import { connect, Redis, RedisConnectOptions, RedisValue, } from "https://deno.land/x/redis@v0.31.0/mod.ts"; const REDIS_HOST = Deno.env.get("REDIS_HOST"); const REDIS_PASS = Deno.env.get("REDIS_PASS") || ""; const REDIS_PORT = Deno.env.get("REDIS_PORT"); async function createCache(): Promise | Redis> { if (REDIS_HOST) { const conf: RedisConnectOptions = { hostname: REDIS_HOST, port: REDIS_PORT || 6379, }; if (REDIS_PASS) { conf.password = REDIS_PASS; } const client = await connect(conf); console.log("[redis] connected"); return client; } return new Map(); } const cache = await createCache(); export async function get(id: string, binary = false) { if (binary && !(cache instanceof Map)) { const cacheHit = await cache.sendCommand("GET", [id], { returnUint8Arrays: true, }) as T; return cacheHit; } const cacheHit = await cache.get(id) as T; return cacheHit; } export function clearAll() { if ("flushall" in cache) { return cache.flushall(); } else { for (const k of cache.keys()) { cache.delete(k); } } } export function expire(id: string, seconds: number) { if ("expire" in cache) { return cache.expire(id, seconds); } } type RedisOptions = { expires?: number; }; export async function set( id: string, content: T, options?: RedisOptions, ) { console.log("[cache] storing ", { id }); const res = await cache.set(id, content); if (options?.expires) { await expire(id, options.expires); } return res; }