{"version":3,"sources":["../packages/core/src/uid.ts","../packages/core/src/tempus.ts"],"sourcesContent":["let index = 0\r\n\r\nexport function getUID(): number {\r\n  return index++\r\n}\r\n","// Infinity = max FPS (system default)\r\n\r\nimport type { TempusCallback, TempusOptions, UID } from './types'\r\nimport { getUID } from './uid'\r\n\r\nconst isClient = typeof window !== 'undefined'\r\n\r\nconst originalRAF = (isClient &&\r\n  window.requestAnimationFrame) as typeof window.requestAnimationFrame\r\nconst originalCancelRAF = (isClient &&\r\n  window.cancelAnimationFrame) as typeof window.cancelAnimationFrame\r\n\r\nclass Framerate {\r\n  callbacks: { callback: TempusCallback; priority: number; uid: UID }[]\r\n  fps: number\r\n  time: number\r\n  lastTickDate: number\r\n\r\n  constructor(fps = Number.POSITIVE_INFINITY) {\r\n    this.callbacks = []\r\n    this.fps = fps\r\n    this.time = 0\r\n    this.lastTickDate = performance.now()\r\n  }\r\n\r\n  get executionTime() {\r\n    return 1000 / this.fps\r\n  }\r\n\r\n  dispatch(time: number, deltaTime: number) {\r\n    for (let i = 0; i < this.callbacks.length; i++) {\r\n      this.callbacks[i]?.callback(time, deltaTime)\r\n    }\r\n  }\r\n\r\n  raf(time: number, deltaTime: number) {\r\n    this.time += deltaTime\r\n\r\n    if (this.fps === Number.POSITIVE_INFINITY) {\r\n      this.dispatch(time, deltaTime)\r\n    } else if (this.time >= this.executionTime) {\r\n      this.time = this.time % this.executionTime\r\n      const deltaTime = time - this.lastTickDate\r\n      this.lastTickDate = time\r\n\r\n      this.dispatch(time, deltaTime)\r\n    }\r\n  }\r\n\r\n  add({ callback, priority }: { callback: TempusCallback; priority: number }) {\r\n    if (typeof callback !== 'function')\r\n      console.error('Tempus.add: callback is not a function')\r\n\r\n    const uid = getUID()\r\n    this.callbacks.push({ callback, priority, uid })\r\n    this.callbacks.sort((a, b) => a.priority - b.priority)\r\n\r\n    return () => this.remove(uid)\r\n  }\r\n\r\n  remove(uid: UID) {\r\n    this.callbacks = this.callbacks.filter(({ uid: u }) => uid !== u)\r\n  }\r\n}\r\n\r\nclass TempusImpl {\r\n  private framerates: Record<number, Framerate>\r\n  time: number\r\n\r\n  constructor() {\r\n    this.framerates = {}\r\n    this.time = isClient ? performance.now() : 0\r\n\r\n    if (!isClient) return\r\n\r\n    requestAnimationFrame(this.raf)\r\n  }\r\n\r\n  add(\r\n    callback: TempusCallback,\r\n    { priority = 0, fps = Number.POSITIVE_INFINITY }: TempusOptions = {}\r\n  ) {\r\n    if (!isClient) return\r\n\r\n    if (typeof fps === 'number') {\r\n      if (!this.framerates[fps]) this.framerates[fps] = new Framerate(fps)\r\n\r\n      return this.framerates[fps].add({ callback, priority })\r\n    }\r\n  }\r\n\r\n  private raf = (time: number) => {\r\n    if (!isClient) return\r\n\r\n    // @ts-ignore\r\n    requestAnimationFrame(this.raf, true)\r\n\r\n    const deltaTime = time - this.time\r\n    this.time = time\r\n\r\n    for (const framerate of Object.values(this.framerates)) {\r\n      framerate.raf(time, deltaTime)\r\n    }\r\n  }\r\n\r\n  patch() {\r\n    if (!isClient) return\r\n\r\n    window.requestAnimationFrame = (\r\n      callback,\r\n      { priority = 0, fps = Number.POSITIVE_INFINITY } = {}\r\n    ) => {\r\n      if (\r\n        callback === this.raf ||\r\n        !callback.toString().includes('requestAnimationFrame(')\r\n      ) {\r\n        return originalRAF(callback)\r\n      }\r\n\r\n      // @ts-ignore\r\n      if (!callback.__tempusPatched) {\r\n        // @ts-ignore\r\n        callback.__tempusPatched = true\r\n        // @ts-ignore\r\n        callback.__tempusUnsubscribe = this.add(callback, { priority, fps })\r\n      }\r\n\r\n      // @ts-ignore\r\n      return callback.__tempusUnsubscribe\r\n    }\r\n\r\n    window.cancelAnimationFrame = (callback: number | (() => void)) => {\r\n      if (typeof callback === 'function') {\r\n        callback?.()\r\n        return\r\n      }\r\n\r\n      return originalCancelRAF(callback)\r\n    }\r\n  }\r\n\r\n  unpatch() {\r\n    if (!isClient) return\r\n\r\n    window.requestAnimationFrame = originalRAF\r\n    window.cancelAnimationFrame = originalCancelRAF\r\n  }\r\n}\r\n\r\nconst Tempus = new TempusImpl()\r\n\r\nexport { Tempus }\r\n"],"mappings":"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","names":["deltaTime"]}