Почему мой ShardWorker не работает в Firefox, но работает в Google Chrome

Наконец-то я реализовал запуск SSE-событий, отправляемых сервером, в Shared Worker. Эта реализация позволила мне ограничить общее количество сценариев, запущенных на сервере, по одному на пользователя.

Однако у меня все еще есть пара проблем.

  1. SharedWorker вообще не работает в FireFox, но работает в Google Chrome. Я использую Firefox v40.0. Я не получаю никаких ошибок в консоли. Я вижу предупреждение в консоли о сертификате SSL, но ошибок нет. Вот предупреждение от консоли FireFox

Этот сайт использует Сертификат SHA-1; Рекомендуется использовать сертификаты с алгоритмами подписи, которые используют хэш-функции сильнее, чем SHA-1.[Узнать больше]

  1. Кажется, что ShardWorker перестает работать через некоторое время простоя. Это не проблема PHP-скрипта, так как скрипт работает с файлом без общего работника. Я сталкиваюсь с этой проблемой с Chrome v44.0. Для того, чтобы снова начать работу надзирателя, мне нужно перезагрузить страницу.

Что я могу сделать, чтобы выяснить, что может вызвать остановку ShardWorker? Почему нет SharedWorder работает в FireFox?

Вот моя реализация

Это код, который называется SharedWorker

$(window).load(function(){
    //establish connection to the shared worker
    var worker = new SharedWorker("/add-ons/icws/js/worker.js");
    //listen for a message send from the worker
    worker.port.addEventListener("message",
        function(event) {
            console.log(event.data);
            processServerData(event.data);
        }
        , false
    );

    //start the connection to the shared worker
    worker.port.start();
});

Вот код для worker.js

var clients = new Array();

//runs only when a new connection starts
self.onconnect = function(event) {

    var port = event.ports[0];
    clients.push(port);
    port.start();

    //implement a channel for a communication between the connecter and the SharedWorker
    port.addEventListener("message",
        function(event) { 
            replyToClientMessage(event, port);
        } , false
    );

}

//reply to any message sent to the SharedWorker with the same message but add the phrase "SharedWorker Said: " to it
replyToClientMessage = function (event, port) {
    port.postMessage(event.data);

}

readNewMessages();

//runs every time and post the message to all the connected client
 function readNewMessages(){
    var serv = new EventSource('/add-ons/icws/poll.php');
        serv.addEventListener("getMessagingQueue", function(event) {

        var queue = JSON.parse(event.data);
        notifyAllPorts(queue);

    }, false);
}

//check all open clients and post a message to each
 function notifyAllPorts(msg){

    var len = clients.length;
    var port;

    for(i = 0; i < len; i++) {
        port = clients[i];
        port.postMessage(msg);
    }
}

1 ответ

Это невозможно. EventSource является собственностью window объект. window недоступно для Worker, См. Возможности, доступные для работников

Работники не имеют доступа к:

  • DOM (это не потокобезопасно)
  • Объект окна
  • Объект документа
  • Родительский объект
Другие вопросы по тегам