Skip to content

Commit

Permalink
Use MessageChannel to support Chrome <51, test with localtunnel.me fo…
Browse files Browse the repository at this point in the history
…r https
  • Loading branch information
nolanlawson committed Jul 20, 2016
1 parent c7a74f4 commit c60ba24
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 39 deletions.
11 changes: 7 additions & 4 deletions .zuul.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
ui: mocha-bdd
tunnel:
type: localtunnel
https: true
browsers:
- name: chrome
version: 50..latest
version: 42..latest
- name: firefox
version: 45..latest
- name: safari
version: [7, 8, 9..latest]
version: [8, 9..latest]
- name: ie
version: 10..latest
- name: microsoftedge
version: 13..latest
- name: iphone
version: [7.0, 8.4, 9.2]
version: [8.4, 9.2]
- name: ipad
version: [7.0, 8.4, 9.2]
version: [8.4, 9.2]
- name: android
version: 4.4..latest
53 changes: 31 additions & 22 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
onMessage(self, e);
});
}

Expand All @@ -57,8 +61,13 @@ PromiseWorker.prototype.postMessage = function (userMessage) {
var jsonMessage = JSON.stringify(messageToSend);
/* istanbul ignore if */
if (typeof self._worker.controller !== 'undefined') {
// service worker
self._worker.controller.postMessage(jsonMessage);
// service worker, use MessageChannels because e.source is broken in Chrome < 51:
// https://bugs.chromium.org/p/chromium/issues/detail?id=543198
var channel = new MessageChannel();
channel.port1.onmessage = function (e) {
onMessage(self, e);
};
self._worker.controller.postMessage(jsonMessage, [channel.port2]);
} else {
// web worker
self._worker.postMessage(jsonMessage);
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@
"run-scripts": "^0.4.0",
"stream-to-promise": "^1.1.0",
"uglify-js": "^2.7.0",
"zuul": "^3.10.1"
"zuul": "^3.10.1",
"zuul-localtunnel": "nolanlawson/zuul-localtunnel#https"
},
"dependencies": {
"is-promise": "^2.1.0",
Expand Down
2 changes: 1 addition & 1 deletion register.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
12 changes: 1 addition & 11 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ describe('service worker test suite', function () {
return;
}

var failed;
var worker;

before(function () {
Expand All @@ -209,16 +208,10 @@ describe('service worker test suite', function () {
});
}).then(function (theWorker) {
worker = theWorker;
}).catch(function (err) {
console.log('failed to install service worker, bailing out', err);
failed = true;
});
});

it('echoes a message', function () {
if (failed) {
return;
}
var promiseWorker = new PromiseWorker(worker);

return promiseWorker.postMessage('ping').then(function (res) {
Expand All @@ -227,9 +220,6 @@ describe('service worker test suite', function () {
});

it('echoes a message multiple times', function () {
if (failed) {
return;
}
var promiseWorker = new PromiseWorker(worker);

var words = [
Expand All @@ -245,4 +235,4 @@ describe('service worker test suite', function () {
}));
});

});
});

0 comments on commit c60ba24

Please sign in to comment.