const DEFAULT_TTL_MS = 30 * 60 * 1000; const cache = new Map(); export function getCacheKey({ normalizedRepo, subpath, identityId }) { const safeRepo = String(normalizedRepo || '').trim(); const safeSubpath = String(subpath || '').trim(); const safeIdentity = String(identityId || '').trim(); return `${safeRepo}::${safeSubpath}::${safeIdentity}`; } export function getCachedScan(key) { const entry = cache.get(key); if (!entry) return null; if (Date.now() >= entry.expiresAt) { cache.delete(key); return null; } return entry.value; } export function setCachedScan(key, value, ttlMs = DEFAULT_TTL_MS) { const ttl = Number.isFinite(ttlMs) ? ttlMs : DEFAULT_TTL_MS; cache.set(key, { expiresAt: Date.now() + ttl, value }); } export function clearCache() { cache.clear(); }