mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
Signed-off-by: James M Snell <jasnell@gmail.com> Assisted-by: Opencode PR-URL: https://github.com/nodejs/node/pull/65658 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
160 lines
3.9 KiB
JavaScript
160 lines
3.9 KiB
JavaScript
// Flags: --experimental-stream-iter
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const { Writable } = require('stream');
|
|
const {
|
|
Broadcast,
|
|
broadcast,
|
|
bytesSync,
|
|
from,
|
|
fromWritable,
|
|
fromSync,
|
|
pipeTo,
|
|
pull,
|
|
push,
|
|
share,
|
|
shareSync,
|
|
text,
|
|
textSync,
|
|
} = require('stream/iter');
|
|
|
|
function testDictionaryAndIntegerConversion() {
|
|
const pushed = push(null);
|
|
assert.strictEqual(pushed.writer.endSync(), 0);
|
|
const transformedWithNull = push((chunks) => chunks, null);
|
|
transformedWithNull.writer.endSync();
|
|
|
|
const broadcasted = broadcast(null);
|
|
assert.strictEqual(broadcasted.writer.endSync(), 0);
|
|
|
|
share(from(''), null).cancel();
|
|
shareSync(fromSync(''), null).cancel();
|
|
|
|
assert.deepStrictEqual(bytesSync(fromSync('data'), null),
|
|
new TextEncoder().encode('data'));
|
|
assert.deepStrictEqual(
|
|
bytesSync(fromSync('data'), { limit: '4.9' }),
|
|
new TextEncoder().encode('data'),
|
|
);
|
|
assert.throws(
|
|
() => bytesSync(fromSync('data'), { limit: -1 }),
|
|
{ name: 'TypeError', code: 'ERR_OUT_OF_RANGE' },
|
|
);
|
|
|
|
const converted = push({
|
|
budget: '16384.9',
|
|
backpressure: { toString: () => 'strict' },
|
|
});
|
|
assert.strictEqual(converted.writer.canWrite, true);
|
|
converted.writer.endSync();
|
|
|
|
let signalReads = 0;
|
|
const transformed = push((chunks) => chunks, {
|
|
get signal() {
|
|
signalReads++;
|
|
return undefined;
|
|
},
|
|
});
|
|
assert.strictEqual(signalReads, 1);
|
|
transformed.writer.endSync();
|
|
}
|
|
|
|
async function testUnknownDictionaryMembers() {
|
|
const source = pull(from('pull'), {
|
|
transform: 1,
|
|
write: 1,
|
|
unknown: true,
|
|
});
|
|
assert.strictEqual(await text(source), 'pull');
|
|
|
|
let ended = false;
|
|
const writer = {
|
|
write() {},
|
|
end() { ended = true; },
|
|
};
|
|
await pipeTo(from('pipe'), writer, {
|
|
transform: 1,
|
|
write: 1,
|
|
});
|
|
assert.strictEqual(ended, true);
|
|
|
|
const options = {
|
|
get encoding() {
|
|
throw new Error('unknown member was read');
|
|
},
|
|
};
|
|
assert.deepStrictEqual(bytesSync(fromSync('bytes'), options),
|
|
new TextEncoder().encode('bytes'));
|
|
assert.strictEqual(textSync(fromSync('text'), {
|
|
encoding: { toString: () => 'utf-8' },
|
|
}), 'text');
|
|
}
|
|
|
|
async function testWriterConversion() {
|
|
const { writer, readable } = push();
|
|
|
|
await writer.write(42, null);
|
|
assert.strictEqual(writer.writevSync(new Set([
|
|
null,
|
|
true,
|
|
{ toString: () => 'object' },
|
|
])), true);
|
|
|
|
assert.throws(
|
|
() => writer.write(Symbol('invalid')),
|
|
{ code: 'ERR_INVALID_ARG_TYPE' },
|
|
);
|
|
assert.throws(
|
|
() => writer.writev('not a sequence object'),
|
|
{ code: 'ERR_INVALID_ARG_TYPE' },
|
|
);
|
|
assert.throws(
|
|
() => writer.write('invalid options', 1),
|
|
{ code: 'ERR_INVALID_ARG_TYPE' },
|
|
);
|
|
|
|
writer.endSync();
|
|
assert.strictEqual(await text(readable), '42nulltrueobject');
|
|
}
|
|
|
|
async function testOtherWriterConversions() {
|
|
const output = [];
|
|
const writable = new Writable({
|
|
write(chunk, encoding, callback) {
|
|
output.push(chunk.toString());
|
|
callback();
|
|
},
|
|
});
|
|
const classicWriter = fromWritable(writable);
|
|
await classicWriter.write(42, null);
|
|
await classicWriter.writev(new Set([false, '!']));
|
|
await classicWriter.end(null);
|
|
assert.strictEqual(output.join(''), '42false!');
|
|
|
|
const result = broadcast();
|
|
const source = result.broadcast.push();
|
|
await result.writer.write(42, null);
|
|
await result.writer.writev(new Set([true]));
|
|
result.writer.endSync();
|
|
assert.strictEqual(await text(source), '42true');
|
|
|
|
let signalReads = 0;
|
|
const fromResult = Broadcast.from(from(''), {
|
|
get signal() {
|
|
signalReads++;
|
|
return undefined;
|
|
},
|
|
});
|
|
assert.strictEqual(signalReads, 1);
|
|
fromResult.broadcast.cancel();
|
|
}
|
|
|
|
Promise.all([
|
|
testDictionaryAndIntegerConversion(),
|
|
testUnknownDictionaryMembers(),
|
|
testWriterConversion(),
|
|
testOtherWriterConversions(),
|
|
]).then(common.mustCall());
|