stream: make the pipeline callback mandatory

Right now when not adding a callback to the pipeline it could cause
an uncaught exception if there is an error. Instead, just make the
callback mandatory as mostly done in all other Node.js callback APIs
so users explicitly have to decide what to do in such situations.

PR-URL: https://github.com/nodejs/node/pull/21054
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Ruben Bridgewater 2018-05-31 12:11:22 +02:00 committed by Anna Henningsen
parent 505bfdc7e4
commit 32c51f10d3
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
3 changed files with 14 additions and 24 deletions

View File

@ -1340,14 +1340,14 @@ run().catch(console.error);
rs.resume(); // drain the stream
```
### stream.pipeline(...streams[, callback])
### stream.pipeline(...streams, callback)
<!-- YAML
added: v10.0.0
-->
* `...streams` {Stream} Two or more streams to pipe between.
* `callback` {Function} A callback function that takes an optional error
argument.
* `callback` {Function} Called when the pipeline is fully done.
* `err` {Error}
A module method to pipe between streams forwarding errors and properly cleaning
up and provide a callback when the pipeline is complete.

View File

@ -6,6 +6,7 @@
let eos;
const {
ERR_INVALID_CALLBACK,
ERR_MISSING_ARGS,
ERR_STREAM_DESTROYED
} = require('internal/errors').codes;
@ -19,11 +20,6 @@ function once(callback) {
};
}
function noop(err) {
// Rethrow the error if it exists to avoid swallowing it
if (err) throw err;
}
function isRequest(stream) {
return stream.setHeader && typeof stream.abort === 'function';
}
@ -66,8 +62,11 @@ function pipe(from, to) {
}
function popCallback(streams) {
if (!streams.length) return noop;
if (typeof streams[streams.length - 1] !== 'function') return noop;
// Streams should never be an empty array. It should always contain at least
// a single stream. Therefore optimize for the average case instead of
// checking for length === 0 as well.
if (typeof streams[streams.length - 1] !== 'function')
throw new ERR_INVALID_CALLBACK();
return streams.pop();
}

View File

@ -60,7 +60,7 @@ common.crashOnUnhandledRejection();
}, /ERR_MISSING_ARGS/);
assert.throws(() => {
pipeline();
}, /ERR_MISSING_ARGS/);
}, /ERR_INVALID_CALLBACK/);
}
{
@ -493,17 +493,8 @@ common.crashOnUnhandledRejection();
}
});
read.on('close', common.mustCall());
transform.on('close', common.mustCall());
write.on('close', common.mustCall());
process.on('uncaughtException', common.mustCall((err) => {
assert.deepStrictEqual(err, new Error('kaboom'));
}));
const dst = pipeline(read, transform, write);
assert.strictEqual(dst, write);
read.push('hello');
assert.throws(
() => pipeline(read, transform, write),
{ code: 'ERR_INVALID_CALLBACK' }
);
}