@jacobbubu/pull-mesh
v3.1.1
Published
[![Build Status](https://github.com/jacobbubu/pull-mesh/workflows/Build%20and%20Release/badge.svg)](https://github.com/jacobbubu/pull-mesh/actions?query=workflow%3A%22Build+and+Release%22) [![Coverage Status](https://coveralls.io/repos/github/jacobbubu/pu
Downloads
27
Readme
@jacobbubu/pull-mesh
创建一个通信网格 (mesh),用于在不确定的网络连通的环境下实现两个 pull duplex 通信
概述
pull-mesh
试图解决一个问题,即两个仅仅知道名字(URI)的 duplex 如何通过一个相互连通的网格来建立连接。如下图: duplexA
和 duplexB
之间存在一个网格(mesh),网格各个节点之间有些相连,有些是中断的。只要存在一条相连的通路,duplexA
和 duplexB
即可相互连接。
示例
两节点直连的例子展示了最简单的情况。其示意图如下:
one
和 two
分别是两端的 duplex 名字,我们用 sourceURI
来标识。one
和 two
为了连接到 mesh,首先需要和它们所知道的 meshNode
建立连接。这是通过 meshNode.createPortStream(sourceURI, destURI)
来完成的。destURI
标记了当前 duplex 希望连接的远端的 duplex 的名字。在整个 mesh 网格内,URI 应该是唯一的。one
和 two
不知道对方的具体的位置或地址,消息由 meshNode
之间转发来完成。
portStream
可以在 meshNode
事先创建好,也可以通过 meshNode
在构造时传入的 onOpenPort
回调函数来创建。两节点直连 演示了这种用法。
meshNode
之间会创建 relayStream
。relayStream
负责将两个 meshNode
连接,它也仅仅负责这件事,对所要传播的 message
的语义并不关心。
还有两个例子演示了更复杂一些的用法:
- 同步 scuttlebutt 数据结构: 这个例子演示了如何在两个节点间同步 scuttlebutt model。
- 三节点同步: 顾名思义,从两节点变成三节点。
节点间消息是如何传播的
每个消息都有一个全网唯一的 id。meshNode
在收到消息后,首先会发给所有它所拥有的的 portStream
,如果没有一个 portStream
能处理,则逐一发给它的 relayStream
。这些 relayStream
将把消息传递给其他 meshNode
,继而重复上述步骤。为了避免消息在 meshNode
之间重复传递,每个 relayStream
确保在一段时间内具有相同 id
的消息仅仅传输一次,重复收到的消息将被丢弃。
注意
该模块目前仅仅出于验证概念阶段,大量的测试用例和连通检测功能还有待完善。