'use strict'; const common = require('../common'); const assert = require('assert'); const { Duplex, duplexPair } = require('stream'); { const pair = duplexPair(); assert(pair[0] instanceof Duplex); assert(pair[1] instanceof Duplex); assert.notStrictEqual(pair[0], pair[1]); } { // Verify that the iterable for array assignment works const [ clientSide, serverSide ] = duplexPair(); assert(clientSide instanceof Duplex); assert(serverSide instanceof Duplex); clientSide.on( 'data', common.mustCall((d) => assert.strictEqual(`${d}`, 'foo')) ); clientSide.on('end', common.mustNotCall()); serverSide.write('foo'); } { const [ clientSide, serverSide ] = duplexPair(); assert(clientSide instanceof Duplex); assert(serverSide instanceof Duplex); serverSide.on( 'data', common.mustCall((d) => assert.strictEqual(`${d}`, 'foo')) ); serverSide.on('end', common.mustCall()); clientSide.end('foo'); } { const [ serverSide, clientSide ] = duplexPair(); serverSide.cork(); serverSide.write('abc'); serverSide.write('12'); serverSide.end('\n'); serverSide.uncork(); let characters = ''; clientSide.on('readable', function() { for (let segment; (segment = this.read()) !== null;) characters += segment; }); clientSide.on('end', common.mustCall(function() { assert.strictEqual(characters, 'abc12\n'); })); } // Test the case where the the _write never calls [kCallback] // because a zero-size push doesn't trigger a _read { const [ serverSide, clientSide ] = duplexPair(); serverSide.write(''); serverSide.write('12'); serverSide.write(''); serverSide.write(''); serverSide.end('\n'); let characters = ''; clientSide.on('readable', function() { for (let segment; (segment = this.read()) !== null;) characters += segment; }); clientSide.on('end', common.mustCall(function() { assert.strictEqual(characters, '12\n'); })); }