zulip/web/src/watchdog.ts

61 lines
1.9 KiB
TypeScript

import * as blueslip from "./blueslip";
const unsuspend_callbacks: (() => void)[] = [];
let watchdog_time = Date.now();
// This field keeps track of whether we are attempting to
// force-reconnect to the events server due to suspecting we are
// offline. It is important for avoiding races with the presence
// system when coming back from unsuspend.
let suspect_offline = false;
export function set_suspect_offline(suspected: boolean): void {
suspect_offline = suspected;
}
export function suspects_user_is_offline(): boolean {
return suspect_offline;
}
/*
Our watchdog code checks every 5 seconds to make sure that we
haven't gone 20 seconds since the last "5-second-ago" check.
This sounds confusing, but it is just is a way to detect that
the machine has gone to sleep.
When we detect the condition we call back to server_events code
to reset ourselves accordingly.
*/
export function check_for_unsuspend(): void {
const new_time = Date.now();
if (new_time - watchdog_time > 20000) {
// 20 seconds.
// Defensively reset watchdog_time here in case there's an
// exception in one of the event handlers
watchdog_time = new_time;
// Our app's JS wasn't running, which probably means the machine was
// asleep.
for (const callback of unsuspend_callbacks) {
try {
callback();
} catch (error) {
blueslip.error(
`Error while executing callback '${
callback.name || "Anonymous function"
}' from unsuspend_callbacks.`,
undefined,
error,
);
}
}
}
watchdog_time = new_time;
}
export function on_unsuspend(f: () => void): void {
unsuspend_callbacks.push(f);
}
setInterval(check_for_unsuspend, 5000);