From f2636598e86c5a5f258441f52d971af171fe4d91 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 1 Mar 2020 19:01:24 +0100 Subject: [PATCH] stream: eos make const state const writable & readable is based on type and is not actual state, treat them as such. Backport-PR-URL: https://github.com/nodejs/node/pull/32178 PR-URL: https://github.com/nodejs/node/pull/32031 Reviewed-By: Matteo Collina Reviewed-By: Luigi Pinca --- lib/internal/streams/end-of-stream.js | 18 +++++++----------- test/parallel/test-stream-finished.js | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/internal/streams/end-of-stream.js b/lib/internal/streams/end-of-stream.js index d6e1c5804eaf4a..e0f27adcc4cd8e 100644 --- a/lib/internal/streams/end-of-stream.js +++ b/lib/internal/streams/end-of-stream.js @@ -47,9 +47,9 @@ function eos(stream, opts, callback) { callback = once(callback); - let readable = opts.readable || + const readable = opts.readable || (opts.readable !== false && isReadable(stream)); - let writable = opts.writable || + const writable = opts.writable || (opts.writable !== false && isWritable(stream)); const onlegacyfinish = () => { @@ -59,17 +59,15 @@ function eos(stream, opts, callback) { let writableFinished = stream.writableFinished || (stream._writableState && stream._writableState.finished); const onfinish = () => { - writable = false; writableFinished = true; - if (!readable) callback.call(stream); + if (!readable || readableEnded) callback.call(stream); }; let readableEnded = stream.readableEnded || (stream._readableState && stream._readableState.endEmitted); const onend = () => { - readable = false; readableEnded = true; - if (!writable) callback.call(stream); + if (!writable || writableFinished) callback.call(stream); }; const onerror = (err) => { @@ -77,17 +75,15 @@ function eos(stream, opts, callback) { }; const onclose = () => { - let err; if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) - err = new ERR_STREAM_PREMATURE_CLOSE(); - return callback.call(stream, err); + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); } if (writable && !writableFinished) { if (!isWritableFinished(stream)) - err = new ERR_STREAM_PREMATURE_CLOSE(); - return callback.call(stream, err); + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); } + callback.call(stream); }; const onrequest = () => { diff --git a/test/parallel/test-stream-finished.js b/test/parallel/test-stream-finished.js index f6515a01b8d077..1a2949d0d80c0f 100644 --- a/test/parallel/test-stream-finished.js +++ b/test/parallel/test-stream-finished.js @@ -181,7 +181,7 @@ const { promisify } = require('util'); const streamLike = new EE(); streamLike.readableEnded = true; streamLike.readable = true; - finished(streamLike, common.mustCall); + finished(streamLike, common.mustCall()); streamLike.emit('close'); }