mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 21:19:50 +01:00
2e81415d9a
PR-URL: https://github.com/nodejs/node/pull/50888 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Debadree Chatterjee <debadree333@gmail.com>
242 lines
5.2 KiB
JavaScript
242 lines
5.2 KiB
JavaScript
// Flags: --expose-internals --no-warnings
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
|
|
const {
|
|
ReadableStream,
|
|
TransformStream,
|
|
TransformStreamDefaultController,
|
|
} = require('stream/web');
|
|
|
|
const {
|
|
createReadStream,
|
|
readFileSync,
|
|
} = require('fs');
|
|
|
|
const {
|
|
kTransfer,
|
|
} = require('internal/worker/js_transferable');
|
|
|
|
const {
|
|
inspect,
|
|
} = require('util');
|
|
|
|
assert.throws(() => new TransformStream({ readableType: 1 }), {
|
|
code: 'ERR_INVALID_ARG_VALUE',
|
|
});
|
|
assert.throws(() => new TransformStream({ writableType: 1 }), {
|
|
code: 'ERR_INVALID_ARG_VALUE',
|
|
});
|
|
|
|
{
|
|
new TransformStream({});
|
|
new TransformStream([]);
|
|
new TransformStream({}, null);
|
|
new TransformStream({}, {});
|
|
new TransformStream({}, []);
|
|
new TransformStream({}, {}, null);
|
|
new TransformStream({}, {}, {});
|
|
new TransformStream({}, {}, []);
|
|
}
|
|
|
|
['a', false, 1, null].forEach((transform) => {
|
|
assert.throws(() => {
|
|
new TransformStream(transform);
|
|
}, {
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
});
|
|
});
|
|
|
|
['a', false, 1].forEach((writableStrategy) => {
|
|
assert.throws(() => {
|
|
new TransformStream({}, writableStrategy);
|
|
}, {
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
});
|
|
});
|
|
|
|
['a', false, 1].forEach((readableStrategy) => {
|
|
assert.throws(() => {
|
|
new TransformStream({}, {}, readableStrategy);
|
|
}, {
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
});
|
|
});
|
|
|
|
{
|
|
const stream = new TransformStream();
|
|
|
|
async function test(stream) {
|
|
const writer = stream.writable.getWriter();
|
|
const reader = stream.readable.getReader();
|
|
|
|
const { 1: result } = await Promise.all([
|
|
writer.write('hello'),
|
|
reader.read(),
|
|
]);
|
|
|
|
assert.strictEqual(result.value, 'hello');
|
|
}
|
|
|
|
test(stream).then(common.mustCall());
|
|
}
|
|
|
|
class Transform {
|
|
start(controller) {
|
|
this.started = true;
|
|
}
|
|
|
|
async transform(chunk, controller) {
|
|
controller.enqueue(chunk.toUpperCase());
|
|
}
|
|
|
|
async flush() {
|
|
this.flushed = true;
|
|
}
|
|
}
|
|
|
|
{
|
|
const transform = new Transform();
|
|
const stream = new TransformStream(transform);
|
|
assert(transform.started);
|
|
|
|
async function test(stream) {
|
|
const writer = stream.writable.getWriter();
|
|
const reader = stream.readable.getReader();
|
|
|
|
const { 1: result } = await Promise.all([
|
|
writer.write('hello'),
|
|
reader.read(),
|
|
]);
|
|
|
|
assert.strictEqual(result.value, 'HELLO');
|
|
|
|
await writer.close();
|
|
}
|
|
|
|
test(stream).then(common.mustCall(() => {
|
|
assert(transform.flushed);
|
|
}));
|
|
}
|
|
|
|
class Source {
|
|
constructor() {
|
|
this.cancelCalled = false;
|
|
}
|
|
|
|
start(controller) {
|
|
this.stream = createReadStream(__filename);
|
|
this.stream.on('data', (chunk) => {
|
|
controller.enqueue(chunk.toString());
|
|
});
|
|
this.stream.once('end', () => {
|
|
if (!this.cancelCalled)
|
|
controller.close();
|
|
});
|
|
this.stream.once('error', (error) => {
|
|
controller.error(error);
|
|
});
|
|
}
|
|
|
|
cancel() {
|
|
this.cancelCalled = true;
|
|
}
|
|
}
|
|
|
|
{
|
|
const instream = new ReadableStream(new Source());
|
|
const tstream = new TransformStream(new Transform());
|
|
const r = instream.pipeThrough(tstream);
|
|
|
|
async function read(stream) {
|
|
let res = '';
|
|
for await (const chunk of stream)
|
|
res += chunk;
|
|
return res;
|
|
}
|
|
|
|
read(r).then(common.mustCall((data) => {
|
|
const check = readFileSync(__filename);
|
|
assert.strictEqual(check.toString().toUpperCase(), data);
|
|
}));
|
|
}
|
|
|
|
{
|
|
assert.throws(() => Reflect.get(TransformStream.prototype, 'readable', {}), {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
assert.throws(() => Reflect.get(TransformStream.prototype, 'writable', {}), {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
assert.throws(() => TransformStream.prototype[kTransfer]({}), {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
|
|
assert.throws(() => {
|
|
Reflect.get(TransformStreamDefaultController.prototype, 'desiredSize', {});
|
|
}, {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
assert.throws(() => {
|
|
TransformStreamDefaultController.prototype.enqueue({});
|
|
}, {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
assert.throws(() => {
|
|
TransformStreamDefaultController.prototype.error({});
|
|
}, {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
assert.throws(() => {
|
|
TransformStreamDefaultController.prototype.terminate({});
|
|
}, {
|
|
code: 'ERR_INVALID_THIS',
|
|
});
|
|
|
|
assert.throws(() => new TransformStreamDefaultController(), {
|
|
code: 'ERR_ILLEGAL_CONSTRUCTOR',
|
|
});
|
|
}
|
|
|
|
{
|
|
let controller;
|
|
const transform = new TransformStream({
|
|
start(c) {
|
|
controller = c;
|
|
}
|
|
});
|
|
|
|
assert.match(inspect(transform), /TransformStream/);
|
|
assert.match(inspect(transform, { depth: null }), /TransformStream/);
|
|
assert.match(inspect(transform, { depth: 0 }), /TransformStream \[/);
|
|
|
|
assert.match(inspect(controller), /TransformStreamDefaultController/);
|
|
assert.match(
|
|
inspect(controller, { depth: null }),
|
|
/TransformStreamDefaultController/);
|
|
assert.match(
|
|
inspect(controller, { depth: 0 }),
|
|
/TransformStreamDefaultController \[/);
|
|
}
|
|
|
|
{
|
|
Object.defineProperty(Object.prototype, 'type', {
|
|
get: common.mustNotCall('get %Object.prototype%.type'),
|
|
set: common.mustNotCall('set %Object.prototype%.type'),
|
|
configurable: true,
|
|
});
|
|
|
|
new TransformStream({
|
|
transform(chunk, controller) {
|
|
controller.enqueue(chunk);
|
|
},
|
|
flush(controller) {
|
|
controller.terminate();
|
|
}
|
|
});
|
|
|
|
delete Object.prototype.type;
|
|
}
|