diff --git a/extension/background.js b/extension/background.js index d313830..4e533c5 100644 --- a/extension/background.js +++ b/extension/background.js @@ -409,10 +409,12 @@ function handleServerEvent(event, data) { if (data.status === 'joined') { if (!currentRoom.peers.find(p => (p.peerId || p) === data.peerId)) { currentRoom.peers.push({ peerId: data.peerId, username: data.username, tabTitle: data.tabTitle }); + if (storageInitialized) chrome.storage.session.set({ currentRoom }); chrome.runtime.sendMessage({ type: 'PEER_UPDATE', peers: currentRoom.peers }).catch(() => {}); } } else if (data.status === 'left') { currentRoom.peers = currentRoom.peers.filter(p => (p.peerId || p) !== data.peerId); + if (storageInitialized) chrome.storage.session.set({ currentRoom }); chrome.runtime.sendMessage({ type: 'PEER_UPDATE', peers: currentRoom.peers }).catch(() => {}); } else { // Heartbeat/Update: Update tabTitle for matching @@ -426,6 +428,7 @@ function handleServerEvent(event, data) { const idx = currentRoom.peers.indexOf(peer); currentRoom.peers[idx] = { peerId: data.peerId, username: data.username, tabTitle: data.tabTitle }; } + if (storageInitialized) chrome.storage.session.set({ currentRoom }); chrome.runtime.sendMessage({ type: 'PEER_UPDATE', peers: currentRoom.peers }).catch(() => {}); } } @@ -556,9 +559,29 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { useCustomServer: !!useCustomServer, serverUrl: serverUrl || '' }, () => { - connect(); - // We wait for status update in handleServerEvent + if (socket && socket.readyState === WebSocket.OPEN && isNamespaceJoined) { + // FORCE TRANSITION: Emit Join Room directly if already connected + emit(EVENTS.JOIN_ROOM, { + roomId, + password, + peerId, + username: message.username || '', // Use username if provided by bridge + protocolVersion: PROTOCOL_VERSION + }); + addLog(`Joining room via link: ${roomId}`, 'info'); + } else { + connect(); + } }); + } else if (message.type === 'REGENERATE_ID') { + const newId = self.crypto.randomUUID().substring(0, 8); + chrome.storage.local.set({ peerId: newId }, () => { + peerId = newId; + addLog(`Identity regenerated: ${newId}`, 'success'); + if (socket) socket.close(); // Force reconnect with new ID + sendResponse({ peerId: newId }); + }); + return true; } else if (message.type === 'GET_VIDEO_STATE') { const { tabId } = message; if (!tabId) { diff --git a/extension/popup.html b/extension/popup.html index 1a95e1f..d110c89 100644 --- a/extension/popup.html +++ b/extension/popup.html @@ -315,6 +315,12 @@

• Username helps others identify you.

• Noise filtering uses a blacklist to hide common non-video sites (e.g. Search, Social Media) from the Target Tab selector.

+ +
+ + +

Use this if you see "Duplicate Identity" errors.

+
diff --git a/extension/popup.js b/extension/popup.js index 3b38951..78067d4 100644 --- a/extension/popup.js +++ b/extension/popup.js @@ -31,6 +31,7 @@ const elements = { roomInfo: document.getElementById('roomInfo'), inviteLink: document.getElementById('inviteLink'), filterNoise: document.getElementById('filterNoise'), + regenId: document.getElementById('regenId'), historyList: document.getElementById('historyList'), copyLogs: document.getElementById('copyLogs'), createRoomBtn: document.getElementById('createRoomBtn'), @@ -42,7 +43,6 @@ const elements = { sectionActive: document.getElementById('section-active'), activeRoomId: document.getElementById('activeRoomId'), activeServer: document.getElementById('activeServer'), - peerList: document.getElementById('peerList'), peerListSync: document.getElementById('peerListSync'), videoDebug: document.getElementById('videoDebug'), playBtn: document.getElementById('playBtn'), diff --git a/server/index.js b/server/index.js index adf77b7..080935b 100644 --- a/server/index.js +++ b/server/index.js @@ -222,8 +222,10 @@ io.on('connection', (socket) => { if (data.peerId === peerId && sid !== socket.id) { const oldSocket = io.sockets.sockets.get(sid); if (oldSocket) { + oldSocket.emit(EVENTS.ERROR, { message: 'Deduplication: Another session with this ID joined. Disconnecting...' }); oldSocket.leave(roomId); - socketToRoom.delete(sid); + oldSocket.disconnect(true); + log('DEDUPE', `Kicked old session for peer ${peerId}`); } room.peers.delete(sid); room.peerIds.delete(sid);