@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,142 @@
1
+ import { NodeType, PeerDescriptor, PeerID } from '@streamr/dht'
2
+ import {
3
+ EncryptionType,
4
+ GroupKeyRequest,
5
+ GroupKeyResponse,
6
+ MessageID,
7
+ StreamMessage,
8
+ StreamMessageType,
9
+ StreamPartIDUtils,
10
+ toStreamID,
11
+ toStreamPartID
12
+ } from '@streamr/protocol'
13
+ import { NetworkNode } from '../../src/NetworkNode'
14
+ import { ProxyDirection } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
15
+ import { toEthereumAddress, waitForEvent3 } from '@streamr/utils'
16
+
17
+ describe('proxy group key exchange', () => {
18
+ const proxyNodeDescriptor: PeerDescriptor = {
19
+ kademliaId: PeerID.fromString(`proxyNode1`).value,
20
+ type: NodeType.NODEJS,
21
+ nodeName: 'proxyNode',
22
+ websocket: { ip: 'localhost', port: 23134 }
23
+ }
24
+ const publisherDescriptor: PeerDescriptor = {
25
+ kademliaId: PeerID.fromString(`publisher`).value,
26
+ type: NodeType.NODEJS,
27
+ }
28
+ const subscriberDescriptor: PeerDescriptor = {
29
+ kademliaId: PeerID.fromString(`subscriber`).value,
30
+ type: NodeType.NODEJS,
31
+ }
32
+
33
+ const publisherUserId = toEthereumAddress('0x823A026e226EB47980c88616e01E1D3305Ef8Ecb')
34
+ const subscriberUserId = toEthereumAddress('0x73E6183bf9b79D30533bEC7B28e982e9Af649B23')
35
+
36
+ const streamPartId = toStreamPartID(toStreamID('proxy-test'), 0)
37
+
38
+ let proxyNode: NetworkNode
39
+ let publisher: NetworkNode
40
+ let subscriber: NetworkNode
41
+
42
+ beforeEach(async () => {
43
+ proxyNode = new NetworkNode({
44
+ layer0: {
45
+ entryPoints: [proxyNodeDescriptor],
46
+ peerDescriptor: proxyNodeDescriptor,
47
+ },
48
+ networkNode: {
49
+ acceptProxyConnections: true
50
+ }
51
+ })
52
+ await proxyNode.start()
53
+ proxyNode.setStreamPartEntryPoints(streamPartId, [proxyNodeDescriptor])
54
+ await proxyNode.stack.getStreamrNode()!.joinStream(streamPartId)
55
+ publisher = new NetworkNode({
56
+ layer0: {
57
+ entryPoints: [publisherDescriptor],
58
+ peerDescriptor: publisherDescriptor,
59
+ },
60
+ networkNode: {}
61
+ })
62
+ await publisher.start(false)
63
+
64
+ subscriber = new NetworkNode({
65
+ layer0: {
66
+ entryPoints: [subscriberDescriptor],
67
+ peerDescriptor: subscriberDescriptor,
68
+ },
69
+ networkNode: {}
70
+ })
71
+ await subscriber.start(false)
72
+ })
73
+
74
+ afterEach(async () => {
75
+ await proxyNode.stop()
76
+ await publisher.stop()
77
+ await subscriber.stop()
78
+ })
79
+
80
+ it('happy path request', async () => {
81
+ await publisher.setProxies(streamPartId, [proxyNodeDescriptor], ProxyDirection.PUBLISH, async () => publisherUserId)
82
+ await subscriber.setProxies(streamPartId, [proxyNodeDescriptor], ProxyDirection.SUBSCRIBE, async () => subscriberUserId)
83
+
84
+ const requestContent = new GroupKeyRequest({
85
+ recipient: publisherUserId,
86
+ requestId: 'requestId',
87
+ rsaPublicKey: 'mockKey',
88
+ groupKeyIds: [
89
+ 'mock'
90
+ ],
91
+ }).toArray()
92
+ const request = new StreamMessage({
93
+ messageId: new MessageID(
94
+ StreamPartIDUtils.getStreamID(streamPartId),
95
+ StreamPartIDUtils.getStreamPartition(streamPartId),
96
+ Date.now(),
97
+ 0,
98
+ subscriberUserId,
99
+ '0'
100
+ ),
101
+ messageType: StreamMessageType.GROUP_KEY_REQUEST,
102
+ encryptionType: EncryptionType.NONE,
103
+ content: requestContent,
104
+ signature: 'signature'
105
+ })
106
+
107
+ await Promise.all([
108
+ waitForEvent3(publisher.stack.getStreamrNode()! as any, 'newMessage'),
109
+ subscriber.publish(request)
110
+ ])
111
+ })
112
+
113
+ it('happy path response', async () => {
114
+ await publisher.setProxies(streamPartId, [proxyNodeDescriptor], ProxyDirection.PUBLISH, async () => publisherUserId)
115
+ await subscriber.setProxies(streamPartId, [proxyNodeDescriptor], ProxyDirection.SUBSCRIBE, async () => subscriberUserId)
116
+
117
+ const responseContent = new GroupKeyResponse({
118
+ recipient: publisherUserId,
119
+ requestId: 'requestId',
120
+ encryptedGroupKeys: []
121
+ }).toArray()
122
+ const response = new StreamMessage({
123
+ messageId: new MessageID(
124
+ StreamPartIDUtils.getStreamID(streamPartId),
125
+ StreamPartIDUtils.getStreamPartition(streamPartId),
126
+ Date.now(),
127
+ 0,
128
+ publisherUserId,
129
+ '0'
130
+ ),
131
+ messageType: StreamMessageType.GROUP_KEY_RESPONSE,
132
+ encryptionType: EncryptionType.RSA,
133
+ content: responseContent,
134
+ signature: 'signature'
135
+ })
136
+
137
+ await Promise.all([
138
+ waitForEvent3(subscriber.stack.getStreamrNode()! as any, 'newMessage'),
139
+ publisher.publish(response)
140
+ ])
141
+ })
142
+ })
@@ -0,0 +1,154 @@
1
+ import { ConnectionManager, DhtNode, PeerDescriptor, NodeType, peerIdFromPeerDescriptor } from '@streamr/dht'
2
+ import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
3
+ import { waitForCondition } from '@streamr/utils'
4
+ import { createStreamMessage } from '../utils/utils'
5
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
6
+ import { createRandomGraphNode } from '../../src/logic/createRandomGraphNode'
7
+
8
+ describe('random graph with real connections', () => {
9
+
10
+ const epPeerDescriptor: PeerDescriptor = {
11
+ kademliaId: Uint8Array.from([1, 2, 3]),
12
+ type: NodeType.NODEJS,
13
+ websocket: { ip: 'localhost', port: 12221 }
14
+ }
15
+
16
+ const randomGraphId = 'random-graph'
17
+ let epDhtNode: DhtNode
18
+ let dhtNode1: DhtNode
19
+ let dhtNode2: DhtNode
20
+ let dhtNode3: DhtNode
21
+ let dhtNode4: DhtNode
22
+ let randomGraphNode1: RandomGraphNode
23
+ let randomGraphNode2: RandomGraphNode
24
+ let randomGraphNode3: RandomGraphNode
25
+ let randomGraphNode4: RandomGraphNode
26
+ let randomGraphNode5: RandomGraphNode
27
+
28
+ beforeEach(async () => {
29
+ epDhtNode = new DhtNode({ peerDescriptor: epPeerDescriptor })
30
+ await epDhtNode.start()
31
+ dhtNode1 = new DhtNode({ peerIdString: '1', webSocketPort: 12222, entryPoints: [epPeerDescriptor] })
32
+ dhtNode2 = new DhtNode({ peerIdString: '2', webSocketPort: 12223, entryPoints: [epPeerDescriptor] })
33
+ dhtNode3 = new DhtNode({ peerIdString: '3', webSocketPort: 12224, entryPoints: [epPeerDescriptor] })
34
+ dhtNode4 = new DhtNode({ peerIdString: '4', webSocketPort: 12225, entryPoints: [epPeerDescriptor] })
35
+ await dhtNode1.start()
36
+ await dhtNode2.start()
37
+ await dhtNode3.start()
38
+ await dhtNode4.start()
39
+
40
+ randomGraphNode1 = createRandomGraphNode(
41
+ {
42
+ randomGraphId,
43
+ layer1: epDhtNode,
44
+ P2PTransport: epDhtNode.getTransport(),
45
+ connectionLocker: epDhtNode.getTransport() as ConnectionManager,
46
+ ownPeerDescriptor: epPeerDescriptor
47
+ }
48
+ )
49
+ randomGraphNode2 = createRandomGraphNode({
50
+ randomGraphId,
51
+ layer1: dhtNode1,
52
+ P2PTransport: dhtNode1.getTransport(),
53
+ connectionLocker: dhtNode1.getTransport() as ConnectionManager,
54
+ ownPeerDescriptor: dhtNode1.getPeerDescriptor()
55
+ })
56
+ randomGraphNode3 = createRandomGraphNode({
57
+ randomGraphId,
58
+ layer1: dhtNode2,
59
+ P2PTransport: dhtNode2.getTransport(),
60
+ connectionLocker: dhtNode2.getTransport() as ConnectionManager,
61
+ ownPeerDescriptor: dhtNode2.getPeerDescriptor()
62
+ })
63
+ randomGraphNode4 = createRandomGraphNode({
64
+ randomGraphId,
65
+ layer1: dhtNode3,
66
+ P2PTransport: dhtNode3.getTransport(),
67
+ connectionLocker: dhtNode3.getTransport() as ConnectionManager,
68
+ ownPeerDescriptor: dhtNode3.getPeerDescriptor()
69
+ })
70
+ randomGraphNode5 = createRandomGraphNode({
71
+ randomGraphId,
72
+ layer1: dhtNode4,
73
+ P2PTransport: dhtNode4.getTransport(),
74
+ connectionLocker: dhtNode4.getTransport() as ConnectionManager,
75
+ ownPeerDescriptor: dhtNode4.getPeerDescriptor()
76
+ })
77
+ await epDhtNode.joinDht([epPeerDescriptor])
78
+ await Promise.all([
79
+ dhtNode1.joinDht([epPeerDescriptor]),
80
+ dhtNode2.joinDht([epPeerDescriptor]),
81
+ dhtNode3.joinDht([epPeerDescriptor]),
82
+ dhtNode4.joinDht([epPeerDescriptor])
83
+ ])
84
+ await Promise.all([
85
+ randomGraphNode1.start(),
86
+ randomGraphNode2.start(),
87
+ randomGraphNode3.start(),
88
+ randomGraphNode4.start(),
89
+ randomGraphNode5.start()
90
+ ])
91
+ })
92
+
93
+ afterEach(async () => {
94
+ await Promise.all([
95
+ epDhtNode.stop(),
96
+ dhtNode1.stop(),
97
+ dhtNode2.stop(),
98
+ dhtNode3.stop(),
99
+ dhtNode4.stop(),
100
+ randomGraphNode1.stop(),
101
+ randomGraphNode2.stop(),
102
+ randomGraphNode3.stop(),
103
+ randomGraphNode4.stop(),
104
+ randomGraphNode5.stop(),
105
+ (epDhtNode.getTransport() as ConnectionManager).stop(),
106
+ (dhtNode1.getTransport() as ConnectionManager).stop(),
107
+ (dhtNode2.getTransport() as ConnectionManager).stop(),
108
+ (dhtNode3.getTransport() as ConnectionManager).stop(),
109
+ (dhtNode4.getTransport() as ConnectionManager).stop()
110
+ ])
111
+ })
112
+
113
+ it('can fully connected topologies ', async () => {
114
+ await waitForCondition(() => {
115
+ return randomGraphNode1.getTargetNeighborStringIds().length >= 3
116
+ && randomGraphNode2.getTargetNeighborStringIds().length >= 3
117
+ && randomGraphNode3.getTargetNeighborStringIds().length >= 3
118
+ && randomGraphNode4.getTargetNeighborStringIds().length >= 3
119
+ && randomGraphNode5.getTargetNeighborStringIds().length >= 3
120
+ }, 10000)
121
+ expect(randomGraphNode1.getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(3)
122
+ expect(randomGraphNode2.getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(3)
123
+ expect(randomGraphNode3.getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(3)
124
+ expect(randomGraphNode4.getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(3)
125
+ expect(randomGraphNode5.getTargetNeighborStringIds().length).toBeGreaterThanOrEqual(3)
126
+ })
127
+
128
+ it('can propagate messages', async () => {
129
+ let numOfMessagesReceived = 0
130
+ randomGraphNode2.on('message', () => numOfMessagesReceived += 1)
131
+ randomGraphNode3.on('message', () => numOfMessagesReceived += 1)
132
+ randomGraphNode4.on('message', () => numOfMessagesReceived += 1)
133
+ randomGraphNode5.on('message', () => numOfMessagesReceived += 1)
134
+
135
+ await waitForCondition(() => {
136
+ return randomGraphNode1.getTargetNeighborStringIds().length >= 3
137
+ && randomGraphNode2.getTargetNeighborStringIds().length >= 3
138
+ && randomGraphNode3.getTargetNeighborStringIds().length >= 3
139
+ && randomGraphNode4.getTargetNeighborStringIds().length >= 3
140
+ && randomGraphNode5.getTargetNeighborStringIds().length >= 3
141
+ }, 10000)
142
+
143
+ const content: ContentMessage = {
144
+ body: JSON.stringify({ hello: 'WORLD' })
145
+ }
146
+ const msg = createStreamMessage(
147
+ content,
148
+ randomGraphId,
149
+ peerIdFromPeerDescriptor(epPeerDescriptor).toString()
150
+ )
151
+ randomGraphNode1.broadcast(msg)
152
+ await waitForCondition(() => numOfMessagesReceived >= 4)
153
+ })
154
+ })
@@ -0,0 +1,97 @@
1
+ import { PeerDescriptor, NodeType, PeerID, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '@streamr/dht'
2
+ import { range } from 'lodash'
3
+ import { waitForCondition } from '@streamr/utils'
4
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
5
+ import { getRandomRegion } from '@streamr/dht'
6
+ import { createStreamMessage } from '../utils/utils'
7
+ import { NetworkStack } from '../../src/NetworkStack'
8
+
9
+ describe('Full node network with WebRTC connections', () => {
10
+
11
+ const NUM_OF_NODES = 22
12
+
13
+ const epPeerDescriptor: PeerDescriptor = {
14
+ kademliaId: PeerID.fromString(`entrypoint`).value,
15
+ type: NodeType.NODEJS,
16
+ websocket: { ip: 'localhost', port: 14444 },
17
+ region: getRandomRegion()
18
+ }
19
+
20
+ const randomGraphId = 'webrtc-network'
21
+
22
+ let entryPoint: NetworkStack
23
+
24
+ let nodes: NetworkStack[]
25
+
26
+ beforeEach(async () => {
27
+
28
+ nodes = []
29
+
30
+ entryPoint = new NetworkStack({
31
+ layer0: {
32
+ entryPoints: [epPeerDescriptor],
33
+ peerDescriptor: epPeerDescriptor
34
+ },
35
+ networkNode: {}
36
+ })
37
+ await entryPoint.start()
38
+ entryPoint.getStreamrNode()!.setStreamPartEntryPoints(randomGraphId, [epPeerDescriptor])
39
+ await entryPoint.getStreamrNode()!.joinStream(randomGraphId)
40
+
41
+ await Promise.all(range(NUM_OF_NODES).map(async (i) => {
42
+ const peerId = PeerID.fromString(`${i}`)
43
+ const peerDescriptor: PeerDescriptor = {
44
+ kademliaId: peerId.value,
45
+ type: NodeType.NODEJS,
46
+ }
47
+ const node = new NetworkStack({
48
+ layer0: {
49
+ peerDescriptor,
50
+ entryPoints: [epPeerDescriptor]
51
+ },
52
+ networkNode: {}
53
+ })
54
+ nodes.push(node)
55
+ await node.start()
56
+ node.getStreamrNode().setStreamPartEntryPoints(randomGraphId, [epPeerDescriptor])
57
+ await node.getStreamrNode().joinStream(randomGraphId)
58
+ node.getStreamrNode!().subscribeToStream(randomGraphId)
59
+ }))
60
+
61
+ }, 90000)
62
+
63
+ afterEach(async () => {
64
+ await Promise.all([
65
+ entryPoint.stop(),
66
+ ...nodes.map((node) => node.stop())
67
+ ])
68
+ })
69
+
70
+ it('happy path', async () => {
71
+ await Promise.all(nodes.map((node) =>
72
+ waitForCondition(() => {
73
+ return node.getStreamrNode()!.getStream(randomGraphId)!.layer2.getTargetNeighborStringIds().length >= 3
74
+ }
75
+ , 120000)
76
+ ))
77
+ let numOfMessagesReceived = 0
78
+ const successIds: string[] = []
79
+ nodes.map((node) => {
80
+ node.getStreamrNode()!.on('newMessage', () => {
81
+ successIds.push(keyFromPeerDescriptor(node.getStreamrNode()!.getPeerDescriptor()))
82
+ numOfMessagesReceived += 1
83
+ })
84
+ })
85
+ const content: ContentMessage = {
86
+ body: JSON.stringify({ hello: 'WORLD' })
87
+ }
88
+ const msg = createStreamMessage(
89
+ content,
90
+ randomGraphId,
91
+ peerIdFromPeerDescriptor(epPeerDescriptor).toString()
92
+ )
93
+ entryPoint.getStreamrNode()!.publishToStream(randomGraphId, msg)
94
+ await waitForCondition(() => numOfMessagesReceived === NUM_OF_NODES)
95
+ }, 120000)
96
+
97
+ })
@@ -0,0 +1,93 @@
1
+ import { PeerDescriptor, NodeType, PeerID, peerIdFromPeerDescriptor, keyFromPeerDescriptor } from '@streamr/dht'
2
+ import { range } from 'lodash'
3
+ import { waitForCondition } from '@streamr/utils'
4
+ import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
5
+ import { createStreamMessage } from '../utils/utils'
6
+ import { NetworkStack } from '../../src/NetworkStack'
7
+
8
+ describe('Full node network with WebSocket connections only', () => {
9
+
10
+ const NUM_OF_NODES = 48
11
+ const epPeerDescriptor: PeerDescriptor = {
12
+ kademliaId: PeerID.fromString(`entrypoint`).value,
13
+ type: NodeType.NODEJS,
14
+ nodeName: 'entrypoint',
15
+ websocket: { ip: 'localhost', port: 15555 }
16
+ }
17
+ const randomGraphId = 'websocket-network'
18
+
19
+ let entryPoint: NetworkStack
20
+
21
+ let nodes: NetworkStack[]
22
+
23
+ beforeEach(async () => {
24
+
25
+ nodes = []
26
+
27
+ entryPoint = new NetworkStack({
28
+ layer0: {
29
+ entryPoints: [epPeerDescriptor],
30
+ peerDescriptor: epPeerDescriptor,
31
+ },
32
+ networkNode: {}
33
+ })
34
+ await entryPoint.start()
35
+ entryPoint.getStreamrNode()!.setStreamPartEntryPoints(randomGraphId, [epPeerDescriptor])
36
+ await entryPoint.getStreamrNode()!.joinStream(randomGraphId)
37
+
38
+ await Promise.all(range(NUM_OF_NODES).map(async (i) => {
39
+ const node = new NetworkStack({
40
+ layer0: {
41
+ entryPoints: [epPeerDescriptor],
42
+ webSocketPort: 15556 + i,
43
+ webSocketHost: 'localhost',
44
+ peerIdString: `${i}`,
45
+ nodeName: `${i}`,
46
+ numberOfNodesPerKBucket: 4
47
+ },
48
+ networkNode: {}
49
+ })
50
+ nodes.push(node)
51
+ await node.start()
52
+ node.getStreamrNode!().setStreamPartEntryPoints(randomGraphId, [epPeerDescriptor])
53
+ await node.getStreamrNode().joinStream(randomGraphId)
54
+ node.getStreamrNode!().subscribeToStream(randomGraphId)
55
+ }))
56
+
57
+ }, 120000)
58
+
59
+ afterEach(async () => {
60
+ await Promise.all([
61
+ entryPoint.stop(),
62
+ ...nodes.map((node) => node.stop())
63
+ ])
64
+ })
65
+
66
+ it('happy path', async () => {
67
+ await Promise.all(nodes.map((node) =>
68
+ waitForCondition(() => {
69
+ return node.getStreamrNode()!.getStream(randomGraphId)!.layer2.getTargetNeighborStringIds().length >= 3
70
+ }
71
+ , 120000)
72
+ ))
73
+ let numOfMessagesReceived = 0
74
+ const successIds: string[] = []
75
+ nodes.map((node) => {
76
+ node.getStreamrNode()!.on('newMessage', () => {
77
+ successIds.push(keyFromPeerDescriptor(node.getStreamrNode()!.getPeerDescriptor()))
78
+ numOfMessagesReceived += 1
79
+ })
80
+ })
81
+ const content: ContentMessage = {
82
+ body: JSON.stringify({ hello: 'WORLD' })
83
+ }
84
+ const msg = createStreamMessage(
85
+ content,
86
+ randomGraphId,
87
+ peerIdFromPeerDescriptor(epPeerDescriptor).toString()
88
+ )
89
+ entryPoint.getStreamrNode()!.publishToStream(randomGraphId, msg)
90
+ await waitForCondition(() => numOfMessagesReceived === NUM_OF_NODES)
91
+ }, 220000)
92
+
93
+ })
@@ -0,0 +1,167 @@
1
+ import { Handshaker } from '../../src/logic/neighbor-discovery/Handshaker'
2
+ import {
3
+ NodeType,
4
+ PeerDescriptor,
5
+ ListeningRpcCommunicator,
6
+ Simulator,
7
+ SimulatorTransport,
8
+ peerIdFromPeerDescriptor
9
+ } from '@streamr/dht'
10
+ import { toProtoRpcClient } from '@streamr/proto-rpc'
11
+ import {
12
+ HandshakeRpcClient
13
+ } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc.client'
14
+ import { PeerList } from '../../src/logic/PeerList'
15
+ import { mockConnectionLocker } from '../utils/utils'
16
+ import { StreamHandshakeRequest, StreamHandshakeResponse } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
17
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
18
+ import { RemoteHandshaker } from '../../src/logic/neighbor-discovery/RemoteHandshaker'
19
+
20
+ describe('Handshakes', () => {
21
+
22
+ const peerDescriptor1: PeerDescriptor = {
23
+ kademliaId: new Uint8Array([1, 1, 1]),
24
+ type: NodeType.NODEJS
25
+ }
26
+ const peerDescriptor2: PeerDescriptor = {
27
+ kademliaId: new Uint8Array([2, 1, 1]),
28
+ type: NodeType.NODEJS
29
+ }
30
+ const peerDescriptor3: PeerDescriptor = {
31
+ kademliaId: new Uint8Array([3, 1, 1]),
32
+ type: NodeType.NODEJS
33
+ }
34
+ let rpcCommunicator1: ListeningRpcCommunicator
35
+ let rpcCommunicator2: ListeningRpcCommunicator
36
+ let rpcCommunicator3: ListeningRpcCommunicator
37
+ let contactPool: PeerList
38
+ let targetNeighbors: PeerList
39
+ let handshaker: Handshaker
40
+ const randomGraphId = 'handshaker'
41
+
42
+ const acceptHandshake = async (request: StreamHandshakeRequest, _context: ServerCallContext): Promise<StreamHandshakeResponse> => {
43
+ const response: StreamHandshakeResponse = {
44
+ requestId: request.requestId,
45
+ accepted: true
46
+ }
47
+ return response
48
+ }
49
+
50
+ const rejectHandshake = async (request: StreamHandshakeRequest, _context: ServerCallContext): Promise<StreamHandshakeResponse> => {
51
+ const response: StreamHandshakeResponse = {
52
+ requestId: request.requestId,
53
+ accepted: false
54
+ }
55
+ return response
56
+ }
57
+
58
+ const interleavingHandshake = async (request: StreamHandshakeRequest, _context: ServerCallContext): Promise<StreamHandshakeResponse> => {
59
+ const response: StreamHandshakeResponse = {
60
+ requestId: request.requestId,
61
+ accepted: true,
62
+ interleaveTarget: peerDescriptor3
63
+ }
64
+ return response
65
+ }
66
+
67
+ let simulator: Simulator
68
+ let simulatorTransport1: SimulatorTransport
69
+ let simulatorTransport2: SimulatorTransport
70
+ let simulatorTransport3: SimulatorTransport
71
+
72
+ beforeEach(() => {
73
+ Simulator.useFakeTimers()
74
+ simulator = new Simulator()
75
+ simulatorTransport1 = new SimulatorTransport(peerDescriptor1, simulator)
76
+ simulatorTransport2 = new SimulatorTransport(peerDescriptor2, simulator)
77
+ simulatorTransport3 = new SimulatorTransport(peerDescriptor3, simulator)
78
+
79
+ rpcCommunicator1 = new ListeningRpcCommunicator(randomGraphId, simulatorTransport1)
80
+ rpcCommunicator2 = new ListeningRpcCommunicator(randomGraphId, simulatorTransport2)
81
+ rpcCommunicator3 = new ListeningRpcCommunicator(randomGraphId, simulatorTransport3)
82
+
83
+ const handshakerPeerId = peerIdFromPeerDescriptor(peerDescriptor2)
84
+ contactPool = new PeerList(handshakerPeerId, 10)
85
+ targetNeighbors = new PeerList(handshakerPeerId, 4)
86
+ handshaker = new Handshaker({
87
+ ownPeerDescriptor: peerDescriptor2,
88
+ randomGraphId: randomGraphId,
89
+ nearbyContactPool: contactPool,
90
+ randomContactPool: contactPool,
91
+ targetNeighbors: targetNeighbors,
92
+ connectionLocker: mockConnectionLocker,
93
+ rpcCommunicator: rpcCommunicator2,
94
+ N: 4
95
+ })
96
+
97
+ })
98
+
99
+ afterEach(async () => {
100
+ rpcCommunicator1.stop()
101
+ rpcCommunicator2.stop()
102
+ rpcCommunicator3.stop()
103
+ await simulatorTransport1.stop()
104
+ await simulatorTransport2.stop()
105
+ await simulatorTransport3.stop()
106
+ simulator.stop()
107
+ Simulator.useFakeTimers(false)
108
+ })
109
+
110
+ it('Two peers can handshake', async () => {
111
+ rpcCommunicator1.registerRpcMethod(StreamHandshakeRequest, StreamHandshakeResponse, 'handshake', acceptHandshake)
112
+ // @ts-expect-error private
113
+ const res = await handshaker.handshakeWithTarget(
114
+ new RemoteHandshaker(
115
+ peerDescriptor1,
116
+ randomGraphId,
117
+ toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport())),
118
+ )
119
+ )
120
+ expect(res).toEqual(true)
121
+ expect(targetNeighbors.hasPeer(peerDescriptor1)).toEqual(true)
122
+ })
123
+
124
+ it('Handshake accepted', async () => {
125
+ rpcCommunicator1.registerRpcMethod(StreamHandshakeRequest, StreamHandshakeResponse, 'handshake', acceptHandshake)
126
+ // @ts-expect-error private
127
+ const res = await handshaker.handshakeWithTarget(
128
+ new RemoteHandshaker(
129
+ peerDescriptor1,
130
+ randomGraphId,
131
+ toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport())),
132
+ )
133
+ )
134
+ expect(res).toEqual(true)
135
+ expect(targetNeighbors.hasPeer(peerDescriptor1)).toEqual(true)
136
+ })
137
+
138
+ it('Handshake rejected', async () => {
139
+ rpcCommunicator1.registerRpcMethod(StreamHandshakeRequest, StreamHandshakeResponse, 'handshake', rejectHandshake)
140
+ // @ts-expect-error private
141
+ const res = await handshaker.handshakeWithTarget(
142
+ new RemoteHandshaker(
143
+ peerDescriptor1,
144
+ randomGraphId,
145
+ toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport())),
146
+ )
147
+ )
148
+ expect(res).toEqual(false)
149
+ expect(targetNeighbors.hasPeer(peerDescriptor1)).toEqual(false)
150
+ })
151
+
152
+ it('Handshake with Interleaving', async () => {
153
+ rpcCommunicator1.registerRpcMethod(StreamHandshakeRequest, StreamHandshakeResponse, 'handshake', interleavingHandshake)
154
+ rpcCommunicator3.registerRpcMethod(StreamHandshakeRequest, StreamHandshakeResponse, 'handshake', acceptHandshake)
155
+ // @ts-expect-error private
156
+ const res = await handshaker.handshakeWithTarget(
157
+ new RemoteHandshaker(
158
+ peerDescriptor1,
159
+ randomGraphId,
160
+ toProtoRpcClient(new HandshakeRpcClient(rpcCommunicator2.getRpcClientTransport())),
161
+ )
162
+ )
163
+ expect(res).toEqual(true)
164
+ expect(targetNeighbors.hasPeer(peerDescriptor1)).toEqual(true)
165
+ expect(targetNeighbors.hasPeer(peerDescriptor3)).toEqual(true)
166
+ })
167
+ })