stream: don't push null from closed promise #42694

closed promise is subscribed to first so will be
resolved first, before any read promise.

This causes data after EOF error to be thrown.

Remove the push null from the closed promise handler.
The push null gets done from the read handler
when it detects done.

PR-URL: https://github.com/nodejs/node/pull/45026
Fixes: https://github.com/nodejs/node/issues/42694
Reviewed-By: Daeyeon Jeong <daeyeon.dev@gmail.com>
Reviewed-By: Minwoo Jung <nodecorelab@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
David Halls
2022-10-22 18:27:37 +01:00
committed by GitHub
parent 3a4f964930
commit 538d8ce106
2 changed files with 26 additions and 5 deletions

View File

@@ -32,7 +32,6 @@ const {
const {
isDestroyed,
isReadable,
isReadableEnded,
isWritable,
isWritableEnded,
} = require('internal/streams/utils');
@@ -528,8 +527,6 @@ function newStreamReadableFromReadableStream(readableStream, options = kEmptyObj
reader.closed,
() => {
closed = true;
if (!isReadableEnded(readable))
readable.push(null);
},
(error) => {
closed = true;
@@ -794,8 +791,6 @@ function newStreamDuplexFromReadableWritablePair(pair = kEmptyObject, options =
reader.closed,
() => {
readableClosed = true;
if (!isReadableEnded(duplex))
duplex.push(null);
},
(error) => {
writableClosed = true;

View File

@@ -0,0 +1,26 @@
'use strict';
const { mustCall } = require('../common');
const { Readable, Duplex } = require('stream');
const { strictEqual } = require('assert');
function start(controller) {
controller.enqueue(new Uint8Array(1));
controller.close();
}
Readable.fromWeb(new ReadableStream({ start }))
.on('data', mustCall((d) => {
strictEqual(d.length, 1);
}))
.on('end', mustCall())
.resume();
Duplex.fromWeb({
readable: new ReadableStream({ start }),
writable: new WritableStream({ write(chunk) {} })
})
.on('data', mustCall((d) => {
strictEqual(d.length, 1);
}))
.on('end', mustCall())
.resume();