// 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(); } { const transform = { readable: {}, writable: {} }; assert.throws(() => newStreamDuplexFromReadableWritablePair(transform), { code: 'ERR_INVALID_ARG_TYPE' }); } { const transform = { readable: new ReadableStream(), writable: null }; assert.throws(() => newStreamDuplexFromReadableWritablePair(transform), { code: 'ERR_INVALID_ARG_TYPE', }); }