◐ Shell
clean mode source ↗

stream: fix pipeTo to defer writes per WHATWG spec · nodejs/node@ea2df2a

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]() {