api9nin / src /lib /db /adapters /bunSqliteAdapter.js
github-actions[bot]
deploy from github actions 2026-06-18
c8ae75d
Raw
History Blame Contribute Delete
2.03 kB
// Bun runtime adapter — uses built-in bun:sqlite (native, fastest under Bun).
// Loaded only when process.versions.bun is present.
import { PRAGMA_SQL } from "../schema.js";
const CHECKPOINT_INTERVAL_MS = 60 * 1000;
export async function createBunSqliteAdapter(filePath) {
// Dynamic import — only resolves under Bun runtime
const { Database } = await import("bun:sqlite");
const db = new Database(filePath, { create: true });
db.exec(PRAGMA_SQL);
const stmtCache = new Map();
function prepare(sql) {
let stmt = stmtCache.get(sql);
if (!stmt) {
stmt = db.prepare(sql);
stmtCache.set(sql, stmt);
}
return stmt;
}
const checkpointTimer = setInterval(() => {
try { db.exec("PRAGMA wal_checkpoint(TRUNCATE)"); } catch {}
}, CHECKPOINT_INTERVAL_MS);
if (typeof checkpointTimer.unref === "function") checkpointTimer.unref();
function gracefulClose() {
try { db.exec("PRAGMA wal_checkpoint(TRUNCATE)"); } catch {}
try { stmtCache.clear(); } catch {}
try { db.close(); } catch {}
}
const onShutdown = () => gracefulClose();
process.once("beforeExit", onShutdown);
process.once("SIGINT", () => { onShutdown(); process.exit(0); });
process.once("SIGTERM", () => { onShutdown(); process.exit(0); });
return {
driver: "bun:sqlite",
run(sql, params = []) {
const r = prepare(sql).run(...params);
return { changes: Number(r.changes ?? 0), lastInsertRowid: Number(r.lastInsertRowid ?? 0) };
},
get(sql, params = []) {
return prepare(sql).get(...params);
},
all(sql, params = []) {
return prepare(sql).all(...params);
},
exec(sql) { return db.exec(sql); },
transaction(fn) {
// bun:sqlite has db.transaction() API (similar to better-sqlite3)
const tx = db.transaction(fn);
return tx();
},
checkpoint() { try { db.exec("PRAGMA wal_checkpoint(TRUNCATE)"); } catch {} },
close() {
clearInterval(checkpointTimer);
gracefulClose();
},
raw: db,
};
}