diff --git a/extension/background.js b/extension/background.js index c80006e..7dd01f7 100644 --- a/extension/background.js +++ b/extension/background.js @@ -15,7 +15,6 @@ let pendingHistory = []; let eventQueue = []; let isNamespaceJoined = false; let lastActionState = { action: null, senderId: null, timestamp: 0, acks: [] }; -let commandSenderMap = new Map(); // tabId -> senderId (tracks who initiated each command per tab) // --- Boot Sequence Lock --- let restorationTask = null; @@ -908,14 +907,15 @@ async function routeToContent(action, payload) { const tabId = parseInt(currentTabId); if (isNaN(tabId)) return; - commandSenderMap.set(tabId, payload?.senderId || null); const actionTimestamp = payload?.actionTimestamp || Date.now(); + const commandSenderId = payload?.senderId || null; chrome.tabs.sendMessage(tabId, { type: 'SERVER_COMMAND', action, payload, - actionTimestamp + actionTimestamp, + commandSenderId }).catch(err => { if (err.message.includes('Receiving end does not exist') || err.message.includes('Extension context invalidated')) { chrome.scripting.executeScript({ @@ -925,12 +925,10 @@ async function routeToContent(action, payload) { setTimeout(() => routeToContent(action, payload), 500); }).catch(_err => { addLog(`Auto-reinject failed for tab ${tabId}`, 'warn'); - commandSenderMap.delete(tabId); }); } else { addLog(`Content Script not responding in tab ${tabId}`, 'warn'); currentTabId = null; - commandSenderMap.delete(tabId); updateBadgeStatus(); } }); @@ -1200,8 +1198,7 @@ async function handleAsyncMessage(message, sender, sendResponse) { } sendResponse({ status: 'ok' }); } else if (message.type === 'CMD_ACK') { - const tabId = sender.tab ? sender.tab.id : null; - const commandSenderId = tabId ? commandSenderMap.get(tabId) : null; + const commandSenderId = message.commandSenderId; if (commandSenderId && commandSenderId !== peerId) { emit(EVENTS.EVENT_ACK, { senderId: peerId, diff --git a/extension/content.js b/extension/content.js index 60c5de3..8fe3ec7 100644 --- a/extension/content.js +++ b/extension/content.js @@ -280,15 +280,15 @@ if (action === EVENTS.PLAY) { tryMediaAction(EVENTS.PLAY); - chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp }); + chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp, commandSenderId: message.commandSenderId }); actionCompleted = true; } else if (action === EVENTS.PAUSE) { tryMediaAction(EVENTS.PAUSE); - chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp }); + chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp, commandSenderId: message.commandSenderId }); actionCompleted = true; } else if (action === EVENTS.SEEK) { tryMediaAction(EVENTS.SEEK, payload); - chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp }); + chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp, commandSenderId: message.commandSenderId }); actionCompleted = true; } else if (action === EVENTS.FORCE_SYNC_PREPARE) { if (!payload || payload.targetTime === undefined) return; @@ -312,9 +312,9 @@ }).catch(() => {}); } } else if (action === EVENTS.FORCE_SYNC_EXECUTE) { - stopLobbyPoll(); // Clear any pending lobby on force sync + stopLobbyPoll(); tryMediaAction(EVENTS.PLAY); - chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp }); + chrome.runtime.sendMessage({ type: 'CMD_ACK', actionTimestamp: message.actionTimestamp, commandSenderId: message.commandSenderId }); actionCompleted = true; }