如何在NodeJS中编写双向双工流

fad*_*bee 8 sockets duplex stream node.js

在最新的几个版本的NodeJS(编写时为v0.10.X)中,Streams API经历了一次欢迎的重新设计,我现在想开始使用它.

我想用一个实现协议的对象包装套接字的输入输出.

所谓的Duplex接口,似乎只是任何可读写的流(如套接字).

目前尚不清楚双工是否应该像A或B,或者它是否无关紧要.

   +---+        +---+
-->| A |-->     |   |-->
   +---+        | B |
                |   |<--
                +---+
Run Code Online (Sandbox Code Playgroud)

具有两个可写和两个可读对象的对象的正确代码结构/接口是什么?

+--------+   +----------+   +----
|       r|-->|w        r|-->|w    
| socket |   | protocol |   | rest of app
|       w|<--|r        w|<--|r    
+--------+   +----------+   +----
Run Code Online (Sandbox Code Playgroud)

上图中的问题是该protocol对象需要两个单独的read方法和两个write方法.

在我的脑海中,我可以使协议生成"左"和"右"双工对象,或"进入"和"出"双工对象(以不同的方式对其进行切片).

这些都是首选方式,还是有更好的解决方案?

fad*_*bee 7

          |      app      |
          +---------------+
              ^       |
              |       V      
           +-----+ +-----+
           |     | |     |
+----------|     |-|     |-+
| protocol | .up | |.down| |
+----------|     |-|     |-+
           |     | |     |
           +-----+ +-----+
              ^       |
              |       V
          +---------------+
          |     socket    |
Run Code Online (Sandbox Code Playgroud)

我的解决方案是创建一个Protocol类,它创建了一个Up Transform和一个Down Transform.

在构造Up和Down变换时,Protocol构造函数传递一个引用(自身).然后_transform,每个上变换和下变换中的方法可以根据需要调用push自身,另一个Transform或两者.共同状态可以保留在Protocol对象中.