import { browser } from "$app/env";
type Entry = { value: unknown; expires: number };
const store = new Map<string, Entry>();
// browser only, a server map would leak viewer-scoped data across requests
export async function cached<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {
if (!browser) return fn();
const hit = store.get(key);
if (hit && hit.expires > Date.now()) return hit.value as T;
try {
const value = await fn();
store.set(key, { value, expires: Date.now() + ttlMs });
return value;
} catch (cause) {
store.delete(key);
throw cause;
}
}
export function invalidate(key: string): void {
store.delete(key);
}
export function clear(): void {
store.clear();
}