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 | }
|