All checks were successful
Build and Push Docker Image / docker (push) Successful in 21s
59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
// 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 {}
|
|
}
|