Files
devdesk/web/src/shared.js
T

32 lines
941 B
JavaScript
Raw Normal View History

// One tab polls for every open DevDesk tab (devdesk#8): whoever fetches the
// session list or the alerts broadcasts the result, and a tab that heard a fresh
// result recently skips its own poll. Each poll costs a ttyd client and a PTY.
const channel = typeof BroadcastChannel === 'function' ? new BroadcastChannel('devdesk') : null;
const heard = new Map();
const handlers = new Map();
channel?.addEventListener('message', (event) => {
const { key, data } = event.data ?? {};
const handler = handlers.get(key);
if (!handler) return;
heard.set(key, Date.now());
handler(data);
});
export function onShared(key, handler) {
handlers.set(key, handler);
}
export function share(key, data) {
try {
channel?.postMessage({ key, data });
} catch {
// Not cloneable or channel closed: the other tabs just poll themselves.
}
}
export function heardWithin(key, ms) {
return Date.now() - (heard.get(key) ?? 0) < ms;
}