| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | 
/** * Module dependencies. */var duplexer = require('duplexer2');var Stream = require('stream');/** * Slice reference. */var slice = [].slice;/** * Duplexer options. */var opts = {  bubbleErrors: false};/** * Expose `pipe`. */module.exports = pipe;/** * Pipe. * * @param {Stream,...,[Function]} * @return {Stream} * @api public */function pipe(){  if (arguments.length == 1) return arguments[0];  var streams = slice.call(arguments);  var cb;  if ('function' == typeof streams[streams.length - 1]) {    cb = streams.splice(-1)[0];  }  var first = streams[0];  var last = streams[streams.length - 1];  var ret;    if (first.writable && last.readable) ret = duplexer(opts, first, last);  else if (first.writable) ret = first;  else if (last.readable) ret = last;  else ret = new Stream;    streams.forEach(function(stream, i){    var next = streams[i+1];    if (next) stream.pipe(next);    if (stream != ret) stream.on('error', ret.emit.bind(ret, 'error'));  });  if (cb) {    var ended = false;    ret.on('error', end);    last.on('finish', end);    function end(err){      if (ended) return;      ended = true;      cb(err);    }  }  return ret;}
 |