feat(db): sqlite in worker (not working right now)
This commit is contained in:
parent
0e1eed664d
commit
c9aaf2ecef
12 changed files with 467 additions and 56 deletions
|
@ -1,29 +1,33 @@
|
|||
import { sql, type NotNull } from "kysely";
|
||||
import { db, kyselyDb, SELF_ID } from "./db";
|
||||
import { worker, kyselyDb, SELF_ID, DB_FILENAME } from "./db";
|
||||
import { cached } from "../lib/db-cache";
|
||||
import type { MainToWorkerMsg, WorkerToMainMsg } from "~/lib/kysely-official-wasm-worker/type";
|
||||
|
||||
export const loadDb = (statements: string[], progressCallback?: (percentage: number) => void) => {
|
||||
const length = statements.length;
|
||||
let percentage = 0;
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
const statement = statements[i];
|
||||
const newPercentage = Math.round((i / length) * 100);
|
||||
|
||||
try {
|
||||
if (progressCallback && newPercentage !== percentage) {
|
||||
progressCallback(newPercentage);
|
||||
|
||||
percentage = newPercentage;
|
||||
export const loadDb = (statements: string[], progressCallback?: (percentage: number) => void): Promise<void> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const progressListener = ({ data }: MessageEvent<WorkerToMainMsg>) => {
|
||||
if (data[0] === 5) {
|
||||
progressCallback?.(data[1]);
|
||||
}
|
||||
};
|
||||
|
||||
db.exec(statement);
|
||||
} catch (e) {
|
||||
throw new Error(`statement failed: ${statement}`, {
|
||||
cause: e,
|
||||
});
|
||||
}
|
||||
}
|
||||
const endListener = ({ data }: MessageEvent<WorkerToMainMsg>) => {
|
||||
if (data[0] === 6) {
|
||||
if (data[2]) {
|
||||
reject(new Error(`statement failed`, { cause: data[2] }));
|
||||
}
|
||||
|
||||
worker.removeEventListener("message", progressListener);
|
||||
worker.removeEventListener("message", endListener);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
|
||||
worker.addEventListener("message", endListener);
|
||||
worker.addEventListener("message", progressListener);
|
||||
|
||||
worker.postMessage([4, DB_FILENAME, true, statements] satisfies MainToWorkerMsg);
|
||||
});
|
||||
};
|
||||
|
||||
const allThreadsOverviewQueryRaw = () =>
|
||||
|
|
19
src/db/db.ts
19
src/db/db.ts
|
@ -1,21 +1,22 @@
|
|||
import { makePersisted } from "@solid-primitives/storage";
|
||||
import sqlite3InitModule from "@sqlite.org/sqlite-wasm";
|
||||
import { Kysely } from "kysely";
|
||||
import type { DB } from "./db-schema";
|
||||
import { OfficialWasmDialect } from "kysely-wasm";
|
||||
import { createSignal } from "solid-js";
|
||||
import { OfficialWasmWorkerDialect } from "~/lib/kysely-official-wasm-worker";
|
||||
import wasmWorkerUrl from "~/lib/kysely-official-wasm-worker/worker?url";
|
||||
|
||||
export const SELF_ID = 2;
|
||||
|
||||
const sqlite3 = await sqlite3InitModule({
|
||||
print: console.log,
|
||||
printErr: console.error,
|
||||
export const DB_FILENAME = "signal.sqlite";
|
||||
|
||||
export const worker = new Worker(wasmWorkerUrl, {
|
||||
type: "module",
|
||||
});
|
||||
|
||||
export const db = new sqlite3.oo1.DB("signal");
|
||||
|
||||
const dialect = new OfficialWasmDialect({
|
||||
database: db,
|
||||
const dialect = new OfficialWasmWorkerDialect({
|
||||
fileName: DB_FILENAME,
|
||||
preferOPFS: true,
|
||||
worker,
|
||||
});
|
||||
|
||||
export const kyselyDb = new Kysely<DB>({
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from "./db";
|
||||
export { kyselyDb, SELF_ID } from "./db";
|
||||
export * from "./db-queries";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue