Jo Liss Jo Liss - 28 days ago 14
Node.js Question

Concatenate two (or n) streams


  • 2 streams:

    Given readable streams
    stream1
    and
    stream2
    , what's an idiomatic (concise) way to get a stream containing
    stream1
    and
    stream2
    concatenated
    ?

    I cannot do
    stream1.pipe(outStream); stream2.pipe(outStream)
    , because then the stream contents are jumbled together.

  • n streams:

    Given an EventEmitter that emits an indeterminate number of streams, e.g.

    eventEmitter.emit('stream', stream1)
    eventEmitter.emit('stream', stream2)
    eventEmitter.emit('stream', stream3)
    ...
    eventEmitter.emit('end')


    what's an idiomatic (concise) way to get a stream with all streams concatenated together?


Answer

The combined-stream package concatenates streams. Example from the README:

var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create();
combinedStream.append(fs.createReadStream('file1.txt'));
combinedStream.append(fs.createReadStream('file2.txt'));

combinedStream.pipe(fs.createWriteStream('combined.txt'));

I believe you have to append all streams at once. If the queue runs empty, the combinedStream automatically ends. See issue #5.

The stream-stream library is an alternative that has an explicit .end, but it's much less popular and presumably not as well-tested. It uses the streams2 API of Node 0.10 (see this discussion).