@streamr/trackerless-network 0.0.1-tatum.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 (262) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc +3 -0
  3. package/README.md +6 -0
  4. package/bin/bootstrap-node.ts +73 -0
  5. package/bin/full-node-webrtc.ts +102 -0
  6. package/bin/full-node-websocket.ts +102 -0
  7. package/bin/network.ts +43 -0
  8. package/dist/package.json +53 -0
  9. package/dist/src/NameDirectory.d.ts +5 -0
  10. package/dist/src/NameDirectory.js +44 -0
  11. package/dist/src/NameDirectory.js.map +1 -0
  12. package/dist/src/NetworkNode.d.ts +35 -0
  13. package/dist/src/NetworkNode.js +130 -0
  14. package/dist/src/NetworkNode.js.map +1 -0
  15. package/dist/src/NetworkStack.d.ts +32 -0
  16. package/dist/src/NetworkStack.js +108 -0
  17. package/dist/src/NetworkStack.js.map +1 -0
  18. package/dist/src/exports.d.ts +6 -0
  19. package/dist/src/exports.js +12 -0
  20. package/dist/src/exports.js.map +1 -0
  21. package/dist/src/identifiers.d.ts +1 -0
  22. package/dist/src/identifiers.js +3 -0
  23. package/dist/src/identifiers.js.map +1 -0
  24. package/dist/src/logic/DuplicateMessageDetector.d.ts +55 -0
  25. package/dist/src/logic/DuplicateMessageDetector.js +155 -0
  26. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -0
  27. package/dist/src/logic/ILayer0.d.ts +13 -0
  28. package/dist/src/logic/ILayer0.js +3 -0
  29. package/dist/src/logic/ILayer0.js.map +1 -0
  30. package/dist/src/logic/IStreamNode.d.ts +12 -0
  31. package/dist/src/logic/IStreamNode.js +3 -0
  32. package/dist/src/logic/IStreamNode.js.map +1 -0
  33. package/dist/src/logic/PeerList.d.ts +27 -0
  34. package/dist/src/logic/PeerList.js +84 -0
  35. package/dist/src/logic/PeerList.js.map +1 -0
  36. package/dist/src/logic/RandomGraphNode.d.ts +68 -0
  37. package/dist/src/logic/RandomGraphNode.js +201 -0
  38. package/dist/src/logic/RandomGraphNode.js.map +1 -0
  39. package/dist/src/logic/Remote.d.ts +9 -0
  40. package/dist/src/logic/Remote.js +15 -0
  41. package/dist/src/logic/Remote.js.map +1 -0
  42. package/dist/src/logic/RemoteRandomGraphNode.d.ts +8 -0
  43. package/dist/src/logic/RemoteRandomGraphNode.js +35 -0
  44. package/dist/src/logic/RemoteRandomGraphNode.js.map +1 -0
  45. package/dist/src/logic/StreamEntryPointDiscovery.d.ts +36 -0
  46. package/dist/src/logic/StreamEntryPointDiscovery.js +179 -0
  47. package/dist/src/logic/StreamEntryPointDiscovery.js.map +1 -0
  48. package/dist/src/logic/StreamNodeServer.d.ts +20 -0
  49. package/dist/src/logic/StreamNodeServer.js +26 -0
  50. package/dist/src/logic/StreamNodeServer.js.map +1 -0
  51. package/dist/src/logic/StreamrNode.d.ts +76 -0
  52. package/dist/src/logic/StreamrNode.js +303 -0
  53. package/dist/src/logic/StreamrNode.js.map +1 -0
  54. package/dist/src/logic/createRandomGraphNode.d.ts +5 -0
  55. package/dist/src/logic/createRandomGraphNode.js +110 -0
  56. package/dist/src/logic/createRandomGraphNode.js.map +1 -0
  57. package/dist/src/logic/inspect/InspectSession.d.ts +18 -0
  58. package/dist/src/logic/inspect/InspectSession.js +38 -0
  59. package/dist/src/logic/inspect/InspectSession.js.map +1 -0
  60. package/dist/src/logic/inspect/Inspector.d.ts +33 -0
  61. package/dist/src/logic/inspect/Inspector.js +63 -0
  62. package/dist/src/logic/inspect/Inspector.js.map +1 -0
  63. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +35 -0
  64. package/dist/src/logic/neighbor-discovery/Handshaker.js +121 -0
  65. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -0
  66. package/dist/src/logic/neighbor-discovery/HandshakerServer.d.ts +30 -0
  67. package/dist/src/logic/neighbor-discovery/HandshakerServer.js +78 -0
  68. package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +1 -0
  69. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +23 -0
  70. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +44 -0
  71. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -0
  72. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +30 -0
  73. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +42 -0
  74. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -0
  75. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.d.ts +20 -0
  76. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js +42 -0
  77. package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +1 -0
  78. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.d.ts +12 -0
  79. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js +54 -0
  80. package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +1 -0
  81. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.d.ts +11 -0
  82. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js +37 -0
  83. package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +1 -0
  84. package/dist/src/logic/propagation/FifoMapWithTTL.d.ts +36 -0
  85. package/dist/src/logic/propagation/FifoMapWithTTL.js +81 -0
  86. package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -0
  87. package/dist/src/logic/propagation/Propagation.d.ts +31 -0
  88. package/dist/src/logic/propagation/Propagation.js +64 -0
  89. package/dist/src/logic/propagation/Propagation.js.map +1 -0
  90. package/dist/src/logic/propagation/PropagationTaskStore.d.ts +21 -0
  91. package/dist/src/logic/propagation/PropagationTaskStore.js +32 -0
  92. package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -0
  93. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.d.ts +5 -0
  94. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js +17 -0
  95. package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js.map +1 -0
  96. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.d.ts +6 -0
  97. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +27 -0
  98. package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -0
  99. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.d.ts +6 -0
  100. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +33 -0
  101. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -0
  102. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.d.ts +6 -0
  103. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +109 -0
  104. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -0
  105. package/dist/src/logic/proxy/ProxyStreamConnectionClient.d.ts +44 -0
  106. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js +189 -0
  107. package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +1 -0
  108. package/dist/src/logic/proxy/ProxyStreamConnectionServer.d.ts +34 -0
  109. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js +64 -0
  110. package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +1 -0
  111. package/dist/src/logic/proxy/RemoteProxyServer.d.ts +7 -0
  112. package/dist/src/logic/proxy/RemoteProxyServer.js +36 -0
  113. package/dist/src/logic/proxy/RemoteProxyServer.js.map +1 -0
  114. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.d.ts +6 -0
  115. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js +28 -0
  116. package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +1 -0
  117. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.d.ts +20 -0
  118. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js +29 -0
  119. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +1 -0
  120. package/dist/src/logic/utils.d.ts +3 -0
  121. package/dist/src/logic/utils.js +16 -0
  122. package/dist/src/logic/utils.js.map +1 -0
  123. package/dist/src/proto/google/protobuf/any.d.ts +173 -0
  124. package/dist/src/proto/google/protobuf/any.js +155 -0
  125. package/dist/src/proto/google/protobuf/any.js.map +1 -0
  126. package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
  127. package/dist/src/proto/google/protobuf/empty.js +34 -0
  128. package/dist/src/proto/google/protobuf/empty.js.map +1 -0
  129. package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
  130. package/dist/src/proto/google/protobuf/timestamp.js +136 -0
  131. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
  132. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
  133. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
  134. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
  135. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
  136. package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
  137. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
  138. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
  139. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
  140. package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
  141. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
  142. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
  143. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  144. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +156 -0
  145. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +122 -0
  146. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
  147. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +524 -0
  148. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +350 -0
  149. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
  150. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +65 -0
  151. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js +3 -0
  152. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
  153. package/dist/test/benchmark/first-message.d.ts +1 -0
  154. package/dist/test/benchmark/first-message.js +137 -0
  155. package/dist/test/benchmark/first-message.js.map +1 -0
  156. package/dist/test/utils/utils.d.ts +12 -0
  157. package/dist/test/utils/utils.js +86 -0
  158. package/dist/test/utils/utils.js.map +1 -0
  159. package/jest.config.js +36 -0
  160. package/karma.config.js +20 -0
  161. package/log.txt +501 -0
  162. package/package.json +53 -0
  163. package/proto.sh +2 -0
  164. package/protos/NetworkRpc.proto +161 -0
  165. package/src/NameDirectory.ts +44 -0
  166. package/src/NetworkNode.ts +169 -0
  167. package/src/NetworkStack.ts +144 -0
  168. package/src/exports.ts +6 -0
  169. package/src/identifiers.ts +1 -0
  170. package/src/logic/DuplicateMessageDetector.ts +167 -0
  171. package/src/logic/ILayer0.ts +14 -0
  172. package/src/logic/IStreamNode.ts +17 -0
  173. package/src/logic/PeerList.ts +106 -0
  174. package/src/logic/RandomGraphNode.ts +310 -0
  175. package/src/logic/Remote.ts +19 -0
  176. package/src/logic/RemoteRandomGraphNode.ts +39 -0
  177. package/src/logic/StreamEntryPointDiscovery.ts +221 -0
  178. package/src/logic/StreamNodeServer.ts +44 -0
  179. package/src/logic/StreamrNode.ts +416 -0
  180. package/src/logic/createRandomGraphNode.ts +114 -0
  181. package/src/logic/inspect/InspectSession.ts +49 -0
  182. package/src/logic/inspect/Inspector.ts +89 -0
  183. package/src/logic/neighbor-discovery/Handshaker.ts +180 -0
  184. package/src/logic/neighbor-discovery/HandshakerServer.ts +99 -0
  185. package/src/logic/neighbor-discovery/NeighborFinder.ts +61 -0
  186. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +67 -0
  187. package/src/logic/neighbor-discovery/NeighborUpdateManagerServer.ts +61 -0
  188. package/src/logic/neighbor-discovery/RemoteHandshaker.ts +64 -0
  189. package/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts +41 -0
  190. package/src/logic/propagation/FifoMapWithTTL.ts +108 -0
  191. package/src/logic/propagation/Propagation.ts +83 -0
  192. package/src/logic/propagation/PropagationTaskStore.ts +40 -0
  193. package/src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts +16 -0
  194. package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +28 -0
  195. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +38 -0
  196. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +142 -0
  197. package/src/logic/proxy/ProxyStreamConnectionClient.ts +255 -0
  198. package/src/logic/proxy/ProxyStreamConnectionServer.ts +97 -0
  199. package/src/logic/proxy/RemoteProxyServer.ts +36 -0
  200. package/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.ts +27 -0
  201. package/src/logic/temporary-connection/TemporaryConnectionRpcServer.ts +50 -0
  202. package/src/logic/utils.ts +17 -0
  203. package/src/proto/google/protobuf/any.ts +319 -0
  204. package/src/proto/google/protobuf/empty.ts +84 -0
  205. package/src/proto/google/protobuf/timestamp.ts +281 -0
  206. package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
  207. package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
  208. package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
  209. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
  210. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +176 -0
  211. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +68 -0
  212. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +667 -0
  213. package/test/benchmark/first-message.ts +155 -0
  214. package/test/end-to-end/inspect.test.ts +119 -0
  215. package/test/end-to-end/proxy-and-full-node.test.ts +140 -0
  216. package/test/end-to-end/proxy-connections.test.ts +228 -0
  217. package/test/end-to-end/proxy-key-exchange.test.ts +142 -0
  218. package/test/end-to-end/random-graph-with-real-connections.test.ts +154 -0
  219. package/test/end-to-end/webrtc-full-node-network.test.ts +97 -0
  220. package/test/end-to-end/websocket-full-node-network.test.ts +93 -0
  221. package/test/integration/Handshakes.test.ts +167 -0
  222. package/test/integration/Inspect.test.ts +102 -0
  223. package/test/integration/NetworkNode.test.ts +99 -0
  224. package/test/integration/NetworkRpc.test.ts +61 -0
  225. package/test/integration/NetworkStack.test.ts +74 -0
  226. package/test/integration/NetworkStackStoppedDuringStart.test.ts +45 -0
  227. package/test/integration/Propagation.test.ts +79 -0
  228. package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +141 -0
  229. package/test/integration/RandomGraphNode-Layer1Node.test.ts +226 -0
  230. package/test/integration/RemoteHandshaker.test.ts +78 -0
  231. package/test/integration/RemoteNeighborUpdateManager.test.ts +82 -0
  232. package/test/integration/RemoteRandomGraphNode.test.ts +102 -0
  233. package/test/integration/StreamrNode.test.ts +145 -0
  234. package/test/integration/stream-without-default-entrypoints.test.ts +132 -0
  235. package/test/unit/ContentMessageTranslator.test.ts +20 -0
  236. package/test/unit/DuplicateMessageDetector.test.ts +192 -0
  237. package/test/unit/FifoMapWithTtl.test.ts +229 -0
  238. package/test/unit/GroupKeyRequestTranslator.test.ts +36 -0
  239. package/test/unit/GroupKeyResponseTranslator.test.ts +39 -0
  240. package/test/unit/Handshaker.test.ts +63 -0
  241. package/test/unit/HandshakerServer.test.ts +123 -0
  242. package/test/unit/InspectSession.test.ts +78 -0
  243. package/test/unit/Inspector.test.ts +57 -0
  244. package/test/unit/NeighborFinder.test.ts +48 -0
  245. package/test/unit/NumberPair.test.ts +22 -0
  246. package/test/unit/PeerList.test.ts +150 -0
  247. package/test/unit/Propagation.test.ts +134 -0
  248. package/test/unit/RandomGraphNode.test.ts +73 -0
  249. package/test/unit/StreamEntrypointDiscovery.test.ts +152 -0
  250. package/test/unit/StreamMessageTranslator.test.ts +67 -0
  251. package/test/unit/StreamNodeServer.test.ts +63 -0
  252. package/test/unit/StreamrNode.test.ts +74 -0
  253. package/test/utils/mock/MockHandshaker.ts +15 -0
  254. package/test/utils/mock/MockLayer0.ts +71 -0
  255. package/test/utils/mock/MockLayer1.ts +6 -0
  256. package/test/utils/mock/MockNeighborFinder.ts +19 -0
  257. package/test/utils/mock/MockNeighborUpdateManager.ts +21 -0
  258. package/test/utils/mock/Transport.ts +25 -0
  259. package/test/utils/utils.ts +104 -0
  260. package/tsconfig.browser.json +12 -0
  261. package/tsconfig.jest.json +15 -0
  262. package/tsconfig.node.json +18 -0
@@ -0,0 +1,226 @@
1
+ /* eslint-disable @typescript-eslint/parameter-properties */
2
+
3
+ import { DhtNode, Simulator, PeerDescriptor, PeerID, ConnectionManager, getRandomRegion } from '@streamr/dht'
4
+ import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
5
+ import { range } from 'lodash'
6
+ import { wait, waitForCondition, waitForEvent3 } from '@streamr/utils'
7
+ import { Logger } from '@streamr/utils'
8
+ import { createRandomGraphNode } from '../../src/logic/createRandomGraphNode'
9
+ import { EventEmitter } from 'eventemitter3'
10
+
11
+ const logger = new Logger(module)
12
+
13
+ interface SuccessEvents {
14
+ success: () => void
15
+ }
16
+
17
+ class SuccessListener extends EventEmitter<SuccessEvents> {
18
+
19
+ private numNeighbors = 0
20
+ private numNearby = 0
21
+
22
+ constructor(private node: RandomGraphNode,
23
+ private wantedNumNeighbors: number,
24
+ private wantedNumNearby: number) {
25
+
26
+ super()
27
+ node.on('targetNeighborConnected', this.onTargetNeighborConnected)
28
+ node.on('nearbyContactPoolIdAdded', this.onNearbyContactPoolIdAdded)
29
+ }
30
+
31
+ private onTargetNeighborConnected = (_stringId: string) => {
32
+ this.numNeighbors++
33
+
34
+ if (this.numNeighbors >= this.wantedNumNeighbors
35
+ && this.numNearby >= this.wantedNumNearby) {
36
+ this.node.off('targetNeighborConnected', this.onTargetNeighborConnected)
37
+ this.node.off('nearbyContactPoolIdAdded', this.onNearbyContactPoolIdAdded)
38
+ this.emit('success')
39
+ }
40
+ }
41
+
42
+ private onNearbyContactPoolIdAdded = () => {
43
+ this.numNearby++
44
+
45
+ if (this.numNeighbors >= this.wantedNumNeighbors
46
+ && this.numNearby >= this.wantedNumNearby) {
47
+ this.node.off('targetNeighborConnected', this.onTargetNeighborConnected)
48
+ this.node.off('nearbyContactPoolIdAdded', this.onNearbyContactPoolIdAdded)
49
+ this.emit('success')
50
+ }
51
+ }
52
+
53
+ public async waitForSuccess(timeout: number): Promise<void> {
54
+ if (this.numNeighbors >= this.wantedNumNeighbors
55
+ && this.numNearby >= this.wantedNumNearby) {
56
+ return
57
+ } else {
58
+ await waitForEvent3<SuccessEvents>(this, 'success', timeout)
59
+ }
60
+ }
61
+ }
62
+
63
+ describe('RandomGraphNode-DhtNode', () => {
64
+ const numOfNodes = 64
65
+ let dhtNodes: DhtNode[]
66
+ let dhtEntryPoint: DhtNode
67
+ let entryPointRandomGraphNode: RandomGraphNode
68
+ let graphNodes: RandomGraphNode[]
69
+
70
+ const streamId = 'Stream1'
71
+ const entrypointDescriptor: PeerDescriptor = {
72
+ kademliaId: PeerID.fromString('entrypoint').value,
73
+ nodeName: 'entrypoint',
74
+ type: 0,
75
+ region: getRandomRegion()
76
+ }
77
+
78
+ const peerDescriptors: PeerDescriptor[] = range(numOfNodes).map((i) => {
79
+ return {
80
+ kademliaId: PeerID.fromString(`${i}`).value,
81
+ nodeName: `node${i}`,
82
+ type: 0,
83
+ region: getRandomRegion()
84
+ }
85
+ })
86
+ beforeEach(async () => {
87
+
88
+ Simulator.useFakeTimers()
89
+ const simulator = new Simulator()
90
+ const entrypointCm = new ConnectionManager({
91
+ ownPeerDescriptor: entrypointDescriptor,
92
+ nodeName: entrypointDescriptor.nodeName, simulator: simulator
93
+ })
94
+
95
+ const cms: ConnectionManager[] = range(numOfNodes).map((i) =>
96
+ new ConnectionManager({
97
+ ownPeerDescriptor: peerDescriptors[i],
98
+ nodeName: peerDescriptors[i].nodeName,
99
+ simulator: simulator
100
+ })
101
+ )
102
+
103
+ dhtEntryPoint = new DhtNode({
104
+ transportLayer: entrypointCm,
105
+ peerDescriptor: entrypointDescriptor,
106
+ serviceId: streamId
107
+ })
108
+
109
+ dhtNodes = range(numOfNodes).map((i) => new DhtNode({
110
+ transportLayer: cms[i],
111
+ peerDescriptor: peerDescriptors[i],
112
+ serviceId: streamId
113
+ }))
114
+
115
+ graphNodes = range(numOfNodes).map((i) => createRandomGraphNode({
116
+ randomGraphId: streamId,
117
+ layer1: dhtNodes[i],
118
+ P2PTransport: cms[i],
119
+ connectionLocker: cms[i],
120
+ ownPeerDescriptor: peerDescriptors[i],
121
+ neighborUpdateInterval: 2000
122
+ }))
123
+
124
+ entryPointRandomGraphNode = createRandomGraphNode({
125
+ randomGraphId: streamId,
126
+ layer1: dhtEntryPoint,
127
+ P2PTransport: entrypointCm,
128
+ connectionLocker: entrypointCm,
129
+ ownPeerDescriptor: entrypointDescriptor,
130
+ neighborUpdateInterval: 2000
131
+ })
132
+
133
+ await dhtEntryPoint.start()
134
+ await dhtEntryPoint.joinDht([entrypointDescriptor])
135
+ await Promise.all(dhtNodes.map((node) => node.start()))
136
+ })
137
+
138
+ afterEach(async () => {
139
+ await dhtEntryPoint.stop()
140
+ entryPointRandomGraphNode.stop()
141
+ await Promise.all(dhtNodes.map((node) => node.stop()))
142
+ await Promise.all(graphNodes.map((node) => node.stop()))
143
+ Simulator.useFakeTimers(false)
144
+ })
145
+
146
+ it('happy path single peer ', async () => {
147
+
148
+ const successListener = new SuccessListener(graphNodes[0], 1, 1)
149
+ await entryPointRandomGraphNode.start()
150
+ await dhtNodes[0].joinDht([entrypointDescriptor])
151
+
152
+ await graphNodes[0].start()
153
+
154
+ await successListener.waitForSuccess(15006)
155
+ expect(graphNodes[0].getNearbyContactPoolIds().length).toEqual(1)
156
+ expect(graphNodes[0].getTargetNeighborStringIds().length).toEqual(1)
157
+
158
+ })
159
+
160
+ it('happy path 4 peers', async () => {
161
+ const promise = Promise.all(range(4).map((i) => {
162
+ const successListener = new SuccessListener(graphNodes[i], 4, 4)
163
+ return waitForEvent3<SuccessEvents>(successListener, 'success', 15009)
164
+ }))
165
+
166
+ entryPointRandomGraphNode.start()
167
+ range(4).map((i) => graphNodes[i].start())
168
+ await Promise.all(range(4).map(async (i) => {
169
+ await dhtNodes[i].joinDht([entrypointDescriptor])
170
+ }))
171
+
172
+ await promise
173
+
174
+ range(4).map((i) => {
175
+ expect(graphNodes[i].getNearbyContactPoolIds().length).toBeGreaterThanOrEqual(4)
176
+ expect(graphNodes[i].getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(4)
177
+ })
178
+
179
+ // Check bidirectionality
180
+ const allNodes = graphNodes
181
+ allNodes.push(entryPointRandomGraphNode)
182
+ range(5).map((i) => {
183
+ allNodes[i].getNearbyContactPoolIds().forEach((stringId) => {
184
+ const neighbor = allNodes.find((peer) => {
185
+ return peer.getOwnStringId() === stringId
186
+ })
187
+ expect(neighbor!.getTargetNeighborStringIds().includes(allNodes[i].getOwnStringId())).toEqual(true)
188
+ })
189
+ })
190
+ }, 10000)
191
+
192
+ it('happy path 64 peers', async () => {
193
+ await Promise.all(range(numOfNodes).map((i) => graphNodes[i].start()))
194
+ await Promise.all(range(numOfNodes).map((i) => {
195
+ dhtNodes[i].joinDht([entrypointDescriptor])
196
+ }))
197
+ await Promise.all(graphNodes.map((node) =>
198
+ waitForCondition(() => node.getTargetNeighborStringIds().length >= 4, 10000)
199
+ ))
200
+
201
+ const avg = graphNodes.reduce((acc, curr) => {
202
+ return acc + curr.getTargetNeighborStringIds().length
203
+ }, 0) / numOfNodes
204
+
205
+ logger.info(`AVG Number of neighbors: ${avg}`)
206
+ await Promise.all(graphNodes.map((node) =>
207
+ waitForCondition(() => node.getNumberOfOutgoingHandshakes() === 0)
208
+ ))
209
+ await wait(10000)
210
+ let mismatchCounter = 0
211
+ graphNodes.forEach((node) => {
212
+ const nodeId = node.getOwnStringId()
213
+ node.getTargetNeighborStringIds().forEach((neighborId) => {
214
+ if (neighborId !== entryPointRandomGraphNode.getOwnStringId()) {
215
+ const neighbor = graphNodes.find((n) => n.getOwnStringId() === neighborId)
216
+ if (!neighbor!.getTargetNeighborStringIds().includes(nodeId)) {
217
+ logger.info('mismatching ids length: ' + nodeId + ' ' + neighbor!.getTargetNeighborStringIds().length)
218
+ mismatchCounter += 1
219
+ }
220
+ }
221
+
222
+ })
223
+ })
224
+ expect(mismatchCounter).toBeLessThanOrEqual(2)
225
+ }, 95000)
226
+ })
@@ -0,0 +1,78 @@
1
+ import {
2
+ StreamHandshakeRequest,
3
+ StreamHandshakeResponse
4
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
5
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
6
+ import {
7
+ ListeningRpcCommunicator,
8
+ PeerDescriptor,
9
+ Simulator,
10
+ SimulatorTransport
11
+ } from '@streamr/dht'
12
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
13
+ import {
14
+ HandshakeRpcClient,
15
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
16
+ import { RemoteHandshaker } from '../../src/logic/neighbor-discovery/RemoteHandshaker'
17
+
18
+ describe('RemoteHandshaker', () => {
19
+ let mockServerRpc: ListeningRpcCommunicator
20
+ let clientRpc: ListeningRpcCommunicator
21
+ let remoteHandshaker: RemoteHandshaker
22
+
23
+ const clientPeer: PeerDescriptor = {
24
+ kademliaId: new Uint8Array([1, 1, 1]),
25
+ type: 1
26
+ }
27
+ const serverPeer: PeerDescriptor = {
28
+ kademliaId: new Uint8Array([2, 2, 2]),
29
+ type: 1
30
+ }
31
+
32
+ let simulator: Simulator
33
+ let mockConnectionManager1: SimulatorTransport
34
+ let mockConnectionManager2: SimulatorTransport
35
+
36
+ beforeEach(() => {
37
+ Simulator.useFakeTimers()
38
+ simulator = new Simulator()
39
+ mockConnectionManager1 = new SimulatorTransport(serverPeer, simulator)
40
+ mockConnectionManager2 = new SimulatorTransport(clientPeer, simulator)
41
+
42
+ mockServerRpc = new ListeningRpcCommunicator('test', mockConnectionManager1)
43
+ clientRpc = new ListeningRpcCommunicator('test', mockConnectionManager2)
44
+
45
+ mockServerRpc.registerRpcMethod(
46
+ StreamHandshakeRequest,
47
+ StreamHandshakeResponse,
48
+ 'handshake',
49
+ async (msg: StreamHandshakeRequest, _context: ServerCallContext): Promise<StreamHandshakeResponse> => {
50
+ const res: StreamHandshakeResponse = {
51
+ requestId: msg.requestId,
52
+ accepted: true
53
+ }
54
+ return res
55
+ }
56
+ )
57
+
58
+ remoteHandshaker = new RemoteHandshaker(
59
+ serverPeer,
60
+ 'test-stream',
61
+ toProtoRpcClient(new HandshakeRpcClient(clientRpc.getRpcClientTransport()))
62
+ )
63
+ })
64
+
65
+ afterEach(async () => {
66
+ clientRpc.stop()
67
+ mockServerRpc.stop()
68
+ await mockConnectionManager1.stop()
69
+ await mockConnectionManager2.stop()
70
+ simulator.stop()
71
+ Simulator.useFakeTimers(false)
72
+ })
73
+
74
+ it('handshake', async () => {
75
+ const result = await remoteHandshaker.handshake(clientPeer, [])
76
+ expect(result.accepted).toEqual(true)
77
+ })
78
+ })
@@ -0,0 +1,82 @@
1
+ import { NeighborUpdate } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
2
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
3
+ import {
4
+ keyFromPeerDescriptor,
5
+ ListeningRpcCommunicator,
6
+ PeerDescriptor,
7
+ Simulator,
8
+ SimulatorTransport
9
+ } from '@streamr/dht'
10
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
11
+ import {
12
+ NeighborUpdateRpcClient,
13
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
14
+ import { RemoteNeighborUpdateManager } from '../../src/logic/neighbor-discovery/RemoteNeighborUpdateManager'
15
+
16
+ describe('RemoteNeighborUpdateManager', () => {
17
+ let mockServerRpc: ListeningRpcCommunicator
18
+ let clientRpc: ListeningRpcCommunicator
19
+ let neighborUpdateRpcClient: RemoteNeighborUpdateManager
20
+
21
+ const clientPeer: PeerDescriptor = {
22
+ kademliaId: new Uint8Array([1, 1, 1]),
23
+ type: 1
24
+ }
25
+ const serverPeer: PeerDescriptor = {
26
+ kademliaId: new Uint8Array([2, 2, 2]),
27
+ type: 1
28
+ }
29
+
30
+ let simulator: Simulator
31
+ let mockConnectionManager1: SimulatorTransport
32
+ let mockConnectionManager2: SimulatorTransport
33
+
34
+ beforeEach(() => {
35
+ simulator = new Simulator()
36
+ mockConnectionManager1 = new SimulatorTransport(serverPeer, simulator)
37
+ mockConnectionManager2 = new SimulatorTransport(clientPeer, simulator)
38
+
39
+ mockServerRpc = new ListeningRpcCommunicator('test', mockConnectionManager1)
40
+ clientRpc = new ListeningRpcCommunicator('test', mockConnectionManager2)
41
+
42
+ mockServerRpc.registerRpcMethod(
43
+ NeighborUpdate,
44
+ NeighborUpdate,
45
+ 'neighborUpdate',
46
+ async (_msg: NeighborUpdate, _context: ServerCallContext): Promise<NeighborUpdate> => {
47
+ const peer: PeerDescriptor = {
48
+ kademliaId: new Uint8Array([4, 2, 4]),
49
+ type: 0
50
+ }
51
+
52
+ const update: NeighborUpdate = {
53
+ senderId: keyFromPeerDescriptor(peer),
54
+ randomGraphId: 'testStream',
55
+ neighborDescriptors: [
56
+ peer
57
+ ],
58
+ removeMe: false
59
+ }
60
+ return update
61
+ }
62
+ )
63
+ neighborUpdateRpcClient = new RemoteNeighborUpdateManager(
64
+ serverPeer,
65
+ 'test-stream',
66
+ toProtoRpcClient(new NeighborUpdateRpcClient(clientRpc.getRpcClientTransport()))
67
+ )
68
+ })
69
+
70
+ afterEach(async () => {
71
+ clientRpc.stop()
72
+ mockServerRpc.stop()
73
+ await mockConnectionManager1.stop()
74
+ await mockConnectionManager2.stop()
75
+ simulator.stop()
76
+ })
77
+
78
+ it('updateNeighbors', async () => {
79
+ const res = await neighborUpdateRpcClient.updateNeighbors(clientPeer, [])
80
+ expect(res.peers.length).toEqual(1)
81
+ })
82
+ })
@@ -0,0 +1,102 @@
1
+ import {
2
+ ListeningRpcCommunicator,
3
+ Simulator,
4
+ PeerDescriptor,
5
+ SimulatorTransport,
6
+ peerIdFromPeerDescriptor
7
+ } from '@streamr/dht'
8
+ import { RemoteRandomGraphNode } from '../../src/logic/RemoteRandomGraphNode'
9
+ import { NetworkRpcClient } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
10
+ import {
11
+ ContentMessage,
12
+ LeaveStreamNotice,
13
+ StreamMessage
14
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
15
+ import { Empty } from '../../src/proto/google/protobuf/empty'
16
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
17
+ import { waitForCondition } from '@streamr/utils'
18
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
19
+ import { createStreamMessage } from '../utils/utils'
20
+
21
+ describe('RemoteRandomGraphNode', () => {
22
+ let mockServerRpc: ListeningRpcCommunicator
23
+ let clientRpc: ListeningRpcCommunicator
24
+ let remoteRandomGraphNode: RemoteRandomGraphNode
25
+
26
+ const clientPeer: PeerDescriptor = {
27
+ kademliaId: new Uint8Array([1, 1, 1]),
28
+ type: 1
29
+ }
30
+ const serverPeer: PeerDescriptor = {
31
+ kademliaId: new Uint8Array([2, 2, 2]),
32
+ type: 1
33
+ }
34
+
35
+ let recvCounter: number
36
+
37
+ let simulator: Simulator
38
+ let mockConnectionManager1: SimulatorTransport
39
+ let mockConnectionManager2: SimulatorTransport
40
+
41
+ beforeEach(() => {
42
+ recvCounter = 0
43
+ simulator = new Simulator()
44
+ mockConnectionManager1 = new SimulatorTransport(serverPeer, simulator)
45
+ mockConnectionManager2 = new SimulatorTransport(clientPeer, simulator)
46
+
47
+ mockServerRpc = new ListeningRpcCommunicator('test', mockConnectionManager1)
48
+ clientRpc = new ListeningRpcCommunicator('test', mockConnectionManager2)
49
+
50
+ mockServerRpc.registerRpcNotification(
51
+ StreamMessage,
52
+ 'sendData',
53
+ async (_msg: StreamMessage, _context: ServerCallContext): Promise<Empty> => {
54
+ recvCounter += 1
55
+ return Empty
56
+ }
57
+ )
58
+
59
+ mockServerRpc.registerRpcNotification(
60
+ LeaveStreamNotice,
61
+ 'leaveStreamNotice',
62
+ async (_msg: LeaveStreamNotice, _context: ServerCallContext): Promise<Empty> => {
63
+ recvCounter += 1
64
+ return Empty
65
+ }
66
+ )
67
+
68
+ remoteRandomGraphNode = new RemoteRandomGraphNode(
69
+ serverPeer,
70
+ 'test-stream',
71
+ toProtoRpcClient(new NetworkRpcClient(clientRpc.getRpcClientTransport()))
72
+ )
73
+ })
74
+
75
+ afterEach(async () => {
76
+ clientRpc.stop()
77
+ mockServerRpc.stop()
78
+ await mockConnectionManager1.stop()
79
+ await mockConnectionManager2.stop()
80
+ simulator.stop()
81
+ })
82
+
83
+ it('sendData', async () => {
84
+ const content: ContentMessage = {
85
+ body: JSON.stringify({ hello: 'WORLD' })
86
+ }
87
+ const msg = createStreamMessage(
88
+ content,
89
+ 'test-stream',
90
+ peerIdFromPeerDescriptor(clientPeer).toString()
91
+ )
92
+
93
+ await remoteRandomGraphNode.sendData(clientPeer, msg)
94
+ await waitForCondition(() => recvCounter === 1)
95
+ })
96
+
97
+ it('leaveNotice', async () => {
98
+ await remoteRandomGraphNode.leaveStreamNotice(clientPeer)
99
+ await waitForCondition(() => recvCounter === 1)
100
+ })
101
+
102
+ })
@@ -0,0 +1,145 @@
1
+ import {
2
+ DhtNode,
3
+ PeerDescriptor,
4
+ Simulator,
5
+ SimulatorTransport,
6
+ NodeType,
7
+ keyFromPeerDescriptor
8
+ } from '@streamr/dht'
9
+ import { StreamrNode, Events } from '../../src/logic/StreamrNode'
10
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
11
+ import { waitForEvent3, waitForCondition } from '@streamr/utils'
12
+ import { createStreamMessage } from '../utils/utils'
13
+
14
+ describe('StreamrNode', () => {
15
+
16
+ let layer01: DhtNode
17
+ let layer02: DhtNode
18
+ let transport1: SimulatorTransport
19
+ let transport2: SimulatorTransport
20
+ let node1: StreamrNode
21
+ let node2: StreamrNode
22
+
23
+ const peer1: PeerDescriptor = {
24
+ kademliaId: new Uint8Array([1, 2, 3]),
25
+ type: NodeType.NODEJS
26
+ }
27
+ const peer2: PeerDescriptor = {
28
+ kademliaId: new Uint8Array([1, 1, 1]),
29
+ type: NodeType.NODEJS
30
+ }
31
+ const STREAM_ID = 'test'
32
+
33
+ const content: ContentMessage = {
34
+ body: JSON.stringify({ hello: 'WORLD' })
35
+ }
36
+ const msg = createStreamMessage(
37
+ content,
38
+ STREAM_ID,
39
+ keyFromPeerDescriptor(peer2)
40
+ )
41
+
42
+ afterEach(async () => {
43
+ await Promise.all([
44
+ node1.destroy(),
45
+ node2.destroy()
46
+ ])
47
+ })
48
+
49
+ beforeEach(async () => {
50
+ const simulator = new Simulator()
51
+ transport1 = new SimulatorTransport(peer1, simulator)
52
+ transport2 = new SimulatorTransport(peer2, simulator)
53
+ layer01 = new DhtNode({
54
+ transportLayer: transport1,
55
+ peerDescriptor: peer1,
56
+ entryPoints: [peer1]
57
+ })
58
+ layer02 = new DhtNode({
59
+ transportLayer: transport2,
60
+ peerDescriptor: peer2,
61
+ entryPoints: [peer1]
62
+ })
63
+ await Promise.all([
64
+ layer01.start(),
65
+ layer02.start()
66
+ ])
67
+ await Promise.all([
68
+ layer01.joinDht([peer1]),
69
+ layer02.joinDht([peer1])
70
+ ])
71
+
72
+ node1 = new StreamrNode({})
73
+ node2 = new StreamrNode({})
74
+ await node1.start(layer01, transport1, transport1)
75
+ node1.setStreamPartEntryPoints(STREAM_ID, [peer1])
76
+ await node2.start(layer02, transport2, transport2)
77
+ node2.setStreamPartEntryPoints(STREAM_ID, [peer1])
78
+ })
79
+
80
+ it('starts', async () => {
81
+ expect(node1.getPeerDescriptor()).toEqual(peer1)
82
+ expect(node2.getPeerDescriptor()).toEqual(peer2)
83
+ })
84
+
85
+ it('Joining stream', async () => {
86
+ await node1.joinStream(STREAM_ID)
87
+ await node2.joinStream(STREAM_ID)
88
+ await waitForCondition(() => node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1)
89
+ await waitForCondition(() => node2.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1)
90
+ expect(node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length).toEqual(1)
91
+ expect(node2.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length).toEqual(1)
92
+ })
93
+
94
+ it('Publishing after joining and waiting for neighbors', async () => {
95
+ node1.subscribeToStream(STREAM_ID)
96
+ await node2.joinStream(STREAM_ID)
97
+ await waitForCondition(() => node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1)
98
+ await waitForCondition(() => node2.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1)
99
+ await Promise.all([
100
+ waitForEvent3<Events>(node1, 'newMessage'),
101
+ node2.publishToStream(STREAM_ID, msg)
102
+ ])
103
+ })
104
+
105
+ it('multi-stream pub/sub', async () => {
106
+ const stream2 = 'test2'
107
+ node1.setStreamPartEntryPoints(stream2, [peer1])
108
+ node2.setStreamPartEntryPoints(stream2, [peer1])
109
+ await node1.joinStream(STREAM_ID)
110
+ await node1.joinStream(stream2)
111
+ await node2.joinStream(STREAM_ID)
112
+ await node2.joinStream(stream2)
113
+ node1.subscribeToStream(STREAM_ID)
114
+ node2.subscribeToStream(stream2)
115
+ await Promise.all([
116
+ waitForCondition(() => node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1),
117
+ waitForCondition(() => node2.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1),
118
+ waitForCondition(() => node1.getStream(stream2)!.layer2.getTargetNeighborStringIds().length === 1),
119
+ waitForCondition(() => node2.getStream(stream2)!.layer2.getTargetNeighborStringIds().length === 1)
120
+ ])
121
+ const msg2 = createStreamMessage(
122
+ content,
123
+ stream2,
124
+ keyFromPeerDescriptor(peer1)
125
+ )
126
+ await Promise.all([
127
+ waitForEvent3<Events>(node1, 'newMessage'),
128
+ waitForEvent3<Events>(node2, 'newMessage'),
129
+ node1.publishToStream(stream2, msg2),
130
+ node2.publishToStream(STREAM_ID, msg)
131
+ ])
132
+ })
133
+
134
+ it('leaving streams', async () => {
135
+ await node1.joinStream(STREAM_ID)
136
+ await node2.joinStream(STREAM_ID)
137
+ await Promise.all([
138
+ waitForCondition(() => node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1),
139
+ waitForCondition(() => node2.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 1)
140
+ ])
141
+ node2.leaveStream(STREAM_ID)
142
+ await waitForCondition(() => node1.getStream(STREAM_ID)!.layer2.getTargetNeighborStringIds().length === 0)
143
+ })
144
+
145
+ })