stream: simplify Writable.end()

Simplifies Writable.end() by inlining and
de-duplicating code.

PR-URL: https://github.com/nodejs/node/pull/32882
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
Robert Nagy
2020-04-16 17:25:22 +02:00
parent f67601cd77
commit 73f3072ffb

View File

@@ -595,21 +595,26 @@ Writable.prototype.end = function(chunk, encoding, cb) {
this.uncork();
}
if (typeof cb !== 'function')
cb = nop;
// This is forgiving in terms of unnecessary calls to end() and can hide
// logic errors. However, usually such errors are harmless and causing a
// hard error can be disproportionately destructive. It is not always
// trivial for the user to determine whether end() needs to be called or not.
let err;
if (!state.errored && !state.ending) {
endWritable(this, state, cb);
state.ending = true;
finishMaybe(this, state, true);
state.ended = true;
} else if (state.finished) {
process.nextTick(cb, new ERR_STREAM_ALREADY_FINISHED('end'));
err = new ERR_STREAM_ALREADY_FINISHED('end');
} else if (state.destroyed) {
process.nextTick(cb, new ERR_STREAM_DESTROYED('end'));
} else if (cb !== nop) {
onFinished(this, state, cb);
err = new ERR_STREAM_DESTROYED('end');
}
if (typeof cb === 'function') {
if (err || state.finished)
process.nextTick(cb, err);
else
onFinished(this, state, cb);
}
return this;
@@ -690,18 +695,6 @@ function finish(stream, state) {
}
}
function endWritable(stream, state, cb) {
state.ending = true;
finishMaybe(stream, state, true);
if (cb !== nop) {
if (state.finished)
process.nextTick(cb);
else
onFinished(stream, state, cb);
}
state.ended = true;
}
function onCorkedFinish(corkReq, state, err) {
let entry = corkReq.entry;
corkReq.entry = null;