From 3eda530bcb737bc8f9545f9666e343f5e1b872bf Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Wed, 18 Feb 2026 13:16:56 -0800 Subject: [PATCH] Feat: In-memory KV store with TTL --- db.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 db.js diff --git a/db.js b/db.js new file mode 100644 index 0000000..efccf39 --- /dev/null +++ b/db.js @@ -0,0 +1,45 @@ +import { Database } from 'bun:sqlite' + +const db = new Database(':memory:', { strict: true }) + +db.exec(` + CREATE TABLE kv ( + k TEXT PRIMARY KEY, + v TEXT NOT NULL, + exp INTEGER NOT NULL + ) +`) + +const stmts = { + get: db.prepare('SELECT v FROM kv WHERE k=? AND exp>?'), + set: db.prepare('INSERT OR REPLACE INTO kv VALUES (?,?,?)'), + del: db.prepare('DELETE FROM kv WHERE k=?'), + prune: db.prepare('DELETE FROM kv WHERE exp?"), +} + +const TTL_MS = 20 * 60 * 1000 + +export function get(key) { + const row = stmts.get.get(key, Date.now()) + return row ? JSON.parse(row.v) : null +} + +export function set(key, val, ttl = TTL_MS) { + stmts.set.run(key, JSON.stringify(val), Date.now() + ttl) +} + +export function del(key) { + stmts.del.run(key) +} + +export function list(prefix) { + return stmts.list.all(prefix + '*', Date.now()).map(r => r.k) +} + +export function prune() { + stmts.prune.run(Date.now()) +} + +// Prune expired entries every 60s +setInterval(prune, 60_000)