// 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; }