mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
eb46e09570
test: test streambase has already has a consumer PR-URL: https://github.com/nodejs/node/pull/48059 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
257 lines
5.9 KiB
JavaScript
257 lines
5.9 KiB
JavaScript
// Flags: --no-warnings --expose-internals
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const {
|
|
newReadableWritablePairFromDuplex,
|
|
} = require('internal/webstreams/adapters');
|
|
|
|
const {
|
|
PassThrough,
|
|
} = require('stream');
|
|
|
|
{
|
|
// Destroying the duplex without an error should close
|
|
// the readable and error the writable.
|
|
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
assert.rejects(reader.closed, {
|
|
code: 'ABORT_ERR',
|
|
}).then(common.mustCall());
|
|
|
|
assert.rejects(writer.closed, {
|
|
code: 'ABORT_ERR',
|
|
}).then(common.mustCall());
|
|
|
|
duplex.destroy();
|
|
|
|
duplex.on('close', common.mustCall());
|
|
}
|
|
|
|
{
|
|
// Destroying the duplex with an error should error
|
|
// both the readable and writable
|
|
|
|
const error = new Error('boom');
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('error', common.mustCall((reason) => {
|
|
assert.strictEqual(reason, error);
|
|
}));
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
assert.rejects(reader.closed, error).then(common.mustCall());
|
|
assert.rejects(writer.closed, error).then(common.mustCall());
|
|
|
|
duplex.destroy(error);
|
|
}
|
|
|
|
{
|
|
const error = new Error('boom');
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('error', common.mustCall((reason) => {
|
|
assert.strictEqual(reason, error);
|
|
}));
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
reader.closed.then(common.mustCall());
|
|
assert.rejects(writer.closed, error).then(common.mustCall());
|
|
|
|
reader.cancel(error).then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('error', common.mustNotCall());
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
reader.closed.then(common.mustCall());
|
|
writer.closed.then(common.mustCall());
|
|
|
|
writer.close().then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const error = new Error('boom');
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('error', common.mustCall((reason) => {
|
|
assert.strictEqual(reason, error);
|
|
}));
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
assert.rejects(reader.closed, error).then(common.mustCall());
|
|
assert.rejects(writer.closed, error).then(common.mustCall());
|
|
|
|
writer.abort(error).then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
|
|
duplex.on('error', common.mustCall((error) => {
|
|
assert.strictEqual(error.code, 'ABORT_ERR');
|
|
}));
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
assert.rejects(writer.closed, {
|
|
code: 'ABORT_ERR',
|
|
}).then(common.mustCall());
|
|
|
|
reader.cancel();
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('error', common.mustNotCall());
|
|
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
|
|
reader.closed.then(common.mustCall());
|
|
assert.rejects(writer.closed, {
|
|
code: 'ABORT_ERR',
|
|
}).then(common.mustCall());
|
|
|
|
duplex.end();
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
|
|
duplex.on('data', common.mustCall(2));
|
|
duplex.on('close', common.mustCall());
|
|
duplex.on('end', common.mustCall());
|
|
duplex.on('finish', common.mustCall());
|
|
|
|
const writer = writable.getWriter();
|
|
const reader = readable.getReader();
|
|
|
|
const ec = new TextEncoder();
|
|
const dc = new TextDecoder();
|
|
|
|
Promise.all([
|
|
writer.write(ec.encode('hello')),
|
|
reader.read().then(common.mustCall(({ done, value }) => {
|
|
assert(!done);
|
|
assert.strictEqual(dc.decode(value), 'hello');
|
|
})),
|
|
reader.read().then(common.mustCall(({ done, value }) => {
|
|
assert(!done);
|
|
assert.strictEqual(dc.decode(value), 'there');
|
|
})),
|
|
writer.write(ec.encode('there')),
|
|
writer.close(),
|
|
reader.read().then(common.mustCall(({ done, value }) => {
|
|
assert(done);
|
|
assert.strictEqual(value, undefined);
|
|
})),
|
|
]).then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough();
|
|
duplex.destroy();
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
reader.closed.then(common.mustCall());
|
|
writer.closed.then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough({ writable: false });
|
|
assert(duplex.readable);
|
|
assert(!duplex.writable);
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
writer.closed.then(common.mustCall());
|
|
reader.cancel().then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
const duplex = new PassThrough({ readable: false });
|
|
assert(!duplex.readable);
|
|
assert(duplex.writable);
|
|
const {
|
|
readable,
|
|
writable,
|
|
} = newReadableWritablePairFromDuplex(duplex);
|
|
const reader = readable.getReader();
|
|
const writer = writable.getWriter();
|
|
reader.closed.then(common.mustCall());
|
|
writer.close().then(common.mustCall());
|
|
}
|
|
|
|
{
|
|
assert.throws(() => newReadableWritablePairFromDuplex(null), {
|
|
code: 'ERR_INVALID_ARG_TYPE'
|
|
});
|
|
}
|