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
All checks were successful
Build and Push Docker Image / docker (push) Successful in 9s
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user