export class BoundedDedupMap { static readonly defaultCapN = 1000; static readonly defaultTtlMs = 60_000; private readonly entries = new Map(); constructor( private readonly capN: number = BoundedDedupMap.defaultCapN, private readonly ttlMs: number = BoundedDedupMap.defaultTtlMs, ) {} hasSeen(key: string): boolean { const now = Date.now(); const expiredBefore = now - this.ttlMs; for (const [k, ts] of this.entries) { if (ts < expiredBefore) this.entries.delete(k); } if (this.entries.has(key)) return true; this.entries.set(key, now); if (this.entries.size > this.capN) { this.entries.delete(this.entries.keys().next().value!); } return false; } get size(): number { return this.entries.size; } }