mirror of
https://github.com/nodejs/node.git
synced 2025-08-16 06:08:50 +02:00
stream: construct
Provide a standardized way of asynchronously creating and initializing resources before performing any work. Refs: https://github.com/nodejs/node/issues/29314 PR-URL: https://github.com/nodejs/node/pull/29656 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Denys Otrishko <shishugi@gmail.com>
This commit is contained in:
parent
9949a2e1e3
commit
fb8cc72e73
5 changed files with 544 additions and 20 deletions
244
test/parallel/test-stream-construct.js
Normal file
244
test/parallel/test-stream-construct.js
Normal file
|
@ -0,0 +1,244 @@
|
|||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const { Writable, Readable, Duplex } = require('stream');
|
||||
const assert = require('assert');
|
||||
|
||||
{
|
||||
// Multiple callback.
|
||||
new Writable({
|
||||
construct: common.mustCall((callback) => {
|
||||
callback();
|
||||
callback();
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
code: 'ERR_MULTIPLE_CALLBACK'
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Multiple callback.
|
||||
new Readable({
|
||||
construct: common.mustCall((callback) => {
|
||||
callback();
|
||||
callback();
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
code: 'ERR_MULTIPLE_CALLBACK'
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Synchronous error.
|
||||
|
||||
new Writable({
|
||||
construct: common.mustCall((callback) => {
|
||||
callback(new Error('test'));
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
message: 'test'
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Synchronous error.
|
||||
|
||||
new Readable({
|
||||
construct: common.mustCall((callback) => {
|
||||
callback(new Error('test'));
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
message: 'test'
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Asynchronous error.
|
||||
|
||||
new Writable({
|
||||
construct: common.mustCall((callback) => {
|
||||
process.nextTick(callback, new Error('test'));
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
message: 'test'
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
// Asynchronous error.
|
||||
|
||||
new Readable({
|
||||
construct: common.mustCall((callback) => {
|
||||
process.nextTick(callback, new Error('test'));
|
||||
})
|
||||
}).on('error', common.expectsError({
|
||||
name: 'Error',
|
||||
message: 'test'
|
||||
}));
|
||||
}
|
||||
|
||||
function testDestroy(factory) {
|
||||
{
|
||||
let constructed = false;
|
||||
const s = factory({
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
s.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.destroy();
|
||||
}
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const s = factory({
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
s.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.destroy(null, () => {
|
||||
assert.strictEqual(constructed, true);
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const s = factory({
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
s.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.destroy();
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const s = factory({
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
s.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.on('error', common.mustCall((err) => {
|
||||
assert.strictEqual(err.message, 'kaboom');
|
||||
}));
|
||||
s.destroy(new Error('kaboom'), (err) => {
|
||||
assert.strictEqual(err.message, 'kaboom');
|
||||
assert.strictEqual(constructed, true);
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const s = factory({
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
s.on('error', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
s.destroy(new Error());
|
||||
}
|
||||
}
|
||||
testDestroy((opts) => new Readable({
|
||||
read: common.mustNotCall(),
|
||||
...opts
|
||||
}));
|
||||
testDestroy((opts) => new Writable({
|
||||
write: common.mustNotCall(),
|
||||
final: common.mustNotCall(),
|
||||
...opts
|
||||
}));
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const r = new Readable({
|
||||
autoDestroy: true,
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
}),
|
||||
read: common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
r.push(null);
|
||||
})
|
||||
});
|
||||
r.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
r.on('data', common.mustNotCall());
|
||||
}
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const w = new Writable({
|
||||
autoDestroy: true,
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
}),
|
||||
write: common.mustCall((chunk, encoding, cb) => {
|
||||
assert.strictEqual(constructed, true);
|
||||
process.nextTick(cb);
|
||||
}),
|
||||
final: common.mustCall((cb) => {
|
||||
assert.strictEqual(constructed, true);
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
w.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
w.end('data');
|
||||
}
|
||||
|
||||
{
|
||||
let constructed = false;
|
||||
const w = new Writable({
|
||||
autoDestroy: true,
|
||||
construct: common.mustCall((cb) => {
|
||||
constructed = true;
|
||||
process.nextTick(cb);
|
||||
}),
|
||||
write: common.mustNotCall(),
|
||||
final: common.mustCall((cb) => {
|
||||
assert.strictEqual(constructed, true);
|
||||
process.nextTick(cb);
|
||||
})
|
||||
});
|
||||
w.on('close', common.mustCall(() => {
|
||||
assert.strictEqual(constructed, true);
|
||||
}));
|
||||
w.end();
|
||||
}
|
||||
|
||||
{
|
||||
new Duplex({
|
||||
construct: common.mustCall()
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue