aboutsummaryrefslogtreecommitdiff
path: root/node_modules/multipipe/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/multipipe/index.js')
-rw-r--r--node_modules/multipipe/index.js72
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;
+}
+