kysely-generic-sqlite
Version:
Generic kysely dialect for SQLite, support run in main thread or worker
81 lines (76 loc) • 2.06 kB
JavaScript
;
// src/worker/types.ts
var initEvent = "0";
var runEvent = "1";
var closeEvent = "2";
var dataEvent = "3";
var endEvent = "4";
// src/worker/utils.ts
function createGenericOnMessageCallback(init, post, message) {
let db;
return async ([type, data1, data2, data3]) => {
const ret = [type, null, null];
try {
switch (type) {
case initEvent: {
db = await init(data1);
break;
}
case runEvent: {
ret[1] = await db.query(data1, data2, data3);
break;
}
case closeEvent: {
await db.close();
break;
}
case dataEvent: {
if (!db.iterator) {
throw new Error("streamQuery() is not supported.");
}
const it = db.iterator(data1, data2, data3);
for await (const row of it) {
post([type, row, null]);
}
ret[0] = endEvent;
break;
}
default: {
if (message) {
const data = await message(db, type, data1, data2, data3);
if (data !== void 0 && data !== null) {
ret[1] = data;
}
}
}
}
} catch (error) {
ret[2] = error;
}
post(ret);
};
}
async function access(data) {
return typeof data === "function" ? await data() : data;
}
// src/worker/web-helper.ts
function createWebOnMessageCallback(init, message) {
const cb = createGenericOnMessageCallback(
init,
(value) => globalThis.postMessage(value),
message
);
globalThis.onmessage = ({ data }) => cb(data);
}
var handleWebWorker = (worker, cb) => worker.onmessage = ({ data }) => cb(data);
function createWebWorkerExecutor(config) {
const { worker, ...rest } = config;
return async () => ({
...rest,
worker: await access(worker),
handle: handleWebWorker
});
}
exports.createWebOnMessageCallback = createWebOnMessageCallback;
exports.createWebWorkerExecutor = createWebWorkerExecutor;
exports.handleWebWorker = handleWebWorker;