interface CacheEntry { data: T; timestamp: number; ttl: number; } class DataCache { private cache: Map>; private defaultTTL: number; constructor(defaultTTL: number = 60000) { this.cache = new Map(); this.defaultTTL = defaultTTL; } set(key: string, data: T, ttl?: number): void { const entry: CacheEntry = { data, timestamp: Date.now(), ttl: ttl || this.defaultTTL, }; this.cache.set(key, entry); } get(key: string): T | null { const entry = this.cache.get(key); if (!entry) return null; const now = Date.now(); if (now - entry.timestamp > entry.ttl) { this.cache.delete(key); return null; } return entry.data as T; } invalidate(key: string): void { this.cache.delete(key); } invalidatePattern(pattern: string): void { const regex = new RegExp(pattern); for (const key of this.cache.keys()) { if (regex.test(key)) { this.cache.delete(key); } } } clear(): void { this.cache.clear(); } size(): number { return this.cache.size; } } export const cache = new DataCache(); export function getCachedData( key: string, fetcher: () => Promise, ttl?: number ): Promise { const cached = cache.get(key); if (cached !== null) { return Promise.resolve(cached); } return fetcher().then((data) => { cache.set(key, data, ttl); return data; }); } export function invalidateCache(key: string): void { cache.invalidate(key); } export function invalidateCachePattern(pattern: string): void { cache.invalidatePattern(pattern); } export function clearCache(): void { cache.clear(); }