Skip to content

Commit 1afc0be

Browse files
authored
Fix scope issues (#9)
* Incorporate changes from #5, avoiding fetch re-mocking and fixing self.onmessage assignment. * lint fixes
1 parent e6dbad0 commit 1afc0be

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

src/index.js

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ if (!global.URL.$$objects) {
1010
global.URL.$$objects[id] = blob;
1111
return `blob:http://localhost/${id}`;
1212
};
13+
}
1314

15+
if (!global.fetch || !global.fetch.jsdomWorker) {
1416
let oldFetch = global.fetch || fetch;
1517
global.fetch = function(url, opts) {
1618
if (url.match(/^blob:/)) {
@@ -29,6 +31,7 @@ if (!global.URL.$$objects) {
2931
}
3032
return oldFetch.call(this, url, opts);
3133
};
34+
global.fetch.jsdomWorker = true;
3235
}
3336

3437
if (!global.document) {
@@ -46,26 +49,31 @@ if (!global.document.createEvent) {
4649

4750

4851
global.Worker = function Worker(url) {
49-
let messageQueue = [],
50-
inside = mitt(),
51-
outside = mitt(),
52-
scope = {
53-
onmessage: null,
54-
dispatchEvent: inside.emit,
55-
addEventListener: inside.on,
56-
removeEventListener: inside.off,
57-
postMessage(data) {
58-
outside.emit('message', { data });
59-
},
60-
fetch: global.fetch,
61-
importScripts() {}
52+
let getScopeVar;
53+
let messageQueue = [];
54+
let inside = mitt();
55+
let outside = mitt();
56+
let scope = {
57+
onmessage: null,
58+
dispatchEvent: inside.emit,
59+
addEventListener: inside.on,
60+
removeEventListener: inside.off,
61+
postMessage(data) {
62+
outside.emit('message', { data });
6263
},
63-
getScopeVar;
64-
inside.on('message', e => { let f = getScopeVar('onmessage'); if (f) f.call(scope, e); });
64+
fetch: global.fetch,
65+
importScripts() {}
66+
};
67+
inside.on('message', e => {
68+
let f = scope.onmessage || getScopeVar('onmessage');
69+
if (f) f.call(scope, e);
70+
});
6571
this.addEventListener = outside.on;
6672
this.removeEventListener = outside.off;
6773
this.dispatchEvent = outside.emit;
68-
outside.on('message', e => { this.onmessage && this.onmessage(e); });
74+
outside.on('message', e => {
75+
if (this.onmessage) this.onmessage(e);
76+
});
6977
this.postMessage = data => {
7078
if (messageQueue!=null) messageQueue.push(data);
7179
else inside.emit('message', { data });
@@ -74,8 +82,8 @@ global.Worker = function Worker(url) {
7482
throw Error('Not Supported');
7583
};
7684
global.fetch(url)
77-
.then( r => r.text() )
78-
.then( code => {
85+
.then(r => r.text())
86+
.then(code => {
7987
let vars = 'var self=this,global=self';
8088
for (let k in scope) vars += `,${k}=self.${k}`;
8189
getScopeVar = Function(
@@ -85,5 +93,8 @@ global.Worker = function Worker(url) {
8593
messageQueue = null;
8694
q.forEach(this.postMessage);
8795
})
88-
.catch( e => { outside.emit('error', e); console.error(e); });
96+
.catch(e => {
97+
outside.emit('error', e);
98+
console.error(e);
99+
});
89100
};

0 commit comments

Comments
 (0)