12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- var Stream = require("stream")
- var writeMethods = ["write", "end", "destroy"]
- var readMethods = ["resume", "pause"]
- var readEvents = ["data", "close"]
- var slice = Array.prototype.slice
- module.exports = duplex
- function forEach (arr, fn) {
- if (arr.forEach) {
- return arr.forEach(fn)
- }
- for (var i = 0; i < arr.length; i++) {
- fn(arr[i], i)
- }
- }
- function duplex(writer, reader) {
- var stream = new Stream()
- var ended = false
- forEach(writeMethods, proxyWriter)
- forEach(readMethods, proxyReader)
- forEach(readEvents, proxyStream)
- reader.on("end", handleEnd)
- writer.on("drain", function() {
- stream.emit("drain")
- })
- writer.on("error", reemit)
- reader.on("error", reemit)
- stream.writable = writer.writable
- stream.readable = reader.readable
- return stream
- function proxyWriter(methodName) {
- stream[methodName] = method
- function method() {
- return writer[methodName].apply(writer, arguments)
- }
- }
- function proxyReader(methodName) {
- stream[methodName] = method
- function method() {
- stream.emit(methodName)
- var func = reader[methodName]
- if (func) {
- return func.apply(reader, arguments)
- }
- reader.emit(methodName)
- }
- }
- function proxyStream(methodName) {
- reader.on(methodName, reemit)
- function reemit() {
- var args = slice.call(arguments)
- args.unshift(methodName)
- stream.emit.apply(stream, args)
- }
- }
- function handleEnd() {
- if (ended) {
- return
- }
- ended = true
- var args = slice.call(arguments)
- args.unshift("end")
- stream.emit.apply(stream, args)
- }
- function reemit(err) {
- stream.emit("error", err)
- }
- }
|