mirror of
https://github.com/nodejs/node.git
synced 2025-04-30 23:56:58 +00:00

Fix: https://github.com/nodejs/node/issues/42157 PR-URL: https://github.com/nodejs/node/pull/42161 Fixes: https://github.com/nodejs/node/issues/42157 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
167 lines
4.1 KiB
JavaScript
167 lines
4.1 KiB
JavaScript
// Flags: --no-warnings --expose-internals
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const {
|
|
TransformStream,
|
|
} = require('stream/web');
|
|
|
|
const {
|
|
newStreamDuplexFromReadableWritablePair,
|
|
} = require('internal/webstreams/adapters');
|
|
|
|
const {
|
|
finished,
|
|
pipeline,
|
|
Readable,
|
|
Writable,
|
|
} = require('stream');
|
|
|
|
const {
|
|
kState,
|
|
} = require('internal/webstreams/util');
|
|
|
|
{
|
|
const transform = new TransformStream();
|
|
const duplex = newStreamDuplexFromReadableWritablePair(transform);
|
|
|
|
assert(transform.readable.locked);
|
|
assert(transform.writable.locked);
|
|
|
|
duplex.destroy();
|
|
|
|
duplex.on('close', common.mustCall(() => {
|
|
assert.strictEqual(transform.readable[kState].state, 'closed');
|
|
assert.strictEqual(transform.writable[kState].state, 'errored');
|
|
}));
|
|
}
|
|
|
|
{
|
|
const error = new Error('boom');
|
|
const transform = new TransformStream();
|
|
const duplex = newStreamDuplexFromReadableWritablePair(transform);
|
|
|
|
assert(transform.readable.locked);
|
|
assert(transform.writable.locked);
|
|
|
|
duplex.destroy(error);
|
|
duplex.on('error', common.mustCall((reason) => {
|
|
assert.strictEqual(reason, error);
|
|
}));
|
|
|
|
duplex.on('close', common.mustCall(() => {
|
|
assert.strictEqual(transform.readable[kState].state, 'closed');
|
|
assert.strictEqual(transform.writable[kState].state, 'errored');
|
|
assert.strictEqual(transform.writable[kState].storedError, error);
|
|
}));
|
|
}
|
|
|
|
{
|
|
const transform = new TransformStream();
|
|
const duplex = new newStreamDuplexFromReadableWritablePair(transform);
|
|
|
|
duplex.end();
|
|
duplex.resume();
|
|
|
|
duplex.on('close', common.mustCall(() => {
|
|
assert.strictEqual(transform.readable[kState].state, 'closed');
|
|
assert.strictEqual(transform.writable[kState].state, 'closed');
|
|
}));
|
|
}
|
|
|
|
{
|
|
const ec = new TextEncoder();
|
|
const dc = new TextDecoder();
|
|
const transform = new TransformStream({
|
|
transform(chunk, controller) {
|
|
const text = dc.decode(chunk);
|
|
controller.enqueue(ec.encode(text.toUpperCase()));
|
|
}
|
|
});
|
|
const duplex = new newStreamDuplexFromReadableWritablePair(transform, {
|
|
encoding: 'utf8',
|
|
});
|
|
|
|
duplex.end('hello');
|
|
duplex.on('data', common.mustCall((chunk) => {
|
|
assert.strictEqual(chunk, 'HELLO');
|
|
}));
|
|
duplex.on('end', common.mustCall());
|
|
|
|
duplex.on('close', common.mustCall(() => {
|
|
assert.strictEqual(transform.readable[kState].state, 'closed');
|
|
assert.strictEqual(transform.writable[kState].state, 'closed');
|
|
}));
|
|
}
|
|
|
|
{
|
|
const ec = new TextEncoder();
|
|
const dc = new TextDecoder();
|
|
const transform = new TransformStream({
|
|
transform: common.mustCall((chunk, controller) => {
|
|
const text = dc.decode(chunk);
|
|
controller.enqueue(ec.encode(text.toUpperCase()));
|
|
})
|
|
});
|
|
const duplex = new newStreamDuplexFromReadableWritablePair(transform, {
|
|
encoding: 'utf8',
|
|
});
|
|
|
|
finished(duplex, common.mustCall());
|
|
|
|
duplex.end('hello');
|
|
duplex.resume();
|
|
}
|
|
|
|
{
|
|
const ec = new TextEncoder();
|
|
const dc = new TextDecoder();
|
|
const transform = new TransformStream({
|
|
transform: common.mustCall((chunk, controller) => {
|
|
const text = dc.decode(chunk);
|
|
controller.enqueue(ec.encode(text.toUpperCase()));
|
|
})
|
|
});
|
|
const duplex = new newStreamDuplexFromReadableWritablePair(transform, {
|
|
encoding: 'utf8',
|
|
});
|
|
|
|
const readable = new Readable({
|
|
read() {
|
|
readable.push(Buffer.from('hello'));
|
|
readable.push(null);
|
|
}
|
|
});
|
|
|
|
const writable = new Writable({
|
|
write: common.mustCall((chunk, encoding, callback) => {
|
|
assert.strictEqual(dc.decode(chunk), 'HELLO');
|
|
assert.strictEqual(encoding, 'buffer');
|
|
callback();
|
|
})
|
|
});
|
|
|
|
finished(duplex, common.mustCall());
|
|
pipeline(readable, duplex, writable, common.mustCall());
|
|
}
|
|
|
|
{
|
|
const transform = new TransformStream();
|
|
const duplex = newStreamDuplexFromReadableWritablePair(transform);
|
|
duplex.setEncoding('utf-8');
|
|
duplex.on('data', common.mustCall((data) => {
|
|
assert.strictEqual(data, 'hello');
|
|
}, 5));
|
|
|
|
duplex.write(Buffer.from('hello'));
|
|
duplex.write(Buffer.from('hello'));
|
|
duplex.write(Buffer.from('hello'));
|
|
duplex.write(Buffer.from('hello'));
|
|
duplex.write(Buffer.from('hello'));
|
|
|
|
duplex.end();
|
|
}
|