我有一个程序,有几个长管道和几个转换。
例如
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。 我还在学习哈斯克尔,所以这个观察可能是不正确的。
pipe
事件:
tb.on('pipe', function(ta) {
console.log('getting data from', ta.remoteAddress);
});
如果元数据是特定管道执行实例的只读数据,那么为什么不在创建单个管道时传递此数据。像这样的东西:socket.pipe(new Ta(address))
就Haskell而言,它听起来像一个Reader moand,其中Pipeline执行功能需要一个Reader,它完全满足了管道各个管道的所有元数据需求。