@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,102 @@
1
+ import { LatencyType, NodeType, PeerDescriptor, PeerID, Simulator, SimulatorTransport } from '@streamr/dht'
2
+ import { NetworkStack } from '../../src/NetworkStack'
3
+ import { range } from 'lodash'
4
+ import { createStreamMessage } from '../utils/utils'
5
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
6
+
7
+ describe('inspect', () => {
8
+
9
+ let simulator: Simulator
10
+
11
+ const streamId = 'stream#0'
12
+ let sequenceNumber: number
13
+
14
+ const publisherDescriptor: PeerDescriptor = {
15
+ kademliaId: PeerID.fromString('publisher').value,
16
+ type: NodeType.NODEJS,
17
+ }
18
+
19
+ const inspectorPeerDescriptor: PeerDescriptor = {
20
+ kademliaId: PeerID.fromString('inspector').value,
21
+ type: NodeType.NODEJS,
22
+ }
23
+
24
+ const inspectedNodeCount = 12
25
+
26
+ let publisherNode: NetworkStack
27
+ let inspectorNode: NetworkStack
28
+ let inspectedNodes: NetworkStack[]
29
+
30
+ let publishInterval: NodeJS.Timeout
31
+
32
+ const initiateNode = async (peerDescriptor: PeerDescriptor, simulator: Simulator): Promise<NetworkStack> => {
33
+ const transportLayer = new SimulatorTransport(peerDescriptor, simulator)
34
+ const node = new NetworkStack({
35
+ layer0: {
36
+ entryPoints: [publisherDescriptor],
37
+ peerDescriptor,
38
+ transportLayer
39
+ },
40
+ networkNode: {}
41
+ })
42
+ await node.start()
43
+ return node
44
+ }
45
+
46
+ beforeEach(async () => {
47
+ Simulator.useFakeTimers()
48
+ simulator = new Simulator(LatencyType.RANDOM)
49
+
50
+ publisherNode = await initiateNode(publisherDescriptor, simulator)
51
+ inspectorNode = await initiateNode(inspectorPeerDescriptor, simulator)
52
+
53
+ inspectedNodes = []
54
+ await Promise.all(range(inspectedNodeCount).map(async (i) => {
55
+ const peerDescriptor: PeerDescriptor = {
56
+ kademliaId: PeerID.fromString(`inspected${i}`).value,
57
+ type: NodeType.NODEJS
58
+ }
59
+ const node = await initiateNode(peerDescriptor, simulator)
60
+ inspectedNodes.push(node)
61
+ }))
62
+ await Promise.all([
63
+ publisherNode.getStreamrNode().waitForJoinAndSubscribe(streamId, 5000, 4),
64
+ inspectorNode.getStreamrNode().waitForJoinAndSubscribe(streamId, 5000, 4),
65
+ ...inspectedNodes.map((node) => node.getStreamrNode().waitForJoinAndSubscribe(streamId, 5000, 4))
66
+ ])
67
+ sequenceNumber = 0
68
+ }, 30000)
69
+
70
+ afterEach(async () => {
71
+ clearInterval(publishInterval)
72
+ await Promise.all([
73
+ publisherNode.stop(),
74
+ inspectorNode.stop(),
75
+ ...inspectedNodes.map((node) => node.stop())
76
+ ])
77
+ Simulator.useFakeTimers(false)
78
+ })
79
+
80
+ it('gets successful inspections from all suspects', async () => {
81
+ publishInterval = setInterval(async () => {
82
+ const content: ContentMessage = {
83
+ body: JSON.stringify({ hello: 'WORLD' })
84
+ }
85
+ const msg = createStreamMessage(
86
+ content,
87
+ 'stream',
88
+ 'publisher',
89
+ 123123,
90
+ sequenceNumber
91
+ )
92
+ await publisherNode.getStreamrNode().publishToStream(streamId, msg)
93
+ sequenceNumber += 1
94
+ }, 200)
95
+
96
+ for (const node of inspectedNodes) {
97
+ const result = await inspectorNode.getStreamrNode().inspect(node.getLayer0DhtNode().getPeerDescriptor(), streamId)
98
+ expect(result).toEqual(true)
99
+ }
100
+ }, 25000)
101
+
102
+ })
@@ -0,0 +1,99 @@
1
+ import { NetworkNode } from '../../src/NetworkNode'
2
+ import { NodeType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
3
+ import {
4
+ MessageID,
5
+ MessageRef,
6
+ StreamMessage,
7
+ StreamMessageType,
8
+ StreamPartIDUtils,
9
+ toStreamID
10
+ } from '@streamr/protocol'
11
+ import { EthereumAddress, waitForCondition } from '@streamr/utils'
12
+
13
+ describe('NetworkNode', () => {
14
+
15
+ let transport1: SimulatorTransport
16
+ let transport2: SimulatorTransport
17
+
18
+ let node1: NetworkNode
19
+ let node2: NetworkNode
20
+
21
+ const pd1: PeerDescriptor = {
22
+ kademliaId: new Uint8Array([1, 2, 3]),
23
+ type: NodeType.NODEJS
24
+ }
25
+
26
+ const pd2: PeerDescriptor = {
27
+ kademliaId: new Uint8Array([1, 1, 1]),
28
+ type: NodeType.NODEJS
29
+ }
30
+
31
+ const STREAM_ID = StreamPartIDUtils.parse('test#0')
32
+
33
+ beforeEach(async () => {
34
+ Simulator.useFakeTimers()
35
+ const simulator = new Simulator()
36
+ transport1 = new SimulatorTransport(pd1, simulator)
37
+ transport2 = new SimulatorTransport(pd2, simulator)
38
+
39
+ node1 = new NetworkNode({
40
+ layer0: {
41
+ entryPoints: [pd1],
42
+ peerDescriptor: pd1,
43
+ transportLayer: transport1
44
+ },
45
+ networkNode: {}
46
+ })
47
+ node2 = new NetworkNode({
48
+ layer0: {
49
+ entryPoints: [pd1],
50
+ peerDescriptor: pd2,
51
+ transportLayer: transport2
52
+ },
53
+ networkNode: {}
54
+ })
55
+
56
+ await node1.start()
57
+ node1.setStreamPartEntryPoints(STREAM_ID, [pd1])
58
+ await node2.start()
59
+ node2.setStreamPartEntryPoints(STREAM_ID, [pd1])
60
+ })
61
+
62
+ afterEach(async () => {
63
+ await Promise.all([
64
+ node1.stop(),
65
+ node2.stop()
66
+ ])
67
+ Simulator.useFakeTimers(false)
68
+ })
69
+
70
+ it('wait for join + publish and subscribe', async () => {
71
+ const streamMessage = new StreamMessage({
72
+ messageId: new MessageID(
73
+ toStreamID('test'),
74
+ 0,
75
+ 666,
76
+ 0,
77
+ 'peer2' as EthereumAddress,
78
+ 'msgChainId'
79
+ ),
80
+ prevMsgRef: new MessageRef(665, 0),
81
+ content: {
82
+ hello: 'world'
83
+ },
84
+ messageType: StreamMessageType.MESSAGE,
85
+ signature: 'signature',
86
+ })
87
+
88
+ let msgCount = 0
89
+ await node1.subscribeAndWaitForJoin(STREAM_ID)
90
+ node1.addMessageListener((msg) => {
91
+ expect(msg.messageId.timestamp).toEqual(666)
92
+ expect(msg.getSequenceNumber()).toEqual(0)
93
+ msgCount += 1
94
+ })
95
+ await node2.waitForJoinAndPublish(streamMessage)
96
+ await waitForCondition(() => msgCount === 1)
97
+ })
98
+
99
+ })
@@ -0,0 +1,61 @@
1
+ import {
2
+ RpcCommunicator,
3
+ ProtoCallContext,
4
+ ProtoRpcClient,
5
+ toProtoRpcClient
6
+ } from '@streamr/proto-rpc'
7
+ import { NetworkRpcClient } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
8
+ import {
9
+ StreamMessage,
10
+ ContentMessage
11
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
12
+ import { waitForCondition } from '@streamr/utils'
13
+ import { Empty } from '../../src/proto/google/protobuf/empty'
14
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
15
+ import { createStreamMessage } from '../utils/utils'
16
+ import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
17
+ import { Simulator } from '@streamr/dht'
18
+
19
+ describe('Network RPC', () => {
20
+ let rpcCommunicator1: RpcCommunicator
21
+ let rpcCommunicator2: RpcCommunicator
22
+ let client: ProtoRpcClient<NetworkRpcClient>
23
+ let recvCounter = 0
24
+
25
+ beforeEach(() => {
26
+ Simulator.useFakeTimers()
27
+ rpcCommunicator1 = new RpcCommunicator()
28
+ rpcCommunicator2 = new RpcCommunicator()
29
+ rpcCommunicator1.on('outgoingMessage', (message: RpcMessage, _requestId: string, _ucallContext?: ProtoCallContext) => {
30
+ rpcCommunicator2.handleIncomingMessage(message)
31
+ })
32
+ client = toProtoRpcClient(new NetworkRpcClient(rpcCommunicator1.getRpcClientTransport()))
33
+ rpcCommunicator2.registerRpcNotification(
34
+ StreamMessage,
35
+ 'sendData',
36
+ async (_msg: StreamMessage, _context: ServerCallContext): Promise<Empty> => {
37
+ recvCounter += 1
38
+ return {}
39
+ }
40
+ )
41
+ })
42
+
43
+ afterEach(() => {
44
+ rpcCommunicator1.stop()
45
+ rpcCommunicator2.stop()
46
+ Simulator.useFakeTimers(false)
47
+ })
48
+
49
+ it('sends Data', async () => {
50
+ const content: ContentMessage = {
51
+ body: JSON.stringify({ hello: 'WORLD' })
52
+ }
53
+ const msg = createStreamMessage(
54
+ content,
55
+ 'testStream',
56
+ 'peer1'
57
+ )
58
+ await client.sendData(msg)
59
+ await waitForCondition(() => recvCounter === 1)
60
+ })
61
+ })
@@ -0,0 +1,74 @@
1
+ import { NetworkStack } from '../../src/NetworkStack'
2
+ import { NodeType, PeerDescriptor, PeerID } from '@streamr/dht'
3
+ import {
4
+ StreamPartIDUtils,
5
+ toStreamID,
6
+ } from '@streamr/protocol'
7
+ import { waitForCondition } from '@streamr/utils'
8
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
9
+ import { createStreamMessage } from '../utils/utils'
10
+
11
+ describe('NetworkStack', () => {
12
+
13
+ let stack1: NetworkStack
14
+ let stack2: NetworkStack
15
+ const streamPartId = StreamPartIDUtils.parse('stream1#0')
16
+
17
+ const epDescriptor: PeerDescriptor = {
18
+ kademliaId: PeerID.fromString('entrypoint').value,
19
+ type: NodeType.NODEJS,
20
+ websocket: { ip: 'localhost', port: 32222 },
21
+ nodeName: 'entrypoint'
22
+ }
23
+
24
+ beforeEach(async () => {
25
+ stack1 = new NetworkStack({
26
+ layer0: {
27
+ peerDescriptor: epDescriptor,
28
+ entryPoints: [epDescriptor],
29
+ nodeName: 'entrypoint'
30
+ },
31
+ networkNode: {}
32
+ })
33
+ stack2 = new NetworkStack({
34
+ layer0: {
35
+ webSocketPort: 32223,
36
+ peerIdString: 'network-stack',
37
+ entryPoints: [epDescriptor],
38
+ nodeName: 'node2'
39
+ },
40
+ networkNode: {}
41
+ })
42
+
43
+ await stack1.start()
44
+ stack1.getStreamrNode()!.setStreamPartEntryPoints(streamPartId, [epDescriptor])
45
+ await stack2.start()
46
+ stack2.getStreamrNode()!.setStreamPartEntryPoints(streamPartId, [epDescriptor])
47
+ })
48
+
49
+ afterEach(async () => {
50
+ await Promise.all([
51
+ stack1.stop(),
52
+ stack2.stop()
53
+ ])
54
+ })
55
+
56
+ it('Can use NetworkNode pub/sub via NetworkStack', async () => {
57
+ let receivedMessages = 0
58
+ await stack1.getStreamrNode().waitForJoinAndSubscribe(streamPartId)
59
+ stack1.getStreamrNode().on('newMessage', () => {
60
+ receivedMessages += 1
61
+ })
62
+ const content: ContentMessage = {
63
+ body: JSON.stringify({ hello: 'WORLD' })
64
+ }
65
+ const msg = createStreamMessage(
66
+ content,
67
+ toStreamID(streamPartId),
68
+ PeerID.fromString('network-stack').toKey()
69
+ )
70
+ await stack2.getStreamrNode().waitForJoinAndPublish(streamPartId, msg)
71
+ await waitForCondition(() => receivedMessages === 1)
72
+ })
73
+
74
+ })
@@ -0,0 +1,45 @@
1
+ import { PeerID } from '@streamr/dht'
2
+ import { NetworkStack } from '../../src/NetworkStack'
3
+ import { NodeType } from '../../src/proto/packages/dht/protos/DhtRpc'
4
+
5
+ describe('NetworkStack can be stopped during start', () => {
6
+
7
+ const epDescriptor = {
8
+ kademliaId: PeerID.fromString('entrypoint').value,
9
+ type: NodeType.NODEJS,
10
+ websocket: { ip: 'localhost', port: 32224 },
11
+ }
12
+ let entryPoint: NetworkStack
13
+ let peer: NetworkStack
14
+
15
+ beforeEach(async () => {
16
+ entryPoint = new NetworkStack({
17
+ layer0: {
18
+ peerDescriptor: epDescriptor,
19
+ entryPoints: [epDescriptor]
20
+ },
21
+ networkNode: {}
22
+ })
23
+ peer = new NetworkStack({
24
+ layer0: {
25
+ peerDescriptor: {
26
+ kademliaId: PeerID.fromString('peer').value,
27
+ type: NodeType.NODEJS
28
+ },
29
+ entryPoints: [epDescriptor]
30
+ },
31
+ networkNode: {}
32
+ })
33
+ await entryPoint.start()
34
+ })
35
+
36
+ afterEach(async () => {
37
+ await entryPoint.stop()
38
+ })
39
+
40
+ it('Can be stopped during start', async () => {
41
+ setImmediate(() => peer.stop())
42
+ await peer.start()
43
+ })
44
+
45
+ })
@@ -0,0 +1,79 @@
1
+ import { DhtNode, PeerDescriptor, Simulator, PeerID, UUID, peerIdFromPeerDescriptor } from '@streamr/dht'
2
+ import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
3
+ import { createMockRandomGraphNodeAndDhtNode, createStreamMessage } from '../utils/utils'
4
+ import { range } from 'lodash'
5
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
6
+ import { waitForCondition } from '@streamr/utils'
7
+
8
+ describe('Propagation', () => {
9
+ const entryPointDescriptor: PeerDescriptor = {
10
+ kademliaId: PeerID.fromString(`entrypoint`).value,
11
+ type: 1
12
+ }
13
+ let dhtNodes: DhtNode[]
14
+ let randomGraphNodes: RandomGraphNode[]
15
+ const STREAM_ID = 'testingtesting'
16
+ let totalReceived: number
17
+ const NUM_OF_NODES = 256
18
+
19
+ beforeEach(async () => {
20
+ totalReceived = 0
21
+ const simulator = new Simulator()
22
+ dhtNodes = []
23
+ randomGraphNodes = []
24
+ const [entryPoint, node1] = createMockRandomGraphNodeAndDhtNode(entryPointDescriptor, entryPointDescriptor, STREAM_ID, simulator)
25
+ await entryPoint.start()
26
+ await entryPoint.joinDht([entryPointDescriptor])
27
+ await node1.start()
28
+ node1.on('message', () => {totalReceived += 1})
29
+ dhtNodes.push(entryPoint)
30
+ randomGraphNodes.push(node1)
31
+
32
+ await Promise.all(range(NUM_OF_NODES).map(async (_i) => {
33
+ const descriptor: PeerDescriptor = {
34
+ kademliaId: PeerID.fromString(new UUID().toString()).value,
35
+ type: 1
36
+ }
37
+ const [dht, graph] = createMockRandomGraphNodeAndDhtNode(
38
+ descriptor,
39
+ entryPointDescriptor,
40
+ STREAM_ID,
41
+ simulator
42
+ )
43
+ await dht.start()
44
+ await graph.start()
45
+ await dht.joinDht([entryPointDescriptor]).then(() => {
46
+ graph.on('message', () => { totalReceived += 1 })
47
+ dhtNodes.push(dht)
48
+ randomGraphNodes.push(graph)
49
+ })
50
+ }))
51
+ }, 45000)
52
+
53
+ afterEach(async () => {
54
+ await Promise.all(randomGraphNodes.map((node) => node.stop()))
55
+ await Promise.all(dhtNodes.map((node) => node.stop()))
56
+ })
57
+
58
+ it('All nodes receive messages', async () => {
59
+ await waitForCondition(
60
+ () => randomGraphNodes.every((peer) => peer.getTargetNeighborStringIds().length >= 3), 30000
61
+ )
62
+ await waitForCondition(() => {
63
+ const avg = randomGraphNodes.reduce((acc, curr) => {
64
+ return acc + curr.getTargetNeighborStringIds().length
65
+ }, 0) / randomGraphNodes.length
66
+ return avg >= 4
67
+ }, 20000)
68
+ const content: ContentMessage = {
69
+ body: JSON.stringify({ hello: 'WORLD' })
70
+ }
71
+ const msg = createStreamMessage(
72
+ content,
73
+ STREAM_ID,
74
+ peerIdFromPeerDescriptor(dhtNodes[0].getPeerDescriptor()).toString()
75
+ )
76
+ randomGraphNodes[0].broadcast(msg)
77
+ await waitForCondition(() => totalReceived >= NUM_OF_NODES, 10000)
78
+ }, 45000)
79
+ })
@@ -0,0 +1,141 @@
1
+ import { DhtNode, Simulator, SimulatorTransport, PeerDescriptor, PeerID, LatencyType } from '@streamr/dht'
2
+ import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
3
+ import { range } from 'lodash'
4
+ import { wait, waitForCondition } from '@streamr/utils'
5
+ import { createRandomGraphNode } from '../../src/logic/createRandomGraphNode'
6
+
7
+ describe('RandomGraphNode-DhtNode-Latencies', () => {
8
+ const numOfNodes = 64
9
+ let dhtNodes: DhtNode[]
10
+ let dhtEntryPoint: DhtNode
11
+ let entryPointRandomGraphNode: RandomGraphNode
12
+ let graphNodes: RandomGraphNode[]
13
+
14
+ const streamId = 'Stream1'
15
+ const entrypointDescriptor: PeerDescriptor = {
16
+ kademliaId: PeerID.fromString('entrypoint').value,
17
+ type: 0
18
+ }
19
+
20
+ const peerDescriptors: PeerDescriptor[] = range(numOfNodes).map((i) => {
21
+ return {
22
+ kademliaId: PeerID.fromString(`${i}`).value,
23
+ type: 0
24
+ }
25
+ })
26
+ beforeEach(async () => {
27
+ Simulator.useFakeTimers()
28
+ const simulator = new Simulator(LatencyType.FIXED, 50)
29
+ const entrypointCm = new SimulatorTransport(entrypointDescriptor, simulator)
30
+ const cms: SimulatorTransport[] = range(numOfNodes).map((i) =>
31
+ new SimulatorTransport(peerDescriptors[i], simulator)
32
+ )
33
+
34
+ dhtEntryPoint = new DhtNode({
35
+ transportLayer: entrypointCm,
36
+ peerDescriptor: entrypointDescriptor,
37
+ serviceId: streamId
38
+ })
39
+ dhtNodes = range(numOfNodes).map((i) => new DhtNode({
40
+ transportLayer: cms[i],
41
+ peerDescriptor: peerDescriptors[i],
42
+ serviceId: streamId
43
+ }))
44
+ graphNodes = range(numOfNodes).map((i) => createRandomGraphNode({
45
+ randomGraphId: streamId,
46
+ layer1: dhtNodes[i],
47
+ P2PTransport: cms[i],
48
+ connectionLocker: cms[i],
49
+ ownPeerDescriptor: peerDescriptors[i]
50
+ }))
51
+ entryPointRandomGraphNode = createRandomGraphNode({
52
+ randomGraphId: streamId,
53
+ layer1: dhtEntryPoint,
54
+ P2PTransport: entrypointCm,
55
+ connectionLocker: entrypointCm,
56
+ ownPeerDescriptor: entrypointDescriptor
57
+ })
58
+
59
+ await dhtEntryPoint.start()
60
+ await dhtEntryPoint.joinDht([entrypointDescriptor])
61
+ await Promise.all(dhtNodes.map((node) => node.start()))
62
+ })
63
+
64
+ afterEach(async () => {
65
+ dhtEntryPoint.stop()
66
+ entryPointRandomGraphNode.stop()
67
+ await Promise.all(dhtNodes.map((node) => node.stop()))
68
+ await Promise.all(graphNodes.map((node) => node.stop()))
69
+ Simulator.useFakeTimers(false)
70
+ })
71
+
72
+ it('happy path single peer', async () => {
73
+ await dhtNodes[0].joinDht([entrypointDescriptor])
74
+ entryPointRandomGraphNode.start()
75
+ await graphNodes[0].start()
76
+ await Promise.all([
77
+ waitForCondition(() => graphNodes[0].getNearbyContactPoolIds().length === 1),
78
+ waitForCondition(() => graphNodes[0].getTargetNeighborStringIds().length === 1)
79
+ ])
80
+ expect(graphNodes[0].getNearbyContactPoolIds().length).toEqual(1)
81
+ expect(graphNodes[0].getTargetNeighborStringIds().length).toEqual(1)
82
+ })
83
+
84
+ it('happy path 5 peers', async () => {
85
+ entryPointRandomGraphNode.start()
86
+ range(4).map((i) => graphNodes[i].start())
87
+ await Promise.all(range(4).map(async (i) => {
88
+ await dhtNodes[i].joinDht([entrypointDescriptor])
89
+ }))
90
+ await Promise.all(range(4).map((i) => {
91
+ return waitForCondition(() => {
92
+ return graphNodes[i].getTargetNeighborStringIds().length >= 4
93
+ }, 10000, 2000)
94
+ }))
95
+ range(4).map((i) => {
96
+ expect(graphNodes[i].getNearbyContactPoolIds().length).toBeGreaterThanOrEqual(4)
97
+ expect(graphNodes[i].getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(4)
98
+ })
99
+ // Check bidirectionality
100
+ const allNodes = graphNodes
101
+ allNodes.push(entryPointRandomGraphNode)
102
+ range(5).map((i) => {
103
+ const nodeId = allNodes[i].getOwnStringId()
104
+ allNodes[i].getNearbyContactPoolIds().forEach((stringId) => {
105
+ const neighbor = allNodes.find((peer) => {
106
+ return peer.getOwnStringId() === stringId
107
+ })
108
+ expect(neighbor!.getTargetNeighborStringIds()).toContain(nodeId)
109
+ })
110
+ })
111
+ }, 60000)
112
+
113
+ it('happy path 64 peers', async () => {
114
+ await Promise.all(range(numOfNodes).map((i) => graphNodes[i].start()))
115
+ await Promise.all(range(numOfNodes).map((i) => {
116
+ dhtNodes[i].joinDht([entrypointDescriptor])
117
+ }))
118
+ await Promise.all(graphNodes.map((node) =>
119
+ waitForCondition(() => node.getTargetNeighborStringIds().length >= 4, 10000)
120
+ ))
121
+
122
+ await Promise.all(graphNodes.map((node) =>
123
+ waitForCondition(() => node.getNumberOfOutgoingHandshakes() === 0)
124
+ ))
125
+
126
+ await wait(20000)
127
+ let mismatchCounter = 0
128
+ graphNodes.forEach((node) => {
129
+ const nodeId = node.getOwnStringId()
130
+ node.getTargetNeighborStringIds().forEach((neighborId) => {
131
+ if (neighborId !== entryPointRandomGraphNode.getOwnStringId()) {
132
+ const neighbor = graphNodes.find((n) => n.getOwnStringId() === neighborId)
133
+ if (!neighbor!.getTargetNeighborStringIds().includes(nodeId)) {
134
+ mismatchCounter += 1
135
+ }
136
+ }
137
+ })
138
+ })
139
+ expect(mismatchCounter).toBeLessThanOrEqual(2)
140
+ }, 90000)
141
+ })