@streamr/trackerless-network 100.0.0-testnet-two.4 → 100.0.0-testnet-three.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/NetworkNode.d.ts +2 -1
- package/dist/src/NetworkNode.js +6 -2
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +6 -2
- package/dist/src/NetworkStack.js +21 -1
- package/dist/src/NetworkStack.js.map +1 -1
- package/dist/src/exports.d.ts +1 -0
- package/dist/src/exports.js +4 -1
- package/dist/src/exports.js.map +1 -1
- package/dist/src/logic/DeliveryRpcLocal.js +1 -0
- package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
- package/dist/src/logic/DuplicateMessageDetector.d.ts +3 -3
- package/dist/src/logic/DuplicateMessageDetector.js +10 -6
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
- package/dist/src/logic/EntryPointDiscovery.js +8 -5
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
- package/dist/src/logic/Layer0Node.d.ts +2 -0
- package/dist/src/logic/Layer1Node.d.ts +4 -4
- package/dist/src/logic/NodeList.d.ts +6 -8
- package/dist/src/logic/NodeList.js +10 -12
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/RandomGraphNode.d.ts +5 -5
- package/dist/src/logic/RandomGraphNode.js +26 -22
- package/dist/src/logic/RandomGraphNode.js.map +1 -1
- package/dist/src/logic/StreamrNode.d.ts +3 -2
- package/dist/src/logic/StreamrNode.js +25 -6
- package/dist/src/logic/StreamrNode.js.map +1 -1
- package/dist/src/logic/createRandomGraphNode.d.ts +2 -2
- package/dist/src/logic/createRandomGraphNode.js +14 -14
- package/dist/src/logic/createRandomGraphNode.js.map +1 -1
- package/dist/src/logic/inspect/InspectSession.js +3 -2
- package/dist/src/logic/inspect/InspectSession.js.map +1 -1
- package/dist/src/logic/inspect/Inspector.d.ts +2 -3
- package/dist/src/logic/inspect/Inspector.js +7 -1
- package/dist/src/logic/inspect/Inspector.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +18 -17
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +3 -4
- package/dist/src/logic/neighbor-discovery/Handshaker.js +29 -27
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +4 -2
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +8 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +5 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.d.ts +9 -0
- package/dist/src/logic/node-info/NodeInfoClient.js +19 -0
- package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +12 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js +29 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +6 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js +11 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js.map +1 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js +7 -3
- package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -1
- package/dist/src/logic/propagation/Propagation.js +3 -0
- package/dist/src/logic/propagation/Propagation.js.map +1 -1
- package/dist/src/logic/propagation/PropagationTaskStore.js +1 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +43 -15
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +3 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +14 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -0
- package/dist/src/logic/proxy/ProxyClient.d.ts +1 -1
- package/dist/src/logic/proxy/ProxyClient.js +18 -11
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +2 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +2 -2
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +4 -2
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/utils.js.map +1 -1
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +4 -5
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +38 -29
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +22 -12
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +11 -16
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +2 -3
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +27 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +43 -17
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +106 -5
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +79 -7
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +11 -0
- package/dist/test/benchmark/first-message.js +7 -5
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.js +2 -1
- package/dist/test/utils/utils.js.map +1 -1
- package/jest.config.js +3 -38
- package/package.json +7 -7
- package/protos/NetworkRpc.proto +34 -5
- package/src/NetworkNode.ts +5 -1
- package/src/NetworkStack.ts +23 -2
- package/src/exports.ts +4 -0
- package/src/logic/DuplicateMessageDetector.ts +7 -7
- package/src/logic/EntryPointDiscovery.ts +3 -3
- package/src/logic/Layer0Node.ts +2 -0
- package/src/logic/Layer1Node.ts +4 -4
- package/src/logic/NodeList.ts +9 -15
- package/src/logic/RandomGraphNode.ts +24 -23
- package/src/logic/StreamrNode.ts +18 -4
- package/src/logic/createRandomGraphNode.ts +17 -17
- package/src/logic/inspect/Inspector.ts +3 -4
- package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +18 -18
- package/src/logic/neighbor-discovery/Handshaker.ts +31 -32
- package/src/logic/neighbor-discovery/NeighborFinder.ts +2 -2
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +6 -5
- package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +5 -5
- package/src/logic/node-info/NodeInfoClient.ts +21 -0
- package/src/logic/node-info/NodeInfoRpcLocal.ts +35 -0
- package/src/logic/node-info/NodeInfoRpcRemote.ts +11 -0
- package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +1 -1
- package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +1 -1
- package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +56 -27
- package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +11 -0
- package/src/logic/proxy/ProxyClient.ts +10 -10
- package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +3 -3
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +6 -7
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +3 -4
- package/src/proto/packages/dht/protos/DhtRpc.ts +32 -20
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +30 -1
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +12 -1
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +138 -11
- package/test/benchmark/first-message.ts +28 -8
- package/test/end-to-end/inspect.test.ts +13 -1
- package/test/end-to-end/proxy-and-full-node.test.ts +14 -1
- package/test/end-to-end/proxy-connections.test.ts +14 -2
- package/test/end-to-end/proxy-key-exchange.test.ts +15 -8
- package/test/end-to-end/random-graph-with-real-connections.test.ts +21 -21
- package/test/end-to-end/webrtc-full-node-network.test.ts +3 -3
- package/test/end-to-end/websocket-full-node-network.test.ts +3 -3
- package/test/integration/Handshakes.test.ts +8 -8
- package/test/integration/NetworkNode.test.ts +19 -1
- package/test/integration/NetworkRpc.test.ts +3 -2
- package/test/integration/NodeInfoRpc.test.ts +103 -0
- package/test/integration/Propagation.test.ts +2 -2
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +20 -21
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +22 -19
- package/test/integration/stream-without-default-entrypoints.test.ts +17 -11
- package/test/unit/HandshakeRpcLocal.test.ts +15 -15
- package/test/unit/Handshaker.test.ts +3 -3
- package/test/unit/NeighborFinder.test.ts +5 -5
- package/test/unit/NodeList.test.ts +56 -57
- package/test/unit/Propagation.test.ts +4 -2
- package/test/unit/RandomGraphNode.test.ts +7 -8
- package/test/unit/StreamMessageTranslator.test.ts +7 -4
- package/test/unit/StreamrNode.test.ts +2 -0
- package/test/unit/oldStreamMessageBinaryUtils.test.ts +39 -0
- package/test/utils/mock/MockLayer0Node.ts +6 -1
- package/test/utils/mock/MockLayer1Node.ts +2 -2
- package/test/utils/mock/Transport.ts +1 -1
- package/test/utils/utils.ts +3 -1
- package/tsconfig.jest.json +3 -3
- package/tsconfig.node.json +0 -1
- package/dist/package.json +0 -55
|
@@ -124,32 +124,32 @@ describe('random graph with real connections', () => {
|
|
|
124
124
|
|
|
125
125
|
it('can fully connected topologies ', async () => {
|
|
126
126
|
await waitForCondition(() => {
|
|
127
|
-
return randomGraphNode1.
|
|
128
|
-
&& randomGraphNode2.
|
|
129
|
-
&& randomGraphNode3.
|
|
130
|
-
&& randomGraphNode4.
|
|
131
|
-
&& randomGraphNode5.
|
|
127
|
+
return randomGraphNode1.getNeighbors().length >= 3
|
|
128
|
+
&& randomGraphNode2.getNeighbors().length >= 3
|
|
129
|
+
&& randomGraphNode3.getNeighbors().length >= 3
|
|
130
|
+
&& randomGraphNode4.getNeighbors().length >= 3
|
|
131
|
+
&& randomGraphNode5.getNeighbors().length >= 3
|
|
132
132
|
}, 10000)
|
|
133
|
-
expect(randomGraphNode1.
|
|
134
|
-
expect(randomGraphNode2.
|
|
135
|
-
expect(randomGraphNode3.
|
|
136
|
-
expect(randomGraphNode4.
|
|
137
|
-
expect(randomGraphNode5.
|
|
133
|
+
expect(randomGraphNode1.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
134
|
+
expect(randomGraphNode2.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
135
|
+
expect(randomGraphNode3.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
136
|
+
expect(randomGraphNode4.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
137
|
+
expect(randomGraphNode5.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
138
138
|
})
|
|
139
139
|
|
|
140
140
|
it('can propagate messages', async () => {
|
|
141
|
-
let
|
|
142
|
-
randomGraphNode2.on('message', () =>
|
|
143
|
-
randomGraphNode3.on('message', () =>
|
|
144
|
-
randomGraphNode4.on('message', () =>
|
|
145
|
-
randomGraphNode5.on('message', () =>
|
|
141
|
+
let receivedMessageCount = 0
|
|
142
|
+
randomGraphNode2.on('message', () => receivedMessageCount += 1)
|
|
143
|
+
randomGraphNode3.on('message', () => receivedMessageCount += 1)
|
|
144
|
+
randomGraphNode4.on('message', () => receivedMessageCount += 1)
|
|
145
|
+
randomGraphNode5.on('message', () => receivedMessageCount += 1)
|
|
146
146
|
|
|
147
147
|
await waitForCondition(() => {
|
|
148
|
-
return randomGraphNode1.
|
|
149
|
-
&& randomGraphNode2.
|
|
150
|
-
&& randomGraphNode3.
|
|
151
|
-
&& randomGraphNode4.
|
|
152
|
-
&& randomGraphNode5.
|
|
148
|
+
return randomGraphNode1.getNeighbors().length >= 3
|
|
149
|
+
&& randomGraphNode2.getNeighbors().length >= 3
|
|
150
|
+
&& randomGraphNode3.getNeighbors().length >= 3
|
|
151
|
+
&& randomGraphNode4.getNeighbors().length >= 3
|
|
152
|
+
&& randomGraphNode5.getNeighbors().length >= 3
|
|
153
153
|
}, 10000)
|
|
154
154
|
|
|
155
155
|
const msg = createStreamMessage(
|
|
@@ -158,6 +158,6 @@ describe('random graph with real connections', () => {
|
|
|
158
158
|
randomEthereumAddress()
|
|
159
159
|
)
|
|
160
160
|
randomGraphNode1.broadcast(msg)
|
|
161
|
-
await waitForCondition(() =>
|
|
161
|
+
await waitForCondition(() => receivedMessageCount >= 4)
|
|
162
162
|
})
|
|
163
163
|
})
|
|
@@ -66,12 +66,12 @@ describe('Full node network with WebRTC connections', () => {
|
|
|
66
66
|
}
|
|
67
67
|
, 30000)
|
|
68
68
|
))
|
|
69
|
-
let
|
|
69
|
+
let receivedMessageCount = 0
|
|
70
70
|
const successIds: string[] = []
|
|
71
71
|
nodes.forEach((node) => {
|
|
72
72
|
node.getStreamrNode()!.on('newMessage', () => {
|
|
73
73
|
successIds.push(getNodeIdFromPeerDescriptor(node.getStreamrNode()!.getPeerDescriptor()))
|
|
74
|
-
|
|
74
|
+
receivedMessageCount += 1
|
|
75
75
|
})
|
|
76
76
|
})
|
|
77
77
|
const msg = createStreamMessage(
|
|
@@ -80,7 +80,7 @@ describe('Full node network with WebRTC connections', () => {
|
|
|
80
80
|
randomEthereumAddress()
|
|
81
81
|
)
|
|
82
82
|
entryPoint.getStreamrNode()!.broadcast(msg)
|
|
83
|
-
await waitForCondition(() =>
|
|
83
|
+
await waitForCondition(() => receivedMessageCount === NUM_OF_NODES)
|
|
84
84
|
}, 120000)
|
|
85
85
|
|
|
86
86
|
})
|
|
@@ -64,12 +64,12 @@ describe('Full node network with WebSocket connections only', () => {
|
|
|
64
64
|
}
|
|
65
65
|
, 30000)
|
|
66
66
|
))
|
|
67
|
-
let
|
|
67
|
+
let receivedMessageCount = 0
|
|
68
68
|
const successIds: string[] = []
|
|
69
69
|
nodes.forEach((node) => {
|
|
70
70
|
node.getStreamrNode()!.on('newMessage', () => {
|
|
71
71
|
successIds.push(getNodeIdFromPeerDescriptor(node.getStreamrNode()!.getPeerDescriptor()))
|
|
72
|
-
|
|
72
|
+
receivedMessageCount += 1
|
|
73
73
|
})
|
|
74
74
|
})
|
|
75
75
|
|
|
@@ -79,7 +79,7 @@ describe('Full node network with WebSocket connections only', () => {
|
|
|
79
79
|
randomEthereumAddress()
|
|
80
80
|
)
|
|
81
81
|
entryPoint.getStreamrNode()!.broadcast(msg)
|
|
82
|
-
await waitForCondition(() =>
|
|
82
|
+
await waitForCondition(() => receivedMessageCount === NUM_OF_NODES)
|
|
83
83
|
}, 220000)
|
|
84
84
|
|
|
85
85
|
})
|
|
@@ -34,7 +34,7 @@ describe('Handshakes', () => {
|
|
|
34
34
|
let rpcCommunicator2: ListeningRpcCommunicator
|
|
35
35
|
let rpcCommunicator3: ListeningRpcCommunicator
|
|
36
36
|
let nodeView: NodeList
|
|
37
|
-
let
|
|
37
|
+
let neighbors: NodeList
|
|
38
38
|
let handshaker: Handshaker
|
|
39
39
|
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
40
40
|
|
|
@@ -83,13 +83,13 @@ describe('Handshakes', () => {
|
|
|
83
83
|
|
|
84
84
|
const handshakerNodeId = getNodeIdFromPeerDescriptor(peerDescriptor2)
|
|
85
85
|
nodeView = new NodeList(handshakerNodeId, 10)
|
|
86
|
-
|
|
86
|
+
neighbors = new NodeList(handshakerNodeId, 4)
|
|
87
87
|
handshaker = new Handshaker({
|
|
88
88
|
localPeerDescriptor: peerDescriptor2,
|
|
89
89
|
streamPartId,
|
|
90
90
|
nearbyNodeView: nodeView,
|
|
91
91
|
randomNodeView: nodeView,
|
|
92
|
-
|
|
92
|
+
neighbors,
|
|
93
93
|
connectionLocker: mockConnectionLocker,
|
|
94
94
|
rpcCommunicator: rpcCommunicator2,
|
|
95
95
|
maxNeighborCount: 4
|
|
@@ -119,7 +119,7 @@ describe('Handshakes', () => {
|
|
|
119
119
|
)
|
|
120
120
|
)
|
|
121
121
|
expect(res).toEqual(true)
|
|
122
|
-
expect(
|
|
122
|
+
expect(neighbors.has(getNodeIdFromPeerDescriptor(peerDescriptor1))).toEqual(true)
|
|
123
123
|
})
|
|
124
124
|
|
|
125
125
|
it('Handshake accepted', async () => {
|
|
@@ -134,7 +134,7 @@ describe('Handshakes', () => {
|
|
|
134
134
|
)
|
|
135
135
|
)
|
|
136
136
|
expect(res).toEqual(true)
|
|
137
|
-
expect(
|
|
137
|
+
expect(neighbors.has(getNodeIdFromPeerDescriptor(peerDescriptor1))).toEqual(true)
|
|
138
138
|
})
|
|
139
139
|
|
|
140
140
|
it('Handshake rejected', async () => {
|
|
@@ -149,7 +149,7 @@ describe('Handshakes', () => {
|
|
|
149
149
|
)
|
|
150
150
|
)
|
|
151
151
|
expect(res).toEqual(false)
|
|
152
|
-
expect(
|
|
152
|
+
expect(neighbors.has(getNodeIdFromPeerDescriptor(peerDescriptor1))).toEqual(false)
|
|
153
153
|
})
|
|
154
154
|
|
|
155
155
|
it('Handshake with Interleaving', async () => {
|
|
@@ -165,7 +165,7 @@ describe('Handshakes', () => {
|
|
|
165
165
|
)
|
|
166
166
|
)
|
|
167
167
|
expect(res).toEqual(true)
|
|
168
|
-
expect(
|
|
169
|
-
expect(
|
|
168
|
+
expect(neighbors.has(getNodeIdFromPeerDescriptor(peerDescriptor1))).toEqual(true)
|
|
169
|
+
expect(neighbors.has(getNodeIdFromPeerDescriptor(peerDescriptor3))).toEqual(true)
|
|
170
170
|
})
|
|
171
171
|
})
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { NodeType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
2
2
|
import {
|
|
3
|
+
ContentType,
|
|
4
|
+
EncryptionType,
|
|
3
5
|
MessageID,
|
|
4
|
-
MessageRef,
|
|
6
|
+
MessageRef, SignatureType,
|
|
5
7
|
StreamMessage,
|
|
6
8
|
StreamMessageType,
|
|
7
9
|
StreamPartIDUtils
|
|
@@ -78,7 +80,10 @@ describe('NetworkNode', () => {
|
|
|
78
80
|
content: utf8ToBinary(JSON.stringify({
|
|
79
81
|
hello: 'world'
|
|
80
82
|
})),
|
|
83
|
+
contentType: ContentType.JSON,
|
|
81
84
|
messageType: StreamMessageType.MESSAGE,
|
|
85
|
+
encryptionType: EncryptionType.NONE,
|
|
86
|
+
signatureType: SignatureType.SECP256K1,
|
|
82
87
|
signature: hexToBinary('0x1234'),
|
|
83
88
|
})
|
|
84
89
|
|
|
@@ -93,4 +98,17 @@ describe('NetworkNode', () => {
|
|
|
93
98
|
await waitForCondition(() => msgCount === 1)
|
|
94
99
|
})
|
|
95
100
|
|
|
101
|
+
it('fetchNodeInfo', async () => {
|
|
102
|
+
await node1.join(STREAM_PART_ID)
|
|
103
|
+
await node2.join(STREAM_PART_ID)
|
|
104
|
+
const result1 = await node1.fetchNodeInfo(pd2)
|
|
105
|
+
const result2 = await node2.fetchNodeInfo(pd1)
|
|
106
|
+
expect(result1.streamPartitions.length).toEqual(1)
|
|
107
|
+
expect(result2.streamPartitions.length).toEqual(1)
|
|
108
|
+
expect(result1.controlLayer!.connections.length).toEqual(1)
|
|
109
|
+
expect(result2.controlLayer!.connections.length).toEqual(1)
|
|
110
|
+
expect(result1.controlLayer!.neighbors.length).toEqual(1)
|
|
111
|
+
expect(result2.controlLayer!.neighbors.length).toEqual(1)
|
|
112
|
+
})
|
|
113
|
+
|
|
96
114
|
})
|
|
@@ -9,12 +9,13 @@ import { waitForCondition } from '@streamr/utils'
|
|
|
9
9
|
import { Empty } from '../../src/proto/google/protobuf/empty'
|
|
10
10
|
import { createStreamMessage } from '../utils/utils'
|
|
11
11
|
import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
|
|
12
|
+
import { DhtCallContext } from '@streamr/dht'
|
|
12
13
|
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
13
14
|
import { randomEthereumAddress } from '@streamr/test-utils'
|
|
14
15
|
|
|
15
16
|
describe('Network RPC', () => {
|
|
16
|
-
let rpcCommunicator1: RpcCommunicator
|
|
17
|
-
let rpcCommunicator2: RpcCommunicator
|
|
17
|
+
let rpcCommunicator1: RpcCommunicator<DhtCallContext>
|
|
18
|
+
let rpcCommunicator2: RpcCommunicator<DhtCallContext>
|
|
18
19
|
let client: ProtoRpcClient<DeliveryRpcClient>
|
|
19
20
|
let recvCounter = 0
|
|
20
21
|
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Simulator, SimulatorTransport, ListeningRpcCommunicator, PeerDescriptor } from '@streamr/dht'
|
|
2
|
+
import { NetworkStack } from '../../src/NetworkStack'
|
|
3
|
+
import { createMockPeerDescriptor } from '../utils/utils'
|
|
4
|
+
import { NodeInfoClient } from '../../src/logic/node-info/NodeInfoClient'
|
|
5
|
+
import { NODE_INFO_RPC_SERVICE_ID } from '../../src/logic/node-info/NodeInfoRpcLocal'
|
|
6
|
+
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
7
|
+
import { waitForCondition } from '@streamr/utils'
|
|
8
|
+
|
|
9
|
+
// TODO add Jest utility so that the normalization is not needed (NET-1254)
|
|
10
|
+
const normalizePeerDescriptor = (peerDescriptor: PeerDescriptor) => {
|
|
11
|
+
return {
|
|
12
|
+
...peerDescriptor,
|
|
13
|
+
nodeId: new Uint8Array(peerDescriptor.nodeId)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe('NetworkStack NodeInfoRpc', () => {
|
|
18
|
+
|
|
19
|
+
let requesteStack: NetworkStack
|
|
20
|
+
let otherStack: NetworkStack
|
|
21
|
+
let nodeInfoClient: NodeInfoClient
|
|
22
|
+
let requesteeTransport1: SimulatorTransport
|
|
23
|
+
let otherTransport: SimulatorTransport
|
|
24
|
+
let requestorTransport: SimulatorTransport
|
|
25
|
+
|
|
26
|
+
let simulator: Simulator
|
|
27
|
+
|
|
28
|
+
const requesteePeerDescriptor = createMockPeerDescriptor()
|
|
29
|
+
const otherPeerDescriptor = createMockPeerDescriptor()
|
|
30
|
+
const requestorPeerDescriptor = createMockPeerDescriptor()
|
|
31
|
+
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
simulator = new Simulator()
|
|
34
|
+
requesteeTransport1 = new SimulatorTransport(requesteePeerDescriptor, simulator)
|
|
35
|
+
otherTransport = new SimulatorTransport(otherPeerDescriptor, simulator)
|
|
36
|
+
requestorTransport = new SimulatorTransport(requestorPeerDescriptor, simulator)
|
|
37
|
+
await requesteeTransport1.start()
|
|
38
|
+
await otherTransport.start()
|
|
39
|
+
await requestorTransport.start()
|
|
40
|
+
requesteStack = new NetworkStack({
|
|
41
|
+
layer0: {
|
|
42
|
+
transport: requesteeTransport1,
|
|
43
|
+
peerDescriptor: requesteePeerDescriptor,
|
|
44
|
+
entryPoints: [requesteePeerDescriptor]
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
otherStack = new NetworkStack({
|
|
48
|
+
layer0: {
|
|
49
|
+
transport: otherTransport,
|
|
50
|
+
peerDescriptor: otherPeerDescriptor,
|
|
51
|
+
entryPoints: [requesteePeerDescriptor]
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
await requesteStack.start()
|
|
55
|
+
await otherStack.start()
|
|
56
|
+
nodeInfoClient = new NodeInfoClient(requestorPeerDescriptor, new ListeningRpcCommunicator(NODE_INFO_RPC_SERVICE_ID, requestorTransport))
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
afterEach(async () => {
|
|
60
|
+
await requesteStack.stop()
|
|
61
|
+
await otherStack.stop()
|
|
62
|
+
await requesteeTransport1.stop()
|
|
63
|
+
await otherTransport.stop()
|
|
64
|
+
await requestorTransport.stop()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('happy path', async () => {
|
|
68
|
+
const streamPartId1 = StreamPartIDUtils.parse('stream1#0')
|
|
69
|
+
const streamPartId2 = StreamPartIDUtils.parse('stream2#0')
|
|
70
|
+
requesteStack.getStreamrNode().joinStreamPart(streamPartId1)
|
|
71
|
+
otherStack.getStreamrNode().joinStreamPart(streamPartId1)
|
|
72
|
+
requesteStack.getStreamrNode().joinStreamPart(streamPartId2)
|
|
73
|
+
otherStack.getStreamrNode().joinStreamPart(streamPartId2)
|
|
74
|
+
await waitForCondition(() =>
|
|
75
|
+
requesteStack.getStreamrNode().getNeighbors(streamPartId1).length === 1
|
|
76
|
+
&& otherStack.getStreamrNode().getNeighbors(streamPartId1).length === 1
|
|
77
|
+
&& requesteStack.getStreamrNode().getNeighbors(streamPartId2).length === 1
|
|
78
|
+
&& otherStack.getStreamrNode().getNeighbors(streamPartId2).length === 1
|
|
79
|
+
)
|
|
80
|
+
const result = await nodeInfoClient.getInfo(requesteePeerDescriptor)
|
|
81
|
+
expect(result).toMatchObject({
|
|
82
|
+
peerDescriptor: normalizePeerDescriptor(requesteePeerDescriptor),
|
|
83
|
+
controlLayer: {
|
|
84
|
+
neighbors: [normalizePeerDescriptor(otherPeerDescriptor)],
|
|
85
|
+
connections: [normalizePeerDescriptor(otherPeerDescriptor), normalizePeerDescriptor(requestorPeerDescriptor)]
|
|
86
|
+
},
|
|
87
|
+
streamPartitions: [
|
|
88
|
+
{
|
|
89
|
+
id: streamPartId1,
|
|
90
|
+
controlLayerNeighbors: [normalizePeerDescriptor(otherPeerDescriptor)],
|
|
91
|
+
deliveryLayerNeighbors: [normalizePeerDescriptor(otherPeerDescriptor)]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: streamPartId2,
|
|
95
|
+
controlLayerNeighbors: [normalizePeerDescriptor(otherPeerDescriptor)],
|
|
96
|
+
deliveryLayerNeighbors: [normalizePeerDescriptor(otherPeerDescriptor)]
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
})
|
|
100
|
+
expect(result.streamPartitions.length).toEqual(2)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
})
|
|
@@ -54,11 +54,11 @@ describe('Propagation', () => {
|
|
|
54
54
|
|
|
55
55
|
it('All nodes receive messages', async () => {
|
|
56
56
|
await waitForCondition(
|
|
57
|
-
() => randomGraphNodes.every((node) => node.
|
|
57
|
+
() => randomGraphNodes.every((node) => node.getNeighbors().length >= 3), 30000
|
|
58
58
|
)
|
|
59
59
|
await waitForCondition(() => {
|
|
60
60
|
const avg = randomGraphNodes.reduce((acc, curr) => {
|
|
61
|
-
return acc + curr.
|
|
61
|
+
return acc + curr.getNeighbors().length
|
|
62
62
|
}, 0) / randomGraphNodes.length
|
|
63
63
|
return avg >= 4
|
|
64
64
|
}, 20000)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
1
|
+
import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor } from '@streamr/dht'
|
|
2
2
|
import { waitForCondition } from '@streamr/utils'
|
|
3
3
|
import { range } from 'lodash'
|
|
4
4
|
import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
|
|
@@ -8,7 +8,7 @@ import { StreamPartIDUtils } from '@streamr/protocol'
|
|
|
8
8
|
import { Layer1Node } from '../../src/logic/Layer1Node'
|
|
9
9
|
|
|
10
10
|
describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
11
|
-
const
|
|
11
|
+
const nodeCount = 64
|
|
12
12
|
let layer1Nodes: Layer1Node[]
|
|
13
13
|
let dhtEntryPoint: Layer1Node
|
|
14
14
|
let entryPointRandomGraphNode: RandomGraphNode
|
|
@@ -17,11 +17,11 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
17
17
|
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
18
18
|
const entrypointDescriptor = createMockPeerDescriptor()
|
|
19
19
|
|
|
20
|
-
const peerDescriptors: PeerDescriptor[] = range(
|
|
20
|
+
const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => createMockPeerDescriptor())
|
|
21
21
|
beforeEach(async () => {
|
|
22
22
|
const simulator = new Simulator(LatencyType.FIXED, 50)
|
|
23
23
|
const entrypointCm = new SimulatorTransport(entrypointDescriptor, simulator)
|
|
24
|
-
const cms: SimulatorTransport[] = range(
|
|
24
|
+
const cms: SimulatorTransport[] = range(nodeCount).map((i) =>
|
|
25
25
|
new SimulatorTransport(peerDescriptors[i], simulator)
|
|
26
26
|
)
|
|
27
27
|
await entrypointCm.start()
|
|
@@ -32,12 +32,12 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
32
32
|
peerDescriptor: entrypointDescriptor,
|
|
33
33
|
serviceId: streamPartId
|
|
34
34
|
})
|
|
35
|
-
layer1Nodes = range(
|
|
35
|
+
layer1Nodes = range(nodeCount).map((i) => new DhtNode({
|
|
36
36
|
transport: cms[i],
|
|
37
37
|
peerDescriptor: peerDescriptors[i],
|
|
38
38
|
serviceId: streamPartId
|
|
39
39
|
}))
|
|
40
|
-
graphNodes = range(
|
|
40
|
+
graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
|
|
41
41
|
streamPartId,
|
|
42
42
|
layer1Node: layer1Nodes[i],
|
|
43
43
|
transport: cms[i],
|
|
@@ -72,10 +72,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
72
72
|
await graphNodes[0].start()
|
|
73
73
|
await Promise.all([
|
|
74
74
|
waitForCondition(() => graphNodes[0].getNearbyNodeView().getIds().length === 1),
|
|
75
|
-
waitForCondition(() => graphNodes[0].
|
|
75
|
+
waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
|
|
76
76
|
])
|
|
77
77
|
expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
|
|
78
|
-
expect(graphNodes[0].
|
|
78
|
+
expect(graphNodes[0].getNeighbors().length).toEqual(1)
|
|
79
79
|
})
|
|
80
80
|
|
|
81
81
|
it('happy path 5 nodes', async () => {
|
|
@@ -84,14 +84,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
84
84
|
await Promise.all(range(4).map(async (i) => {
|
|
85
85
|
await layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
86
86
|
}))
|
|
87
|
-
await
|
|
88
|
-
return waitForCondition(() => {
|
|
89
|
-
return graphNodes[i].getTargetNeighborIds().length >= 4
|
|
90
|
-
}, 15000, 2000)
|
|
91
|
-
}))
|
|
87
|
+
await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length >= 4), 15000, 1000)
|
|
92
88
|
range(4).forEach((i) => {
|
|
93
89
|
expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
|
|
94
|
-
expect(graphNodes[i].
|
|
90
|
+
expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
|
|
95
91
|
})
|
|
96
92
|
// Check bidirectionality
|
|
97
93
|
const allNodes = graphNodes
|
|
@@ -102,32 +98,35 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
102
98
|
const neighbor = allNodes.find((node) => {
|
|
103
99
|
return node.getOwnNodeId() === ownNodeId
|
|
104
100
|
})
|
|
105
|
-
|
|
101
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
102
|
+
expect(neighborIds).toContain(nodeId)
|
|
106
103
|
})
|
|
107
104
|
})
|
|
108
105
|
}, 60000)
|
|
109
106
|
|
|
110
107
|
it('happy path 64 nodes', async () => {
|
|
111
|
-
await Promise.all(range(
|
|
112
|
-
await Promise.all(range(
|
|
108
|
+
await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
|
|
109
|
+
await Promise.all(range(nodeCount).map((i) => {
|
|
113
110
|
layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
114
111
|
}))
|
|
115
112
|
await Promise.all(graphNodes.map((node) =>
|
|
116
|
-
waitForCondition(() => node.
|
|
113
|
+
waitForCondition(() => node.getNeighbors().length >= 4, 10000)
|
|
117
114
|
))
|
|
118
115
|
|
|
119
116
|
await Promise.all(graphNodes.map((node) =>
|
|
120
|
-
waitForCondition(() => node.
|
|
117
|
+
waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
|
|
121
118
|
))
|
|
122
119
|
|
|
123
120
|
await waitForCondition(() => {
|
|
124
121
|
let mismatchCounter = 0
|
|
125
122
|
graphNodes.forEach((node) => {
|
|
126
123
|
const nodeId = node.getOwnNodeId()
|
|
127
|
-
node.
|
|
124
|
+
node.getNeighbors().forEach((neighbor) => {
|
|
125
|
+
const neighborId = getNodeIdFromPeerDescriptor(neighbor)
|
|
128
126
|
if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
|
|
129
127
|
const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
|
|
130
|
-
|
|
128
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
129
|
+
if (!neighborIds.includes(nodeId)) {
|
|
131
130
|
mismatchCounter += 1
|
|
132
131
|
}
|
|
133
132
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getRandomRegion } from '@streamr/dht'
|
|
1
|
+
import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor, getRandomRegion } from '@streamr/dht'
|
|
2
2
|
import { Logger, waitForCondition } from '@streamr/utils'
|
|
3
3
|
import { range } from 'lodash'
|
|
4
4
|
import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
|
|
@@ -10,7 +10,7 @@ import { Layer1Node } from '../../src/logic/Layer1Node'
|
|
|
10
10
|
const logger = new Logger(module)
|
|
11
11
|
|
|
12
12
|
describe('RandomGraphNode-DhtNode', () => {
|
|
13
|
-
const
|
|
13
|
+
const nodeCount = 64
|
|
14
14
|
let layer1Nodes: Layer1Node[]
|
|
15
15
|
let dhtEntryPoint: Layer1Node
|
|
16
16
|
let entryPointRandomGraphNode: RandomGraphNode
|
|
@@ -21,7 +21,7 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
21
21
|
region: getRandomRegion()
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
const peerDescriptors: PeerDescriptor[] = range(
|
|
24
|
+
const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => {
|
|
25
25
|
return createMockPeerDescriptor({
|
|
26
26
|
region: getRandomRegion()
|
|
27
27
|
})
|
|
@@ -34,7 +34,7 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
34
34
|
)
|
|
35
35
|
await entrypointCm.start()
|
|
36
36
|
|
|
37
|
-
const cms: ConnectionManager[] = range(
|
|
37
|
+
const cms: ConnectionManager[] = range(nodeCount).map((i) =>
|
|
38
38
|
new SimulatorTransport(
|
|
39
39
|
peerDescriptors[i],
|
|
40
40
|
simulator
|
|
@@ -48,13 +48,13 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
48
48
|
serviceId: streamPartId
|
|
49
49
|
})
|
|
50
50
|
|
|
51
|
-
layer1Nodes = range(
|
|
51
|
+
layer1Nodes = range(nodeCount).map((i) => new DhtNode({
|
|
52
52
|
transport: cms[i],
|
|
53
53
|
peerDescriptor: peerDescriptors[i],
|
|
54
54
|
serviceId: streamPartId
|
|
55
55
|
}))
|
|
56
56
|
|
|
57
|
-
graphNodes = range(
|
|
57
|
+
graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
|
|
58
58
|
streamPartId,
|
|
59
59
|
layer1Node: layer1Nodes[i],
|
|
60
60
|
transport: cms[i],
|
|
@@ -92,9 +92,9 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
92
92
|
|
|
93
93
|
await graphNodes[0].start()
|
|
94
94
|
|
|
95
|
-
await waitForCondition(() => graphNodes[0].
|
|
95
|
+
await waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
|
|
96
96
|
expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
|
|
97
|
-
expect(graphNodes[0].
|
|
97
|
+
expect(graphNodes[0].getNeighbors().length).toEqual(1)
|
|
98
98
|
})
|
|
99
99
|
|
|
100
100
|
it('happy path 4 nodes', async () => {
|
|
@@ -104,10 +104,10 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
104
104
|
await layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
105
105
|
}))
|
|
106
106
|
|
|
107
|
-
await waitForCondition(() => range(4).every((i) => graphNodes[i].
|
|
107
|
+
await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length === 4))
|
|
108
108
|
range(4).forEach((i) => {
|
|
109
109
|
expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
|
|
110
|
-
expect(graphNodes[i].
|
|
110
|
+
expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
|
|
111
111
|
})
|
|
112
112
|
|
|
113
113
|
// Check bidirectionality
|
|
@@ -118,36 +118,39 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
118
118
|
const neighbor = allNodes.find((node) => {
|
|
119
119
|
return node.getOwnNodeId() === nodeId
|
|
120
120
|
})
|
|
121
|
-
|
|
121
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
122
|
+
expect(neighborIds.includes(allNodes[i].getOwnNodeId())).toEqual(true)
|
|
122
123
|
})
|
|
123
124
|
})
|
|
124
125
|
}, 10000)
|
|
125
126
|
|
|
126
127
|
it('happy path 64 nodes', async () => {
|
|
127
|
-
await Promise.all(range(
|
|
128
|
-
await Promise.all(range(
|
|
128
|
+
await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
|
|
129
|
+
await Promise.all(range(nodeCount).map((i) => {
|
|
129
130
|
layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
130
131
|
}))
|
|
131
132
|
await Promise.all(graphNodes.map((node) =>
|
|
132
|
-
waitForCondition(() => node.
|
|
133
|
+
waitForCondition(() => node.getNeighbors().length >= 4, 10000)
|
|
133
134
|
))
|
|
134
135
|
|
|
135
136
|
const avg = graphNodes.reduce((acc, curr) => {
|
|
136
|
-
return acc + curr.
|
|
137
|
-
}, 0) /
|
|
137
|
+
return acc + curr.getNeighbors().length
|
|
138
|
+
}, 0) / nodeCount
|
|
138
139
|
|
|
139
140
|
logger.info(`AVG Number of neighbors: ${avg}`)
|
|
140
141
|
await Promise.all(graphNodes.map((node) =>
|
|
141
|
-
waitForCondition(() => node.
|
|
142
|
+
waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
|
|
142
143
|
))
|
|
143
144
|
await waitForCondition(() => {
|
|
144
145
|
let mismatchCounter = 0
|
|
145
146
|
graphNodes.forEach((node) => {
|
|
146
147
|
const nodeId = node.getOwnNodeId()
|
|
147
|
-
node.
|
|
148
|
+
node.getNeighbors().forEach((neighbor) => {
|
|
149
|
+
const neighborId = getNodeIdFromPeerDescriptor(neighbor)
|
|
148
150
|
if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
|
|
149
151
|
const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
|
|
150
|
-
|
|
152
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
153
|
+
if (!neighborIds.includes(nodeId)) {
|
|
151
154
|
mismatchCounter += 1
|
|
152
155
|
}
|
|
153
156
|
}
|