← Public packages
@kody/mailroom
Offline-first PWA for your Kody mailbox: sent and received threads, copy-prompt for agents, no send.
src/settings.ts
41 lines · 1.0 KB · TypeScriptimport { packageStorage } from 'kody:runtime'
type SqlBucket = {
sql: (
query: string,
params?: Array<string | number | boolean | null>,
) => Promise<{ rows: Array<Record<string, unknown>> }>
}
let schemaReady = false
function bucket(): SqlBucket {
return packageStorage() as unknown as SqlBucket
}
async function ensureSchema(): Promise<void> {
if (schemaReady) return
await bucket().sql(`
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
)
`)
schemaReady = true
}
export async function getSetting(key: string): Promise<string | null> {
await ensureSchema()
const result = await bucket().sql(`SELECT value FROM settings WHERE key = ?`, [key])
const value = result.rows[0]?.value
return typeof value === 'string' ? value : null
}
export async function setSetting(key: string, value: string): Promise<void> {
await ensureSchema()
await bucket().sql(
`INSERT INTO settings (key, value) VALUES (?, ?)
ON CONFLICT(key) DO UPDATE SET value = excluded.value`,
[key, value],
)
}