@evolu/web
Version:
Evolu for web
61 lines (60 loc) • 2.04 kB
JavaScript
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;
};