1'use strict'; 2const common = require('../common'); 3 4// Regression test for https://github.com/nodejs/node/issues/12718. 5// Tests that piping a source stream twice to the same destination stream 6// works, and that a subsequent unpipe() call only removes the pipe *once*. 7const assert = require('assert'); 8const { PassThrough, Writable } = require('stream'); 9 10{ 11 const passThrough = new PassThrough(); 12 const dest = new Writable({ 13 write: common.mustCall((chunk, encoding, cb) => { 14 assert.strictEqual(`${chunk}`, 'foobar'); 15 cb(); 16 }) 17 }); 18 19 passThrough.pipe(dest); 20 passThrough.pipe(dest); 21 22 assert.strictEqual(passThrough._events.data.length, 2); 23 assert.strictEqual(passThrough._readableState.pipes.length, 2); 24 assert.strictEqual(passThrough._readableState.pipes[0], dest); 25 assert.strictEqual(passThrough._readableState.pipes[1], dest); 26 27 passThrough.unpipe(dest); 28 29 assert.strictEqual(passThrough._events.data.length, 1); 30 assert.strictEqual(passThrough._readableState.pipes.length, 1); 31 assert.deepStrictEqual(passThrough._readableState.pipes, [dest]); 32 33 passThrough.write('foobar'); 34 passThrough.pipe(dest); 35} 36 37{ 38 const passThrough = new PassThrough(); 39 const dest = new Writable({ 40 write: common.mustCall((chunk, encoding, cb) => { 41 assert.strictEqual(`${chunk}`, 'foobar'); 42 cb(); 43 }, 2) 44 }); 45 46 passThrough.pipe(dest); 47 passThrough.pipe(dest); 48 49 assert.strictEqual(passThrough._events.data.length, 2); 50 assert.strictEqual(passThrough._readableState.pipes.length, 2); 51 assert.strictEqual(passThrough._readableState.pipes[0], dest); 52 assert.strictEqual(passThrough._readableState.pipes[1], dest); 53 54 passThrough.write('foobar'); 55} 56 57{ 58 const passThrough = new PassThrough(); 59 const dest = new Writable({ 60 write: common.mustNotCall() 61 }); 62 63 passThrough.pipe(dest); 64 passThrough.pipe(dest); 65 66 assert.strictEqual(passThrough._events.data.length, 2); 67 assert.strictEqual(passThrough._readableState.pipes.length, 2); 68 assert.strictEqual(passThrough._readableState.pipes[0], dest); 69 assert.strictEqual(passThrough._readableState.pipes[1], dest); 70 71 passThrough.unpipe(dest); 72 passThrough.unpipe(dest); 73 74 assert.strictEqual(passThrough._events.data, undefined); 75 assert.strictEqual(passThrough._readableState.pipes.length, 0); 76 77 passThrough.write('foobar'); 78} 79