Initial commit
[yaffs-website] / node_modules / multipipe / index.js
1
2 /**
3  * Module dependencies.
4  */
5
6 var duplexer = require('duplexer2');
7 var Stream = require('stream');
8
9 /**
10  * Slice reference.
11  */
12
13 var slice = [].slice;
14
15 /**
16  * Duplexer options.
17  */
18
19 var opts = {
20   bubbleErrors: false
21 };
22
23 /**
24  * Expose `pipe`.
25  */
26
27 module.exports = pipe;
28
29 /**
30  * Pipe.
31  *
32  * @param {Stream,...,[Function]}
33  * @return {Stream}
34  * @api public
35  */
36
37 function pipe(){
38   if (arguments.length == 1) return arguments[0];
39   var streams = slice.call(arguments);
40   var cb;
41   if ('function' == typeof streams[streams.length - 1]) {
42     cb = streams.splice(-1)[0];
43   }
44   var first = streams[0];
45   var last = streams[streams.length - 1];
46   var ret;
47   
48   if (first.writable && last.readable) ret = duplexer(opts, first, last);
49   else if (first.writable) ret = first;
50   else if (last.readable) ret = last;
51   else ret = new Stream;
52   
53   streams.forEach(function(stream, i){
54     var next = streams[i+1];
55     if (next) stream.pipe(next);
56     if (stream != ret) stream.on('error', ret.emit.bind(ret, 'error'));
57   });
58
59   if (cb) {
60     var ended = false;
61     ret.on('error', end);
62     last.on('finish', end);
63     function end(err){
64       if (ended) return;
65       ended = true;
66       cb(err);
67     }
68   }
69
70   return ret;
71 }
72