Skip to content

Commit 93ee36e

Browse files
committed
revert eos change
1 parent e178f04 commit 93ee36e

File tree

5 files changed

+46
-78
lines changed

5 files changed

+46
-78
lines changed

lib/_http_client.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,9 +806,6 @@ function onSocketNT(req, socket, err) {
806806
socket.emit('free');
807807
} else {
808808
finished(socket.destroy(err || req[kError]), (er) => {
809-
if (er?.code === 'ERR_STREAM_PREMATURE_CLOSE') {
810-
er = null;
811-
}
812809
_destroy(req, er || err);
813810
});
814811
return;

lib/_http_incoming.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,6 @@ IncomingMessage.prototype._destroy = function _destroy(err, cb) {
188188
if (this.socket && !this.socket.destroyed && this.aborted) {
189189
this.socket.destroy(err);
190190
const cleanup = finished(this.socket, (e) => {
191-
if (e?.code === 'ERR_STREAM_PREMATURE_CLOSE') {
192-
e = null;
193-
}
194191
cleanup();
195192
process.nextTick(onError, this, e || err, cb);
196193
});

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

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ function eos(stream, options, callback) {
9898
isWritable(stream) === writable
9999
);
100100

101-
let writableFinished = stream.writableFinished || wState?.finished;
101+
let writableFinished = stream.writableFinished ||
102+
(wState && wState.finished);
102103
const onfinish = () => {
103104
writableFinished = true;
104105
// Stream should not be destroyed here. If it is that
@@ -110,7 +111,8 @@ function eos(stream, options, callback) {
110111
if (!readable || readableEnded) callback.call(stream);
111112
};
112113

113-
let readableEnded = stream.readableEnded || rState?.endEmitted;
114+
let readableEnded = stream.readableEnded ||
115+
(rState && rState.endEmitted);
114116
const onend = () => {
115117
readableEnded = true;
116118
// Stream should not be destroyed here. If it is that
@@ -126,17 +128,7 @@ function eos(stream, options, callback) {
126128
callback.call(stream, err);
127129
};
128130

129-
let closed = wState?.closed || rState?.closed;
130-
131131
const onclose = () => {
132-
closed = true;
133-
134-
const errored = wState?.errored || rState?.errored;
135-
136-
if (errored && typeof errored !== 'boolean') {
137-
return callback.call(stream, errored);
138-
}
139-
140132
if (readable && !readableEnded) {
141133
if (!isReadableEnded(stream))
142134
return callback.call(stream,
@@ -147,7 +139,6 @@ function eos(stream, options, callback) {
147139
return callback.call(stream,
148140
new ERR_STREAM_PREMATURE_CLOSE());
149141
}
150-
151142
callback.call(stream);
152143
};
153144

@@ -177,29 +168,29 @@ function eos(stream, options, callback) {
177168
if (options.error !== false) stream.on('error', onerror);
178169
stream.on('close', onclose);
179170

171+
// _closed is for OutgoingMessage which is not a proper Writable.
172+
const closed = (!wState && !rState && stream._closed === true) || (
173+
(wState && wState.closed) ||
174+
(rState && rState.closed) ||
175+
(wState && wState.errorEmitted) ||
176+
(rState && rState.errorEmitted) ||
177+
(rState && stream.req && stream.aborted) ||
178+
(
179+
(!writable || (wState && wState.finished)) &&
180+
(!readable || (rState && rState.endEmitted))
181+
)
182+
);
183+
180184
if (closed) {
181-
process.nextTick(onclose);
182-
} else if (wState?.errorEmitted || rState?.errorEmitted) {
183-
if (!willEmitClose) {
184-
process.nextTick(onclose);
185-
}
186-
} else if (
187-
!readable &&
188-
(!willEmitClose || stream.readable) &&
189-
writableFinished
190-
) {
191-
process.nextTick(onclose);
192-
} else if (
193-
!writable &&
194-
(!willEmitClose || stream.writable) &&
195-
readableEnded
196-
) {
197-
process.nextTick(onclose);
198-
} else if (!wState && !rState && stream._closed === true) {
199-
// _closed is for OutgoingMessage which is not a proper Writable.
200-
process.nextTick(onclose);
201-
} else if ((rState && stream.req && stream.aborted)) {
202-
process.nextTick(onclose);
185+
// TODO(ronag): Re-throw error if errorEmitted?
186+
// TODO(ronag): Throw premature close as if finished was called?
187+
// before being closed? i.e. if closed but not errored, ended or finished.
188+
// TODO(ronag): Throw some kind of error? Does it make sense
189+
// to call finished() on a "finished" stream?
190+
// TODO(ronag): willEmitClose?
191+
process.nextTick(() => {
192+
callback();
193+
});
203194
}
204195

205196
const cleanup = () => {

lib/internal/streams/readable.js

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ const {
5656
getDefaultHighWaterMark
5757
} = require('internal/streams/state');
5858

59-
const eos = require('internal/streams/end-of-stream');
60-
6159
const {
6260
ERR_INVALID_ARG_TYPE,
63-
ERR_STREAM_PUSH_AFTER_EOF,
6461
ERR_METHOD_NOT_IMPLEMENTED,
65-
ERR_STREAM_UNSHIFT_AFTER_END_EVENT
62+
ERR_STREAM_PREMATURE_CLOSE,
63+
ERR_STREAM_PUSH_AFTER_EOF,
64+
ERR_STREAM_UNSHIFT_AFTER_END_EVENT,
6665
} = require('internal/errors').codes;
6766
const { validateObject } = require('internal/validators');
6867

@@ -1111,18 +1110,23 @@ async function* createAsyncIterator(stream, options) {
11111110
let error = state.errored;
11121111
let errorEmitted = state.errorEmitted;
11131112
let endEmitted = state.endEmitted;
1113+
let closeEmitted = state.closeEmitted;
11141114

1115-
stream.on('readable', next);
1116-
1117-
eos(stream, (err) => {
1118-
if (err) {
1119-
errorEmitted = true;
1115+
stream
1116+
.on('readable', next)
1117+
.on('error', function(err) {
11201118
error = err;
1121-
}
1122-
1123-
endEmitted = true;
1124-
next.call(stream);
1125-
});
1119+
errorEmitted = true;
1120+
next.call(this);
1121+
})
1122+
.on('end', function() {
1123+
endEmitted = true;
1124+
next.call(this);
1125+
})
1126+
.on('close', function() {
1127+
closeEmitted = true;
1128+
next.call(this);
1129+
});
11261130

11271131
let errorThrown = false;
11281132
try {
@@ -1134,6 +1138,8 @@ async function* createAsyncIterator(stream, options) {
11341138
throw error;
11351139
} else if (endEmitted) {
11361140
break;
1141+
} else if (closeEmitted) {
1142+
throw new ERR_STREAM_PREMATURE_CLOSE();
11371143
} else {
11381144
await new Promise(next);
11391145
}

test/parallel/test-stream-finished.js

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -608,26 +608,3 @@ testClosed((opts) => new Writable({ write() {}, ...opts }));
608608
assert.strictEqual(closed, true);
609609
}));
610610
}
611-
612-
{
613-
const w = new Writable();
614-
const _err = new Error();
615-
w.destroy(_err);
616-
finished(w, common.mustCall((err) => {
617-
assert.strictEqual(_err, err);
618-
finished(w, common.mustCall((err) => {
619-
assert.strictEqual(_err, err);
620-
}));
621-
}));
622-
}
623-
624-
{
625-
const w = new Writable();
626-
w.destroy();
627-
finished(w, common.mustCall((err) => {
628-
assert.strictEqual(err.code, 'ERR_STREAM_PREMATURE_CLOSE');
629-
finished(w, common.mustCall((err) => {
630-
assert.strictEqual(err.code, 'ERR_STREAM_PREMATURE_CLOSE');
631-
}));
632-
}));
633-
}

0 commit comments

Comments
 (0)