74 lines
1.4 KiB
JavaScript
74 lines
1.4 KiB
JavaScript
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;
|
|
}
|