forked from
stevedylan.dev/sequoia
A CLI for publishing standard.site documents to ATProto
1import { Database } from "bun:sqlite";
2import { mkdirSync } from "node:fs";
3import { dirname } from "node:path";
4
5export 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
20export 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
37export 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
51export function kvDel(db: Database, key: string): void {
52 db.run("DELETE FROM kv WHERE key = ?", [key]);
53}