feat(db): sqlite in worker (not working right now)

This commit is contained in:
Samuel 2025-01-20 17:00:57 +01:00
parent 0e1eed664d
commit c9aaf2ecef
12 changed files with 467 additions and 56 deletions

View file

@ -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 = () =>

View file

@ -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>({

View file

@ -1,2 +1,2 @@
export * from "./db";
export { kyselyDb, SELF_ID } from "./db";
export * from "./db-queries";