From 2ab4ebc8bf86457b0b37e224f231ee90ca75a0d3 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() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplifies Writable.end() by inlining and de-duplicating code. PR-URL: https://github.com/nodejs/node/pull/32882 Reviewed-By: Anna Henningsen Reviewed-By: Luigi Pinca Reviewed-By: Gerhard Stöbich Reviewed-By: Ruben Bridgewater Reviewed-By: Matteo Collina --- 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 14a7ede27611c4..ec263d8f578fe5 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -588,21 +588,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; @@ -683,18 +688,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;