import init, { Database } from "../pkg-web/graphitesql_wasm.js";
let db = null;
async function acquireHandles(dbName) {
const root = await navigator.storage.getDirectory();
const files = {};
for (const suffix of ["", "-journal", "-wal"]) {
const name = dbName + suffix;
const fh = await root.getFileHandle(name, { create: true });
files[name] = await fh.createSyncAccessHandle();
}
return files;
}
self.onmessage = async (ev) => {
const msg = ev.data;
try {
switch (msg.type) {
case "open": {
await init(); const files = await acquireHandles(msg.name);
const isNew = files[msg.name].getSize() === 0;
db = Database.openOpfs(files, msg.name, isNew);
self.postMessage({ id: msg.id, ok: true, created: isNew });
break;
}
case "exec": {
const changes = db.exec(msg.sql);
self.postMessage({ id: msg.id, ok: true, changes });
break;
}
case "query": {
const result = db.query(msg.sql);
self.postMessage({ id: msg.id, ok: true, result });
break;
}
default:
throw new Error(`unknown message type: ${msg.type}`);
}
} catch (e) {
self.postMessage({ id: msg.id, ok: false, error: String((e && e.message) || e) });
}
};