Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ea2df2a

Browse filesBrowse files
mcollinaaduh95
authored andcommitted
stream: fix pipeTo to defer writes per WHATWG spec
The WHATWG Streams spec requires that pipeTo's chunk handling must queue a microtask before calling the write algorithm. This ensures that enqueue() does not synchronously trigger writes. Previously, PipeToReadableStreamReadRequest[kChunk] would synchronously call writableStreamDefaultWriterWrite(), which violated the spec and caused the WPT test "enqueue() must not synchronously call write algorithm" to fail. Fix by wrapping the write operation in queueMicrotask(), which defers it to the next microtask as required by the spec. Refs: whatwg/streams#1243 PR-URL: #61800 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Mattias Buelens <mattias@buelens.com>
1 parent 9ddd1a9 commit ea2df2a
Copy full SHA for ea2df2a

2 files changed

+8-11Lines changed: 8 additions & 11 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/internal/webstreams/readablestream.js‎

Copy file name to clipboardExpand all lines: lib/internal/webstreams/readablestream.js
+8-3Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1662,9 +1662,14 @@ class PipeToReadableStreamReadRequest {
16621662
}
16631663

16641664
[kChunk](chunk) {
1665-
this.state.currentWrite = writableStreamDefaultWriterWrite(this.writer, chunk);
1666-
setPromiseHandled(this.state.currentWrite);
1667-
this.promise.resolve(false);
1665+
// Per spec, pipeTo must queue a microtask for the write to avoid
1666+
// synchronous write during enqueue(). See WHATWG Streams spec
1667+
// "ReadableStreamPipeTo" step 15's "chunk steps".
1668+
queueMicrotask(() => {
1669+
this.state.currentWrite = writableStreamDefaultWriterWrite(this.writer, chunk);
1670+
setPromiseHandled(this.state.currentWrite);
1671+
this.promise.resolve(false);
1672+
});
16681673
}
16691674

16701675
[kClose]() {
Collapse file

‎test/wpt/status/streams.json‎

Copy file name to clipboardExpand all lines: test/wpt/status/streams.json
-8Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@
22
"idlharness-shadowrealm.window.js": {
33
"skip": "ShadowRealm support is not enabled"
44
},
5-
"piping/general-addition.any.js": {
6-
"fail": {
7-
"note": "Blocked on https://github.com/whatwg/streams/issues/1243",
8-
"expected": [
9-
"enqueue() must not synchronously call write algorithm"
10-
]
11-
}
12-
},
135
"queuing-strategies-size-function-per-global.window.js": {
146
"skip": "Browser-specific test"
157
},

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.