Version 1
[yaffs-website] / node_modules / duplexer / index.js
1 var Stream = require("stream")
2 var writeMethods = ["write", "end", "destroy"]
3 var readMethods = ["resume", "pause"]
4 var readEvents = ["data", "close"]
5 var slice = Array.prototype.slice
6
7 module.exports = duplex
8
9 function forEach (arr, fn) {
10     if (arr.forEach) {
11         return arr.forEach(fn)
12     }
13
14     for (var i = 0; i < arr.length; i++) {
15         fn(arr[i], i)
16     }
17 }
18
19 function duplex(writer, reader) {
20     var stream = new Stream()
21     var ended = false
22
23     forEach(writeMethods, proxyWriter)
24
25     forEach(readMethods, proxyReader)
26
27     forEach(readEvents, proxyStream)
28
29     reader.on("end", handleEnd)
30
31     writer.on("drain", function() {
32       stream.emit("drain")
33     })
34
35     writer.on("error", reemit)
36     reader.on("error", reemit)
37
38     stream.writable = writer.writable
39     stream.readable = reader.readable
40
41     return stream
42
43     function proxyWriter(methodName) {
44         stream[methodName] = method
45
46         function method() {
47             return writer[methodName].apply(writer, arguments)
48         }
49     }
50
51     function proxyReader(methodName) {
52         stream[methodName] = method
53
54         function method() {
55             stream.emit(methodName)
56             var func = reader[methodName]
57             if (func) {
58                 return func.apply(reader, arguments)
59             }
60             reader.emit(methodName)
61         }
62     }
63
64     function proxyStream(methodName) {
65         reader.on(methodName, reemit)
66
67         function reemit() {
68             var args = slice.call(arguments)
69             args.unshift(methodName)
70             stream.emit.apply(stream, args)
71         }
72     }
73
74     function handleEnd() {
75         if (ended) {
76             return
77         }
78         ended = true
79         var args = slice.call(arguments)
80         args.unshift("end")
81         stream.emit.apply(stream, args)
82     }
83
84     function reemit(err) {
85         stream.emit("error", err)
86     }
87 }