Files
MineGeo/lib/realtime-refresh.ts

35 lines
721 B
TypeScript

/** Serialize refreshes, retaining one follow-up if a change arrives mid-request. */
export function realtimeRefresh(
refresh: () => Promise<void>,
onError: (error: unknown) => void,
) {
let running = false;
let pending = false;
let closed = false;
async function request() {
if (closed) return;
pending = true;
if (running) return;
running = true;
try {
while (pending && !closed) {
pending = false;
try {
await refresh();
} catch (error) {
if (!closed) onError(error);
}
}
} finally {
running = false;
}
}
return {
request,
close: () => {
closed = true;
pending = false;
},
};
}