@streamr/dht 100.0.0-pretestnet.6 → 100.0.0-rc.1

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 (444) hide show
  1. package/README.md +90 -8
  2. package/dist/package.json +70 -0
  3. package/dist/src/connection/Connection.d.ts +1 -0
  4. package/dist/src/connection/Connection.js +10 -3
  5. package/dist/src/connection/Connection.js.map +1 -1
  6. package/dist/src/connection/ConnectionLockHandler.d.ts +14 -14
  7. package/dist/src/connection/ConnectionLockHandler.js +22 -16
  8. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  9. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +3 -3
  10. package/dist/src/connection/ConnectionLockRpcLocal.js +7 -6
  11. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
  12. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -6
  13. package/dist/src/connection/ConnectionLockRpcRemote.js +10 -37
  14. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  15. package/dist/src/connection/ConnectionManager.d.ts +19 -20
  16. package/dist/src/connection/ConnectionManager.js +132 -117
  17. package/dist/src/connection/ConnectionManager.js.map +1 -1
  18. package/dist/src/connection/ConnectorFacade.d.ts +3 -2
  19. package/dist/src/connection/ConnectorFacade.js +10 -3
  20. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  21. package/dist/src/connection/Handshaker.d.ts +3 -1
  22. package/dist/src/connection/Handshaker.js +19 -10
  23. package/dist/src/connection/Handshaker.js.map +1 -1
  24. package/dist/src/connection/IConnection.d.ts +2 -7
  25. package/dist/src/connection/IConnection.js +1 -8
  26. package/dist/src/connection/IConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedConnection.d.ts +5 -7
  28. package/dist/src/connection/ManagedConnection.js +42 -26
  29. package/dist/src/connection/ManagedConnection.js.map +1 -1
  30. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -1
  31. package/dist/src/connection/connectivityChecker.d.ts +9 -0
  32. package/dist/src/connection/connectivityChecker.js +130 -0
  33. package/dist/src/connection/connectivityChecker.js.map +1 -0
  34. package/dist/src/connection/connectivityRequestHandler.d.ts +3 -0
  35. package/dist/src/connection/connectivityRequestHandler.js +101 -0
  36. package/dist/src/connection/connectivityRequestHandler.js.map +1 -0
  37. package/dist/src/connection/simulator/Simulator.d.ts +0 -3
  38. package/dist/src/connection/simulator/Simulator.js +34 -69
  39. package/dist/src/connection/simulator/Simulator.js.map +1 -1
  40. package/dist/src/connection/simulator/SimulatorConnection.js +27 -25
  41. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
  42. package/dist/src/connection/simulator/SimulatorConnector.js +16 -12
  43. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
  44. package/dist/src/connection/simulator/pings.js.map +1 -1
  45. package/dist/src/connection/webrtc/NodeWebrtcConnection.d.ts +2 -3
  46. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +40 -27
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +1 -2
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +36 -32
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +4 -2
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +28 -22
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  54. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.d.ts +3 -6
  55. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js +2 -5
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -1
  57. package/dist/src/connection/webrtc/iceServerAsString.js +1 -1
  58. package/dist/src/connection/webrtc/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +1 -2
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +6 -4
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -1
  62. package/dist/src/connection/websocket/ClientWebsocket.d.ts +1 -0
  63. package/dist/src/connection/websocket/ClientWebsocket.js +14 -7
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -1
  65. package/dist/src/connection/websocket/WebsocketConnector.d.ts +3 -9
  66. package/dist/src/connection/websocket/WebsocketConnector.js +142 -74
  67. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  68. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +5 -3
  69. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +9 -12
  70. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -1
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +4 -7
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js +7 -44
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -1
  74. package/dist/src/connection/websocket/WebsocketServer.d.ts +1 -4
  75. package/dist/src/connection/websocket/WebsocketServer.js +49 -40
  76. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  77. package/dist/src/connection/websocket/{ServerWebsocket.d.ts → WebsocketServerConnection.d.ts} +8 -4
  78. package/dist/src/connection/websocket/WebsocketServerConnection.js +97 -0
  79. package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +45 -49
  81. package/dist/src/dht/DhtNode.js +229 -317
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +10 -9
  84. package/dist/src/dht/DhtNodeRpcLocal.js +19 -11
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  86. package/dist/src/dht/DhtNodeRpcRemote.d.ts +15 -10
  87. package/dist/src/dht/DhtNodeRpcRemote.js +38 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -1
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +7 -6
  90. package/dist/src/dht/ExternalApiRpcLocal.js +9 -13
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +6 -5
  93. package/dist/src/dht/ExternalApiRpcRemote.js +10 -7
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/PeerManager.d.ts +61 -0
  96. package/dist/src/dht/PeerManager.js +288 -0
  97. package/dist/src/dht/PeerManager.js.map +1 -0
  98. package/dist/src/dht/contact/Contact.d.ts +2 -2
  99. package/dist/src/dht/contact/Contact.js +4 -3
  100. package/dist/src/dht/contact/Contact.js.map +1 -1
  101. package/dist/src/dht/contact/ContactList.d.ts +8 -8
  102. package/dist/src/dht/contact/ContactList.js +12 -7
  103. package/dist/src/dht/contact/ContactList.js.map +1 -1
  104. package/dist/src/dht/contact/RandomContactList.d.ts +4 -4
  105. package/dist/src/dht/contact/RandomContactList.js +13 -12
  106. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  107. package/dist/src/dht/contact/RingContactList.d.ts +31 -0
  108. package/dist/src/dht/contact/RingContactList.js +133 -0
  109. package/dist/src/dht/contact/RingContactList.js.map +1 -0
  110. package/dist/src/dht/contact/{Remote.d.ts → RpcRemote.d.ts} +8 -7
  111. package/dist/src/dht/contact/{Remote.js → RpcRemote.js} +16 -13
  112. package/dist/src/dht/contact/RpcRemote.js.map +1 -0
  113. package/dist/src/dht/contact/SortedContactList.d.ts +29 -15
  114. package/dist/src/dht/contact/SortedContactList.js +79 -42
  115. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  116. package/dist/src/dht/contact/ringIdentifiers.d.ts +16 -0
  117. package/dist/src/dht/contact/ringIdentifiers.js +54 -0
  118. package/dist/src/dht/contact/ringIdentifiers.js.map +1 -0
  119. package/dist/src/dht/discovery/DiscoverySession.d.ts +8 -18
  120. package/dist/src/dht/discovery/DiscoverySession.js +32 -48
  121. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  122. package/dist/src/dht/discovery/PeerDiscovery.d.ts +16 -12
  123. package/dist/src/dht/discovery/PeerDiscovery.js +82 -39
  124. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  125. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +29 -0
  126. package/dist/src/dht/discovery/RingDiscoverySession.js +123 -0
  127. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -0
  128. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +36 -0
  129. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +166 -0
  130. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -0
  131. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.d.ts +14 -0
  132. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js +26 -0
  133. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js.map +1 -0
  134. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.d.ts +6 -0
  135. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js +44 -0
  136. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js.map +1 -0
  137. package/dist/src/dht/recursive-operation/RecursiveOperationSession.d.ts +44 -0
  138. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +187 -0
  139. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -0
  140. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.d.ts +14 -0
  141. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js +20 -0
  142. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js.map +1 -0
  143. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.d.ts +6 -0
  144. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js +21 -0
  145. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js.map +1 -0
  146. package/dist/src/dht/routing/DuplicateDetector.d.ts +2 -4
  147. package/dist/src/dht/routing/DuplicateDetector.js +10 -15
  148. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  149. package/dist/src/dht/routing/Router.d.ts +11 -27
  150. package/dist/src/dht/routing/Router.js +92 -58
  151. package/dist/src/dht/routing/Router.js.map +1 -1
  152. package/dist/src/dht/routing/RouterRpcLocal.d.ts +3 -4
  153. package/dist/src/dht/routing/RouterRpcLocal.js +17 -16
  154. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
  155. package/dist/src/dht/routing/RouterRpcRemote.d.ts +3 -3
  156. package/dist/src/dht/routing/RouterRpcRemote.js +29 -20
  157. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  158. package/dist/src/dht/routing/RoutingSession.d.ts +29 -21
  159. package/dist/src/dht/routing/RoutingSession.js +93 -68
  160. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  161. package/dist/src/dht/routing/RoutingTablesCache.d.ts +24 -0
  162. package/dist/src/dht/routing/RoutingTablesCache.js +46 -0
  163. package/dist/src/dht/routing/RoutingTablesCache.js.map +1 -0
  164. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -1
  165. package/dist/src/dht/store/LocalDataStore.d.ts +9 -14
  166. package/dist/src/dht/store/LocalDataStore.js +46 -72
  167. package/dist/src/dht/store/LocalDataStore.js.map +1 -1
  168. package/dist/src/dht/store/StoreManager.d.ts +33 -0
  169. package/dist/src/dht/store/StoreManager.js +182 -0
  170. package/dist/src/dht/store/StoreManager.js.map +1 -0
  171. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -41
  172. package/dist/src/dht/store/StoreRpcLocal.js +27 -234
  173. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  174. package/dist/src/dht/store/StoreRpcRemote.d.ts +6 -7
  175. package/dist/src/dht/store/StoreRpcRemote.js +10 -20
  176. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  177. package/dist/src/exports.d.ts +5 -3
  178. package/dist/src/exports.js +10 -8
  179. package/dist/src/exports.js.map +1 -1
  180. package/dist/src/helpers/AddressTools.js +2 -0
  181. package/dist/src/helpers/AddressTools.js.map +1 -1
  182. package/dist/src/helpers/Connectivity.js.map +1 -1
  183. package/dist/src/helpers/MapWithTtl.d.ts +14 -0
  184. package/dist/src/helpers/MapWithTtl.js +60 -0
  185. package/dist/src/helpers/MapWithTtl.js.map +1 -0
  186. package/dist/src/helpers/createPeerDescriptor.d.ts +3 -0
  187. package/dist/src/helpers/createPeerDescriptor.js +57 -0
  188. package/dist/src/helpers/createPeerDescriptor.js.map +1 -0
  189. package/dist/src/helpers/createPeerDescriptorSignaturePayload.d.ts +2 -0
  190. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js +30 -0
  191. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js.map +1 -0
  192. package/dist/src/helpers/debugHelpers.js.map +1 -1
  193. package/dist/src/helpers/errors.js +2 -0
  194. package/dist/src/helpers/errors.js.map +1 -1
  195. package/dist/src/helpers/offering.d.ts +4 -0
  196. package/dist/src/helpers/offering.js +18 -0
  197. package/dist/src/helpers/offering.js.map +1 -0
  198. package/dist/src/helpers/protoClasses.js +2 -3
  199. package/dist/src/helpers/protoClasses.js.map +1 -1
  200. package/dist/src/helpers/protoToString.js.map +1 -1
  201. package/dist/src/helpers/version.d.ts +6 -0
  202. package/dist/src/helpers/version.js +38 -0
  203. package/dist/src/helpers/version.js.map +1 -0
  204. package/dist/src/identifiers.d.ts +10 -0
  205. package/dist/src/identifiers.js +31 -0
  206. package/dist/src/identifiers.js.map +1 -0
  207. package/dist/src/proto/google/protobuf/any.js +8 -8
  208. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  209. package/dist/src/proto/google/protobuf/empty.js +2 -4
  210. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  211. package/dist/src/proto/google/protobuf/timestamp.js +10 -10
  212. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  213. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +46 -49
  214. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +63 -54
  215. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  216. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +226 -232
  217. package/dist/src/proto/packages/dht/protos/DhtRpc.js +146 -168
  218. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  219. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -29
  220. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  221. package/dist/src/rpc-protocol/DhtCallContext.d.ts +2 -2
  222. package/dist/src/rpc-protocol/DhtCallContext.js +8 -0
  223. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  224. package/dist/src/rpc-protocol/DhtRpcOptions.d.ts +2 -1
  225. package/dist/src/transport/ITransport.d.ts +10 -2
  226. package/dist/src/transport/ITransport.js +5 -0
  227. package/dist/src/transport/ITransport.js.map +1 -1
  228. package/dist/src/transport/ListeningRpcCommunicator.js +3 -1
  229. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  230. package/dist/src/transport/RoutingRpcCommunicator.d.ts +4 -2
  231. package/dist/src/transport/RoutingRpcCommunicator.js +19 -12
  232. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  233. package/jest.config.js +4 -1
  234. package/karma-setup.js +2 -0
  235. package/karma.config.js +13 -9
  236. package/package.json +17 -14
  237. package/protos/DhtRpc.proto +76 -76
  238. package/src/connection/Connection.ts +6 -1
  239. package/src/connection/ConnectionLockHandler.ts +30 -22
  240. package/src/connection/ConnectionLockRpcLocal.ts +7 -12
  241. package/src/connection/ConnectionLockRpcRemote.ts +9 -19
  242. package/src/connection/ConnectionManager.ts +132 -138
  243. package/src/connection/ConnectorFacade.ts +10 -9
  244. package/src/connection/Handshaker.ts +24 -12
  245. package/src/connection/IConnection.ts +2 -8
  246. package/src/connection/ManagedConnection.ts +34 -35
  247. package/src/connection/connectivityChecker.ts +109 -0
  248. package/src/connection/connectivityRequestHandler.ts +103 -0
  249. package/src/connection/simulator/Simulator.ts +6 -37
  250. package/src/connection/simulator/SimulatorConnection.ts +23 -25
  251. package/src/connection/simulator/SimulatorConnector.ts +11 -11
  252. package/src/connection/webrtc/BrowserWebrtcConnection.ts +17 -25
  253. package/src/connection/webrtc/NodeWebrtcConnection.ts +25 -27
  254. package/src/connection/webrtc/WebrtcConnector.ts +31 -36
  255. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +31 -25
  256. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +4 -14
  257. package/src/connection/webrtc/iceServerAsString.ts +1 -1
  258. package/src/connection/websocket/AutoCertifierClientFacade.ts +4 -6
  259. package/src/connection/websocket/ClientWebsocket.ts +10 -4
  260. package/src/connection/websocket/WebsocketConnector.ts +120 -97
  261. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +13 -15
  262. package/src/connection/websocket/WebsocketConnectorRpcRemote.ts +7 -27
  263. package/src/connection/websocket/WebsocketServer.ts +50 -53
  264. package/src/connection/websocket/WebsocketServerConnection.ts +104 -0
  265. package/src/dht/DhtNode.ts +289 -410
  266. package/src/dht/DhtNodeRpcLocal.ts +25 -17
  267. package/src/dht/DhtNodeRpcRemote.ts +43 -27
  268. package/src/dht/ExternalApiRpcLocal.ts +30 -17
  269. package/src/dht/ExternalApiRpcRemote.ts +14 -11
  270. package/src/dht/PeerManager.ts +339 -0
  271. package/src/dht/contact/Contact.ts +4 -4
  272. package/src/dht/contact/ContactList.ts +11 -10
  273. package/src/dht/contact/RandomContactList.ts +15 -15
  274. package/src/dht/contact/RingContactList.ts +151 -0
  275. package/src/dht/contact/{Remote.ts → RpcRemote.ts} +16 -19
  276. package/src/dht/contact/SortedContactList.ts +120 -72
  277. package/src/dht/contact/ringIdentifiers.ts +62 -0
  278. package/src/dht/discovery/DiscoverySession.ts +36 -61
  279. package/src/dht/discovery/PeerDiscovery.ts +98 -43
  280. package/src/dht/discovery/RingDiscoverySession.ts +160 -0
  281. package/src/dht/recursive-operation/RecursiveOperationManager.ts +246 -0
  282. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +34 -0
  283. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +43 -0
  284. package/src/dht/recursive-operation/RecursiveOperationSession.ts +232 -0
  285. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +35 -0
  286. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +30 -0
  287. package/src/dht/routing/DuplicateDetector.ts +9 -21
  288. package/src/dht/routing/Router.ts +95 -92
  289. package/src/dht/routing/RouterRpcLocal.ts +16 -18
  290. package/src/dht/routing/RouterRpcRemote.ts +26 -24
  291. package/src/dht/routing/RoutingSession.ts +119 -98
  292. package/src/dht/routing/RoutingTablesCache.ts +58 -0
  293. package/src/dht/routing/getPreviousPeer.ts +1 -1
  294. package/src/dht/store/LocalDataStore.ts +47 -77
  295. package/src/dht/store/StoreManager.ts +209 -0
  296. package/src/dht/store/StoreRpcLocal.ts +39 -308
  297. package/src/dht/store/StoreRpcRemote.ts +13 -31
  298. package/src/exports.ts +13 -3
  299. package/src/helpers/AddressTools.ts +2 -0
  300. package/src/helpers/MapWithTtl.ts +71 -0
  301. package/src/helpers/createPeerDescriptor.ts +57 -0
  302. package/src/helpers/createPeerDescriptorSignaturePayload.ts +28 -0
  303. package/src/helpers/offering.ts +15 -0
  304. package/src/helpers/protoClasses.ts +4 -6
  305. package/src/helpers/version.ts +32 -0
  306. package/src/identifiers.ts +29 -0
  307. package/src/proto/google/protobuf/any.ts +4 -4
  308. package/src/proto/google/protobuf/empty.ts +2 -4
  309. package/src/proto/google/protobuf/timestamp.ts +4 -4
  310. package/src/proto/packages/dht/protos/DhtRpc.client.ts +65 -68
  311. package/src/proto/packages/dht/protos/DhtRpc.server.ts +27 -30
  312. package/src/proto/packages/dht/protos/DhtRpc.ts +297 -313
  313. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  314. package/src/rpc-protocol/DhtCallContext.ts +2 -2
  315. package/src/rpc-protocol/DhtRpcOptions.ts +2 -1
  316. package/src/transport/ITransport.ts +11 -2
  317. package/src/transport/ListeningRpcCommunicator.ts +1 -1
  318. package/src/transport/RoutingRpcCommunicator.ts +21 -14
  319. package/test/RandomGraphSimulation.ts +3 -2
  320. package/test/benchmark/Find.test.ts +13 -28
  321. package/test/benchmark/KademliaCorrectness.test.ts +24 -28
  322. package/test/benchmark/RingCorrectness.test.ts +157 -0
  323. package/test/benchmark/SortedContactListBenchmark.test.ts +151 -0
  324. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +41 -0
  325. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +72 -0
  326. package/test/benchmark/kademlia-simulation/Contact.ts +9 -9
  327. package/test/benchmark/kademlia-simulation/KademliaSimulation.ts +11 -11
  328. package/test/benchmark/kademlia-simulation/SimulationNode.ts +29 -25
  329. package/test/data/generateGroundTruthData.ts +7 -6
  330. package/test/end-to-end/Layer0-Layer1.test.ts +11 -15
  331. package/test/end-to-end/Layer0.test.ts +19 -22
  332. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +19 -21
  333. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +26 -28
  334. package/test/end-to-end/Layer0Webrtc.test.ts +19 -19
  335. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +10 -18
  336. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +8 -15
  337. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +2 -2
  338. package/test/end-to-end/WebsocketConnectionRequest.test.ts +8 -9
  339. package/test/end-to-end/memory-leak.test.ts +19 -24
  340. package/test/integration/ConnectionLocking.test.ts +66 -60
  341. package/test/integration/ConnectionManager.test.ts +43 -63
  342. package/test/integration/ConnectivityChecking.test.ts +52 -0
  343. package/test/integration/DhtJoinPeerDiscovery.test.ts +8 -12
  344. package/test/integration/DhtNodeExternalAPI.test.ts +17 -21
  345. package/test/integration/DhtNodeRpcRemote.test.ts +19 -26
  346. package/test/integration/DhtRpc.test.ts +20 -24
  347. package/test/integration/Find.test.ts +10 -12
  348. package/test/integration/Layer1-scale.test.ts +25 -37
  349. package/test/integration/Mock-Layer1-Layer0.test.ts +39 -59
  350. package/test/integration/MultipleEntryPointJoining.test.ts +14 -14
  351. package/test/integration/ReplicateData.test.ts +106 -0
  352. package/test/integration/RouteMessage.test.ts +42 -68
  353. package/test/integration/RouterRpcRemote.test.ts +19 -24
  354. package/test/integration/ScaleDownDht.test.ts +14 -12
  355. package/test/integration/SimultaneousConnections.test.ts +112 -111
  356. package/test/integration/Store.test.ts +43 -27
  357. package/test/integration/StoreAndDelete.test.ts +36 -48
  358. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +59 -0
  359. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +17 -37
  360. package/test/integration/StoreRpcRemote.test.ts +20 -32
  361. package/test/integration/WebrtcConnectionManagement.test.ts +39 -25
  362. package/test/integration/WebrtcConnectorRpc.test.ts +6 -11
  363. package/test/integration/WebsocketConnectionManagement.test.ts +87 -22
  364. package/test/integration/WebsocketConnectorRpc.test.ts +14 -24
  365. package/test/integration/{RpcErrors.test.ts → rpc-connections-over-webrpc.test.ts} +15 -26
  366. package/test/unit/AddressTools.test.ts +4 -0
  367. package/test/unit/ConnectivityHelpers.test.ts +9 -17
  368. package/test/unit/DuplicateDetector.test.ts +8 -5
  369. package/test/unit/LocalDataStore.test.ts +78 -75
  370. package/test/unit/PeerManager.test.ts +33 -0
  371. package/test/unit/RandomContactList.test.ts +12 -9
  372. package/test/unit/RecursiveOperationManager.test.ts +157 -0
  373. package/test/unit/RecursiveOperationSession.test.ts +68 -0
  374. package/test/unit/Router.test.ts +52 -35
  375. package/test/unit/RoutingSession.test.ts +79 -0
  376. package/test/unit/SortedContactList.test.ts +61 -30
  377. package/test/unit/StoreManager.test.ts +138 -0
  378. package/test/unit/WebsocketConnector.test.ts +27 -35
  379. package/test/unit/connectivityRequestHandler.test.ts +104 -0
  380. package/test/unit/createPeerDescriptor.test.ts +69 -0
  381. package/test/unit/customMatchers.test.ts +16 -0
  382. package/test/unit/version.test.ts +18 -0
  383. package/test/utils/FakeTransport.ts +47 -0
  384. package/test/utils/customMatchers.ts +71 -0
  385. package/test/utils/mock/MockRpcCommunicator.ts +7 -0
  386. package/test/utils/mock/Router.ts +13 -3
  387. package/test/utils/mock/Transport.ts +1 -1
  388. package/test/utils/mock/mockDataEntry.ts +38 -0
  389. package/test/utils/utils.ts +104 -107
  390. package/tsconfig.browser.json +2 -1
  391. package/tsconfig.jest.json +4 -2
  392. package/tsconfig.node.json +4 -2
  393. package/dist/src/connection/ConnectivityChecker.d.ts +0 -17
  394. package/dist/src/connection/ConnectivityChecker.js +0 -208
  395. package/dist/src/connection/ConnectivityChecker.js.map +0 -1
  396. package/dist/src/connection/websocket/ServerWebsocket.js +0 -100
  397. package/dist/src/connection/websocket/ServerWebsocket.js.map +0 -1
  398. package/dist/src/dht/contact/Remote.js.map +0 -1
  399. package/dist/src/dht/find/FindRpcLocal.d.ts +0 -14
  400. package/dist/src/dht/find/FindRpcLocal.js +0 -25
  401. package/dist/src/dht/find/FindRpcLocal.js.map +0 -1
  402. package/dist/src/dht/find/FindSession.d.ts +0 -44
  403. package/dist/src/dht/find/FindSession.js +0 -145
  404. package/dist/src/dht/find/FindSession.js.map +0 -1
  405. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +0 -12
  406. package/dist/src/dht/find/FindSessionRpcLocal.js +0 -17
  407. package/dist/src/dht/find/FindSessionRpcLocal.js.map +0 -1
  408. package/dist/src/dht/find/FindSessionRpcRemote.d.ts +0 -6
  409. package/dist/src/dht/find/FindSessionRpcRemote.js +0 -21
  410. package/dist/src/dht/find/FindSessionRpcRemote.js.map +0 -1
  411. package/dist/src/dht/find/Finder.d.ts +0 -49
  412. package/dist/src/dht/find/Finder.js +0 -184
  413. package/dist/src/dht/find/Finder.js.map +0 -1
  414. package/dist/src/dht/routing/FindRpcRemote.d.ts +0 -6
  415. package/dist/src/dht/routing/FindRpcRemote.js +0 -41
  416. package/dist/src/dht/routing/FindRpcRemote.js.map +0 -1
  417. package/dist/src/helpers/PeerID.d.ts +0 -24
  418. package/dist/src/helpers/PeerID.js +0 -78
  419. package/dist/src/helpers/PeerID.js.map +0 -1
  420. package/dist/src/helpers/UUID.d.ts +0 -8
  421. package/dist/src/helpers/UUID.js +0 -36
  422. package/dist/src/helpers/UUID.js.map +0 -1
  423. package/dist/src/helpers/kademliaId.d.ts +0 -1
  424. package/dist/src/helpers/kademliaId.js +0 -14
  425. package/dist/src/helpers/kademliaId.js.map +0 -1
  426. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +0 -6
  427. package/dist/src/helpers/peerIdFromPeerDescriptor.js +0 -23
  428. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +0 -1
  429. package/src/connection/ConnectivityChecker.ts +0 -199
  430. package/src/connection/websocket/ServerWebsocket.ts +0 -114
  431. package/src/dht/find/FindRpcLocal.ts +0 -35
  432. package/src/dht/find/FindSession.ts +0 -178
  433. package/src/dht/find/FindSessionRpcLocal.ts +0 -25
  434. package/src/dht/find/FindSessionRpcRemote.ts +0 -30
  435. package/src/dht/find/Finder.ts +0 -275
  436. package/src/dht/routing/FindRpcRemote.ts +0 -40
  437. package/src/helpers/PeerID.ts +0 -88
  438. package/src/helpers/UUID.ts +0 -35
  439. package/src/helpers/kademliaId.ts +0 -8
  440. package/src/helpers/peerIdFromPeerDescriptor.ts +0 -20
  441. package/test/integration/MigrateData.test.ts +0 -204
  442. package/test/unit/Finder.test.ts +0 -110
  443. package/test/unit/PeerID.test.ts +0 -22
  444. package/test/unit/UUID.test.ts +0 -55
@@ -0,0 +1,157 @@
1
+ import {
2
+ RecursiveOperation,
3
+ Message,
4
+ RouteMessageAck,
5
+ RouteMessageError,
6
+ RouteMessageWrapper,
7
+ RecursiveOperationRequest
8
+ } from '../../src/proto/packages/dht/protos/DhtRpc'
9
+ import {
10
+ createWrappedClosestPeersRequest,
11
+ createMockPeerDescriptor
12
+ } from '../utils/utils'
13
+ import { RecursiveOperationManager } from '../../src/dht/recursive-operation/RecursiveOperationManager'
14
+ import { LocalDataStore } from '../../src/dht/store/LocalDataStore'
15
+ import { v4 } from 'uuid'
16
+ import { MockRouter } from '../utils/mock/Router'
17
+ import { MockTransport } from '../utils/mock/Transport'
18
+ import { FakeRpcCommunicator } from '../utils/FakeRpcCommunicator'
19
+ import { Router } from '../../src/dht/routing/Router'
20
+ import { ITransport } from '../../src/transport/ITransport'
21
+ import { areEqualPeerDescriptors, createRandomDhtAddress } from '../../src/identifiers'
22
+
23
+ const createMockRouter = (error?: RouteMessageError): Partial<Router> => {
24
+ return {
25
+ doRouteMessage: (routedMessage: RouteMessageWrapper) => {
26
+ return {
27
+ requestId: routedMessage.requestId,
28
+ error
29
+ }
30
+ },
31
+ isMostLikelyDuplicate: () => false,
32
+ addToDuplicateDetector: () => {}
33
+ }
34
+ }
35
+
36
+ const createRequest = (): RecursiveOperationRequest => {
37
+ const request: RecursiveOperationRequest = {
38
+ operation: RecursiveOperation.FIND_CLOSEST_NODES,
39
+ sessionId: v4()
40
+ }
41
+ return request
42
+ }
43
+
44
+ describe('RecursiveOperationManager', () => {
45
+
46
+ const peerDescriptor1 = createMockPeerDescriptor()
47
+ const peerDescriptor2 = createMockPeerDescriptor()
48
+ const recursiveOperationRequest = createRequest()
49
+ const message: Message = {
50
+ serviceId: 'unknown',
51
+ messageId: v4(),
52
+ body: {
53
+ oneofKind: 'recursiveOperationRequest',
54
+ recursiveOperationRequest
55
+ },
56
+ sourceDescriptor: peerDescriptor1,
57
+ targetDescriptor: peerDescriptor2
58
+ }
59
+ const routedMessage: RouteMessageWrapper = {
60
+ message,
61
+ requestId: 'REQ',
62
+ routingPath: [],
63
+ reachableThrough: [],
64
+ sourcePeer: peerDescriptor1,
65
+ target: peerDescriptor2.nodeId,
66
+ parallelRootNodeIds: []
67
+ }
68
+ const rpcCommunicator = new FakeRpcCommunicator()
69
+
70
+ const createRecursiveOperationManager = (
71
+ router: Router = new MockRouter() as any,
72
+ transport: ITransport = new MockTransport()
73
+ ): RecursiveOperationManager => {
74
+ return new RecursiveOperationManager({
75
+ localPeerDescriptor: peerDescriptor1,
76
+ router,
77
+ connections: new Map(),
78
+ serviceId: 'RecursiveOperationManager',
79
+ localDataStore: new LocalDataStore(30 * 100),
80
+ sessionTransport: transport,
81
+ addContact: () => {},
82
+ rpcCommunicator: rpcCommunicator as any
83
+ })
84
+ }
85
+
86
+ it('RecursiveOperationManager server', async () => {
87
+ const recursiveOperationManager = createRecursiveOperationManager()
88
+ const res = await rpcCommunicator.callRpcMethod('routeRequest', routedMessage) as RouteMessageAck
89
+ expect(res.error).toBeUndefined()
90
+ recursiveOperationManager.stop()
91
+ })
92
+
93
+ it('find closest nodes returns self if no peers', async () => {
94
+ const recursiveOperationManager = createRecursiveOperationManager()
95
+ const res = await recursiveOperationManager.execute(createRandomDhtAddress(), RecursiveOperation.FIND_CLOSEST_NODES)
96
+ expect(areEqualPeerDescriptors(res.closestNodes[0], peerDescriptor1)).toEqual(true)
97
+ recursiveOperationManager.stop()
98
+ })
99
+
100
+ it('RecursiveOperationManager server throws if payload is not RecursiveOperationRequest', async () => {
101
+ const manager = createRecursiveOperationManager(new MockRouter() as any)
102
+ const rpcWrapper = createWrappedClosestPeersRequest(peerDescriptor1)
103
+ const badMessage: Message = {
104
+ serviceId: 'unknown',
105
+ messageId: v4(),
106
+ body: {
107
+ oneofKind: 'rpcMessage',
108
+ rpcMessage: rpcWrapper
109
+ },
110
+ sourceDescriptor: peerDescriptor1,
111
+ targetDescriptor: peerDescriptor2
112
+ }
113
+ await expect(() => rpcCommunicator.callRpcMethod('routeRequest', {
114
+ message: badMessage,
115
+ requestId: 'REQ',
116
+ routingPath: [],
117
+ reachableThrough: [],
118
+ target: peerDescriptor1.nodeId,
119
+ sourcePeer: peerDescriptor2
120
+ })).rejects.toThrow()
121
+ manager.stop()
122
+ })
123
+
124
+ it('no targets', async () => {
125
+ const router = createMockRouter(RouteMessageError.NO_TARGETS)
126
+ const send = jest.fn()
127
+ const transport = {
128
+ send,
129
+ on: () => {},
130
+ off: () => {}
131
+ }
132
+ const recursiveOperationManager = createRecursiveOperationManager(router as any, transport as any)
133
+ const ack = await rpcCommunicator.callRpcMethod('routeRequest', routedMessage)
134
+ expect(ack).toEqual({
135
+ requestId: routedMessage.requestId,
136
+ error: RouteMessageError.NO_TARGETS
137
+ })
138
+ expect(send).toHaveBeenCalledTimes(1)
139
+ recursiveOperationManager.stop()
140
+ })
141
+
142
+ it('error', async () => {
143
+ const router = createMockRouter(RouteMessageError.DUPLICATE)
144
+ const send = jest.fn()
145
+ const transport = {
146
+ send
147
+ }
148
+ const recursiveOperationManager = createRecursiveOperationManager(router as any, transport as any)
149
+ const ack = await rpcCommunicator.callRpcMethod('routeRequest', routedMessage)
150
+ expect(ack).toEqual({
151
+ requestId: routedMessage.requestId,
152
+ error: RouteMessageError.DUPLICATE
153
+ })
154
+ expect(send).not.toHaveBeenCalled()
155
+ recursiveOperationManager.stop()
156
+ })
157
+ })
@@ -0,0 +1,68 @@
1
+ import { waitForCondition } from '@streamr/utils'
2
+ import { range } from 'lodash'
3
+ import { RecursiveOperationSession } from '../../src/dht/recursive-operation/RecursiveOperationSession'
4
+ import { RecursiveOperationSessionRpcRemote } from '../../src/dht/recursive-operation/RecursiveOperationSessionRpcRemote'
5
+ import { ServiceID } from '../../src/types/ServiceID'
6
+ import { createRandomDhtAddress } from '../../src/identifiers'
7
+ import { Message, PeerDescriptor, RecursiveOperation } from '../../src/proto/packages/dht/protos/DhtRpc'
8
+ import { RecursiveOperationSessionRpcClient } from '../../src/proto/packages/dht/protos/DhtRpc.client'
9
+ import { RoutingRpcCommunicator } from '../../src/transport/RoutingRpcCommunicator'
10
+ import { FakeEnvironment } from '../utils/FakeTransport'
11
+ import { createMockPeerDescriptor } from '../utils/utils'
12
+
13
+ describe('RecursiveOperationSession', () => {
14
+
15
+ let environment: FakeEnvironment
16
+ let localPeerDescriptor: PeerDescriptor
17
+
18
+ const createRpcRemote = (serviceId: ServiceID) => {
19
+ const mockPeerDescriptor = createMockPeerDescriptor()
20
+ const transport = environment.createTransport(mockPeerDescriptor)
21
+ const send = (msg: Message) => transport.send(msg)
22
+ return new RecursiveOperationSessionRpcRemote(
23
+ mockPeerDescriptor,
24
+ localPeerDescriptor,
25
+ new RoutingRpcCommunicator(serviceId, send),
26
+ RecursiveOperationSessionRpcClient
27
+ )
28
+ }
29
+
30
+ beforeEach(() => {
31
+ environment = new FakeEnvironment()
32
+ localPeerDescriptor = createMockPeerDescriptor()
33
+ })
34
+
35
+ it('happy path', async () => {
36
+ const doRouteRequest = jest.fn()
37
+ const session = new RecursiveOperationSession({
38
+ transport: environment.createTransport(localPeerDescriptor),
39
+ targetId: createRandomDhtAddress(),
40
+ localPeerDescriptor,
41
+ waitedRoutingPathCompletions: 3,
42
+ operation: RecursiveOperation.FIND_CLOSEST_NODES,
43
+ doRouteRequest
44
+ })
45
+ const onCompleted = jest.fn()
46
+ session.on('completed', onCompleted)
47
+
48
+ session.start('')
49
+ expect(doRouteRequest).toHaveBeenCalled()
50
+ range(3).forEach(() => {
51
+ const remote = createRpcRemote(session.getId())
52
+ remote.sendResponse(
53
+ [createMockPeerDescriptor(), createMockPeerDescriptor()],
54
+ [createMockPeerDescriptor(), createMockPeerDescriptor()],
55
+ [],
56
+ true
57
+ )
58
+ })
59
+
60
+ // TODO now waits for the 4s timeout, could setup test so that it completes by receiving
61
+ // all data it wants
62
+ await waitForCondition(() => onCompleted.mock.calls.length > 0)
63
+ const result = session.getResults()
64
+ // TODO assert peer descriptors
65
+ expect(result.closestNodes).toHaveLength(6)
66
+ expect(result.dataEntries).toEqual([])
67
+ })
68
+ })
@@ -1,28 +1,27 @@
1
1
  import { v4 } from 'uuid'
2
2
  import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote'
3
3
  import { Router } from '../../src/dht/routing/Router'
4
- import { PeerID, PeerIDKey } from '../../src/helpers/PeerID'
5
- import { Message, MessageType, NodeType, PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
6
- import { createWrappedClosestPeersRequest } from '../utils/utils'
4
+ import {
5
+ Message,
6
+ PeerDescriptor,
7
+ RouteMessageAck,
8
+ RouteMessageError,
9
+ RouteMessageWrapper
10
+ } from '../../src/proto/packages/dht/protos/DhtRpc'
11
+ import { createMockPeerDescriptor, createWrappedClosestPeersRequest } from '../utils/utils'
7
12
  import { FakeRpcCommunicator } from '../utils/FakeRpcCommunicator'
13
+ import { DhtAddress, getNodeIdFromPeerDescriptor, createRandomDhtAddress } from '../../src/identifiers'
14
+ import { MockRpcCommunicator } from '../utils/mock/MockRpcCommunicator'
8
15
 
9
16
  describe('Router', () => {
10
- let router: Router
11
17
 
12
- const peerId = PeerID.fromString('router')
13
- const peerDescriptor1: PeerDescriptor = {
14
- kademliaId: peerId.value,
15
- type: NodeType.NODEJS
16
- }
17
- const peerDescriptor2: PeerDescriptor = {
18
- kademliaId: PeerID.fromString('destination').value,
19
- type: NodeType.NODEJS
20
- }
18
+ let router: Router
19
+ const peerDescriptor1 = createMockPeerDescriptor()
20
+ const peerDescriptor2 = createMockPeerDescriptor()
21
21
  const rpcWrapper = createWrappedClosestPeersRequest(peerDescriptor1)
22
22
  const message: Message = {
23
23
  serviceId: 'unknown',
24
24
  messageId: v4(),
25
- messageType: MessageType.RPC,
26
25
  body: {
27
26
  oneofKind: 'rpcMessage',
28
27
  rpcMessage: rpcWrapper
@@ -35,14 +34,15 @@ describe('Router', () => {
35
34
  requestId: 'REQ',
36
35
  routingPath: [],
37
36
  reachableThrough: [],
38
- destinationPeer: peerDescriptor1,
39
- sourcePeer: peerDescriptor2
37
+ target: peerDescriptor1.nodeId,
38
+ sourcePeer: peerDescriptor2,
39
+ parallelRootNodeIds: []
40
40
  }
41
- let connections: Map<PeerIDKey, DhtNodeRpcRemote>
41
+ let connections: Map<DhtAddress, DhtNodeRpcRemote>
42
42
  const rpcCommunicator = new FakeRpcCommunicator()
43
43
 
44
44
  const createMockDhtNodeRpcRemote = (destination: PeerDescriptor): DhtNodeRpcRemote => {
45
- return new DhtNodeRpcRemote(peerDescriptor1, destination, {} as any, 'router')
45
+ return new DhtNodeRpcRemote(peerDescriptor1, destination, undefined as any, new MockRpcCommunicator())
46
46
  }
47
47
 
48
48
  beforeEach(() => {
@@ -51,8 +51,8 @@ describe('Router', () => {
51
51
  localPeerDescriptor: peerDescriptor1,
52
52
  rpcCommunicator: rpcCommunicator as any,
53
53
  addContact: (_contact) => {},
54
- serviceId: 'router',
55
- connections
54
+ connections,
55
+ handleMessage: () => {}
56
56
  })
57
57
  })
58
58
 
@@ -63,59 +63,76 @@ describe('Router', () => {
63
63
  it('doRouteMessage without connections', async () => {
64
64
  const ack = await rpcCommunicator.callRpcMethod('routeMessage', {
65
65
  message,
66
- destinationPeer: peerDescriptor2,
66
+ target: peerDescriptor2.nodeId,
67
67
  requestId: v4(),
68
68
  sourcePeer: peerDescriptor1,
69
69
  reachableThrough: [],
70
- routingPath: []
70
+ routingPath: [],
71
+ parallelRootNodeIds: []
71
72
  }) as RouteMessageAck
72
- expect(ack.error).toEqual('No routing candidates found')
73
+ expect(ack.error).toEqual(RouteMessageError.NO_TARGETS)
73
74
  })
74
75
 
75
76
  it('doRouteMessage with connections', async () => {
76
- connections.set(PeerID.fromString('test').toKey(), createMockDhtNodeRpcRemote(peerDescriptor2))
77
+ connections.set(createRandomDhtAddress(), createMockDhtNodeRpcRemote(peerDescriptor2))
78
+ const ack = await rpcCommunicator.callRpcMethod('routeMessage', {
79
+ message,
80
+ target: peerDescriptor2.nodeId,
81
+ requestId: v4(),
82
+ sourcePeer: peerDescriptor1,
83
+ reachableThrough: [],
84
+ routingPath: [],
85
+ parallelRootNodeIds: []
86
+ }) as RouteMessageAck
87
+ expect(ack.error).toBeUndefined()
88
+ })
89
+
90
+ it('doRouteMessage with parallelRootNodeIds', async () => {
91
+ const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor2)
92
+ connections.set(nodeId, createMockDhtNodeRpcRemote(peerDescriptor2))
77
93
  const ack = await rpcCommunicator.callRpcMethod('routeMessage', {
78
94
  message,
79
- destinationPeer: peerDescriptor2,
95
+ target: peerDescriptor2.nodeId,
80
96
  requestId: v4(),
81
97
  sourcePeer: peerDescriptor1,
82
98
  reachableThrough: [],
83
- routingPath: []
99
+ routingPath: [],
100
+ parallelRootNodeIds: [nodeId]
84
101
  }) as RouteMessageAck
85
- expect(ack.error).toEqual('')
102
+ expect(ack.error).toEqual(RouteMessageError.NO_TARGETS)
86
103
  })
87
104
 
88
105
  it('route server is destination without connections', async () => {
89
106
  const ack = await rpcCommunicator.callRpcMethod('routeMessage', routedMessage) as RouteMessageAck
90
- expect(ack.error).toEqual('')
107
+ expect(ack.error).toBeUndefined()
91
108
  })
92
109
 
93
110
  it('route server with connections', async () => {
94
- connections.set(PeerID.fromString('test').toKey(), createMockDhtNodeRpcRemote(peerDescriptor2))
111
+ connections.set(createRandomDhtAddress(), createMockDhtNodeRpcRemote(peerDescriptor2))
95
112
  const ack = await rpcCommunicator.callRpcMethod('routeMessage', routedMessage) as RouteMessageAck
96
- expect(ack.error).toEqual('')
113
+ expect(ack.error).toBeUndefined()
97
114
  })
98
115
 
99
116
  it('route server on duplicate message', async () => {
100
117
  router.addToDuplicateDetector(routedMessage.requestId)
101
118
  const ack = await rpcCommunicator.callRpcMethod('routeMessage', routedMessage) as RouteMessageAck
102
- expect(ack.error).toEqual('message given to routeMessage() service is likely a duplicate')
119
+ expect(ack.error).toEqual(RouteMessageError.DUPLICATE)
103
120
  })
104
121
 
105
122
  it('forward server no connections', async () => {
106
123
  const ack = await rpcCommunicator.callRpcMethod('forwardMessage', routedMessage) as RouteMessageAck
107
- expect(ack.error).toEqual('No routing candidates found')
124
+ expect(ack.error).toEqual(RouteMessageError.NO_TARGETS)
108
125
  })
109
126
 
110
127
  it('forward server with connections', async () => {
111
- connections.set(PeerID.fromString('test').toKey(), createMockDhtNodeRpcRemote(peerDescriptor2))
128
+ connections.set(createRandomDhtAddress(), createMockDhtNodeRpcRemote(peerDescriptor2))
112
129
  const ack = await rpcCommunicator.callRpcMethod('forwardMessage', routedMessage) as RouteMessageAck
113
- expect(ack.error).toEqual('')
130
+ expect(ack.error).toBeUndefined()
114
131
  })
115
132
 
116
133
  it('forward server on duplicate message', async () => {
117
134
  router.addToDuplicateDetector(routedMessage.requestId)
118
135
  const ack = await rpcCommunicator.callRpcMethod('forwardMessage', routedMessage) as RouteMessageAck
119
- expect(ack.error).toEqual('message given to forwardMessage() service is likely a duplicate')
136
+ expect(ack.error).toEqual(RouteMessageError.DUPLICATE)
120
137
  })
121
138
  })
@@ -0,0 +1,79 @@
1
+ import { v4 } from 'uuid'
2
+ import { RoutingMode, RoutingSession } from '../../src/dht/routing/RoutingSession'
3
+ import { Message, PeerDescriptor, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
4
+ import { createMockPeerDescriptor, createWrappedClosestPeersRequest } from '../utils/utils'
5
+ import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote'
6
+ import { RoutingRpcCommunicator } from '../../src/transport/RoutingRpcCommunicator'
7
+ import { DhtAddress, getNodeIdFromPeerDescriptor } from '../../src/identifiers'
8
+ import { MockRpcCommunicator } from '../utils/mock/MockRpcCommunicator'
9
+ import { RoutingTablesCache } from '../../src/dht/routing/RoutingTablesCache'
10
+
11
+ describe('RoutingSession', () => {
12
+
13
+ let session: RoutingSession
14
+ let connections: Map<DhtAddress, DhtNodeRpcRemote>
15
+ let rpcCommunicator: RoutingRpcCommunicator
16
+ let routingTablesCache: RoutingTablesCache
17
+ const mockPeerDescriptor1 = createMockPeerDescriptor()
18
+ const mockPeerDescriptor2 = createMockPeerDescriptor()
19
+ const rpcWrapper = createWrappedClosestPeersRequest(mockPeerDescriptor1)
20
+ const message: Message = {
21
+ serviceId: 'unknown',
22
+ messageId: v4(),
23
+ body: {
24
+ oneofKind: 'rpcMessage',
25
+ rpcMessage: rpcWrapper
26
+ },
27
+ sourceDescriptor: mockPeerDescriptor1,
28
+ targetDescriptor: mockPeerDescriptor2
29
+ }
30
+ const routedMessage: RouteMessageWrapper = {
31
+ message,
32
+ requestId: 'REQ',
33
+ routingPath: [],
34
+ reachableThrough: [],
35
+ target: mockPeerDescriptor1.nodeId,
36
+ sourcePeer: mockPeerDescriptor2,
37
+ parallelRootNodeIds: []
38
+ }
39
+
40
+ const createMockDhtNodeRpcRemote = (destination: PeerDescriptor): DhtNodeRpcRemote => {
41
+ return new DhtNodeRpcRemote(mockPeerDescriptor1, destination, undefined as any, rpcCommunicator)
42
+ }
43
+
44
+ beforeEach(() => {
45
+ rpcCommunicator = new MockRpcCommunicator()
46
+ connections = new Map()
47
+ routingTablesCache = new RoutingTablesCache()
48
+ session = new RoutingSession({
49
+ rpcCommunicator: rpcCommunicator,
50
+ localPeerDescriptor: mockPeerDescriptor1,
51
+ routedMessage,
52
+ connections,
53
+ parallelism: 2,
54
+ mode: RoutingMode.ROUTE,
55
+ excludedNodeIds: new Set(),
56
+ routingTablesCache
57
+ })
58
+ })
59
+
60
+ afterEach(() => {
61
+ rpcCommunicator.stop()
62
+ session.stop()
63
+ })
64
+
65
+ it('findMoreContacts', () => {
66
+ connections.set(getNodeIdFromPeerDescriptor(mockPeerDescriptor2), createMockDhtNodeRpcRemote(mockPeerDescriptor2))
67
+ const contacts = session.updateAndGetRoutablePeers()
68
+ expect(contacts.length).toBe(1)
69
+ })
70
+
71
+ it('findMoreContacts peer disconnects', () => {
72
+ connections.set(getNodeIdFromPeerDescriptor(mockPeerDescriptor2), createMockDhtNodeRpcRemote(mockPeerDescriptor2))
73
+ expect(session.updateAndGetRoutablePeers().length).toBe(1)
74
+ connections.delete(getNodeIdFromPeerDescriptor(mockPeerDescriptor2))
75
+ routingTablesCache.onNodeDisconnected(getNodeIdFromPeerDescriptor(mockPeerDescriptor2))
76
+ expect(session.updateAndGetRoutablePeers().length).toBe(0)
77
+ })
78
+
79
+ })
@@ -1,11 +1,14 @@
1
1
  import { SortedContactList } from '../../src/dht/contact/SortedContactList'
2
- import { PeerID } from '../../src/helpers/PeerID'
2
+ import { DhtAddress, DhtAddressRaw, createRandomDhtAddress, getDhtAddressFromRaw } from '../../src/identifiers'
3
3
 
4
- const createItem = (kademliaId: Uint8Array): { getPeerId: () => PeerID } => {
5
- return { getPeerId: () => PeerID.fromValue(kademliaId) }
4
+ const createItem = (nodeId: DhtAddressRaw): { getNodeId: () => DhtAddress } => {
5
+ return {
6
+ getNodeId: () => getDhtAddressFromRaw(nodeId)
7
+ }
6
8
  }
7
9
 
8
10
  describe('SortedContactList', () => {
11
+
9
12
  const item0 = createItem(new Uint8Array([0, 0, 0, 0]))
10
13
  const item1 = createItem(new Uint8Array([0, 0, 0, 1]))
11
14
  const item2 = createItem(new Uint8Array([0, 0, 0, 2]))
@@ -13,19 +16,19 @@ describe('SortedContactList', () => {
13
16
  const item4 = createItem(new Uint8Array([0, 0, 0, 4]))
14
17
 
15
18
  it('compares Ids correctly', async () => {
16
- const list = new SortedContactList(item0.getPeerId(), 10)
17
- expect(list.compareIds(item0.getPeerId(), item0.getPeerId())).toBe(0)
18
- expect(list.compareIds(item1.getPeerId(), item1.getPeerId())).toBe(0)
19
- expect(list.compareIds(item0.getPeerId(), item1.getPeerId())).toBe(-1)
20
- expect(list.compareIds(item0.getPeerId(), item2.getPeerId())).toBe(-2)
21
- expect(list.compareIds(item1.getPeerId(), item0.getPeerId())).toBe(1)
22
- expect(list.compareIds(item2.getPeerId(), item0.getPeerId())).toBe(2)
23
- expect(list.compareIds(item2.getPeerId(), item3.getPeerId())).toBe(-1)
24
- expect(list.compareIds(item1.getPeerId(), item4.getPeerId())).toBe(-3)
19
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 10, allowToContainReferenceId: true, emitEvents: false })
20
+ expect(list.compareIds(item0.getNodeId(), item0.getNodeId())).toBe(0)
21
+ expect(list.compareIds(item1.getNodeId(), item1.getNodeId())).toBe(0)
22
+ expect(list.compareIds(item0.getNodeId(), item1.getNodeId())).toBe(-1)
23
+ expect(list.compareIds(item0.getNodeId(), item2.getNodeId())).toBe(-2)
24
+ expect(list.compareIds(item1.getNodeId(), item0.getNodeId())).toBe(1)
25
+ expect(list.compareIds(item2.getNodeId(), item0.getNodeId())).toBe(2)
26
+ expect(list.compareIds(item2.getNodeId(), item3.getNodeId())).toBe(-1)
27
+ expect(list.compareIds(item1.getNodeId(), item4.getNodeId())).toBe(-3)
25
28
  })
26
-
29
+
27
30
  it('orders itself correctly', async () => {
28
- const list = new SortedContactList(item0.getPeerId(), 10)
31
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 10, allowToContainReferenceId: true, emitEvents: false })
29
32
  list.addContact(item3)
30
33
  list.addContact(item2)
31
34
  list.addContact(item1)
@@ -35,13 +38,13 @@ describe('SortedContactList', () => {
35
38
  expect(contacts[1]).toEqual(item2)
36
39
  expect(contacts[2]).toEqual(item3)
37
40
  })
38
-
41
+
39
42
  it('handles contacted nodes correctly', async () => {
40
- const list = new SortedContactList(item0.getPeerId(), 10)
43
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 10, allowToContainReferenceId: false, emitEvents: false })
41
44
  list.addContact(item3)
42
45
  list.addContact(item2)
43
46
  list.addContact(item1)
44
- list.setContacted(item2.getPeerId())
47
+ list.setContacted(item2.getNodeId())
45
48
  const contacts = list.getUncontactedContacts(3)
46
49
  expect(contacts.length).toEqual(2)
47
50
  expect(contacts[0]).toEqual(item1)
@@ -49,7 +52,7 @@ describe('SortedContactList', () => {
49
52
  })
50
53
 
51
54
  it('cannot exceed maxSize', async () => {
52
- const list = new SortedContactList(item0.getPeerId(), 3)
55
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 3, allowToContainReferenceId: false, emitEvents: true })
53
56
  const onContactRemoved = jest.fn()
54
57
  list.on('contactRemoved', onContactRemoved)
55
58
  list.addContact(item1)
@@ -57,30 +60,45 @@ describe('SortedContactList', () => {
57
60
  list.addContact(item3)
58
61
  list.addContact(item2)
59
62
  expect(list.getSize()).toEqual(3)
63
+ expect(list.getAllContacts()).toEqual([item1, item2, item3])
64
+ expect(list.getContactIds()).toEqual([item1.getNodeId(), item2.getNodeId(), item3.getNodeId()])
60
65
  expect(onContactRemoved).toBeCalledWith(item4, [item1, item2, item3])
61
- expect(list.getContact(item4.getPeerId())).toBeFalsy()
66
+ expect(list.getContact(item4.getNodeId())).toBeFalsy()
62
67
  })
63
68
 
64
69
  it('removing contacts', async () => {
65
- const list = new SortedContactList(item0.getPeerId(), 8)
70
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 8, allowToContainReferenceId: false, emitEvents: true })
66
71
  const onContactRemoved = jest.fn()
67
72
  list.on('contactRemoved', onContactRemoved)
73
+ list.removeContact(createRandomDhtAddress())
74
+ list.addContact(item3)
75
+ list.removeContact(item3.getNodeId())
68
76
  list.addContact(item4)
69
77
  list.addContact(item3)
70
78
  list.addContact(item2)
71
79
  list.addContact(item1)
72
- list.removeContact(item2.getPeerId())
80
+ list.removeContact(item2.getNodeId())
73
81
  expect(list.getSize()).toEqual(3)
74
- expect(list.getContact(item2.getPeerId())).toBeFalsy()
82
+ expect(list.getContact(item2.getNodeId())).toBeFalsy()
75
83
  expect(list.getContactIds()).toEqual(list.getContactIds().sort(list.compareIds))
76
84
  expect(list.getAllContacts()).toEqual([item1, item3, item4])
77
- expect(onContactRemoved).toBeCalledWith(item2, [item1, item3, item4])
78
- const ret = list.removeContact(PeerID.fromValue(Buffer.from([0, 0, 0, 6])))
85
+ const ret = list.removeContact(getDhtAddressFromRaw(Buffer.from([0, 0, 0, 6])))
79
86
  expect(ret).toEqual(false)
87
+ list.removeContact(item3.getNodeId())
88
+ list.removeContact(createRandomDhtAddress())
89
+ expect(list.getAllContacts()).toEqual([item1, item4])
90
+ expect(onContactRemoved).toHaveBeenNthCalledWith(1, item3, [])
91
+ expect(onContactRemoved).toHaveBeenNthCalledWith(2, item2, [item1, item3, item4])
92
+ expect(onContactRemoved).toHaveBeenNthCalledWith(3, item3, [item1, item4])
80
93
  })
81
94
 
82
- it('get closes contacts', () => {
83
- const list = new SortedContactList(item0.getPeerId(), 8)
95
+ it('get closest contacts', () => {
96
+ const list = new SortedContactList({
97
+ referenceId: item0.getNodeId(),
98
+ maxSize: 8,
99
+ allowToContainReferenceId: false,
100
+ emitEvents: false
101
+ })
84
102
  list.addContact(item1)
85
103
  list.addContact(item3)
86
104
  list.addContact(item4)
@@ -90,14 +108,27 @@ describe('SortedContactList', () => {
90
108
  })
91
109
 
92
110
  it('get active contacts', () => {
93
- const list = new SortedContactList(item0.getPeerId(), 8)
111
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 8, allowToContainReferenceId: false, emitEvents: false })
94
112
  list.addContact(item1)
95
113
  list.addContact(item3)
96
114
  list.addContact(item4)
97
115
  list.addContact(item2)
98
- list.setActive(item2.getPeerId())
99
- list.setActive(item3.getPeerId())
100
- list.setActive(item4.getPeerId())
116
+ list.setActive(item2.getNodeId())
117
+ list.setActive(item3.getNodeId())
118
+ list.setActive(item4.getNodeId())
101
119
  expect(list.getActiveContacts()).toEqual([item2, item3, item4])
102
120
  })
121
+
122
+ it('does not emit contactAdded if contact did not fit the structure', () => {
123
+ const list = new SortedContactList({ referenceId: item0.getNodeId(), maxSize: 2, allowToContainReferenceId: false, emitEvents: true })
124
+ const onContactAdded = jest.fn()
125
+ list.on('contactAdded', onContactAdded)
126
+ list.addContact(item1)
127
+ list.addContact(item2)
128
+ expect(onContactAdded).toBeCalledTimes(2)
129
+ list.addContact(item3)
130
+ expect(onContactAdded).toBeCalledTimes(2)
131
+ expect(list.getAllContacts().length).toEqual(2)
132
+ })
133
+
103
134
  })