// Clock abstraction so AutoManager can be tested deterministically. // Production code uses RealClock; tests inject a MockClock that exposes // advanceTime() to drive timers manually. export interface CancellableTimer { cancel(): void; } export interface Clock { now(): Date; setTimeout(fn: () => void, ms: number): CancellableTimer; setInterval(fn: () => void, ms: number): CancellableTimer; } export class RealClock implements Clock { public now(): Date { return new Date(); } public setTimeout(fn: () => void, ms: number): CancellableTimer { const handle = setTimeout(fn, ms); return { cancel: () => clearTimeout(handle) }; } public setInterval(fn: () => void, ms: number): CancellableTimer { const handle = setInterval(fn, ms); return { cancel: () => clearInterval(handle) }; } }