mirror of
https://github.com/nodejs/node.git
synced 2025-05-01 17:03:34 +00:00

Experimental implementation of the WHATWG streams standard. Signed-off-by: James M Snell <jasnell@gmail.com> PR-URL: https://github.com/nodejs/node/pull/39062 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
189 lines
4.1 KiB
JavaScript
189 lines
4.1 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',
|
|
});
|
|
|
|
|
|
{
|
|
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 \[/);
|
|
}
|