refactor: enhance session management and room joining logic in WebSocket handling
All checks were successful
Build and Push Docker Image / docker (push) Successful in 9s

This commit is contained in:
2025-09-04 18:22:30 +02:00
parent a63c5858f7
commit 33aa410c09
8 changed files with 199 additions and 18 deletions

View File

@@ -4,6 +4,8 @@ let ws;
let reconnectAttempts = 0;
let reconnectTimer = null;
const outbox = [];
let sessionId = localStorage.getItem('sessionId') || null;
let lastRoomId = localStorage.getItem('lastRoomId') || null;
function wsIsOpen() { return ws && ws.readyState === WebSocket.OPEN; }
function sendMsg(obj) {
if (wsIsOpen()) ws.send(JSON.stringify(obj));
@@ -23,6 +25,10 @@ function connectWS() {
ws = new WebSocket(url);
ws.addEventListener('open', () => {
reconnectAttempts = 0;
// Try to resume session immediately
if (sessionId) {
try { ws.send(JSON.stringify({ type: 'resume', sessionId })); } catch {}
}
// Flush queued messages
setTimeout(() => {
while (outbox.length && wsIsOpen()) {
@@ -89,6 +95,7 @@ function showRoom() { $lobby.classList.add('hidden'); $room.classList.remove('hi
function renderRoom(room) {
state.room = room;
try { if (room?.id) { lastRoomId = room.id; localStorage.setItem('lastRoomId', room.id); } } catch {}
if (!room) { showLobby(); return; }
showRoom();
$roomId.textContent = room.id;
@@ -241,6 +248,10 @@ function handleMessage(ev) {
const msg = JSON.parse(ev.data);
if (msg.type === 'connected') {
state.playerId = msg.playerId;
if (msg.sessionId && !sessionId) {
sessionId = msg.sessionId;
try { localStorage.setItem('sessionId', sessionId); } catch {}
}
// Try to auto-apply stored name
const stored = localStorage.getItem('playerName');
if (stored) {
@@ -252,8 +263,28 @@ function handleMessage(ev) {
}
sendMsg({ type: 'set_name', name: stored });
}
// Try to rejoin room if known
if (state.room?.id) sendMsg({ type: 'join_room', code: state.room.id });
// If we already have a sessionId, we'll resume instead of auto-joining here
if (!sessionId) {
const code = state.room?.id || lastRoomId || localStorage.getItem('lastRoomId');
if (code) sendMsg({ type: 'join_room', code });
}
}
if (msg.type === 'resume_result') {
if (msg.ok) {
if (msg.playerId) state.playerId = msg.playerId;
// If we have a known room, ensure we rejoin it
if (msg.roomId) {
// Update local roomId (we will receive a room_update shortly)
sendMsg({ type: 'join_room', code: msg.roomId });
} else {
const code = state.room?.id || lastRoomId || localStorage.getItem('lastRoomId');
if (code) sendMsg({ type: 'join_room', code });
}
} else {
// If resume failed, try to rejoin by last room code
const code = state.room?.id || lastRoomId || localStorage.getItem('lastRoomId');
if (code) sendMsg({ type: 'join_room', code });
}
}
if (msg.type === 'room_update') {
renderRoom(msg.room);