Files
hitstar/public/js/ws.js
Elmar Kresse 8c5ca0044f
All checks were successful
Build and Push Docker Image / docker (push) Successful in 21s
Refactor code structure for improved readability and maintainability
2025-09-04 21:53:54 +02:00

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 {}
}