function createContextPoller({ fetchContext, onSnapshot, onError, isHidden = () => false, setTimer = setTimeout, clearTimer = clearTimeout, intervalMs = 8000, }) { let inFlight = null; let timer = null; let stopped = false; function cancelTimer() { if (timer !== null) clearTimer(timer); timer = null; } function schedule() { cancelTimer(); if (stopped || isHidden()) return; timer = setTimer(() => { timer = null; refresh(); }, intervalMs); } function refresh() { if (stopped || isHidden()) return Promise.resolve(null); if (inFlight) return inFlight; let request; try { request = fetchContext(); } catch (error) { request = Promise.reject(error); } inFlight = Promise.resolve(request) .then((snapshot) => { onSnapshot(snapshot); return snapshot; }) .catch((error) => { onError(error); return null; }) .finally(() => { inFlight = null; schedule(); }); return inFlight; } function setVisible(visible) { cancelTimer(); if (!visible) return Promise.resolve(null); return refresh(); } return { start: refresh, refresh, setVisible, stop() { stopped = true; cancelTimer(); }, }; } if (typeof module !== 'undefined' && module.exports) { module.exports = createContextPoller; }