From e37419dd004be6f2d6f78287c33f8601581ef898 Mon Sep 17 00:00:00 2001 From: "Kamat, Trivikram" <16024985+trivikr@users.noreply.github.com> Date: Sat, 11 Jul 2026 00:02:31 -0700 Subject: [PATCH] stream: use RangeError for broadcast overflow Reject strict-backpressure writes with a RangeError when the broadcast pending writes queue is full. Signed-off-by: Kamat, Trivikram <16024985+trivikr@users.noreply.github.com> --- lib/internal/streams/iter/broadcast.js | 2 +- ...test-stream-iter-broadcast-backpressure.js | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/internal/streams/iter/broadcast.js b/lib/internal/streams/iter/broadcast.js index 3592453036d303..ec8c347e6e05ba 100644 --- a/lib/internal/streams/iter/broadcast.js +++ b/lib/internal/streams/iter/broadcast.js @@ -582,7 +582,7 @@ class BroadcastWriter { if (policy === 'strict') { if (this.#pendingWrites.length >= hwm) { - throw new ERR_INVALID_STATE.TypeError( + throw new ERR_INVALID_STATE.RangeError( 'Backpressure violation: too many pending writes. ' + 'Await each write() call to respect backpressure.'); } diff --git a/test/parallel/test-stream-iter-broadcast-backpressure.js b/test/parallel/test-stream-iter-broadcast-backpressure.js index d1e466c3ac44cf..7135a71b8e2806 100644 --- a/test/parallel/test-stream-iter-broadcast-backpressure.js +++ b/test/parallel/test-stream-iter-broadcast-backpressure.js @@ -105,6 +105,28 @@ async function testBlockBackpressureContent() { assert.strictEqual(done.done, true); } +async function testStrictBackpressureOverflow() { + const { writer } = broadcast({ + highWaterMark: 1, + backpressure: 'strict', + }); + + await writer.write('a'); + const pending = writer.write('b'); + + await assert.rejects(writer.write('c'), { + name: 'RangeError', + code: 'ERR_INVALID_STATE', + }); + + writer.fail(); + await assert.rejects(pending, { + name: 'TypeError', + code: 'ERR_INVALID_STATE', + message: 'Invalid state: Failed', + }); +} + // Writev async path async function testWritevAsync() { const { writer, broadcast: bc } = broadcast({ highWaterMark: 10 }); @@ -133,6 +155,7 @@ Promise.all([ testDropNewest(), testBlockBackpressure(), testBlockBackpressureContent(), + testStrictBackpressureOverflow(), testWritevAsync(), testEndSyncReturnValue(), ]).then(common.mustCall());