import { sqlite } from "https://esm.town/v/std/sqlite";
const tableName = Deno.env.get("CACHE_TABLE_NAME");
if (tableName === undefined) {
console.error(
"Env variable 'CACHE_TABLE_NAME' is not configured. Stopping execution.",
);
throw new Error("Env variable 'CACHE_TABLE_NAME' is not configured");
}
const defaultTTL = parseInt(
Deno.env.get("CACHE_DEFAULT_TTL") || `${24 * 60 * 60}`,
);
export async function setup() {
await sqlite.execute(`
CREATE TABLE IF NOT EXISTS ${tableName} (
key TEXT PRIMARY KEY,
content TEXT NOT NULL,
expires_at DATETIME
)
`);
console.log("Cache setup complete.");
}
export async function exists(key): Promise<Boolean> {
const result = await sqlite.execute({
sql: `SELECT 1 FROM ${tableName} WHERE key = :key AND (expires_at IS NULL OR expires_at > datetime('now'))`,
args: { key },
});
return result.rows.length > 0;
}
export async function get<T = unknown>(key): Promise<T | null> {
const result = await sqlite.execute({
sql: `SELECT content FROM ${tableName} WHERE key = :key AND (expires_at IS NULL OR expires_at > datetime('now'))`,
args: { key },
});
return result.rows.length > 0
? JSON.parse(result.rows[0][0] as string) as T
: null;
}
export async function set(key, value, ttl: number = defaultTTL): Promise<number> {
if (ttl <= 0) return 0;
const expires_at = ttl ? `datetime('now', '+${ttl} seconds')` : null;
const result = await sqlite.execute({
sql:
`INSERT INTO ${tableName} (key, content, expires_at) VALUES (:key, :content, ${expires_at}) ON CONFLICT(key) DO UPDATE SET content = :content, expires_at = ${expires_at}`,
args: { key, content: JSON.stringify(value) },
});
return result.rowsAffected;
}
export async function setUntil(key: string, value: unknown, expiresAt: string): Promise<number> {
const currentDateTime = new Date().toISOString();
if (expiresAt <= currentDateTime) return 0;
const result = await sqlite.execute({
sql:
`INSERT INTO ${tableName} (key, content, expires_at) VALUES (:key, :content, :expiresAt) ON CONFLICT(key) DO UPDATE SET content = :content, expires_at = :expiresAt`,
args: { key, content: JSON.stringify(value), expiresAt },
});