export function connectWs(onMessage) { let ws, retry = 0, closed = false; function open() { const proto = location.protocol === 'https:' ? 'wss' : 'ws'; ws = new WebSocket(`${proto}://${location.host}/ws`); ws.addEventListener('open', () => { retry = 0; }); ws.addEventListener('message', (ev) => { try { onMessage(JSON.parse(ev.data)); } catch {} }); ws.addEventListener('close', () => { if (closed) return; retry = Math.min(retry + 1, 6); setTimeout(open, 500 * 2 ** retry); }); ws.addEventListener('error', () => ws.close()); } open(); return { send(msg) { if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify(msg)); }, close() { closed = true; ws?.close(); } }; }