Files
healer-man/src/platform/rateLimitedPublisher.ts
T
2026-08-14 15:56:39 -04:00

26 lines
711 B
TypeScript

export function createRateLimitedPublisher(publish: () => void, intervalMs: number) {
let timer: number | null = null;
let lastPublishedAt = Number.NEGATIVE_INFINITY;
const flush = () => {
timer = null;
lastPublishedAt = performance.now();
publish();
};
return {
request() {
if (timer !== null) return;
const delay = Math.max(0, intervalMs - (performance.now() - lastPublishedAt));
if (delay === 0) flush();
else timer = window.setTimeout(flush, delay);
},
cancel() {
if (timer !== null) window.clearTimeout(timer);
timer = null;
},
dispose() {
if (timer !== null) window.clearTimeout(timer);
timer = null;
},
};
}