| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | var Readable = require('stream').Readable;var util = require('util');function addStream(streams, stream){  if(!stream.readable) throw new Error('All input streams must be readable');  if(this._readableState.ended) throw new Error('Adding streams after ended');  var self = this;  stream._buffer = [];  stream.on('data', function(chunk)  {    if(this === streams[0])      self.push(chunk);    else      this._buffer.push(chunk);  });  stream.on('end', function()  {    for(var stream = streams[0];        stream && stream._readableState.ended;        stream = streams[0])    {      while(stream._buffer.length)        self.push(stream._buffer.shift());      streams.shift();    }    if(!streams.length) self.push(null);  });  stream.on('error', this.emit.bind(this, 'error'));  streams.push(stream);}function OrderedStreams(streams, options) {  if (!(this instanceof(OrderedStreams))) {    return new OrderedStreams(streams, options);  }  streams = streams || [];  options = options || {};  options.objectMode = true;  Readable.call(this, options);  if(!Array.isArray(streams)) streams = [streams];  if(!streams.length) return this.push(null);  // no streams, close  var addStream_bind = addStream.bind(this, []);  this.concat = function()  {    Array.prototype.forEach.call(arguments, function(item)    {      if(Array.isArray(item))        item.forEach(addStream_bind);      else        addStream_bind(item);    });  };  this.concat(streams);}util.inherits(OrderedStreams, Readable);OrderedStreams.prototype._read = function () {};module.exports = OrderedStreams;
 |