Skip to content

Instantly share code, notes, and snippets.

@tlively
Created February 1, 2023 19:44
Show Gist options
  • Save tlively/4216eecc8286381d9746a4c928c0b4c5 to your computer and use it in GitHub Desktop.
Save tlively/4216eecc8286381d9746a4c928c0b4c5 to your computer and use it in GitHub Desktop.
Repro showing that relaying messages via a worker does not work in FireFox
<script>
console.log('Starting up');
var receiverCode = '(' + (() => {
console.log('Hello from receiver');
self.onmessage = (msg) => {
if (typeof msg.data === 'string') {
console.log('received from main:', msg.data);
} else {
var relay = msg.data.relay;
console.log('receiver received port');
relay.onmessage = (m) => {
console.log('received from relay:', m.data);
};
}
};
}).toString() + ')()';
var relayCode = '(' + (() => {
console.log('Hello from relay');
self.onmessage = (msg) => {
var sender = msg.data.sender;
var receiver = msg.data.receiver;
console.log('relay received ports');
sender.onmessage = (m) => {
console.log('worker relaying', m.data);
receiver.postMessage(m.data);
};
};
}).toString() + ')()';
var senderCode = '(' + (() => {
console.log('Hello from sender');
self.onmessage = (msg) => {
var relay = msg.data.relay;
console.log('sender received port');
relay.postMessage('hi via relay');
self.postMessage('hi via main');
// Spin to emulate synchronously waiting for the message to be
// received.
while (1) {}
};
}).toString() + ')()';
var uri = (code) => 'data:text/javascript,' + encodeURIComponent(code);
var receiver = new Worker(uri(receiverCode), {name: 'receiver'});
var relay = new Worker(uri(relayCode), {name: 'relay'});
var sender = new Worker(uri(senderCode), {name: 'sender'});
sender.onmessage = (m) => {
console.log('main relaying', m.data);
receiver.postMessage(m.data);
};
console.log('sending ports');
var senderChannel = new MessageChannel();
var receiverChannel = new MessageChannel();
sender.postMessage({
relay: senderChannel.port1
}, [senderChannel.port1]);
relay.postMessage({
sender: senderChannel.port2,
receiver: receiverChannel.port1
}, [senderChannel.port2, receiverChannel.port1]);
receiver.postMessage({
relay: receiverChannel.port2
}, [receiverChannel.port2]);
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment