Skip to content

Commit

Permalink
stream: simplify Writable.end()
Browse files Browse the repository at this point in the history
Simplifies Writable.end() by inlining and
de-duplicating code.

PR-URL: #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>
  • Loading branch information
ronag committed Apr 18, 2020
1 parent f67601c commit 73f3072
Showing 1 changed file with 13 additions and 20 deletions.
33 changes: 13 additions & 20 deletions lib/_stream_writable.js
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 73f3072

Please sign in to comment.