import { JulianDate } from "@cesium/engine"; import type { Viewer } from "@cesium/widgets"; // Use `any` for Cesium viewer/event - tightening Cesium types is out of scope. // eslint-disable-next-line @typescript-eslint/no-explicit-any type CesiumEvent = any; export class CesiumCallbackHelper { /** * Fire every `refreshRate` ticks of the clock. * @returns the unsubscribe */ static createPeriodicTickCallback(viewer: Viewer, refreshRate: number, callback: (time: JulianDate) => void, event: CesiumEvent = viewer.clock.onTick): () => void { let ticks = 0; return event.addEventListener(() => { if (ticks < refreshRate) { ticks += 1; return; } callback(viewer.clock.currentTime); ticks = 0; }); } /** * Fire every `refreshRate` seconds of *simulation* time, so a faster clock * fires it more often in real time. * @returns the unsubscribe */ static createPeriodicTimeCallback(viewer: Viewer, refreshRate: number, callback: (time: JulianDate) => void, event: CesiumEvent = viewer.clock.onTick): () => void { let lastUpdated = viewer.clock.currentTime; return event.addEventListener(() => { const time = viewer.clock.currentTime; const delta = Math.abs(JulianDate.secondsDifference(time, lastUpdated)); if (delta < refreshRate) { return; } callback(time); lastUpdated = time; }); } }