import sqlWasmUrl from "@jlongster/sql.js/dist/sql-wasm.wasm?url"; import { MigrateDeploy } from "@prisma/migrate"; import initSqlJs from "@jlongster/sql.js"; import { SQLiteFS } from "absurd-sql"; import type { BindParams, Database } from "sql.js"; import IndexedDBBackend from "absurd-sql/dist/indexeddb-backend"; import { RpcProvider } from "worker-rpc"; import executeMigrations from "./migrations"; import { DbStatusCode } from "./constants"; async function init() { const rpcProvider = new RpcProvider((message, transfer) => self.postMessage(message, undefined, transfer), ); self.addEventListener("message", (evt) => rpcProvider.dispatch(evt.data)); const SQL = await initSqlJs({ locateFile: (file) => { switch (file) { case "sql-wasm.wasm": return sqlWasmUrl; } return file; }, }); rpcProvider.signal("db", { status: DbStatusCode.LOADED_SQLITE }); const sqlFS = new SQLiteFS(SQL.FS, new IndexedDBBackend()); SQL.register_for_idb(sqlFS); SQL.FS.mkdir("/sql"); SQL.FS.mount(sqlFS, {}, "/sql"); const path = "/sql/db.sqlite"; if (typeof SharedArrayBuffer === "undefined") { const stream = SQL.FS.open(path, "a+"); await stream.node.contents.readIfFallback(); SQL.FS.close(stream); } const db: Database = new SQL.Database(path, { filename: true }); db.exec("PRAGMA journal_mode=MEMORY;"); rpcProvider.signal("db", { status: DbStatusCode.OPENED_DATABASE }); await executeMigrations(db); rpcProvider.signal("db", { status: DbStatusCode.RAN_MIGRATIONS }); rpcProvider.registerRpcHandler("run", ({ s, p }: Args) => db.run(s, p)); rpcProvider.registerRpcHandler("exec", ({ s, p }: Args) => db.exec(s, p)); rpcProvider.signal("db", { status: DbStatusCode.READY }); } init(); interface Args { s: string; p?: BindParams; }