From 19d3f1e79bffb15e6aa99a2d0a61fa23ca574dbe Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Thu, 16 Apr 2020 17:25:22 +0200 Subject: [PATCH] stream: simplify Writable.end() Simplifies Writable.end() by inlining and de-duplicating code. --- lib/_stream_writable.js | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 25235166d9fa7d..2b36a765e592ef 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -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;