export type TimerHandle = ReturnType | number; export interface Clock { clearInterval(handle: TimerHandle): void; clearTimeout(handle: TimerHandle): void; now(): number; setInterval(fn: () => void, delayMs: number): TimerHandle; setTimeout(fn: () => void, delayMs: number): TimerHandle; } export class SystemClock implements Clock { public now(): number { if ( !globalThis.performance || typeof globalThis.performance.now !== "function" ) { throw new Error("SystemClock requires globalThis.performance.now()"); } return globalThis.performance.now(); } public setTimeout(fn: () => void, delayMs: number): TimerHandle { return globalThis.setTimeout(fn, delayMs); } public clearTimeout(handle: TimerHandle): void { globalThis.clearTimeout(handle as ReturnType); } public setInterval(fn: () => void, delayMs: number): TimerHandle { return globalThis.setInterval(fn, delayMs); } public clearInterval(handle: TimerHandle): void { globalThis.clearInterval( handle as ReturnType, ); } }