mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user