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 <anna@addaleax.net>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Robert Nagy 2019-09-21 01:29:41 +02:00 committed by Rich Trott
parent 68d6c4c661
commit d398b8f02b
3 changed files with 26 additions and 6 deletions

View File

@ -1687,8 +1687,8 @@ const myWritable = new Writable({
The `stream.Writable` class is extended to implement a [`Writable`][] stream. The `stream.Writable` class is extended to implement a [`Writable`][] stream.
Custom `Writable` streams *must* call the `new stream.Writable([options])` Custom `Writable` streams *must* call the `new stream.Writable([options])`
constructor and implement the `writable._write()` method. The constructor and implement the `writable._write()` and/or `writable._writev()`
`writable._writev()` method *may* also be implemented. method.
#### Constructor: new stream.Writable([options]) #### Constructor: new stream.Writable([options])
<!-- YAML <!-- YAML
@ -1777,6 +1777,12 @@ const myWritable = new Writable({
``` ```
#### writable.\_write(chunk, encoding, callback) #### writable.\_write(chunk, encoding, callback)
<!-- YAML
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/29639
description: _write() is optional when providing _writev().
-->
* `chunk` {Buffer|string|any} The `Buffer` to be written, converted from the * `chunk` {Buffer|string|any} The `Buffer` to be written, converted from the
`string` passed to [`stream.write()`][stream-write]. If the stream's `string` passed to [`stream.write()`][stream-write]. If the stream's
@ -1790,7 +1796,8 @@ const myWritable = new Writable({
argument) when processing is complete for the supplied chunk. argument) when processing is complete for the supplied chunk.
All `Writable` stream implementations must provide a 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. resource.
[`Transform`][] streams provide their own implementation of the [`Transform`][] streams provide their own implementation of the
@ -1833,8 +1840,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 implemented by child classes, and called by the internal `Writable` class
methods only. methods only.
The `writable._writev()` method may be implemented in addition to The `writable._writev()` method may be implemented in addition or alternatively
`writable._write()` in stream implementations that are capable of processing 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 multiple chunks of data at once. If implemented, the method will be called with
all chunks of data currently buffered in the write queue. all chunks of data currently buffered in the write queue.

View File

@ -565,7 +565,11 @@ function clearBuffer(stream, state) {
} }
Writable.prototype._write = function(chunk, encoding, cb) { Writable.prototype._write = function(chunk, encoding, cb) {
if (this._writev) {
this._writev([{ chunk, encoding }], cb);
} else {
cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
}
}; };
Writable.prototype._writev = null; Writable.prototype._writev = null;

View File

@ -119,3 +119,12 @@ function test(decode, uncork, multi, next) {
next(); next();
}); });
} }
{
const w = new stream.Writable({
writev: common.mustCall(function(chunks, cb) {
cb();
})
});
w.write('asd', common.mustCall());
}