diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 9c38da3f107ba0..e4f598886c00e4 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -261,12 +261,6 @@ Writable.prototype.pipe = function() { Writable.prototype.write = function(chunk, encoding, cb) { const state = this._writableState; - const isBuf = !state.objectMode && Stream._isUint8Array(chunk); - - // Do not use Object.getPrototypeOf as it is slower since V8 7.3. - if (isBuf && !(chunk instanceof Buffer)) { - chunk = Stream._uint8ArrayToBuffer(chunk); - } if (typeof encoding === 'function') { cb = encoding; @@ -278,9 +272,6 @@ Writable.prototype.write = function(chunk, encoding, cb) { cb = nop; } - if (isBuf) - encoding = 'buffer'; - let err; if (state.ending) { err = new ERR_STREAM_WRITE_AFTER_END(); @@ -288,24 +279,31 @@ Writable.prototype.write = function(chunk, encoding, cb) { err = new ERR_STREAM_DESTROYED('write'); } else if (chunk === null) { err = new ERR_STREAM_NULL_VALUES(); - } else { - if (!isBuf && !state.objectMode) { - if (typeof chunk !== 'string') { - err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); - } else if (encoding !== 'buffer' && state.decodeStrings !== false) { + } else if (!state.objectMode) { + if (typeof chunk === 'string') { + if (state.decodeStrings !== false) { chunk = Buffer.from(chunk, encoding); encoding = 'buffer'; } - } - if (err === undefined) { - state.pendingcb++; - return writeOrBuffer(this, state, chunk, encoding, cb); + } else if (chunk instanceof Buffer) { + encoding = 'buffer'; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = 'buffer'; + } else { + err = new ERR_INVALID_ARG_TYPE( + 'chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } } - process.nextTick(cb, err); - errorOrDestroy(this, err, true); - return false; + if (err) { + process.nextTick(cb, err); + errorOrDestroy(this, err, true); + return false; + } else { + state.pendingcb++; + return writeOrBuffer(this, state, chunk, encoding, cb); + } }; Writable.prototype.cork = function() { diff --git a/test/parallel/test-net-write-arguments.js b/test/parallel/test-net-write-arguments.js index 8d864e546647d3..407871afe6d3b3 100644 --- a/test/parallel/test-net-write-arguments.js +++ b/test/parallel/test-net-write-arguments.js @@ -33,6 +33,6 @@ socket.on('error', common.expectsError({ code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The "chunk" argument must be of type string or an instance of ' + - `Buffer.${common.invalidArgTypeHelper(value)}` + `Buffer or Uint8Array.${common.invalidArgTypeHelper(value)}` })); });