## Features - Add bun:sqlite adapter with automatic runtime detection (Bun/Node) - Add bulk API key import (format: `name|sk-key`, one per line) ## Fixes - Fix add API key for custom providers
64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
// 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,
|
|
};
|
|
}
|