UNPKG

tempus

Version:
1 lines 16.6 kB
{"version":3,"sources":["../packages/core/src/clock.ts","../packages/core/src/uid.ts","../package.json","../packages/core/src/tempus.ts"],"sourcesContent":["export default class Clock {\r\n private _elapsed = 0\r\n private _currentTime = 0\r\n private _startTime: number | undefined = undefined\r\n private _lastTime: number | undefined = undefined\r\n private _isPlaying = false\r\n private _deltaTime = 0\r\n\r\n play() {\r\n if (this._isPlaying) return\r\n this._currentTime = 0\r\n this._startTime = undefined\r\n this._isPlaying = true\r\n }\r\n\r\n pause() {\r\n if (!this._isPlaying) return\r\n this._deltaTime = 0\r\n this._isPlaying = false\r\n }\r\n\r\n reset() {\r\n this._elapsed = 0\r\n this._deltaTime = 0\r\n this._currentTime = 0\r\n this._lastTime = undefined\r\n this._isPlaying = false\r\n }\r\n\r\n update(browserTime: number) {\r\n if (!this._isPlaying) return\r\n\r\n if (!this._startTime) {\r\n /**\r\n * We always rely on the browser's tick time from the requestAnimationFrame, avoid mixing it\r\n * with performance.now() because it's not in sync with the browser's rendering timeline.\r\n */\r\n this._startTime = browserTime\r\n }\r\n\r\n if (this._lastTime === undefined) {\r\n this._lastTime = this._startTime\r\n this._currentTime = 0\r\n this._deltaTime = 0\r\n } else {\r\n this._lastTime = this._currentTime\r\n this._currentTime = browserTime - this._startTime\r\n this._deltaTime = this._currentTime - this._lastTime\r\n this._elapsed += this._deltaTime\r\n }\r\n }\r\n\r\n get time() {\r\n return this._elapsed\r\n }\r\n\r\n get isPlaying() {\r\n return this._isPlaying\r\n }\r\n\r\n get deltaTime() {\r\n return this._deltaTime\r\n }\r\n}\r\n","let index = 0\r\n\r\nexport function getUID(): number {\r\n return index++\r\n}\r\n","{\n \"name\": \"tempus\",\n \"version\": \"1.0.0-dev.17\",\n \"description\": \"one rAF to rule them all\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"unpkg\": \"./dist/tempus.mjs\",\n \"main\": \"./dist/tempus.mjs\",\n \"module\": \"./dist/tempus.mjs\",\n \"types\": \"./dist/tempus.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/tempus.d.ts\",\n \"default\": \"./dist/tempus.mjs\"\n },\n \"./react\": {\n \"types\": \"./dist/tempus-react.d.ts\",\n \"default\": \"./dist/tempus-react.mjs\"\n },\n \"./dist/*\": \"./dist/*\"\n },\n \"scripts\": {\n \"build\": \"pnpm build:core && pnpm build:all\",\n \"build:core\": \"tsup --config tsup.core.ts\",\n \"build:all\": \"tsup\",\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\n \"dev:build\": \"tsup --watch\",\n \"dev:playground\": \"pnpm --filter playground dev\",\n \"readme\": \"node ./scripts/update-readme.js\",\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\n \"version:major\": \"npm version major --force --no-git-tag-version\",\n \"postversion\": \"pnpm build && pnpm readme\",\n \"publish:main\": \"npm publish\",\n \"publish:dev\": \"npm publish --tag dev\"\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/darkroomengineering/tempus.git\"\n },\n \"keywords\": [\n \"raf\",\n \"ticker\",\n \"framerate\",\n \"fps\"\n ],\n \"author\": \"darkroom.engineering\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/darkroomengineering/tempus/issues\"\n },\n \"homepage\": \"https://github.com/darkroomengineering/tempus\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.9.4\",\n \"tsup\": \"^8.3.6\",\n \"typescript\": \"^5.7.3\",\n \"lottie-web\": \"^5.13.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=17.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"react\": {\n \"optional\": true\n }\n }\n}\n","// Infinity = max FPS (system default)\r\n\r\nimport Clock from './clock'\r\nimport type { TempusCallback, TempusOptions, UID } from './types'\r\nimport { getUID } from './uid'\r\nimport { version } from '../../../package.json'\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\nif (isClient) {\r\n ;(window as any).tempusVersion = version\r\n}\r\n\r\nfunction stopwatch(callback: () => void) {\r\n const now = performance.now()\r\n callback()\r\n return performance.now() - now\r\n}\r\n\r\nclass Framerate {\r\n callbacks: {\r\n callback: TempusCallback\r\n priority: number\r\n uid: UID\r\n label: string\r\n samples: number[]\r\n idle: number\r\n }[] = []\r\n fps: number | string\r\n time = 0\r\n lastTickDate = performance.now()\r\n framesCount = 0\r\n\r\n constructor(fps: number | string = Number.POSITIVE_INFINITY) {\r\n this.fps = fps\r\n }\r\n\r\n get isRelativeFps() {\r\n // eg: '33%'\r\n return typeof this.fps === 'string' && this.fps.endsWith('%')\r\n }\r\n\r\n get maxFramesCount() {\r\n if (!this.isRelativeFps) return 1\r\n\r\n // @ts-ignore\r\n return Math.max(1, Math.round(100 / Number(this.fps.replace('%', ''))))\r\n }\r\n\r\n get executionTime() {\r\n if (this.isRelativeFps) return 0\r\n\r\n // @ts-ignore\r\n return 1000 / this.fps\r\n }\r\n\r\n dispatch(time: number, deltaTime: number, frameCount: number) {\r\n for (let i = 0; i < this.callbacks.length; i++) {\r\n const duration = stopwatch(() => {\r\n if (\r\n (this.callbacks[i]?.idle ?? Number.POSITIVE_INFINITY) > Tempus.usage\r\n ) {\r\n this.callbacks[i]?.callback(time, deltaTime, frameCount)\r\n }\r\n })\r\n\r\n this.callbacks[i]!.samples?.push(duration)\r\n this.callbacks[i]!.samples = this.callbacks[i]!.samples?.slice(-9)\r\n }\r\n }\r\n\r\n raf(time: number, deltaTime: number, frameCount: number) {\r\n this.time += deltaTime\r\n\r\n if (this.isRelativeFps) {\r\n if (this.framesCount === 0) {\r\n this.dispatch(time, deltaTime, frameCount)\r\n }\r\n\r\n this.framesCount++\r\n this.framesCount %= this.maxFramesCount\r\n } else {\r\n if (this.fps === Number.POSITIVE_INFINITY) {\r\n this.dispatch(time, deltaTime, frameCount)\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, frameCount)\r\n }\r\n }\r\n }\r\n\r\n add({\r\n callback,\r\n priority,\r\n label,\r\n idle,\r\n }: {\r\n callback: TempusCallback\r\n priority: number\r\n label: string\r\n idle: number\r\n }) {\r\n if (typeof callback !== 'function') {\r\n console.warn('Tempus.add: callback is not a function')\r\n return\r\n }\r\n\r\n const uid = getUID()\r\n this.callbacks.push({ callback, priority, uid, label, samples: [], idle })\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 framerates: Record<number | string, Framerate> = {}\r\n clock = new Clock()\r\n fps?: number\r\n usage = 0\r\n private rafId: number | undefined\r\n frameCount = 0\r\n\r\n constructor() {\r\n if (!isClient) return\r\n\r\n this.play()\r\n }\r\n\r\n restart() {\r\n if (this.rafId) {\r\n cancelAnimationFrame(this.rafId)\r\n }\r\n this.frameCount = 0\r\n\r\n for (const framerate of Object.values(this.framerates)) {\r\n framerate.framesCount = 0\r\n framerate.time = 0\r\n framerate.lastTickDate = performance.now()\r\n }\r\n\r\n this.clock.reset()\r\n this.play()\r\n }\r\n\r\n play() {\r\n if (!isClient || this.clock.isPlaying) return\r\n\r\n this.clock.play()\r\n this.rafId = requestAnimationFrame(this.raf)\r\n }\r\n\r\n pause() {\r\n if (!isClient || !this.rafId || !this.clock.isPlaying) return\r\n\r\n cancelAnimationFrame(this.rafId)\r\n this.rafId = undefined\r\n this.clock.pause()\r\n }\r\n\r\n get isPlaying() {\r\n return this.clock.isPlaying\r\n }\r\n\r\n add(\r\n callback: TempusCallback,\r\n {\r\n priority = 0,\r\n fps = Number.POSITIVE_INFINITY,\r\n label = '',\r\n idle = Number.POSITIVE_INFINITY,\r\n }: TempusOptions = {}\r\n ) {\r\n if (!isClient) return\r\n\r\n if (\r\n typeof fps === 'number' ||\r\n (typeof fps === 'string' && fps.endsWith('%'))\r\n ) {\r\n if (!this.framerates[fps]) this.framerates[fps] = new Framerate(fps)\r\n return this.framerates[fps].add({ callback, priority, label, idle })\r\n }\r\n\r\n console.warn('Tempus.add: fps is not a number or a string ending with \"%\"')\r\n }\r\n\r\n private raf = (browserElapsed: number) => {\r\n if (!isClient) return\r\n\r\n this.clock.update(browserElapsed)\r\n\r\n const elapsed = this.clock.time\r\n const deltaTime = this.clock.deltaTime\r\n\r\n this.fps = 1000 / deltaTime\r\n\r\n const duration = stopwatch(() => {\r\n for (const framerate of Object.values(this.framerates)) {\r\n framerate.raf(elapsed, deltaTime, this.frameCount)\r\n }\r\n })\r\n\r\n if (deltaTime) {\r\n this.usage = duration / deltaTime\r\n }\r\n\r\n this.frameCount++\r\n\r\n this.rafId = requestAnimationFrame(this.raf)\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 const stringifiedCallback = callback.toString()\r\n\r\n if (\r\n (stringifiedCallback.includes(\r\n `requestAnimationFrame(${callback.name})`\r\n ) ||\r\n stringifiedCallback.includes(\r\n `requestAnimationFrame(this.${callback.name})`\r\n )) &&\r\n callback !== this.raf\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, {\r\n priority,\r\n fps,\r\n label: callback.name,\r\n })\r\n }\r\n\r\n // @ts-ignore\r\n return callback.__tempusUnsubscribe\r\n }\r\n\r\n return originalRAF(callback)\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"]}