/** * The timers of `backgroundTimers.ts`: a worker's keep their pace in a hidden tab, where the page's * own are held to once a second. `{ id, ms, repeat }` starts one, `{ id, ms: 0 }` ends it; each time * it fires, its id comes back. */ const timers = new Map>(); self.onmessage = (event: MessageEvent<{ id: number; ms: number; repeat: boolean }>) => { const { id, ms, repeat } = event.data; const running = timers.get(id); if (running !== undefined) { clearTimeout(running); clearInterval(running); timers.delete(id); } if (ms <= 0) return; if (repeat) timers.set( id, setInterval(() => self.postMessage(id), ms), ); else timers.set( id, setTimeout(() => { timers.delete(id); self.postMessage(id); }, ms), ); };