[Расширение Chrome - Socket.io]: сокет не определен после того, как он был использован для открытия соединения - PullRequest
0 голосов
/ 10 июля 2019

У меня проблема с сокетом, открытым из скрипта контента.Библиотека 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, нельзя использовать повторно в другой.Спасибо, сообщество!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...