@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.
Files changed (176) hide show
  1. package/dist/src/NetworkNode.d.ts +2 -1
  2. package/dist/src/NetworkNode.js +6 -2
  3. package/dist/src/NetworkNode.js.map +1 -1
  4. package/dist/src/NetworkStack.d.ts +6 -2
  5. package/dist/src/NetworkStack.js +21 -1
  6. package/dist/src/NetworkStack.js.map +1 -1
  7. package/dist/src/exports.d.ts +1 -0
  8. package/dist/src/exports.js +4 -1
  9. package/dist/src/exports.js.map +1 -1
  10. package/dist/src/logic/DeliveryRpcLocal.js +1 -0
  11. package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
  12. package/dist/src/logic/DuplicateMessageDetector.d.ts +3 -3
  13. package/dist/src/logic/DuplicateMessageDetector.js +10 -6
  14. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
  15. package/dist/src/logic/EntryPointDiscovery.js +8 -5
  16. package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
  17. package/dist/src/logic/Layer0Node.d.ts +2 -0
  18. package/dist/src/logic/Layer1Node.d.ts +4 -4
  19. package/dist/src/logic/NodeList.d.ts +6 -8
  20. package/dist/src/logic/NodeList.js +10 -12
  21. package/dist/src/logic/NodeList.js.map +1 -1
  22. package/dist/src/logic/RandomGraphNode.d.ts +5 -5
  23. package/dist/src/logic/RandomGraphNode.js +26 -22
  24. package/dist/src/logic/RandomGraphNode.js.map +1 -1
  25. package/dist/src/logic/StreamrNode.d.ts +3 -2
  26. package/dist/src/logic/StreamrNode.js +25 -6
  27. package/dist/src/logic/StreamrNode.js.map +1 -1
  28. package/dist/src/logic/createRandomGraphNode.d.ts +2 -2
  29. package/dist/src/logic/createRandomGraphNode.js +14 -14
  30. package/dist/src/logic/createRandomGraphNode.js.map +1 -1
  31. package/dist/src/logic/inspect/InspectSession.js +3 -2
  32. package/dist/src/logic/inspect/InspectSession.js.map +1 -1
  33. package/dist/src/logic/inspect/Inspector.d.ts +2 -3
  34. package/dist/src/logic/inspect/Inspector.js +7 -1
  35. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  36. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +1 -1
  37. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +18 -17
  38. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
  39. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
  40. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +3 -4
  41. package/dist/src/logic/neighbor-discovery/Handshaker.js +29 -27
  42. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  43. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +1 -1
  44. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +4 -2
  45. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
  46. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +1 -1
  47. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +8 -4
  48. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  49. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +1 -1
  50. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +5 -4
  51. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  52. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
  53. package/dist/src/logic/node-info/NodeInfoClient.d.ts +9 -0
  54. package/dist/src/logic/node-info/NodeInfoClient.js +19 -0
  55. package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -0
  56. package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +12 -0
  57. package/dist/src/logic/node-info/NodeInfoRpcLocal.js +29 -0
  58. package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -0
  59. package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +6 -0
  60. package/dist/src/logic/node-info/NodeInfoRpcRemote.js +11 -0
  61. package/dist/src/logic/node-info/NodeInfoRpcRemote.js.map +1 -0
  62. package/dist/src/logic/propagation/FifoMapWithTTL.js +7 -3
  63. package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -1
  64. package/dist/src/logic/propagation/Propagation.js +3 -0
  65. package/dist/src/logic/propagation/Propagation.js.map +1 -1
  66. package/dist/src/logic/propagation/PropagationTaskStore.js +1 -0
  67. package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -1
  68. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +1 -1
  69. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -1
  70. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +1 -1
  71. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
  72. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +43 -15
  73. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
  74. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +3 -0
  75. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +14 -0
  76. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -0
  77. package/dist/src/logic/proxy/ProxyClient.d.ts +1 -1
  78. package/dist/src/logic/proxy/ProxyClient.js +18 -11
  79. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  80. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +2 -1
  81. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  82. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
  83. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +2 -2
  84. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +4 -2
  85. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  86. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
  87. package/dist/src/logic/utils.js.map +1 -1
  88. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  89. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  90. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +4 -5
  91. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +38 -29
  92. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  93. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +22 -12
  94. package/dist/src/proto/packages/dht/protos/DhtRpc.js +11 -16
  95. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  96. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +2 -3
  97. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  98. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +27 -0
  99. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +43 -17
  100. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
  101. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +106 -5
  102. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +79 -7
  103. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
  104. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +11 -0
  105. package/dist/test/benchmark/first-message.js +7 -5
  106. package/dist/test/benchmark/first-message.js.map +1 -1
  107. package/dist/test/utils/utils.js +2 -1
  108. package/dist/test/utils/utils.js.map +1 -1
  109. package/jest.config.js +3 -38
  110. package/package.json +7 -7
  111. package/protos/NetworkRpc.proto +34 -5
  112. package/src/NetworkNode.ts +5 -1
  113. package/src/NetworkStack.ts +23 -2
  114. package/src/exports.ts +4 -0
  115. package/src/logic/DuplicateMessageDetector.ts +7 -7
  116. package/src/logic/EntryPointDiscovery.ts +3 -3
  117. package/src/logic/Layer0Node.ts +2 -0
  118. package/src/logic/Layer1Node.ts +4 -4
  119. package/src/logic/NodeList.ts +9 -15
  120. package/src/logic/RandomGraphNode.ts +24 -23
  121. package/src/logic/StreamrNode.ts +18 -4
  122. package/src/logic/createRandomGraphNode.ts +17 -17
  123. package/src/logic/inspect/Inspector.ts +3 -4
  124. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +18 -18
  125. package/src/logic/neighbor-discovery/Handshaker.ts +31 -32
  126. package/src/logic/neighbor-discovery/NeighborFinder.ts +2 -2
  127. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +6 -5
  128. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +5 -5
  129. package/src/logic/node-info/NodeInfoClient.ts +21 -0
  130. package/src/logic/node-info/NodeInfoRpcLocal.ts +35 -0
  131. package/src/logic/node-info/NodeInfoRpcRemote.ts +11 -0
  132. package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +1 -1
  133. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +1 -1
  134. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +56 -27
  135. package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +11 -0
  136. package/src/logic/proxy/ProxyClient.ts +10 -10
  137. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +3 -3
  138. package/src/proto/packages/dht/protos/DhtRpc.client.ts +6 -7
  139. package/src/proto/packages/dht/protos/DhtRpc.server.ts +3 -4
  140. package/src/proto/packages/dht/protos/DhtRpc.ts +32 -20
  141. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  142. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +30 -1
  143. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +12 -1
  144. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +138 -11
  145. package/test/benchmark/first-message.ts +28 -8
  146. package/test/end-to-end/inspect.test.ts +13 -1
  147. package/test/end-to-end/proxy-and-full-node.test.ts +14 -1
  148. package/test/end-to-end/proxy-connections.test.ts +14 -2
  149. package/test/end-to-end/proxy-key-exchange.test.ts +15 -8
  150. package/test/end-to-end/random-graph-with-real-connections.test.ts +21 -21
  151. package/test/end-to-end/webrtc-full-node-network.test.ts +3 -3
  152. package/test/end-to-end/websocket-full-node-network.test.ts +3 -3
  153. package/test/integration/Handshakes.test.ts +8 -8
  154. package/test/integration/NetworkNode.test.ts +19 -1
  155. package/test/integration/NetworkRpc.test.ts +3 -2
  156. package/test/integration/NodeInfoRpc.test.ts +103 -0
  157. package/test/integration/Propagation.test.ts +2 -2
  158. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +20 -21
  159. package/test/integration/RandomGraphNode-Layer1Node.test.ts +22 -19
  160. package/test/integration/stream-without-default-entrypoints.test.ts +17 -11
  161. package/test/unit/HandshakeRpcLocal.test.ts +15 -15
  162. package/test/unit/Handshaker.test.ts +3 -3
  163. package/test/unit/NeighborFinder.test.ts +5 -5
  164. package/test/unit/NodeList.test.ts +56 -57
  165. package/test/unit/Propagation.test.ts +4 -2
  166. package/test/unit/RandomGraphNode.test.ts +7 -8
  167. package/test/unit/StreamMessageTranslator.test.ts +7 -4
  168. package/test/unit/StreamrNode.test.ts +2 -0
  169. package/test/unit/oldStreamMessageBinaryUtils.test.ts +39 -0
  170. package/test/utils/mock/MockLayer0Node.ts +6 -1
  171. package/test/utils/mock/MockLayer1Node.ts +2 -2
  172. package/test/utils/mock/Transport.ts +1 -1
  173. package/test/utils/utils.ts +3 -1
  174. package/tsconfig.jest.json +3 -3
  175. package/tsconfig.node.json +0 -1
  176. 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.getTargetNeighborIds().length >= 3
128
- && randomGraphNode2.getTargetNeighborIds().length >= 3
129
- && randomGraphNode3.getTargetNeighborIds().length >= 3
130
- && randomGraphNode4.getTargetNeighborIds().length >= 3
131
- && randomGraphNode5.getTargetNeighborIds().length >= 3
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.getTargetNeighborIds().length).toBeGreaterThanOrEqual(3)
134
- expect(randomGraphNode2.getTargetNeighborIds().length).toBeGreaterThanOrEqual(3)
135
- expect(randomGraphNode3.getTargetNeighborIds().length).toBeGreaterThanOrEqual(3)
136
- expect(randomGraphNode4.getTargetNeighborIds().length).toBeGreaterThanOrEqual(3)
137
- expect(randomGraphNode5.getTargetNeighborIds().length).toBeGreaterThanOrEqual(3)
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 numOfMessagesReceived = 0
142
- randomGraphNode2.on('message', () => numOfMessagesReceived += 1)
143
- randomGraphNode3.on('message', () => numOfMessagesReceived += 1)
144
- randomGraphNode4.on('message', () => numOfMessagesReceived += 1)
145
- randomGraphNode5.on('message', () => numOfMessagesReceived += 1)
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.getTargetNeighborIds().length >= 3
149
- && randomGraphNode2.getTargetNeighborIds().length >= 3
150
- && randomGraphNode3.getTargetNeighborIds().length >= 3
151
- && randomGraphNode4.getTargetNeighborIds().length >= 3
152
- && randomGraphNode5.getTargetNeighborIds().length >= 3
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(() => numOfMessagesReceived >= 4)
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 numOfMessagesReceived = 0
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
- numOfMessagesReceived += 1
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(() => numOfMessagesReceived === NUM_OF_NODES)
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 numOfMessagesReceived = 0
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
- numOfMessagesReceived += 1
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(() => numOfMessagesReceived === NUM_OF_NODES)
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 targetNeighbors: NodeList
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
- targetNeighbors = new NodeList(handshakerNodeId, 4)
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
- targetNeighbors,
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(targetNeighbors.hasNode(peerDescriptor1)).toEqual(true)
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(targetNeighbors.hasNode(peerDescriptor1)).toEqual(true)
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(targetNeighbors.hasNode(peerDescriptor1)).toEqual(false)
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(targetNeighbors.hasNode(peerDescriptor1)).toEqual(true)
169
- expect(targetNeighbors.hasNode(peerDescriptor3)).toEqual(true)
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.getTargetNeighborIds().length >= 3), 30000
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.getTargetNeighborIds().length
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 numOfNodes = 64
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(numOfNodes).map(() => createMockPeerDescriptor())
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(numOfNodes).map((i) =>
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(numOfNodes).map((i) => new DhtNode({
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(numOfNodes).map((i) => createRandomGraphNode({
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].getTargetNeighborIds().length === 1)
75
+ waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
76
76
  ])
77
77
  expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
78
- expect(graphNodes[0].getTargetNeighborIds().length).toEqual(1)
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 Promise.all(range(4).map((i) => {
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].getTargetNeighborIds().length).toBeGreaterThanOrEqual(4)
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
- expect(neighbor!.getTargetNeighborIds()).toContain(nodeId)
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(numOfNodes).map((i) => graphNodes[i].start()))
112
- await Promise.all(range(numOfNodes).map((i) => {
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.getTargetNeighborIds().length >= 4, 10000)
113
+ waitForCondition(() => node.getNeighbors().length >= 4, 10000)
117
114
  ))
118
115
 
119
116
  await Promise.all(graphNodes.map((node) =>
120
- waitForCondition(() => node.getNumberOfOutgoingHandshakes() === 0)
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.getTargetNeighborIds().forEach((neighborId) => {
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
- if (!neighbor!.getTargetNeighborIds().includes(nodeId)) {
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 numOfNodes = 64
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(numOfNodes).map(() => {
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(numOfNodes).map((i) =>
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(numOfNodes).map((i) => new DhtNode({
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(numOfNodes).map((i) => createRandomGraphNode({
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].getTargetNeighborIds().length === 1)
95
+ await waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
96
96
  expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
97
- expect(graphNodes[0].getTargetNeighborIds().length).toEqual(1)
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].getTargetNeighborIds().length === 4))
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].getTargetNeighborIds().length).toBeGreaterThanOrEqual(4)
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
- expect(neighbor!.getTargetNeighborIds().includes(allNodes[i].getOwnNodeId())).toEqual(true)
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(numOfNodes).map((i) => graphNodes[i].start()))
128
- await Promise.all(range(numOfNodes).map((i) => {
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.getTargetNeighborIds().length >= 4, 10000)
133
+ waitForCondition(() => node.getNeighbors().length >= 4, 10000)
133
134
  ))
134
135
 
135
136
  const avg = graphNodes.reduce((acc, curr) => {
136
- return acc + curr.getTargetNeighborIds().length
137
- }, 0) / numOfNodes
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.getNumberOfOutgoingHandshakes() === 0)
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.getTargetNeighborIds().forEach((neighborId) => {
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
- if (!neighbor!.getTargetNeighborIds().includes(nodeId)) {
152
+ const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
153
+ if (!neighborIds.includes(nodeId)) {
151
154
  mismatchCounter += 1
152
155
  }
153
156
  }