diff options
Diffstat (limited to 'node_modules/multipipe/index.js')
-rw-r--r-- | node_modules/multipipe/index.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/node_modules/multipipe/index.js b/node_modules/multipipe/index.js new file mode 100644 index 000000000..5e406db88 --- /dev/null +++ b/node_modules/multipipe/index.js @@ -0,0 +1,72 @@ + +/** + * 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; +} + |