我有一个带有多个长管道和多个转换的程序。
例如
socket.pipe(ta).pipe(tb).pipe(tc);
...
tc.pipe(other_socket);
向管道添加/读取元数据的最佳方式是什么?
例如:
ta
累积数据包并将其分成行。 tb
需要在每行前面添加基于源 IP 地址(如果有)的数据前缀。
tb
如何从其输入中获取remoteAddress
?
这里似乎与原型继承有一些相似之处。 即
tb
应该询问 ta
(缺少该属性),然后 ta
应该询问 socket
(具有该属性)。
我正在寻找一种从管道添加和读取元数据的通用方法,因为我还有其他更复杂但类似的问题。
我目前正在通过使用由具有
meta
和 payload
属性的对象组成的“对象流”来解决此问题。 每个变换都必须对 payload
执行其操作,并且大多数变换都保留 meta
。 这个解决方案很丑陋,特别是因为我必须创建一个新的 xnet
模块,它看起来像 net
但会生成这些增强的对象,而不是普通的缓冲区或字符串。
(Haskellers 可能会将此解决方案视为 Monad,我将使用的大部分流转换提升为“元”Monad。我仍在学习 Haskell,因此这种观察可能是不正确的。)
您可以使用
pipe
事件:
tb.on('pipe', function(ta) {
console.log('getting data from', ta.remoteAddress);
});
如果元数据是管道执行的特定实例的只读数据,那么为什么不在创建各个管道时传递此数据。类似于:socket.pipe(new Ta(address))
就Haskell而言,这听起来像是一个Reader moand,其中Pipeline执行函数采用一个Reader,它完全满足了管道各个管道的所有元数据要求