@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,73 @@
1
+ import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
2
+ import { keyFromPeerDescriptor, PeerDescriptor, PeerID, peerIdFromPeerDescriptor } from '@streamr/dht'
3
+ import { MockTransport } from '../utils/mock/Transport'
4
+ import { createMockRemotePeer, mockConnectionLocker } from '../utils/utils'
5
+ import { createRandomGraphNode } from '../../src/logic/createRandomGraphNode'
6
+ import { PeerList } from '../../src/logic/PeerList'
7
+ import { MockHandshaker } from '../utils/mock/MockHandshaker'
8
+ import { MockNeighborUpdateManager } from '../utils/mock/MockNeighborUpdateManager'
9
+ import { MockNeighborFinder } from '../utils/mock/MockNeighborFinder'
10
+ import { mockLayer1 } from '../utils/mock/MockLayer1'
11
+
12
+ describe('RandomGraphNode', () => {
13
+
14
+ let randomGraphNode: RandomGraphNode
15
+ const peerDescriptor: PeerDescriptor = {
16
+ kademliaId: PeerID.fromString('random-graph-node').value,
17
+ type: 0
18
+ }
19
+
20
+ let targetNeighbors: PeerList
21
+ let nearbyContactPool: PeerList
22
+ let randomContactPool: PeerList
23
+
24
+ beforeEach(async () => {
25
+ const peerId = peerIdFromPeerDescriptor(peerDescriptor)
26
+
27
+ targetNeighbors = new PeerList(peerId, 10)
28
+ randomContactPool = new PeerList(peerId, 10)
29
+ nearbyContactPool = new PeerList(peerId, 10)
30
+
31
+ randomGraphNode = createRandomGraphNode({
32
+ targetNeighbors,
33
+ randomContactPool,
34
+ nearbyContactPool,
35
+ P2PTransport: new MockTransport(),
36
+ ownPeerDescriptor: peerDescriptor,
37
+ layer1: mockLayer1 as any,
38
+ connectionLocker: mockConnectionLocker,
39
+ handshaker: new MockHandshaker(),
40
+ neighborUpdateManager: new MockNeighborUpdateManager(),
41
+ neighborFinder: new MockNeighborFinder(),
42
+ randomGraphId: 'random-graph'
43
+ })
44
+ await randomGraphNode.start()
45
+ })
46
+
47
+ afterEach(async () => {
48
+ await randomGraphNode.stop()
49
+ })
50
+
51
+ it('getTargetNeighborStringIds', () => {
52
+ const mockRemote = createMockRemotePeer()
53
+ targetNeighbors.add(mockRemote)
54
+ const ids = randomGraphNode.getTargetNeighborStringIds()
55
+ expect(ids[0]).toEqual(keyFromPeerDescriptor(mockRemote.getPeerDescriptor()))
56
+ targetNeighbors.remove(mockRemote.getPeerDescriptor())
57
+ })
58
+
59
+ it('getNearbyContactPoolIds', () => {
60
+ const mockRemote = createMockRemotePeer()
61
+ nearbyContactPool.add(mockRemote)
62
+ const ids = randomGraphNode.getNearbyContactPoolIds()
63
+ expect(ids[0]).toEqual(keyFromPeerDescriptor(mockRemote.getPeerDescriptor()))
64
+ })
65
+
66
+ it('getRandomContactPoolIds', () => {
67
+ const mockRemote = createMockRemotePeer()
68
+ randomContactPool.add(mockRemote)
69
+ const ids = randomGraphNode.getRandomContactPoolIds()
70
+ expect(ids[0]).toEqual(keyFromPeerDescriptor(mockRemote.getPeerDescriptor()))
71
+ })
72
+
73
+ })
@@ -0,0 +1,152 @@
1
+ import { StreamEntryPointDiscovery } from '../../src/logic/StreamEntryPointDiscovery'
2
+ import { PeerDescriptor, RecursiveFindResult, PeerID } from '@streamr/dht'
3
+ import { StreamObject } from '../../src/logic/StreamrNode'
4
+ import { DataEntry } from '../../src/proto/packages/dht/protos/DhtRpc'
5
+ import { Any } from '../../src/proto/google/protobuf/any'
6
+ import { wait } from '@streamr/utils'
7
+
8
+ describe('StreamEntryPointDiscovery', () => {
9
+
10
+ let streamEntryPointDiscoveryWithData: StreamEntryPointDiscovery
11
+ let streamEntryPointDiscoveryWithoutData: StreamEntryPointDiscovery
12
+ let storeCalled: number
13
+ let streams = new Map<string, StreamObject>()
14
+
15
+ const peerDescriptor: PeerDescriptor = {
16
+ kademliaId: PeerID.fromString('fake').value,
17
+ type: 0,
18
+ nodeName: 'fake'
19
+ }
20
+
21
+ const deletedPeerDescriptor: PeerDescriptor = {
22
+ kademliaId: PeerID.fromString('deleted').value,
23
+ type: 0,
24
+ nodeName: 'deleted'
25
+ }
26
+
27
+ const fakeData: DataEntry = {
28
+ data: Any.pack(peerDescriptor, PeerDescriptor),
29
+ ttl: 1000,
30
+ storer: peerDescriptor,
31
+ kademliaId: Uint8Array.from([1, 2, 3]),
32
+ stale: false,
33
+ deleted: false
34
+ }
35
+
36
+ const fakeDeletedData: DataEntry = {
37
+ data: Any.pack(deletedPeerDescriptor, PeerDescriptor),
38
+ ttl: 1000,
39
+ storer: deletedPeerDescriptor,
40
+ kademliaId: Uint8Array.from([1, 2, 3]),
41
+ stale: false,
42
+ deleted: true
43
+ }
44
+
45
+ const stream = 'stream#0'
46
+
47
+ const fakeGetEntryPointData = async (_key: Uint8Array): Promise<RecursiveFindResult> => {
48
+ return {
49
+ closestNodes: [peerDescriptor],
50
+ dataEntries: [fakeData, fakeDeletedData]
51
+ }
52
+ }
53
+
54
+ const fakeGetEntryPointDataViaPeer = async (_key: Uint8Array, _peer: PeerDescriptor): Promise<DataEntry[]> => {
55
+ return [fakeData]
56
+ }
57
+
58
+ const fakeStoreEntryPointData = async (_key: Uint8Array, _data: Any): Promise<PeerDescriptor[]> => {
59
+ storeCalled++
60
+ return [peerDescriptor]
61
+ }
62
+
63
+ const fakeEmptyGetEntryPointData = async (_key: Uint8Array): Promise<RecursiveFindResult> => {
64
+ return {
65
+ closestNodes: [],
66
+ dataEntries: []
67
+ }
68
+ }
69
+
70
+ const fakeDeleteEntryPointData = async (_key: Uint8Array): Promise<void> => {}
71
+
72
+ beforeEach(() => {
73
+ storeCalled = 0
74
+ streams = new Map()
75
+ streams.set(stream, {} as any)
76
+ streamEntryPointDiscoveryWithData = new StreamEntryPointDiscovery({
77
+ ownPeerDescriptor: peerDescriptor,
78
+ streams,
79
+ getEntryPointData: fakeGetEntryPointData,
80
+ getEntryPointDataViaPeer: fakeGetEntryPointDataViaPeer,
81
+ storeEntryPointData: fakeStoreEntryPointData,
82
+ deleteEntryPointData: fakeDeleteEntryPointData,
83
+ cacheInterval: 2000
84
+ })
85
+ streamEntryPointDiscoveryWithoutData = new StreamEntryPointDiscovery({
86
+ ownPeerDescriptor: peerDescriptor,
87
+ streams: new Map<string, StreamObject>(),
88
+ getEntryPointData: fakeEmptyGetEntryPointData,
89
+ getEntryPointDataViaPeer: fakeGetEntryPointDataViaPeer,
90
+ storeEntryPointData: fakeStoreEntryPointData,
91
+ deleteEntryPointData: fakeDeleteEntryPointData,
92
+ cacheInterval: 2000
93
+ })
94
+ })
95
+
96
+ afterEach(() => {
97
+ streamEntryPointDiscoveryWithData.destroy()
98
+ })
99
+
100
+ it('discoverEntryPointsFromDht has known entrypoints', async () => {
101
+ const res = await streamEntryPointDiscoveryWithData.discoverEntryPointsFromDht(stream, 1)
102
+ expect(res.joiningEmptyStream).toEqual(false)
103
+ expect(res.entryPointsFromDht).toEqual(false)
104
+ expect(res.discoveredEntryPoints).toEqual([])
105
+ })
106
+
107
+ it('discoverEntryPointsFromDht does not have known entrypoints', async () => {
108
+ const res = await streamEntryPointDiscoveryWithData.discoverEntryPointsFromDht(stream, 0)
109
+ expect(res.joiningEmptyStream).toEqual(false)
110
+ expect(res.entryPointsFromDht).toEqual(true)
111
+ expect(res.discoveredEntryPoints).toEqual([peerDescriptor])
112
+ })
113
+
114
+ it('discoverEntryPointsfromDht on an empty stream', async () => {
115
+ const res = await streamEntryPointDiscoveryWithoutData.discoverEntryPointsFromDht(stream, 0)
116
+ expect(res.joiningEmptyStream).toEqual(true)
117
+ expect(res.entryPointsFromDht).toEqual(true)
118
+ expect(res.discoveredEntryPoints).toEqual([peerDescriptor]) // ownPeerDescriptor
119
+ })
120
+
121
+ it('store on empty stream', async () => {
122
+ await streamEntryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(stream, true, true, 0)
123
+ expect(storeCalled).toEqual(1)
124
+ })
125
+
126
+ it('store on non-empty stream without known entry points', async () => {
127
+ await streamEntryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(stream, false, false, 0)
128
+ expect(storeCalled).toEqual(0)
129
+ })
130
+
131
+ it('store on stream without saturated entrypoint count', async () => {
132
+ await streamEntryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(stream, false, true, 0)
133
+ expect(storeCalled).toEqual(1)
134
+ })
135
+
136
+ it('will keep recaching until stream stopped', async () => {
137
+ await streamEntryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(stream, true, true, 0)
138
+ expect(storeCalled).toEqual(1)
139
+ await wait(4500)
140
+ streamEntryPointDiscoveryWithData.removeSelfAsEntryPoint(stream)
141
+ expect(storeCalled).toEqual(3)
142
+ })
143
+
144
+ it('will stop recaching is stream is left', async () => {
145
+ await streamEntryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(stream, true, true, 0)
146
+ expect(storeCalled).toEqual(1)
147
+ streams.delete(stream)
148
+ await wait(4500)
149
+ expect(storeCalled).toEqual(1)
150
+ })
151
+
152
+ })
@@ -0,0 +1,67 @@
1
+ import { createStreamMessage } from '../utils/utils'
2
+ import { ContentMessage, StreamMessageType } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
3
+ import { StreamMessageTranslator } from '../../src/logic/protocol-integration/stream-message/StreamMessageTranslator'
4
+ import {
5
+ EncryptionType,
6
+ MessageID,
7
+ StreamID,
8
+ StreamMessage as OldStreamMessage,
9
+ StreamMessageType as OldStreamMessageType
10
+ } from '@streamr/protocol'
11
+ import { EthereumAddress } from '@streamr/utils'
12
+
13
+ describe('StreamMessageTranslator', () => {
14
+
15
+ const content: ContentMessage = {
16
+ body: JSON.stringify({ hello: 'WORLD' })
17
+ }
18
+ const protobufMsg = createStreamMessage(content, 'TEST', 'publisher')
19
+
20
+ const messageId = new MessageID(
21
+ 'TEST' as StreamID,
22
+ 0,
23
+ Date.now(),
24
+ 0,
25
+ 'publisher' as EthereumAddress,
26
+ 'test',
27
+ )
28
+
29
+ const oldProtocolMsg = new OldStreamMessage({
30
+ messageId,
31
+ prevMsgRef: null,
32
+ content: { hello: 'WORLD' },
33
+ messageType: OldStreamMessageType.MESSAGE,
34
+ encryptionType: EncryptionType.NONE,
35
+ signature: 'signature',
36
+ })
37
+
38
+ it('translates old protocol to protobuf', () => {
39
+ const translated = StreamMessageTranslator.toProtobuf(oldProtocolMsg)
40
+ expect(translated.messageRef!.timestamp).toBeGreaterThanOrEqual(0)
41
+ expect(translated.messageRef!.sequenceNumber).toEqual(0)
42
+ expect(translated.messageRef!.streamId).toEqual('TEST')
43
+ expect(translated.messageRef!.streamPartition).toEqual(0)
44
+ expect(translated.messageRef!.publisherId).toEqual('publisher')
45
+ expect(translated.previousMessageRef).toEqual(undefined)
46
+ expect(translated.messageType).toEqual(StreamMessageType.MESSAGE)
47
+ expect(translated.groupKeyId).toEqual(undefined)
48
+ expect(translated.signature).toEqual('signature')
49
+ expect(JSON.parse(ContentMessage.fromBinary(translated.content).body)).toEqual({ hello: 'WORLD' })
50
+
51
+ })
52
+
53
+ it('translates protobuf to old protocol', () => {
54
+ const translated = StreamMessageTranslator.toClientProtocol(protobufMsg)
55
+ expect(translated.messageId.timestamp).toBeGreaterThanOrEqual(0)
56
+ expect(translated.messageId.sequenceNumber).toEqual(0)
57
+ expect(translated.messageId.streamId).toEqual('TEST')
58
+ expect(translated.messageId.streamPartition).toEqual(0)
59
+ expect(translated.getPublisherId()).toEqual('publisher')
60
+ expect(translated.prevMsgRef).toEqual(null)
61
+ expect(translated.messageType).toEqual(OldStreamMessageType.MESSAGE)
62
+ expect(translated.contentType).toEqual(0)
63
+ expect(translated.groupKeyId).toEqual(null)
64
+ expect(translated.signature).toEqual('signature')
65
+ expect(translated.getParsedContent()).toEqual({ hello: 'WORLD' })
66
+ })
67
+ })
@@ -0,0 +1,63 @@
1
+ import { ListeningRpcCommunicator, PeerDescriptor, PeerID } from '@streamr/dht'
2
+ import { StreamNodeServer } from '../../src/logic/StreamNodeServer'
3
+ import { ContentMessage, LeaveStreamNotice } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
4
+ import { MockTransport } from '../utils/mock/Transport'
5
+ import { createStreamMessage } from '../utils/utils'
6
+
7
+ describe('StreamNodeServer', () => {
8
+
9
+ let streamNodeServer: StreamNodeServer
10
+ const peerDescriptor: PeerDescriptor = {
11
+ kademliaId: PeerID.fromString('random-graph-node').value,
12
+ type: 0
13
+ }
14
+
15
+ const mockSender: PeerDescriptor = {
16
+ kademliaId: PeerID.fromString('mock-sender').value,
17
+ type: 0
18
+ }
19
+
20
+ const content: ContentMessage = {
21
+ body: JSON.stringify({ hello: 'WORLD' })
22
+ }
23
+ const message = createStreamMessage(content, 'random-graph', 'publisher')
24
+
25
+ let mockBroadcast: jest.Mock
26
+ let mockDuplicateCheck: jest.Mock
27
+ let mockOnLeaveNotice: jest.Mock
28
+ let mockMarkForInspection: jest.Mock
29
+
30
+ beforeEach(async () => {
31
+ mockDuplicateCheck = jest.fn((_c, _p) => true)
32
+ mockBroadcast = jest.fn((_m, _p) => {})
33
+ mockOnLeaveNotice = jest.fn((_m) => {})
34
+ mockMarkForInspection = jest.fn((_m) => {})
35
+
36
+ streamNodeServer = new StreamNodeServer({
37
+ markAndCheckDuplicate: mockDuplicateCheck,
38
+ broadcast: mockBroadcast,
39
+ onLeaveNotice: mockOnLeaveNotice,
40
+ markForInspection: mockMarkForInspection,
41
+ ownPeerDescriptor: peerDescriptor,
42
+ randomGraphId: 'random-graph',
43
+ rpcCommunicator: new ListeningRpcCommunicator('random-graph-node', new MockTransport())
44
+ })
45
+ })
46
+
47
+ it('Server sendData()', async () => {
48
+ await streamNodeServer.sendData(message, { incomingSourceDescriptor: mockSender } as any)
49
+ expect(mockDuplicateCheck).toHaveBeenCalledTimes(1)
50
+ expect(mockBroadcast).toHaveBeenCalledTimes(1)
51
+ expect(mockMarkForInspection).toHaveBeenCalledTimes(1)
52
+ })
53
+
54
+ it('Server leaveStreamNotice()', async () => {
55
+ const leaveNotice: LeaveStreamNotice = {
56
+ senderId: 'sender',
57
+ randomGraphId: 'random-graph'
58
+ }
59
+ await streamNodeServer.leaveStreamNotice(leaveNotice, { incomingSourceDescriptor: mockSender } as any)
60
+ expect(mockOnLeaveNotice).toHaveBeenCalledTimes(1)
61
+ })
62
+
63
+ })
@@ -0,0 +1,74 @@
1
+ import { StreamrNode } from '../../src/logic/StreamrNode'
2
+ import { MockLayer0 } from '../utils/mock/MockLayer0'
3
+ import { isSamePeerDescriptor, PeerDescriptor, PeerID } from '@streamr/dht'
4
+ import { createStreamMessage, mockConnectionLocker } from '../utils/utils'
5
+ import { MockTransport } from '../utils/mock/Transport'
6
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
7
+ import { waitForCondition } from '@streamr/utils'
8
+
9
+ describe('StreamrNode', () => {
10
+
11
+ let node: StreamrNode
12
+ const peerDescriptor: PeerDescriptor = {
13
+ kademliaId: PeerID.fromString('streamr-node').value,
14
+ type: 0
15
+ }
16
+ const stream = 'stream'
17
+ const content: ContentMessage = {
18
+ body: JSON.stringify({ hello: 'WORLD' })
19
+ }
20
+ const message = createStreamMessage(content, stream, 'publisher')
21
+
22
+ beforeEach(async () => {
23
+ node = new StreamrNode({})
24
+ const mockLayer0 = new MockLayer0(peerDescriptor)
25
+ await node.start(mockLayer0, new MockTransport(), mockConnectionLocker)
26
+ node.setStreamPartEntryPoints(stream, [peerDescriptor])
27
+ })
28
+
29
+ afterEach(async () => {
30
+ await node.destroy()
31
+ })
32
+
33
+ it('PeerDescriptor is correct', () => {
34
+ expect(isSamePeerDescriptor(peerDescriptor, node.getPeerDescriptor()))
35
+ })
36
+
37
+ it('can join streams', async () => {
38
+ await node.joinStream(stream)
39
+ expect(node.hasStream(stream)).toEqual(true)
40
+ })
41
+
42
+ it('can leave streams', async () => {
43
+ await node.joinStream(stream)
44
+ expect(node.hasStream(stream)).toEqual(true)
45
+ node.leaveStream(stream)
46
+ expect(node.hasStream(stream)).toEqual(false)
47
+ })
48
+
49
+ it('subscribe and wait for join', async () => {
50
+ await node.waitForJoinAndSubscribe(stream)
51
+ expect(node.hasStream(stream)).toEqual(true)
52
+ })
53
+
54
+ it('publish and wait for join', async () => {
55
+ await node.waitForJoinAndPublish(stream, message)
56
+ expect(node.hasStream(stream)).toEqual(true)
57
+ })
58
+
59
+ it('subscribe joins stream', async () => {
60
+ node.subscribeToStream(stream)
61
+ await waitForCondition(() => node.hasStream(stream))
62
+ })
63
+
64
+ it('publish joins stream', async () => {
65
+ await node.publishToStream(stream, message)
66
+ await waitForCondition(() => node.hasStream(stream))
67
+ })
68
+
69
+ it('can unsubscribe', async () => {
70
+ await node.joinStream(stream)
71
+ await node.unsubscribeFromStream(stream)
72
+ })
73
+
74
+ })
@@ -0,0 +1,15 @@
1
+ import { IHandshaker } from '../../../src/logic/neighbor-discovery/Handshaker'
2
+
3
+ export class MockHandshaker implements IHandshaker {
4
+
5
+ // eslint-disable-next-line class-methods-use-this
6
+ getOngoingHandshakes(): Set<string> {
7
+ return new Set()
8
+ }
9
+
10
+ // eslint-disable-next-line class-methods-use-this
11
+ async attemptHandshakesOnContacts(excludedIds: string[]): Promise<string[]> {
12
+ return excludedIds
13
+ }
14
+
15
+ }
@@ -0,0 +1,71 @@
1
+ import { PeerDescriptor, peerIdFromPeerDescriptor, PeerID, RecursiveFindResult, Message, DataEntry } from '@streamr/dht'
2
+ import { ILayer0 } from '../../../src/logic/ILayer0'
3
+ import { Any } from '../../../src/proto/google/protobuf/any'
4
+ import { EventEmitter } from 'eventemitter3'
5
+
6
+ export class MockLayer0 extends EventEmitter implements ILayer0 {
7
+
8
+ private readonly peerDescriptor: PeerDescriptor
9
+
10
+ constructor(peerDescriptor: PeerDescriptor) {
11
+ super()
12
+ this.peerDescriptor = peerDescriptor
13
+ }
14
+
15
+ getPeerDescriptor(): PeerDescriptor {
16
+ return this.peerDescriptor
17
+ }
18
+
19
+ getNodeId(): PeerID {
20
+ return peerIdFromPeerDescriptor(this.peerDescriptor)
21
+ }
22
+
23
+ // eslint-disable-next-line class-methods-use-this
24
+ async getDataFromDht(_key: Uint8Array): Promise<RecursiveFindResult> {
25
+ return {
26
+ closestNodes: [],
27
+ dataEntries: []
28
+ }
29
+ }
30
+
31
+ // eslint-disable-next-line class-methods-use-this
32
+ async findDataViaPeer(_key: Uint8Array): Promise<DataEntry[]> {
33
+ return []
34
+ }
35
+
36
+ // eslint-disable-next-line class-methods-use-this
37
+ async deleteDataFromDht(_key: Uint8Array): Promise<void> {
38
+
39
+ }
40
+
41
+ // eslint-disable-next-line class-methods-use-this
42
+ async storeDataToDht(_key: Uint8Array, _data: Any): Promise<PeerDescriptor[]> {
43
+ return []
44
+ }
45
+
46
+ // eslint-disable-next-line class-methods-use-this
47
+ async send(_message: Message, _doNotConnect?: boolean): Promise<void> {
48
+ return
49
+ }
50
+
51
+ // eslint-disable-next-line class-methods-use-this
52
+ getKnownEntryPoints(): PeerDescriptor[] {
53
+ return []
54
+ }
55
+
56
+ // eslint-disable-next-line class-methods-use-this
57
+ isJoinOngoing(): boolean {
58
+ return false
59
+ }
60
+
61
+ // eslint-disable-next-line class-methods-use-this
62
+ getAllConnectionPeerDescriptors(): PeerDescriptor[] {
63
+ return []
64
+ }
65
+
66
+ // eslint-disable-next-line class-methods-use-this
67
+ async stop(): Promise<void> {
68
+
69
+ }
70
+
71
+ }
@@ -0,0 +1,6 @@
1
+ export const mockLayer1 = {
2
+ on: (): void => {},
3
+ once: (): void => {},
4
+ off: (): void => {},
5
+ getNeighborList: (): any => { return { getClosestContacts: () => [] }},
6
+ }
@@ -0,0 +1,19 @@
1
+ import { INeighborFinder } from '../../../src/logic/neighbor-discovery/NeighborFinder'
2
+
3
+ export class MockNeighborFinder implements INeighborFinder {
4
+
5
+ // eslint-disable-next-line class-methods-use-this
6
+ start(_excluded?: string[]): void {
7
+
8
+ }
9
+
10
+ // eslint-disable-next-line class-methods-use-this
11
+ stop(): void {
12
+
13
+ }
14
+
15
+ // eslint-disable-next-line class-methods-use-this
16
+ isRunning(): boolean {
17
+ return false
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ import { INeighborUpdateManager } from '../../../src/logic/neighbor-discovery/NeighborUpdateManager'
2
+ import { NeighborUpdate } from '../../../src/proto/packages/trackerless-network/protos/NetworkRpc'
3
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
4
+
5
+ export class MockNeighborUpdateManager implements INeighborUpdateManager {
6
+
7
+ // eslint-disable-next-line class-methods-use-this
8
+ async start(): Promise<void> {
9
+
10
+ }
11
+
12
+ // eslint-disable-next-line class-methods-use-this
13
+ stop(): void {
14
+
15
+ }
16
+
17
+ // eslint-disable-next-line class-methods-use-this
18
+ async neighborUpdate(_request: NeighborUpdate, _context: ServerCallContext): Promise<NeighborUpdate> {
19
+ return NeighborUpdate.create()
20
+ }
21
+ }
@@ -0,0 +1,25 @@
1
+ import { ITransport, Message, PeerDescriptor } from '@streamr/dht'
2
+ import { EventEmitter } from 'eventemitter3'
3
+
4
+ export class MockTransport extends EventEmitter implements ITransport {
5
+
6
+ // eslint-disable-next-line class-methods-use-this
7
+ async send(_msg: Message, _doNotConnect?: boolean): Promise<void> {
8
+
9
+ }
10
+
11
+ // eslint-disable-next-line class-methods-use-this
12
+ getPeerDescriptor(): PeerDescriptor {
13
+ return PeerDescriptor.create()
14
+ }
15
+
16
+ // eslint-disable-next-line class-methods-use-this
17
+ getAllConnectionPeerDescriptors(): PeerDescriptor[] {
18
+ return []
19
+ }
20
+
21
+ // eslint-disable-next-line class-methods-use-this
22
+ stop(): void {
23
+
24
+ }
25
+ }