diff --git a/index.js b/index.js index 82b9107..76c17da 100644 --- a/index.js +++ b/index.js @@ -13,31 +13,35 @@ function parseJsonSafely(str) { } } +function onMessage (self, e) { + var message = parseJsonSafely(e.data); + if (!message) { + // Ignore - this message is not for us. + return; + } + var messageId = message[0]; + var error = message[1]; + var result = message[2]; + + var callback = self._callbacks[messageId]; + + if (!callback) { + // Ignore - user might have created multiple PromiseWorkers. + // This message is not for us. + return; + } + + delete self._callbacks[messageId]; + callback(error, result); +} + function PromiseWorker(worker) { var self = this; self._worker = worker; self._callbacks = {}; - worker.addEventListener('message', function onIncomingMessage(e) { - var message = parseJsonSafely(e.data); - if (!message) { - // Ignore - this message is not for us. - return; - } - var messageId = message[0]; - var error = message[1]; - var result = message[2]; - - var callback = self._callbacks[messageId]; - - if (!callback) { - // Ignore - user might have created multiple PromiseWorkers. - // This message is not for us. - return; - } - - delete self._callbacks[messageId]; - callback(error, result); + worker.addEventListener('message', function (e) { + self._onMessage(e); }); } @@ -58,7 +62,11 @@ PromiseWorker.prototype.postMessage = function (userMessage) { /* istanbul ignore if */ if (typeof self._worker.controller !== 'undefined') { // service worker - self._worker.controller.postMessage(jsonMessage); + var channel = new MessageChannel(); + channel.port1.onmessage = function (e) { + self._onMessage(e); + }; + self._worker.controller.postMessage(jsonMessage, [channel.port2]); } else { // web worker self._worker.postMessage(jsonMessage); diff --git a/register.js b/register.js index a65f738..86b31b1 100644 --- a/register.js +++ b/register.js @@ -16,7 +16,7 @@ function registerPromiseWorker(callback) { function postMessage(msg) { /* istanbul ignore if */ if (typeof self.postMessage !== 'function') { // service worker - e.source.postMessage(msg); + e.ports[0].postMessage(msg); } else { // web worker self.postMessage(msg); }