packages/server/src/lib/db.ts 1.2 K raw
1
import { Database } from "bun:sqlite";
2
import { mkdirSync } from "node:fs";
3
import { dirname } from "node:path";
4
5
export function openDatabase(path: string): Database {
6
	mkdirSync(dirname(path), { recursive: true });
7
8
	const db = new Database(path);
9
	db.run("PRAGMA journal_mode = WAL");
10
	db.run(`
11
		CREATE TABLE IF NOT EXISTS kv (
12
			key   TEXT PRIMARY KEY,
13
			value TEXT NOT NULL,
14
			expires_at INTEGER
15
		)
16
	`);
17
	return db;
18
}
19
20
export function kvGet(db: Database, key: string): string | undefined {
21
	const row = db
22
		.query<{ value: string; expires_at: number | null }, [string]>(
23
			"SELECT value, expires_at FROM kv WHERE key = ?",
24
		)
25
		.get(key);
26
27
	if (!row) return undefined;
28
29
	if (row.expires_at !== null && row.expires_at <= Date.now()) {
30
		db.run("DELETE FROM kv WHERE key = ?", [key]);
31
		return undefined;
32
	}
33
34
	return row.value;
35
}
36
37
export function kvSet(
38
	db: Database,
39
	key: string,
40
	value: string,
41
	ttlSeconds?: number,
42
): void {
43
	const expiresAt =
44
		ttlSeconds !== undefined ? Date.now() + ttlSeconds * 1000 : null;
45
	db.run(
46
		"INSERT OR REPLACE INTO kv (key, value, expires_at) VALUES (?, ?, ?)",
47
		[key, value, expiresAt],
48
	);
49
}
50
51
export function kvDel(db: Database, key: string): void {
52
	db.run("DELETE FROM kv WHERE key = ?", [key]);
53
}