0

我有一个带有几个长管道和几个变换的程序。

例如

socket.pipe(ta).pipe(tb).pipe(tc);
...
tc.pipe(other_socket);

向/从管道添加/读取元数据的最佳方式是什么?

例如:ta将数据包累积并分解为行。 tb需要根据原始 IP 地址(如果有)为每一行添加数据前缀。

如何从它的输入中tb获取?remoteAddress

这里似乎与原型继承有一些相似之处。即tb应该问ta(哪个没有属性)然后ta应该问socket(哪个有属性)。

我正在寻找一种从管道添加和读取元数据的通用方法,因为我还有其他更复杂但类似的问题。

我目前正在通过使用由具有metapayload属性的对象组成的“对象流”来解决这个问题。每个转换都必须完成它的工作,payload并且大多数都不要meta理会。这个解决方案很难看,特别是因为我必须创建一个xnet看起来像net但产生这些增强对象的新模块,而不是普通的缓冲区或字符串。

(Haskellers 可能将此解决方案视为 Monad,我将我使用的大部分流转换提升为“元”Monad。我仍在学习 Haskell,因此这种观察可能不正确。)

4

2 回答 2

2

您可以使用该pipe事件:

tb.on('pipe', function(ta) {
  console.log('getting data from', ta.remoteAddress);
});
于 2013-10-18T15:04:30.360 回答
1

如果元数据是特定管道执行实例的只读数据,那么为什么不在创建单个管道时传递此数据。类似于:socket.pipe(new Ta(address))

就 Haskell 而言,它听起来像 Reader moand,其中 Pipeline 执行功能需要一个 Reader,它完全满足管道各个管道的所有元数据需求

于 2013-10-21T08:37:48.830 回答