From e9cf37a6fad40d14d4d0f2be67f33145372d1534 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Mon, 16 Oct 2023 15:34:13 +0200 Subject: [PATCH] stream: refactor writable _write PR-URL: https://github.com/nodejs/node/pull/50198 --- lib/internal/streams/writable.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/internal/streams/writable.js b/lib/internal/streams/writable.js index 8bf967e556bf80..ba4f09f368e768 100644 --- a/lib/internal/streams/writable.js +++ b/lib/internal/streams/writable.js @@ -443,9 +443,8 @@ Writable.prototype.pipe = function() { function _write(stream, chunk, encoding, cb) { const state = stream._writableState; - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; + if (cb == null || typeof cb !== 'function') { + cb = nop; } if (!encoding) @@ -458,7 +457,15 @@ function _write(stream, chunk, encoding, cb) { if (chunk === null) { throw new ERR_STREAM_NULL_VALUES(); - } else if ((state[kState] & kObjectMode) === 0) { + } + + if ((state[kState] & kObjectMode) === 0) { + if (!encoding) { + encoding = (state[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : state.defaultEncoding; + } else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding); + } + if (typeof chunk === 'string') { if ((state[kState] & kDecodeStrings) !== 0) { chunk = Buffer.from(chunk, encoding); @@ -487,11 +494,17 @@ function _write(stream, chunk, encoding, cb) { errorOrDestroy(stream, err, true); return err; } + state.pendingcb++; return writeOrBuffer(stream, state, chunk, encoding, cb); } Writable.prototype.write = function(chunk, encoding, cb) { + if (encoding != null && typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + return _write(this, chunk, encoding, cb) === true; };