From 6c72783e5454d9b93243a5a8157052c7cd1043b0 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 | 28 +++++++++++++++---------- test/parallel/test-stream-uint8array.js | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/internal/streams/writable.js b/lib/internal/streams/writable.js index b8f8b72ce8d113..84a802b67af744 100644 --- a/lib/internal/streams/writable.js +++ b/lib/internal/streams/writable.js @@ -443,21 +443,21 @@ Writable.prototype.pipe = function() { function _write(stream, chunk, encoding, cb) { const state = stream._writableState; - if (typeof encoding === 'function') { - cb = encoding; - encoding = (state[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : state.defaultEncoding; - } else { - 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 cb !== 'function') - cb = nop; + if (cb == null || typeof cb !== 'function') { + cb = nop; } 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); @@ -486,11 +486,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; }; diff --git a/test/parallel/test-stream-uint8array.js b/test/parallel/test-stream-uint8array.js index 38a45d54048967..f1de4c873fd3a8 100644 --- a/test/parallel/test-stream-uint8array.js +++ b/test/parallel/test-stream-uint8array.js @@ -38,7 +38,7 @@ const GHI = new Uint8Array([0x47, 0x48, 0x49]); assert(!(chunk instanceof Buffer)); assert(chunk instanceof Uint8Array); assert.strictEqual(chunk, ABC); - assert.strictEqual(encoding, 'utf8'); + assert.strictEqual(encoding, undefined); cb(); }) });