Skip to content
← 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 · TypeScript
import { 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],
	)
}