es.merge = function (/*streams...*/) {
  var toMerge = [].slice.call(arguments)
  var stream = new Stream()
  stream.setMaxListeners(0) // allow adding more than 11 streams
  var endCount = 0
  stream.writable = stream.readable = true

  toMerge.forEach(function (e) {
    e.pipe(stream, {end: false})
    var ended = false
    e.on('end', function () {
      if(ended) return
      ended = true
      endCount ++
      if(endCount == toMerge.length)
        stream.emit('end') 
    })
  })
  stream.write = function (data) {
    this.emit('data', data)
  }
  stream.destroy = function () {
    toMerge.forEach(function (e) {
      if(e.destroy) e.destroy()
    })
  }
  return stream
}
示例#2
0
 es.concat = es.merge = function() {
   var toMerge = [].slice.call(arguments);
   if (toMerge.length === 1 && (toMerge[0] instanceof Array)) {
     toMerge = toMerge[0];
   }
   var stream = new Stream();
   stream.setMaxListeners(0);
   var endCount = 0;
   stream.writable = stream.readable = true;
   toMerge.forEach(function(e) {
     e.pipe(stream, {end: false});
     var ended = false;
     e.on('end', function() {
       if (ended)
         return;
       ended = true;
       endCount++;
       if (endCount == toMerge.length)
         stream.emit('end');
     });
   });
   stream.write = function(data) {
     this.emit('data', data);
   };
   stream.destroy = function() {
     toMerge.forEach(function(e) {
       if (e.destroy)
         e.destroy();
     });
   };
   return stream;
 };
示例#3
0
文件: ms.js 项目: icw82/kenzo-vk
const mod = function( /*streams...*/ ) {
    var toMerge = [].slice.call(arguments)
    //var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

    if (toMerge.length === 1 && (toMerge[0] instanceof Array)) {
        toMerge = toMerge[0] //handle array as arguments object
    }
    var stream = new Stream();

    stream.setMaxListeners(0) // allow adding more than 11 streams
    var endCount = 0
    stream.writable = stream.readable = true

    if (toMerge.length) {
        toMerge.forEach(function (e) {
            e.pipe(stream, {
                end: false
            })
            var ended = false
            e.on('end', function () {
                if (ended) return
                ended = true
                endCount++
                if (endCount == toMerge.length)
                    stream.emit('end')
            })
        })
    } else {
        process.nextTick(function () {
            stream.emit('end')
        })
    }

    stream.write = function (data) {
        this.emit('data', data)
    }
    stream.destroy = function () {
        toMerge.forEach(function (e) {
            if (e.destroy) e.destroy()
        })
    }
    return stream
}
示例#4
0
module.exports = function (write, end, error) {

    write = write || function (data) { this.emit('data', data) }
    end = end || function () { this.emit('end') }

    var ended = false, destroyed = false
    var stream = new Stream(), buffer = []
    stream.buffer = buffer
    stream.readable = stream.writable = true
    stream.paused = false  
    stream.write = function (data) {
      if(!data){ 
        this.emit('data'); 
      }else{
        write.call(this, data)
      }
      return !stream.paused
    }
    
    function drain() {
      while(buffer.length && !stream.paused) {
        var data = buffer.shift()
        if(null === data)
          return stream.emit('end')
        else
          stream.emit('data', data)
      }
    }

    stream.queue = function (data) {
      buffer.push(data)
      drain()
    }

    //this will be registered as the first 'end' listener
    //must call destroy next tick, to make sure we're after any
    //stream piped from here. 
    //this is only a problem if end is not emitted synchronously.
    //a nicer way to do this is to make sure this is the last listener for 'end'


    stream.on('end', function () {
      stream.readable = false
      if(!stream.writable)
        process.nextTick(function () {
          stream.destroy()
        })
    })

    function _end () {
      stream.writable = false
      end.call(stream)
      if(!stream.readable)
        stream.destroy()
    }

    stream.end = function (data) {
      if(ended) return 
      //this breaks, because pipe doesn't check writable before calling end.
      //throw new Error('cannot call end twice')
      ended = true
      if(arguments.length) stream.write(data)
      if(!buffer.length) _end()
    }

    stream.destroy = function () {
      if(destroyed) return
      destroyed = true
      ended = true
      buffer.length = 0
      stream.writable = stream.readable = false
      stream.emit('close')
    }

    stream.pause = function () {
      if(stream.paused) return
      stream.paused = true
      stream.emit('pause')
    }
    stream.wait = function () {
      if(stream.paused) return
      stream.paused = true
  //    stream.emit('pause')
    }
    
    stream.resume = function () {
      if(stream.paused) {
        stream.paused = false
      }
      drain()
      //may have become paused again,
      //as drain emits 'data'.
      if(!stream.paused)
        stream.emit('drain')
    }


    /**********ADDED BY BRANDON*************/
    var streamler = stream.streamler = this.streamler,
        metric = stream.metric = this.metric,
        channelname = stream.channelname = this.channelname,
        parentmap = stream.parentmap = this.parentmap,
        routemap = stream.routemap = this.routemap,
        root = stream.root = this.root ? streamler.merge(this.root, {count:0}) : {count:0},
        _start = stream._start = this._start;


    if(error && error.length){
      error.forEach(function(err){
        stream.on("error", err);
      });
    }

    stream.setMaxListeners(0);

    stream.filter = stream.filt = stream.link = function(type, options){
      var ret;
      if( options && options.hasOwnProperty("condition") && !options.condition )
        ret = this;
      else if( this.streamler.filters[metric] && typeof this.streamler.filters[metric][type] === "function" )
        ret = this.pipe( this.streamler.filters[metric][type].call( this, options ) );
      else if( typeof this.streamler.filters.global[type] === "function" )
        ret = this.pipe( this.streamler.filters.global[type].call( this, options ) );
      else {
        console.log("broken filter! metric not correct OR filter doesnt exist "+this.metric+type); process.exit();
      }
      return ret;
    }

    stream.dumper = stream.dump = function(type, options){
      if( options && options.hasOwnProperty("condition") && !options.condition )
        return this;
      else if( streamler.dumpers[metric] && typeof streamler.dumpers[metric][type] === "function" )
        this.pipe( streamler.dumpers[metric][type].call( this, options ) );
      else if( typeof streamler.dumpers.global[type] === "function" )
        this.pipe( streamler.dumpers.global[type].call( this, options ) );
      else {
        console.log("broken dumper!"+metric+type); process.exit();
      }
      return this;
    }

    stream.done = function(options){
      this.pipe( streamler.channelDone.apply(this, arguments) );
    }

    stream.convert = function( toconvert ){
      var me = toconvert;
      me.streamler = streamler;
      me.channelname = channelname;
      me.routemap = routemap;
      me.root = root;
      me.metric = metric;
      me._start = _start;
      toconvert.filter = toconvert.filt = toconvert.link = stream.filt.bind( me );
      toconvert.dumper = toconvert.dump = stream.dump.bind( me );
      toconvert.done = stream.done.bind( me );
      return me;
    }

    return stream
}