From e71bdadf526477c05d676034cfab0aa42cda257d Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sat, 21 Sep 2019 01:29:41 +0200 Subject: [PATCH] stream: make _write() optional when _writev() is implemented When implementing _writev, _write should be optional. PR-URL: https://github.com/nodejs/node/pull/29639 Reviewed-By: Anna Henningsen Reviewed-By: Minwoo Jung Reviewed-By: Luigi Pinca --- doc/api/stream.md | 17 ++++++++++++----- lib/_stream_writable.js | 6 +++++- test/parallel/test-stream-writev.js | 9 +++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 8d21abb6bded26..557e37ed7c0183 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -1684,8 +1684,8 @@ const myWritable = new Writable({ The `stream.Writable` class is extended to implement a [`Writable`][] stream. Custom `Writable` streams *must* call the `new stream.Writable([options])` -constructor and implement the `writable._write()` method. The -`writable._writev()` method *may* also be implemented. +constructor and implement the `writable._write()` and/or `writable._writev()` +method. #### Constructor: new stream.Writable([options]) * `chunk` {Buffer|string|any} The `Buffer` to be written, converted from the `string` passed to [`stream.write()`][stream-write]. If the stream's @@ -1787,7 +1793,8 @@ const myWritable = new Writable({ argument) when processing is complete for the supplied chunk. All `Writable` stream implementations must provide a -[`writable._write()`][stream-_write] method to send data to the underlying +[`writable._write()`][stream-_write] and/or +[`writable._writev()`][stream-_writev] method to send data to the underlying resource. [`Transform`][] streams provide their own implementation of the @@ -1830,8 +1837,8 @@ This function MUST NOT be called by application code directly. It should be implemented by child classes, and called by the internal `Writable` class methods only. -The `writable._writev()` method may be implemented in addition to -`writable._write()` in stream implementations that are capable of processing +The `writable._writev()` method may be implemented in addition or alternatively +to `writable._write()` in stream implementations that are capable of processing multiple chunks of data at once. If implemented, the method will be called with all chunks of data currently buffered in the write queue. diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 8c21bf9c5238da..5edcbefbfde5c4 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -569,7 +569,11 @@ function clearBuffer(stream, state) { } Writable.prototype._write = function(chunk, encoding, cb) { - cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); + if (this._writev) { + this._writev([{ chunk, encoding }], cb); + } else { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); + } }; Writable.prototype._writev = null; diff --git a/test/parallel/test-stream-writev.js b/test/parallel/test-stream-writev.js index 1123e66ddc5767..7aba543f0732f6 100644 --- a/test/parallel/test-stream-writev.js +++ b/test/parallel/test-stream-writev.js @@ -119,3 +119,12 @@ function test(decode, uncork, multi, next) { next(); }); } + +{ + const w = new stream.Writable({ + writev: common.mustCall(function(chunks, cb) { + cb(); + }) + }); + w.write('asd', common.mustCall()); +}