@@ -37,6 +37,15 @@ console.debug('Initializing worker');
3737
3838 const worker_result = await fn(arg, event.ports[0]);
3939
40+ // For channel tasks, yield the event loop before posting the result.
41+ // Channel messages (sent via MessagePort.postMessage during execution)
42+ // and the task result (sent via self.postMessage) travel on independent
43+ // message paths. Without this yield, the main thread may receive the
44+ // result before all channel messages have been delivered.
45+ if (is_channel) {
46+ await new Promise(resolve => setTimeout(resolve, 0));
47+ }
48+
4049 // Send response back to be handled by callback in main thread.
4150 console.debug('Send worker result');
4251 self.postMessage({ id: id, response: worker_result });
@@ -103,6 +112,12 @@ initHandler = async function(event) {
103112
104113 const worker_result = await fn(arg, event.ports[0]);
105114
115+ // For channel tasks, yield the event loop before posting the result.
116+ // See comment in WORKER_JS for rationale.
117+ if (is_channel) {
118+ await new Promise(resolve => setTimeout(resolve, 0));
119+ }
120+
106121 // Send response back to be handled by callback in main thread.
107122 console.debug('Send worker result');
108123 self.postMessage({ id: id, response: worker_result });
0 commit comments