UNPKG

1.88 kBJavaScriptView Raw
1var Stream = require("stream")
2var writeMethods = ["write", "end", "destroy"]
3var readMethods = ["resume", "pause"]
4var readEvents = ["data", "close"]
5var slice = Array.prototype.slice
6
7module.exports = duplex
8
9function 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
19function 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}