node/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js
Robert Nagy 3f0b62375b stream: convert premature close to AbortError
AbortError is a more "web" align alternative to
ERR_STREAM_PREMATURE_CLOSE.

PR-URL: https://github.com/nodejs/node/pull/39524
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2021-07-28 10:12:04 +02:00

251 lines
5.5 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',
});
assert.rejects(writer.closed, {
code: 'ABORT_ERR',
});
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);
assert.rejects(writer.closed, error);
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);
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);
assert.rejects(writer.closed, error);
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',
});
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',
});
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());
}