// Assumes socket.io client library is loaded globally as io let socket; const outbox = []; let sessionId = localStorage.getItem('sessionId') || null; let _lastRoomId = localStorage.getItem('lastRoomId') || null; export function wsIsOpen() { return !!socket?.connected; } export function sendMsg(obj) { if (wsIsOpen()) socket.emit('message', obj); else outbox.push(obj); } export function connectWS(onMessage) { // Establish Socket.IO connection in websocket-only mode socket = window.io({ transports: ['websocket'] }); socket.on('connect', () => { // Try to resume session immediately on (re)connect if (sessionId) { try { socket.emit('message', { type: 'resume', sessionId }); } catch {} } // flush queued setTimeout(() => { while (outbox.length && wsIsOpen()) { try { socket.emit('message', outbox.shift()); } catch { break; } } }, 50); }); socket.on('message', (msg) => { // Adapt to previous onmessage(ev) signature used by main.js const ev = { data: JSON.stringify(msg) }; onMessage(ev); }); // Socket.IO handles reconnection internally; no manual timers required } // Helpers to update cached ids from other modules export function cacheSessionId(id) { if (!id) return; sessionId = id; try { localStorage.setItem('sessionId', id); } catch {} } export function cacheLastRoomId(id) { if (!id) return; _lastRoomId = id; try { localStorage.setItem('lastRoomId', id); } catch {} }