{"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"}