DDRCompanion/lib/db/db.worker.ts

64 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-05-16 01:04:15 +00:00
import sqlWasmUrl from "@jlongster/sql.js/dist/sql-wasm.wasm?url";
2024-05-16 03:37:00 +00:00
import { MigrateDeploy } from "@prisma/migrate";
2024-05-16 01:04:15 +00:00
import initSqlJs from "@jlongster/sql.js";
import { SQLiteFS } from "absurd-sql";
2024-05-16 04:37:23 +00:00
import type { BindParams, Database } from "sql.js";
2024-05-16 01:04:15 +00:00
import IndexedDBBackend from "absurd-sql/dist/indexeddb-backend";
import { RpcProvider } from "worker-rpc";
2024-05-16 03:37:00 +00:00
import executeMigrations from "./migrations";
2024-05-16 04:37:23 +00:00
import { DbStatusCode } from "./constants";
2024-05-16 01:04:15 +00:00
async function init() {
2024-05-16 04:37:23 +00:00
const rpcProvider = new RpcProvider((message, transfer) =>
self.postMessage(message, undefined, transfer),
);
self.addEventListener("message", (evt) => rpcProvider.dispatch(evt.data));
2024-05-16 01:04:15 +00:00
const SQL = await initSqlJs({
locateFile: (file) => {
switch (file) {
case "sql-wasm.wasm":
return sqlWasmUrl;
}
return file;
},
});
2024-05-16 04:37:23 +00:00
rpcProvider.signal("db", { status: DbStatusCode.LOADED_SQLITE });
2024-05-16 01:04:15 +00:00
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);
}
2024-05-16 03:37:00 +00:00
const db: Database = new SQL.Database(path, { filename: true });
2024-05-16 01:04:15 +00:00
db.exec("PRAGMA journal_mode=MEMORY;");
2024-05-16 04:37:23 +00:00
rpcProvider.signal("db", { status: DbStatusCode.OPENED_DATABASE });
2024-05-16 01:04:15 +00:00
2024-05-16 04:37:23 +00:00
await executeMigrations(db);
2024-05-16 01:04:15 +00:00
2024-05-16 04:37:23 +00:00
rpcProvider.signal("db", { status: DbStatusCode.RAN_MIGRATIONS });
2024-05-16 01:04:15 +00:00
2024-05-16 04:37:23 +00:00
rpcProvider.registerRpcHandler("run", ({ s, p }: Args) => db.run(s, p));
2024-05-16 01:04:15 +00:00
2024-05-16 04:37:23 +00:00
rpcProvider.registerRpcHandler("exec", ({ s, p }: Args) => db.exec(s, p));
2024-05-16 01:04:15 +00:00
2024-05-16 04:37:23 +00:00
rpcProvider.signal("db", { status: DbStatusCode.READY });
2024-05-16 03:37:00 +00:00
}
2024-05-16 01:04:15 +00:00
2024-05-16 03:37:00 +00:00
init();
2024-05-16 04:37:23 +00:00
interface Args {
s: string;
p?: BindParams;
}