Commit d72fb59ddc0 for nodejs
commit d72fb59ddc0db2ed007fcbf823edd3b960a8e2e6
Author: James M Snell <jasnell@gmail.com>
Date: Sun Aug 30 17:16:23 2026 +0000
stream: make Broadcast.from() only return the Broadcast
Signed-off-by: James M Snell <jasnell@gmail.com>
Assisted-by: Opencode
PR-URL: https://github.com/nodejs/node/pull/66030
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
diff --git a/doc/api/stream_iter.md b/doc/api/stream_iter.md
index 80579fba982..60d2aa39737 100644
--- a/doc/api/stream_iter.md
+++ b/doc/api/stream_iter.md
@@ -1374,7 +1374,8 @@ added:
* `input` {AsyncIterable|Iterable|BroadcastChannel}
* `options` {Object} Same as `broadcast()`.
-* Returns: {Object} `{ writer, broadcast }`
+* Returns: {BroadcastChannel|Object} A `broadcastProtocol` input returns its
+ {BroadcastChannel} directly. Other inputs return `{ writer, broadcast }`.
Create a {BroadcastChannel} from an existing source. The source is consumed
automatically and pushed to all subscribers.
@@ -1883,7 +1884,7 @@ class MessageBus {
}
const bus = new MessageBus();
-const { broadcast } = Broadcast.from(bus);
+const broadcast = Broadcast.from(bus);
const consumer = broadcast.push();
bus.send('hello');
bus.close();
@@ -1919,7 +1920,7 @@ class MessageBus {
}
const bus = new MessageBus();
-const { broadcast } = Broadcast.from(bus);
+const broadcast = Broadcast.from(bus);
const consumer = broadcast.push();
bus.send('hello');
bus.close();
diff --git a/lib/internal/streams/iter/broadcast.js b/lib/internal/streams/iter/broadcast.js
index 4c191295a37..3b37a5b5f2a 100644
--- a/lib/internal/streams/iter/broadcast.js
+++ b/lib/internal/streams/iter/broadcast.js
@@ -923,7 +923,7 @@ const Broadcast = {
throw new ERR_INVALID_RETURN_VALUE(
'an object', '[Symbol.for(\'Stream.broadcastProtocol\')]', bc);
}
- return { __proto__: null, writer: { __proto__: null }, broadcast: bc };
+ return bc;
}
const source = from(input);
diff --git a/test/parallel/test-stream-iter-broadcast-from.js b/test/parallel/test-stream-iter-broadcast-from.js
index 6062f5244ec..cd76f3647b2 100644
--- a/test/parallel/test-stream-iter-broadcast-from.js
+++ b/test/parallel/test-stream-iter-broadcast-from.js
@@ -181,6 +181,15 @@ async function testBroadcastFromSourceError() {
// Protocol validation
// =============================================================================
+function testBroadcastProtocolReturnsBroadcast() {
+ const { broadcast: expected } = broadcast();
+ const obj = {
+ [Symbol.for('Stream.broadcastProtocol')]() { return expected; },
+ };
+ assert.strictEqual(Broadcast.from(obj), expected);
+ expected.cancel();
+}
+
function testBroadcastProtocolReturnsNull() {
const obj = {
[Symbol.for('Stream.broadcastProtocol')]() { return null; },
@@ -223,6 +232,7 @@ Promise.all([
testAlreadyAbortedSignal(),
testBroadcastFromCancelWhileBlocked(),
testBroadcastFromSourceError(),
+ testBroadcastProtocolReturnsBroadcast(),
testBroadcastProtocolReturnsNull(),
testBroadcastProtocolReturnsString(),
testBroadcastProtocolReturnsUndefined(),
diff --git a/test/parallel/test-stream-iter-property-access.js b/test/parallel/test-stream-iter-property-access.js
index 5ba1a5a587f..7c4b8ef3a7e 100644
--- a/test/parallel/test-stream-iter-property-access.js
+++ b/test/parallel/test-stream-iter-property-access.js
@@ -140,8 +140,7 @@ async function testMultiConsumerProtocolsSnapshotMethods() {
const broadcastTarget = broadcast().broadcast;
const broadcastFixture = protocolFixture(
broadcastProtocol, broadcastTarget);
- assert.strictEqual(
- Broadcast.from(broadcastFixture.input).broadcast, broadcastTarget);
+ assert.strictEqual(Broadcast.from(broadcastFixture.input), broadcastTarget);
assert.strictEqual(broadcastFixture.accesses, 1);
const shareTarget = share('abc');