У меня проблема с сокетом, открытым из скрипта контента.Библиотека Socket.io внедряется как файл сценария содержимого, и сокет инициализируется сверху:
content_script.js
let socket;
, но значение не назначается допользователь нажимает Открытое соединение из интерфейса пользователя:
popup.js
document.querySelector('#open-connection').addEventListener('click', () => {
port.postMessage({
"from": "popup",
"openConnection": true
});
});
background.js
if (o.from === 'popup' && o.openConnection === true) {
chrome.tabs.executeScript(null, {
// the first check below is executed in content_scrip.js
// so now we should be able to use socket
code: `
if (typeof socket === 'undefined' || !socket) {
socket = io('http://localhost:3003'); // connection registers fine
}
socket.on('joinRequest', (res) => {
chrome.runtime.sendMessage({message: "sessionStarted"});
})
socket.on('error', (payload) => {
chrome.runtime.sendMessage({message: "error", payload: payload});
})
`
}, callback);
}
В этот момент сокет подключается к серверу, сервер регистрирует новое соединение и отправляет обратно сообщение joinRequest, чтобы подтвердить, что соединение установлено.Затем скрипт содержимого отправляет сообщение sessionStarted в popup.js (как показано выше)
popup.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.message === 'sessionStarted') {
document.getElementById('disconnect-button')
.classList
.toggle('hidden');
}}
...
// clicking on this button should send a message to background.js
document.querySelector('#disconnect-button').addEventListener('click', () => {
port.postMessage({
"from": "popup",
"req": 'disconnect'
});
})
background.js
if (msg.from === 'popup' && msg.req === 'disconnect') {
chrome.tabs.executeScript(null, {
code: `socket.emit('disconnect');`
}, callback);
}
Это нормально работает до того момента, когда я нажимаю кнопку отключения - тогда ничего не происходит, и я получаю сообщение об ошибке, говоря, что сокет undefined .Если я реализую следующую проверку
if (typeof socket === 'undefined' || !socket) {
socket = io('http://localhost:3003');
}
, а затем нажму кнопку Отключить - это создаст другое соединение с сокетом, и это второе соединение запрашивает отключение, а первое остается открытым.
Оцените всена этот счет, поскольку я прожег 2 дня, пытаясь выяснить, почему сокет, инициированный в одной части background.js, нельзя использовать повторно в другой.Спасибо, сообщество!