Skip to content

Commit 77ff0d3

Browse files
committed
stream: eos premature close
1 parent 885c644 commit 77ff0d3

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

lib/internal/streams/end-of-stream.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,22 @@ function eos(stream, opts, callback) {
3535
if (!stream.writable) onfinish();
3636
};
3737

38-
var writableEnded = stream._writableState && stream._writableState.finished;
38+
var writableFinished = (
39+
stream._writableState &&
40+
stream._writableState.finished
41+
);
42+
3943
const onfinish = () => {
4044
writable = false;
41-
writableEnded = true;
45+
writableFinished = true;
4246
if (!readable) callback.call(stream);
4347
};
4448

45-
var readableEnded = stream._readableState && stream._readableState.endEmitted;
49+
var readableEnded = (
50+
stream._readableState &&
51+
stream._readableState.endEmitted
52+
);
53+
4654
const onend = () => {
4755
readable = false;
4856
readableEnded = true;
@@ -56,12 +64,12 @@ function eos(stream, opts, callback) {
5664
const onclose = () => {
5765
let err;
5866
if (readable && !readableEnded) {
59-
if (!stream._readableState || !stream._readableState.ended)
67+
if (!stream._readableState || !stream._readableState.endEmitted)
6068
err = new ERR_STREAM_PREMATURE_CLOSE();
6169
return callback.call(stream, err);
6270
}
63-
if (writable && !writableEnded) {
64-
if (!stream._writableState || !stream._writableState.ended)
71+
if (writable && !writableFinished) {
72+
if (!stream._writableState || !stream._writableState.finished)
6573
err = new ERR_STREAM_PREMATURE_CLOSE();
6674
return callback.call(stream, err);
6775
}

test/parallel/test-stream-finished.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@ const { promisify } = require('util');
9696
}));
9797
}
9898

99+
{
100+
const rs = new Readable();
101+
102+
finished(rs, common.mustCall((err) => {
103+
assert(err, 'premature close error');
104+
}));
105+
106+
rs.push(null);
107+
rs.emit('close');
108+
rs.resume();
109+
}
110+
99111
{
100112
const rs = new Readable();
101113

@@ -104,7 +116,9 @@ const { promisify } = require('util');
104116
}));
105117

106118
rs.push(null);
107-
rs.emit('close'); // Should not trigger an error
119+
rs.on('end', common.mustCall(() => {
120+
rs.emit('close'); // Should not trigger an error
121+
}));
108122
rs.resume();
109123
}
110124

0 commit comments

Comments
 (0)