mirror of
https://github.com/nodejs/node.git
synced 2025-05-10 17:57:53 +00:00

Make the callback mandatory as mostly done in all other Node.js callback APIs so users explicitly have to decide what to do in error cases. This also documents the options for `Stream.finished()`. When originally implemented it was missed that Stream.finished() has an optional options object. PR-URL: https://github.com/nodejs/node/pull/21058 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Mathias Buus <mathiasbuus@gmail.com>
156 lines
2.4 KiB
JavaScript
156 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const { Writable, Readable, Transform, finished } = require('stream');
|
|
const assert = require('assert');
|
|
const fs = require('fs');
|
|
const { promisify } = require('util');
|
|
|
|
{
|
|
const rs = new Readable({
|
|
read() {}
|
|
});
|
|
|
|
finished(rs, common.mustCall((err) => {
|
|
assert(!err, 'no error');
|
|
}));
|
|
|
|
rs.push(null);
|
|
rs.resume();
|
|
}
|
|
|
|
{
|
|
const ws = new Writable({
|
|
write(data, enc, cb) {
|
|
cb();
|
|
}
|
|
});
|
|
|
|
finished(ws, common.mustCall((err) => {
|
|
assert(!err, 'no error');
|
|
}));
|
|
|
|
ws.end();
|
|
}
|
|
|
|
{
|
|
const tr = new Transform({
|
|
transform(data, enc, cb) {
|
|
cb();
|
|
}
|
|
});
|
|
|
|
let finish = false;
|
|
let ended = false;
|
|
|
|
tr.on('end', () => {
|
|
ended = true;
|
|
});
|
|
|
|
tr.on('finish', () => {
|
|
finish = true;
|
|
});
|
|
|
|
finished(tr, common.mustCall((err) => {
|
|
assert(!err, 'no error');
|
|
assert(finish);
|
|
assert(ended);
|
|
}));
|
|
|
|
tr.end();
|
|
tr.resume();
|
|
}
|
|
|
|
{
|
|
const rs = fs.createReadStream(__filename);
|
|
|
|
rs.resume();
|
|
finished(rs, common.mustCall());
|
|
}
|
|
|
|
{
|
|
const finishedPromise = promisify(finished);
|
|
|
|
async function run() {
|
|
const rs = fs.createReadStream(__filename);
|
|
const done = common.mustCall();
|
|
|
|
let ended = false;
|
|
rs.resume();
|
|
rs.on('end', () => {
|
|
ended = true;
|
|
});
|
|
await finishedPromise(rs);
|
|
assert(ended);
|
|
done();
|
|
}
|
|
|
|
run();
|
|
}
|
|
|
|
{
|
|
const rs = fs.createReadStream('file-does-not-exist');
|
|
|
|
finished(rs, common.expectsError({
|
|
code: 'ENOENT'
|
|
}));
|
|
}
|
|
|
|
{
|
|
const rs = new Readable();
|
|
|
|
finished(rs, common.mustCall((err) => {
|
|
assert(!err, 'no error');
|
|
}));
|
|
|
|
rs.push(null);
|
|
rs.emit('close'); // should not trigger an error
|
|
rs.resume();
|
|
}
|
|
|
|
{
|
|
const rs = new Readable();
|
|
|
|
finished(rs, common.mustCall((err) => {
|
|
assert(err, 'premature close error');
|
|
}));
|
|
|
|
rs.emit('close'); // should trigger error
|
|
rs.push(null);
|
|
rs.resume();
|
|
}
|
|
|
|
// Test faulty input values and options.
|
|
{
|
|
const rs = new Readable({
|
|
read() {}
|
|
});
|
|
|
|
assert.throws(
|
|
() => finished(rs, 'foo'),
|
|
{
|
|
name: /ERR_INVALID_ARG_TYPE/,
|
|
message: /callback/
|
|
}
|
|
);
|
|
assert.throws(
|
|
() => finished(rs, 'foo', () => {}),
|
|
{
|
|
name: /ERR_INVALID_ARG_TYPE/,
|
|
message: /opts/
|
|
}
|
|
);
|
|
assert.throws(
|
|
() => finished(rs, {}, 'foo'),
|
|
{
|
|
name: /ERR_INVALID_ARG_TYPE/,
|
|
message: /callback/
|
|
}
|
|
);
|
|
|
|
finished(rs, null, common.mustCall());
|
|
|
|
rs.push(null);
|
|
rs.resume();
|
|
}
|