From 77ff0d3045067292221af2df857fec918d5f1619 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Tue, 16 Jul 2019 17:52:01 +0200 Subject: [PATCH] stream: eos premature close --- lib/internal/streams/end-of-stream.js | 20 ++++++++++++++------ test/parallel/test-stream-finished.js | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/internal/streams/end-of-stream.js b/lib/internal/streams/end-of-stream.js index 1753996a4f85de..f2b34e517a9a81 100644 --- a/lib/internal/streams/end-of-stream.js +++ b/lib/internal/streams/end-of-stream.js @@ -35,14 +35,22 @@ function eos(stream, opts, callback) { if (!stream.writable) onfinish(); }; - var writableEnded = stream._writableState && stream._writableState.finished; + var writableFinished = ( + stream._writableState && + stream._writableState.finished + ); + const onfinish = () => { writable = false; - writableEnded = true; + writableFinished = true; if (!readable) callback.call(stream); }; - var readableEnded = stream._readableState && stream._readableState.endEmitted; + var readableEnded = ( + stream._readableState && + stream._readableState.endEmitted + ); + const onend = () => { readable = false; readableEnded = true; @@ -56,12 +64,12 @@ function eos(stream, opts, callback) { const onclose = () => { let err; if (readable && !readableEnded) { - if (!stream._readableState || !stream._readableState.ended) + if (!stream._readableState || !stream._readableState.endEmitted) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } - if (writable && !writableEnded) { - if (!stream._writableState || !stream._writableState.ended) + if (writable && !writableFinished) { + if (!stream._writableState || !stream._writableState.finished) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); } diff --git a/test/parallel/test-stream-finished.js b/test/parallel/test-stream-finished.js index 329b4ed42b0c43..129b5dc02112b4 100644 --- a/test/parallel/test-stream-finished.js +++ b/test/parallel/test-stream-finished.js @@ -96,6 +96,18 @@ const { promisify } = require('util'); })); } +{ + const rs = new Readable(); + + finished(rs, common.mustCall((err) => { + assert(err, 'premature close error'); + })); + + rs.push(null); + rs.emit('close'); + rs.resume(); +} + { const rs = new Readable(); @@ -104,7 +116,9 @@ const { promisify } = require('util'); })); rs.push(null); - rs.emit('close'); // Should not trigger an error + rs.on('end', common.mustCall(() => { + rs.emit('close'); // Should not trigger an error + })); rs.resume(); }