UNPKG

@evolu/web

Version:
61 lines (60 loc) 2.04 kB
import { constVoid, createPreparedStatementsCache, } from "@evolu/common"; import sqlite3InitModule from "@sqlite.org/sqlite-wasm"; // TODO: Do we still need that? // https://github.com/sqlite/sqlite-wasm/issues/62 // @ts-expect-error Missing types. globalThis.sqlite3ApiConfig = { warn: constVoid, }; // Init ASAP. const sqlite3Promise = sqlite3InitModule(); export const createWasmSqliteDriver = async (name) => { const sqlite3 = await sqlite3Promise; const poolUtil = await sqlite3.installOpfsSAHPoolVfs({ name }); const db = new poolUtil.OpfsSAHPoolDb("/evolu1.db"); let isDisposed = false; const cache = createPreparedStatementsCache((sql) => db.prepare(sql), (statement) => { statement.finalize(); }); const driver = { exec: (query, isMutation) => { const prepared = cache.get(query); if (prepared) { prepared.bind(query.parameters); if (isMutation) { prepared.stepReset(); return { rows: [], changes: db.changes(), }; } const rows = []; while (prepared.step()) { rows.push(prepared.get({})); } prepared.reset(); return { rows: rows, changes: 0, }; } const rows = db.exec(query.sql, { returnValue: "resultRows", rowMode: "object", bind: query.parameters, }); const changes = db.changes(); return { rows, changes }; }, export: () => sqlite3.capi.sqlite3_js_db_export(db), [Symbol.dispose]: () => { if (isDisposed) return; isDisposed = true; // poolUtil.unlink? cache[Symbol.dispose](); db.close(); }, }; return driver; };