Skip to content

Commit eeb92bb

Browse files
author
Avaer Kazmer
committed
Make postMessage across window boundaries synchronous
1 parent f31ce00 commit eeb92bb

File tree

4 files changed

+53
-50
lines changed

4 files changed

+53
-50
lines changed

src/Window.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -687,21 +687,25 @@ self.onrunasync = req => {
687687
switch (method) {
688688
case 'tickAnimationFrame': {
689689
self.tickAnimationFrame(req);
690-
return Promise.resolve();
690+
break;
691691
}
692692
case 'enterXr': {
693693
console.log('handle enter xr', GlobalContext.id);
694694
self.vrdisplaypresentchange();
695-
return Promise.all(windows.map(win => win.runAsync({
696-
method: 'enterXr',
697-
}))).then(() => {});
695+
for (let i = 0; i < windows.length; i++) {
696+
windows[i].runAsync({
697+
method: 'enterXr',
698+
});
699+
}
698700
break;
699701
}
700702
case 'exitXr': {
701703
self.vrdisplaypresentchange();
702-
return Promise.all(windows.map(win => win.runAsync({
703-
method: 'exitXr',
704-
}))).then(() => {});
704+
for (let i = 0; i < windows.length; i++) {
705+
windows[i].runAsync({
706+
method: 'exitXr',
707+
});
708+
}
705709
break;
706710
}
707711
case 'response': {
@@ -710,10 +714,8 @@ self.onrunasync = req => {
710714
if (keypath.length === 0) {
711715
if (vrPresentState.responseAccepts.length > 0) {
712716
vrPresentState.responseAccepts.shift()(req);
713-
714-
return Promise.resolve();
715717
} else {
716-
return Promise.reject(new Error(`unexpected response at window ${method}`));
718+
throw new Error(`unexpected response at window ${method}`);
717719
}
718720
} else {
719721
const windowId = keypath.pop();
@@ -729,8 +731,8 @@ self.onrunasync = req => {
729731
} else {
730732
console.warn('ignoring unknown response', req, {windowId});
731733
}
732-
return Promise.resolve();
733734
}
735+
break;
734736
}
735737
/* case 'keyEvent': {
736738
const {event} = request;
@@ -806,9 +808,11 @@ self.onrunasync = req => {
806808
}
807809
break;
808810
} */
809-
case 'eval': // used in tests
810-
return Promise.resolve([(0, eval)(req.scriptString), []]);
811+
case 'eval': {// used in tests
812+
(0, eval)(req.scriptString);
813+
break;
814+
}
811815
default:
812-
return Promise.reject(new Error(`invalid window async request: ${JSON.stringify(req)}`));
816+
throw new Error(`invalid window async request: ${JSON.stringify(req)}`);
813817
}
814818
};

src/WindowBase.js

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ const _oninitmessage = async e => {
141141
self._onbootstrap = undefined;
142142
};
143143
self._postMessageUp = function _postMessageUp(data, transfer) {
144-
messagePort.postMessage(data, transfer);
144+
messagePort.postMessageSync(data, transfer);
145145
};
146146
const _onmessageHandle = e => {
147147
const {data: m} = e;
@@ -163,26 +163,23 @@ const _oninitmessage = async e => {
163163
break;
164164
}
165165
case 'runAsync': {
166-
let result, err;
166+
let resultSpec, err;
167167
try {
168-
result = self.onrunasync ? self.onrunasync(m.request) : null;
168+
resultSpec = self.onrunasync ? self.onrunasync(m.request) : null;
169169
} catch(e) {
170170
err = e.stack;
171171
}
172172
if (!err) {
173-
Promise.resolve(result)
174-
.then(resultSpec => {
175-
let result, transfers;
176-
if (resultSpec) {
177-
result = resultSpec[0];
178-
transfers = resultSpec[1];
179-
}
180-
self._postMessageUp({
181-
method: 'response',
182-
requestKey: m.requestKey,
183-
result,
184-
}, transfers);
185-
});
173+
let result, transfers;
174+
if (resultSpec) {
175+
result = resultSpec[0];
176+
transfers = resultSpec[1];
177+
}
178+
self._postMessageUp({
179+
method: 'response',
180+
requestKey: m.requestKey,
181+
result,
182+
}, transfers);
186183
} else {
187184
self._postMessageUp({
188185
method: 'response',

src/WindowVm.js

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ class WorkerVm extends EventTarget {
8787
});
8888

8989
const messageChannel = new MessageChannel2();
90+
messageChannel.port2.postMessageSync = (data, transfers) => {
91+
messageChannel.port1.dispatchEvent(new MessageEvent('message', {data}));
92+
};
93+
messageChannel.port1.postMessageSync = (data, transfers) => {
94+
messageChannel.port2.dispatchEvent(new MessageEvent('message', {data}));
95+
};
9096
messageChannel.port1.addEventListener('message', e => {
9197
const {data: m} = e;
9298
switch (m.method) {
@@ -145,7 +151,7 @@ class WorkerVm extends EventTarget {
145151
messageChannel.port1.start();
146152

147153
iframe._postMessageDown = function _postMessageDown(data, transfer) {
148-
messageChannel.port1.postMessage(data, transfer);
154+
messageChannel.port1.postMessageSync(data, transfer);
149155
};
150156
iframe.cleanup = () => {
151157
iframe.contentWindow.removeEventListener('postmessage', _postmessage);
@@ -185,20 +191,21 @@ class WorkerVm extends EventTarget {
185191
});
186192
}
187193
runAsync(request, transferList) {
188-
return new Promise((accept, reject) => {
189-
const requestKey = this.queueRequest((err, result) => {
190-
if (!err) {
191-
accept(result);
192-
} else {
193-
reject(err);
194-
}
195-
});
196-
this.iframe._postMessageDown({
197-
method: 'runAsync',
198-
request,
199-
requestKey,
200-
}, transferList);
194+
let result, error;
195+
const requestKey = this.queueRequest((err, res) => {
196+
error = err;
197+
result = res;
201198
});
199+
this.iframe._postMessageDown({
200+
method: 'runAsync',
201+
request,
202+
requestKey,
203+
}, transferList);
204+
if (!error) {
205+
return result;
206+
} else {
207+
throw error;
208+
}
202209
}
203210
postMessage(message, transferList) {
204211
this.iframe._postMessageDown({

src/index.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,7 @@ const _tickAnimationFrame = win => {
453453
return win.runAsync({
454454
method: 'tickAnimationFrame',
455455
layered: true,
456-
})
457-
.catch(err => {
458-
if (err.code !== 'ECANCEL') {
459-
console.warn(err);
460-
}
461-
});
456+
});
462457
};
463458
const _tickAnimationFrames = () => {
464459
for (let i = 0; i < windows.length; i++) {

0 commit comments

Comments
 (0)