Created
February 1, 2023 19:44
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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