32 lines
941 B
JavaScript
32 lines
941 B
JavaScript
// 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;
|
||
|
|
}
|