From dd496c2878318ebc9b130b07af29b26b03df02e0 Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Sun, 1 Mar 2026 13:33:20 +0100 Subject: [PATCH 1/5] stream: optimize webstreams pipeTo --- lib/internal/webstreams/readablestream.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 43cfcded03def4..b6a420ca4b214b 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -1573,10 +1573,7 @@ function readableStreamPipeTo( } // Trigger pull if needed after batch - if (source[kState].state === 'readable' && - !controller[kState].closeRequested) { - readableStreamDefaultControllerCallPullIfNeeded(controller); - } + readableStreamDefaultControllerCallPullIfNeeded(controller); // Check if stream closed during batch if (source[kState].state === 'closed') { From 3479d397f708d9c51251a839aab50cc993d4b03f Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Sun, 1 Mar 2026 13:35:28 +0100 Subject: [PATCH 2/5] fixup! do not use writer public API --- lib/internal/webstreams/readablestream.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index b6a420ca4b214b..2456d1798f158a 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -127,6 +127,7 @@ const { writableStreamAbort, writableStreamCloseQueuedOrInFlight, writableStreamDefaultWriterCloseWithErrorPropagation, + writableStreamDefaultWriterGetDesiredSize, writableStreamDefaultWriterRelease, writableStreamDefaultWriterWrite, } = require('internal/webstreams/writablestream'); @@ -1564,7 +1565,7 @@ function readableStreamPipeTo( // Check backpressure after each write if (dest[kState].state === 'writable') { - const desiredSize = writer.desiredSize; + const desiredSize = writableStreamDefaultWriterGetDesiredSize(writer); if (desiredSize !== null && desiredSize <= 0) { // Backpressure - stop batch and wait for ready break; From b8f166ca5aed82e1c1d8b53059f638f79a8f7cf1 Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Sun, 1 Mar 2026 13:56:04 +0100 Subject: [PATCH 3/5] fixup! optimize backpressure check --- lib/internal/webstreams/readablestream.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 2456d1798f158a..f163a4e3b0642c 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -127,7 +127,6 @@ const { writableStreamAbort, writableStreamCloseQueuedOrInFlight, writableStreamDefaultWriterCloseWithErrorPropagation, - writableStreamDefaultWriterGetDesiredSize, writableStreamDefaultWriterRelease, writableStreamDefaultWriterWrite, } = require('internal/webstreams/writablestream'); @@ -1564,12 +1563,12 @@ function readableStreamPipeTo( setPromiseHandled(state.currentWrite); // Check backpressure after each write - if (dest[kState].state === 'writable') { - const desiredSize = writableStreamDefaultWriterGetDesiredSize(writer); - if (desiredSize !== null && desiredSize <= 0) { - // Backpressure - stop batch and wait for ready - break; - } + if (dest[kState].backpressure) { + // Backpressure - stop batch and wait for ready + break; + } else if (dest[kState].state !== 'writable' || writableStreamCloseQueuedOrInFlight(dest)) { + // Closing or erroring - stop batch and wait for shutdown + break; } } From 911f8958952597fdd24684010cd0a4cd95c521c8 Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Mon, 2 Mar 2026 20:58:14 +0100 Subject: [PATCH 4/5] fixup! wait for ready only if there is backpressure --- lib/internal/webstreams/readablestream.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index f163a4e3b0642c..4cc457c130009c 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -1532,10 +1532,12 @@ function readableStreamPipeTo( } async function step() { - if (shuttingDown) - return true; + if (shuttingDown) return true; - await writer[kState].ready.promise; + if (dest[kState].backpressure) { + await writer[kState].ready.promise; + if (shuttingDown) return true; + } const controller = source[kState].controller; From 7b31401e6d9ad9f48090334272943f3b21d29508 Mon Sep 17 00:00:00 2001 From: Mattias Buelens Date: Mon, 2 Mar 2026 21:04:06 +0100 Subject: [PATCH 5/5] fixup! disturbed is already true at start of pipeTo --- lib/internal/webstreams/readablestream.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 4cc457c130009c..69a2cc65098089 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -1551,7 +1551,6 @@ function readableStreamPipeTo( while (controller[kState].queue.length > 0) { if (shuttingDown) return true; - source[kState].disturbed = true; const chunk = dequeueValue(controller); if (controller[kState].closeRequested && !controller[kState].queue.length) {