Paginate beta history and refresh pages from events
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
/** Coalesce pushes, serialize refreshes, and recover missed events after reconnect or tab activation. */
|
||||
export function betaUpdates(load: () => Promise<unknown>, betaId?: () => number): () => void {
|
||||
let timer: ReturnType<typeof setTimeout> | undefined;
|
||||
let stopped = false, running = false, pending = false;
|
||||
const schedule = () => {
|
||||
pending = true;
|
||||
if (stopped || running || timer || document.hidden) return;
|
||||
timer = setTimeout(async () => {
|
||||
timer = undefined;
|
||||
if (stopped || document.hidden) return;
|
||||
running = true; pending = false;
|
||||
try { await load(); }
|
||||
catch { /* The page owns its error state; later events can retry. */ }
|
||||
finally { running = false; if (pending) schedule(); }
|
||||
}, 200);
|
||||
};
|
||||
const changed = (event: Event) => { if (!betaId || (event as CustomEvent).detail?.betaId === betaId()) schedule(); };
|
||||
const visible = () => { if (!document.hidden) schedule(); };
|
||||
window.addEventListener('ec:beta-changed', changed);
|
||||
window.addEventListener('ec:pipeline-connected', schedule);
|
||||
window.addEventListener('ec:fleet-changed', schedule);
|
||||
document.addEventListener('visibilitychange', visible);
|
||||
return () => {
|
||||
stopped = true; clearTimeout(timer);
|
||||
window.removeEventListener('ec:beta-changed', changed);
|
||||
window.removeEventListener('ec:pipeline-connected', schedule);
|
||||
window.removeEventListener('ec:fleet-changed', schedule);
|
||||
document.removeEventListener('visibilitychange', visible);
|
||||
};
|
||||
}
|
||||
@@ -26,6 +26,11 @@ function updateDeployment(id: string, mutate: (d: PipelineDeployment) => void):
|
||||
export function startPipelineStream(): (() => void) | undefined {
|
||||
if (!browser || source) return;
|
||||
source = new EventSource('/api/events/pipeline');
|
||||
source.addEventListener('open', () => window.dispatchEvent(new Event('ec:pipeline-connected')));
|
||||
source.addEventListener('beta-changed', event => {
|
||||
try { window.dispatchEvent(new CustomEvent('ec:beta-changed', { detail: JSON.parse((event as MessageEvent).data) })); }
|
||||
catch { /* Reconnect refreshes authoritative state if an event is malformed. */ }
|
||||
});
|
||||
for (const event of ['server-changed', 'server-state', 'deployment-opened', 'fleet-invalidated']) {
|
||||
source.addEventListener(event, () => window.dispatchEvent(new Event('ec:fleet-changed')));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user