type CacheEntry = { data: T; expiresAt: number }; const store = new Map>(); const DEFAULT_TTL_MS = 60 * 1000; // 60 seconds export function get(key: string): T | undefined { const entry = store.get(key); if (!entry) return undefined; if (Date.now() > entry.expiresAt) { store.delete(key); return undefined; } return entry.data; } export function set(key: string, data: T, ttlMs = DEFAULT_TTL_MS): void { store.set(key, { data, expiresAt: Date.now() + ttlMs }); } export function invalidate(keyPattern?: string): void { if (!keyPattern) { store.clear(); return; } for (const key of store.keys()) { if (key.includes(keyPattern)) { store.delete(key); } } } export function invalidatePrefix(prefix: string): void { for (const key of store.keys()) { if (key.startsWith(prefix)) { store.delete(key); } } }