A CLI for publishing standard.site documents to ATProto
at main 53 lines 1.3 kB view raw
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}