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
7 module.exports = duplex
9 function forEach (arr, fn) {
11 return arr.forEach(fn)
14 for (var i = 0; i < arr.length; i++) {
19 function duplex(writer, reader) {
20 var stream = new Stream()
23 forEach(writeMethods, proxyWriter)
25 forEach(readMethods, proxyReader)
27 forEach(readEvents, proxyStream)
29 reader.on("end", handleEnd)
31 writer.on("drain", function() {
35 writer.on("error", reemit)
36 reader.on("error", reemit)
38 stream.writable = writer.writable
39 stream.readable = reader.readable
43 function proxyWriter(methodName) {
44 stream[methodName] = method
47 return writer[methodName].apply(writer, arguments)
51 function proxyReader(methodName) {
52 stream[methodName] = method
55 stream.emit(methodName)
56 var func = reader[methodName]
58 return func.apply(reader, arguments)
60 reader.emit(methodName)
64 function proxyStream(methodName) {
65 reader.on(methodName, reemit)
68 var args = slice.call(arguments)
69 args.unshift(methodName)
70 stream.emit.apply(stream, args)
74 function handleEnd() {
79 var args = slice.call(arguments)
81 stream.emit.apply(stream, args)
84 function reemit(err) {
85 stream.emit("error", err)