DDRCompanion/lib/db/client.ts

46 lines
1.4 KiB
TypeScript
Raw Permalink Normal View History

2024-05-15 22:37:00 -05:00
import type { BindParams, Database, QueryExecResult } from "sql.js";
2024-05-15 20:04:15 -05:00
import { RpcProvider } from "worker-rpc";
import DbWorker from "./db.worker?worker";
2024-05-15 23:37:23 -05:00
import { dbStatusAtom, jotaiStore } from "../../src/globals";
2024-05-16 01:02:44 -05:00
import { DbStatusCode } from "./constants";
2024-05-15 20:04:15 -05:00
const worker = new DbWorker();
const rpcProvider = new RpcProvider((message, transfer) =>
worker.postMessage(message, transfer),
);
worker.onmessage = (e) => rpcProvider.dispatch(e.data);
2024-05-15 23:37:23 -05:00
rpcProvider.registerSignalHandler("db", ({ status }) => {
jotaiStore.set(dbStatusAtom, (prevState) => ({ ...prevState, status }));
});
2024-05-15 22:37:00 -05:00
interface AsyncDatabase {
exec(sql: string, params?: BindParams): Promise<QueryExecResult[]>;
run(sql: string, params?: BindParams): Promise<Database>;
2024-05-16 01:02:44 -05:00
rpc(cmd: string, args: any): Promise<any>;
2024-05-15 22:37:00 -05:00
}
export let dbClient: AsyncDatabase;
2024-05-15 20:04:15 -05:00
export async function getDbClient() {
await new Promise<void>((resolve) => {
2024-05-16 01:02:44 -05:00
rpcProvider.registerSignalHandler(DbStatusCode.READY, () => {
2024-05-15 20:04:15 -05:00
resolve();
});
});
2024-05-15 22:37:00 -05:00
dbClient = {
async run(s: string, p?: BindParams): Promise<Database> {
2024-05-15 20:04:15 -05:00
return await rpcProvider.rpc("run", { s, p });
},
2024-05-15 22:37:00 -05:00
async exec(s: string, p?: BindParams): Promise<QueryExecResult[]> {
2024-05-15 20:04:15 -05:00
return await rpcProvider.rpc("exec", { s, p });
},
2024-05-16 01:02:44 -05:00
async rpc(cmd, args): Promise<any> {
return await rpcProvider.rpc(cmd, args);
},
2024-05-15 20:04:15 -05:00
};
2024-05-16 01:02:44 -05:00
console.log("done :3");
2024-05-15 20:04:15 -05:00
}