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; }, }; }