forked from phenom/healer-man
26 lines
711 B
TypeScript
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;
|
|
},
|
|
};
|
|
}
|