UNPKG

shared-timers

Version:

Unthrottleable timers that work across tabs.

1 lines 3.57 kB
{"version":3,"file":"shared-timers.umd.cjs","sources":["../lib/main.ts"],"sourcesContent":["import TimerWorker from './worker?sharedworker&inline'\nimport type { TimerFunction, TimerEvent, WorkerEvent } from './types'\n\nclass Timer {\n readonly delay: number\n #subscribers: Map<number, TimerFunction>\n\n constructor(delay: number) {\n this.delay = delay\n this.#subscribers = new Map()\n }\n\n get size() {\n return this.#subscribers.size\n }\n\n call() {\n for (const cb of this.#subscribers.values()) {\n window.setTimeout(cb)\n }\n }\n\n subscribe(id: number, func: TimerFunction) {\n this.#subscribers.set(id, func)\n }\n\n unsubscribe(id: number) {\n this.#subscribers.delete(id)\n }\n}\n\nconst timerByDelay = new Map<number, Timer>()\nconst worker = new TimerWorker()\n\nlet callbackId = 0\nconst newCallbackId = () => ++callbackId\nconst timerByCallback = new Map<number, Timer>()\n\nworker.port.onmessage = ({ data }: MessageEvent<TimerEvent>) => {\n switch (data.type) {\n case 'tick': {\n timerByDelay.get(data.delay)?.call()\n break\n }\n }\n}\n\nwindow.addEventListener('beforeunload', () => {\n const msg: WorkerEvent = { type: 'close' }\n worker.port.postMessage(msg)\n})\n\nexport function runTimer(func: TimerFunction, delay: number) {\n let timer = timerByDelay.get(delay)\n if (!timer) {\n timer = new Timer(delay)\n timerByDelay.set(delay, timer)\n const msg: WorkerEvent = { type: 'subscribe', delay }\n worker.port.postMessage(msg)\n }\n const id = newCallbackId()\n timer.subscribe(id, func)\n timerByCallback.set(id, timer)\n return id\n}\n\nexport function clearTimer(id: number) {\n const timer = timerByCallback.get(id)\n if (timer) {\n timerByCallback.delete(id)\n timer.unsubscribe(id)\n if (timer.size === 0) {\n timerByDelay.delete(timer.delay)\n const msg: WorkerEvent = { type: 'unsubscribe', delay: timer.delay }\n worker.port.postMessage(msg)\n }\n }\n}\n"],"names":["Timer","delay","__publicField","__privateAdd","_subscribers","__privateSet","__privateGet","cb","id","func","timerByDelay","worker","TimerWorker","callbackId","newCallbackId","timerByCallback","data","_a","msg","runTimer","timer","clearTimer"],"mappings":";;kIAGA,MAAMA,CAAM,CAIV,YAAYC,EAAe,CAHlBC,EAAA,cACTC,EAAA,KAAAC,GAGE,KAAK,MAAQH,EACRI,EAAA,KAAAD,MAAmB,IAAI,CAG9B,IAAI,MAAO,CACT,OAAOE,EAAA,KAAKF,GAAa,IAAA,CAG3B,MAAO,CACL,UAAWG,KAAMD,EAAA,KAAKF,GAAa,OAAA,EACjC,OAAO,WAAWG,CAAE,CACtB,CAGF,UAAUC,EAAYC,EAAqB,CACpCH,EAAA,KAAAF,GAAa,IAAII,EAAIC,CAAI,CAAA,CAGhC,YAAYD,EAAY,CACjBF,EAAA,KAAAF,GAAa,OAAOI,CAAE,CAAA,CAE/B,CAxBEJ,EAAA,YA0BF,MAAMM,MAAmB,IACnBC,EAAS,IAAIC,EAEnB,IAAIC,EAAa,EACjB,MAAMC,EAAgB,IAAM,EAAED,EACxBE,MAAsB,IAE5BJ,EAAO,KAAK,UAAY,CAAC,CAAE,KAAAK,KAAqC,OAC9D,OAAQA,EAAK,KAAM,CACjB,IAAK,OAAQ,EACXC,EAAAP,EAAa,IAAIM,EAAK,KAAK,IAA3B,MAAAC,EAA8B,OAC9B,KAAA,CACF,CAEJ,EAEA,OAAO,iBAAiB,eAAgB,IAAM,CACtC,MAAAC,EAAmB,CAAE,KAAM,OAAQ,EAClCP,EAAA,KAAK,YAAYO,CAAG,CAC7B,CAAC,EAEe,SAAAC,EAASV,EAAqBR,EAAe,CACvD,IAAAmB,EAAQV,EAAa,IAAIT,CAAK,EAClC,GAAI,CAACmB,EAAO,CACFA,EAAA,IAAIpB,EAAMC,CAAK,EACVS,EAAA,IAAIT,EAAOmB,CAAK,EAC7B,MAAMF,EAAmB,CAAE,KAAM,YAAa,MAAAjB,CAAM,EAC7CU,EAAA,KAAK,YAAYO,CAAG,CAAA,CAE7B,MAAMV,EAAKM,EAAc,EACnB,OAAAM,EAAA,UAAUZ,EAAIC,CAAI,EACRM,EAAA,IAAIP,EAAIY,CAAK,EACtBZ,CACT,CAEO,SAASa,EAAWb,EAAY,CAC/B,MAAAY,EAAQL,EAAgB,IAAIP,CAAE,EACpC,GAAIY,IACFL,EAAgB,OAAOP,CAAE,EACzBY,EAAM,YAAYZ,CAAE,EAChBY,EAAM,OAAS,GAAG,CACPV,EAAA,OAAOU,EAAM,KAAK,EAC/B,MAAMF,EAAmB,CAAE,KAAM,cAAe,MAAOE,EAAM,KAAM,EAC5DT,EAAA,KAAK,YAAYO,CAAG,CAAA,CAGjC"}