Coalesce fleet refreshes and suppress unchanged sweep events

This commit is contained in:
2026-10-05 15:29:03 -04:00
parent 2af768011a
commit 030794635e
5 changed files with 198 additions and 5 deletions
+27 -2
View File
@@ -124,12 +124,37 @@ export function startFleetMonitor(): () => void {
if (!browser || stop) return () => {};
const stopPolling = pollVisible(() => refreshFleet(), 60_000, !get(fleet).receivedAt || Date.now() - get(fleet).receivedAt > 30_000);
let refreshTimer: ReturnType<typeof setTimeout> | undefined;
let stopped = false;
let pending = false;
let refreshing = false;
let lastEventRefresh = -Infinity;
const schedule = () => {
if (stopped || refreshing || refreshTimer !== undefined || !pending || document.visibilityState === 'hidden') return;
refreshTimer = setTimeout(async () => {
refreshTimer = undefined;
refreshing = true;
try {
// Wait for any manual/poll refresh, then fetch evidence newer than
// the event. Do not use refreshFleet(true)'s immediate follow-up.
if (inFlight) await inFlight;
if (stopped || document.visibilityState === 'hidden') return;
pending = false;
lastEventRefresh = Date.now();
await refreshFleet();
} finally {
refreshing = false;
schedule();
}
}, Math.max(250, lastEventRefresh + 2000 - Date.now()));
};
const changed = () => {
if (refreshTimer || document.visibilityState === 'hidden') return;
refreshTimer = setTimeout(() => { refreshTimer = undefined; void refreshFleet(true); }, 250);
if (document.visibilityState === 'hidden') return;
pending = true;
schedule();
};
window.addEventListener('ec:fleet-changed', changed);
stop = () => {
stopped = true;
stopPolling(); clearTimeout(refreshTimer); window.removeEventListener('ec:fleet-changed', changed); stop = null;
};
return stop;