import { PassThrough } from 'stream' ; function mergeStream ( ... args ) { let sources = [ ] ; const output = new PassThrough ( { objectMode : true } ) ; output . setMaxListeners ( 0 ) ; function remove ( source ) { sources = sources . filter ( ( it ) => { return it !== source ; } ) ; if ( ! sources . length && output . readable ) { output . end ( ) ; } } function add ( this , source ) { if ( Array . isArray ( source ) ) { source . forEach ( add ) ; return this ; } sources . push ( source ) ; source . once ( 'end' , remove . bind ( null , source ) ) ; source . once ( 'error' , output . emit . bind ( output , 'error' ) ) ; source . pipe ( output , { end : false } ) ; return this ; } function isEmpty ( ) { return sources . length == 0 ; } output . add = add ; output . isEmpty = isEmpty ; output . on ( 'unpipe' , remove ) ; [ ... args ] . slice ( ) . forEach ( add ) ; return output ; } export default mergeStream ;