BroadcastChannel doesn't fill in useful MessageEvent fields like source, or ports
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 122k
- Forks
- 37.3k
- Avg merge
- 4d 2h
- Merged PRs (30d)
- 283
Description
Please populate the Worker value in BroadcastChannel MessageEvents 'source' field the same way it is in WebWorkers.
There is currently no mechanism to compose Workers in the NodeJS APIs and this change would provide a mechanism to
solve that problem, if not for the general case, at least with only a small amount of additional bookkeeping on the part of
application developers.
Without a composition mechanism, it is extremely difficult to implement cross-cutting concerns between workers, and between workers and large subsystems in the main application. Which is problematic for many areas of production code including caching, telemetry, reloadable configuration, and security.
Fundamentally, there is no mechanism to tell if a Worker has terminated. And since Workers tend to be used for tasks with high utilization of the event toop, even sending a message to ask if anyone is still listening to the BroadcastChannel is not guaranteed to work on any reasonable time frame, and in particular for cross-cutting concerns who can't know what, for instance, the cutoff time is for image processing in the Image Worker, and that the Cache Worker has a cutoff of 1/100th of that time. Which then leads to a scenario where you've decided a Worker is dead and then the same worker pops back up 10 seconds later. What you need is worker.on('exit') which is unambiguous.
Version
All versions
Platform
All Platforms
Subsystem
node:worker_threads
What steps will reproduce the bug?
const util = require('util');
const channel = new BroadcastChannel('example');
if (isMainThread) {
channel.addEventListener('message', evt => {
console.log(util.inspect(evt)); // breakpoint here
});
} else {
channel.postMessage('hello');
}
The Message Event recieved looks like
MessageEvent {
type: 'message',
defaultPrevented: false,
cancelable: false,
timeStamp: 444.018666
}
How often does it reproduce? Is there a required condition?
Always. Seems to be by design, and the design may have drifted from the current web standards over time.
What is the expected behavior? Why is that the expected behavior?
That I get a Worker object to facilitate lifecycle management and IPC coordination.
What do you see instead?
empty string, empty array. And no other mechanism in the Node API to interrogate the running isolates to find this information.
Additional information
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at the node:worker_threads BroadcastChannel entry point and reproduce the MessageEvent output from the provided example. Compare its source and ports fields with the WebWorkers behavior described in the issue, then verify that the resulting event exposes the requested Worker information and lifecycle-coordination behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, node.js
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100