@streamr/dht 100.0.0-pretestnet.6 → 100.0.0-rc.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 (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 +18 -9
  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 +0 -2
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +24 -25
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +2 -2
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +27 -20
  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 +16 -13
  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 +23 -11
  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 +24 -26
  254. package/src/connection/webrtc/WebrtcConnector.ts +18 -29
  255. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +29 -24
  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
@@ -1,35 +1,20 @@
1
- import { Message, PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
2
- import {
3
- areEqualPeerDescriptors,
4
- getNodeIdFromPeerDescriptor,
5
- keyFromPeerDescriptor,
6
- peerIdFromPeerDescriptor
7
- } from '../../helpers/peerIdFromPeerDescriptor'
8
- import { RoutingMode, RoutingSession, RoutingSessionEvents } from './RoutingSession'
1
+ import { Message, PeerDescriptor, RouteMessageAck, RouteMessageError, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
2
+ import { RoutingMode, RoutingRemoteContact, RoutingSession, RoutingSessionEvents } from './RoutingSession'
9
3
  import { Logger, executeSafePromise, raceEvents3, withTimeout } from '@streamr/utils'
10
4
  import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
11
- import { PeerIDKey } from '../../helpers/PeerID'
12
5
  import { DuplicateDetector } from './DuplicateDetector'
13
- import { ConnectionManager } from '../../connection/ConnectionManager'
14
6
  import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote'
15
7
  import { v4 } from 'uuid'
16
8
  import { RouterRpcLocal, createRouteMessageAck } from './RouterRpcLocal'
17
- import { ServiceID } from '../../types/ServiceID'
18
-
19
- export enum RoutingErrors {
20
- NO_CANDIDATES_FOUND = 'No routing candidates found',
21
- STOPPED = 'DhtNode Stopped'
22
- }
9
+ import { DhtAddress, areEqualPeerDescriptors, getDhtAddressFromRaw, getNodeIdFromPeerDescriptor } from '../../identifiers'
10
+ import { RoutingTablesCache } from './RoutingTablesCache'
23
11
 
24
12
  export interface RouterConfig {
25
13
  rpcCommunicator: RoutingRpcCommunicator
26
14
  localPeerDescriptor: PeerDescriptor
27
- connections: Map<PeerIDKey, DhtNodeRpcRemote>
15
+ connections: Map<DhtAddress, DhtNodeRpcRemote>
28
16
  addContact: (contact: PeerDescriptor, setActive?: boolean) => void
29
- serviceId: ServiceID
30
- connectionManager?: ConnectionManager
31
- rpcRequestTimeout?: number
32
-
17
+ handleMessage: (message: Message) => void
33
18
  }
34
19
 
35
20
  interface ForwardingTableEntry {
@@ -37,63 +22,50 @@ interface ForwardingTableEntry {
37
22
  peerDescriptors: PeerDescriptor[]
38
23
  }
39
24
 
40
- export interface IRouter {
41
- doRouteMessage(routedMessage: RouteMessageWrapper, mode: RoutingMode, excludedPeer?: PeerDescriptor): RouteMessageAck
42
- send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void>
43
- isMostLikelyDuplicate(requestId: string): boolean
44
- addToDuplicateDetector(requestId: string): void
45
- addRoutingSession(session: RoutingSession): void
46
- removeRoutingSession(sessionId: string): void
47
- stop(): void
48
- }
49
-
50
25
  const logger = new Logger(module)
51
26
 
52
- export class Router implements IRouter {
53
- private readonly rpcCommunicator: RoutingRpcCommunicator
54
- private readonly localPeerDescriptor: PeerDescriptor
55
- private readonly connections: Map<PeerIDKey, DhtNodeRpcRemote>
56
- private readonly serviceId: ServiceID
57
- private readonly forwardingTable: Map<string, ForwardingTableEntry> = new Map()
27
+ export class Router {
28
+
29
+ private readonly forwardingTable: Map<DhtAddress, ForwardingTableEntry> = new Map()
30
+ private readonly routingTablesCache = new RoutingTablesCache()
58
31
  private ongoingRoutingSessions: Map<string, RoutingSession> = new Map()
59
- private readonly duplicateRequestDetector: DuplicateDetector = new DuplicateDetector(100000, 100)
32
+ // TODO use config option or named constant?
33
+ private readonly duplicateRequestDetector: DuplicateDetector = new DuplicateDetector(10000)
60
34
  private stopped = false
35
+ private readonly config: RouterConfig
61
36
 
62
37
  constructor(config: RouterConfig) {
63
- this.rpcCommunicator = config.rpcCommunicator
64
- this.localPeerDescriptor = config.localPeerDescriptor
65
- this.connections = config.connections
66
- this.serviceId = config.serviceId
67
- this.registerLocalRpcMethods(config)
38
+ this.config = config
39
+ this.registerLocalRpcMethods()
68
40
  }
69
41
 
70
- private registerLocalRpcMethods(config: RouterConfig) {
42
+ private registerLocalRpcMethods() {
71
43
  const rpcLocal = new RouterRpcLocal({
72
44
  doRouteMessage: (routedMessage: RouteMessageWrapper, mode?: RoutingMode) => this.doRouteMessage(routedMessage, mode),
73
- addContact: (contact: PeerDescriptor, setActive: boolean) => config.addContact(contact, setActive),
45
+ addContact: (contact: PeerDescriptor, setActive: boolean) => this.config.addContact(contact, setActive),
74
46
  setForwardingEntries: (routedMessage: RouteMessageWrapper) => this.setForwardingEntries(routedMessage),
75
47
  duplicateRequestDetector: this.duplicateRequestDetector,
76
- localPeerDescriptor: this.localPeerDescriptor,
77
- connectionManager: config.connectionManager
48
+ localPeerDescriptor: this.config.localPeerDescriptor,
49
+ handleMessage: this.config.handleMessage
78
50
  })
79
- this.rpcCommunicator.registerRpcMethod(
51
+ this.config.rpcCommunicator.registerRpcMethod(
80
52
  RouteMessageWrapper,
81
53
  RouteMessageAck,
82
54
  'routeMessage',
83
55
  async (routedMessage: RouteMessageWrapper) => {
84
56
  if (this.stopped) {
85
- return createRouteMessageAck(routedMessage, 'routeMessage() service is not running')
57
+ return createRouteMessageAck(routedMessage, RouteMessageError.STOPPED)
86
58
  }
87
59
  return rpcLocal.routeMessage(routedMessage)
88
60
  }
89
61
  )
90
- this.rpcCommunicator.registerRpcMethod(
62
+ this.config.rpcCommunicator.registerRpcMethod(
91
63
  RouteMessageWrapper,
92
64
  RouteMessageAck,
93
65
  'forwardMessage',
94
66
  async (forwardMessage: RouteMessageWrapper) => {
95
67
  if (this.stopped) {
96
- return createRouteMessageAck(forwardMessage, 'forwardMessage() service is not running')
68
+ return createRouteMessageAck(forwardMessage, RouteMessageError.STOPPED)
97
69
  }
98
70
  return rpcLocal.forwardMessage(forwardMessage)
99
71
  }
@@ -101,47 +73,59 @@ export class Router implements IRouter {
101
73
 
102
74
  }
103
75
 
104
- public async send(msg: Message, reachableThrough: PeerDescriptor[]): Promise<void> {
105
- msg.sourceDescriptor = this.localPeerDescriptor
76
+ public send(msg: Message, reachableThrough: PeerDescriptor[]): void {
77
+ msg.sourceDescriptor = this.config.localPeerDescriptor
106
78
  const targetPeerDescriptor = msg.targetDescriptor!
107
- const forwardingEntry = this.forwardingTable.get(keyFromPeerDescriptor(targetPeerDescriptor))
79
+ const forwardingEntry = this.forwardingTable.get(getNodeIdFromPeerDescriptor(targetPeerDescriptor))
108
80
  if (forwardingEntry && forwardingEntry.peerDescriptors.length > 0) {
109
- const forwardingPeer = forwardingEntry.peerDescriptors[0]
110
81
  const forwardedMessage: RouteMessageWrapper = {
111
82
  message: msg,
112
83
  requestId: v4(),
113
- destinationPeer: forwardingPeer,
114
- sourcePeer: this.localPeerDescriptor,
84
+ target: forwardingEntry.peerDescriptors[0].nodeId,
85
+ sourcePeer: this.config.localPeerDescriptor,
115
86
  reachableThrough,
116
- routingPath: []
87
+ routingPath: [],
88
+ parallelRootNodeIds: []
89
+ }
90
+ const ack = this.doRouteMessage(forwardedMessage, RoutingMode.FORWARD)
91
+ if (ack.error !== undefined) {
92
+ const error = 'Could not forward message with error ' + ack.error
93
+ logger.debug(error)
94
+ throw new Error(error)
117
95
  }
118
- this.doRouteMessage(forwardedMessage, RoutingMode.FORWARD)
119
96
  } else {
120
97
  const routedMessage: RouteMessageWrapper = {
121
98
  message: msg,
122
99
  requestId: v4(),
123
- destinationPeer: targetPeerDescriptor,
124
- sourcePeer: this.localPeerDescriptor,
100
+ target: targetPeerDescriptor.nodeId,
101
+ sourcePeer: this.config.localPeerDescriptor,
125
102
  reachableThrough,
126
- routingPath: []
103
+ routingPath: [],
104
+ parallelRootNodeIds: []
105
+ }
106
+ const ack = this.doRouteMessage(routedMessage, RoutingMode.ROUTE)
107
+ if (ack.error !== undefined) {
108
+ const error = 'Could not route message with error ' + ack.error
109
+ logger.debug(error)
110
+ throw new Error(error)
127
111
  }
128
- this.doRouteMessage(routedMessage, RoutingMode.ROUTE)
129
112
  }
130
113
  }
131
114
 
132
- public doRouteMessage(routedMessage: RouteMessageWrapper, mode = RoutingMode.ROUTE): RouteMessageAck {
115
+ public doRouteMessage(routedMessage: RouteMessageWrapper, mode = RoutingMode.ROUTE, excludedPeer?: DhtAddress): RouteMessageAck {
133
116
  if (this.stopped) {
134
- return createRouteMessageAck(routedMessage, RoutingErrors.STOPPED)
117
+ return createRouteMessageAck(routedMessage, RouteMessageError.STOPPED)
135
118
  }
136
119
  logger.trace(`Routing message ${routedMessage.requestId} from ${getNodeIdFromPeerDescriptor(routedMessage.sourcePeer!)} `
137
- + `to ${getNodeIdFromPeerDescriptor(routedMessage.destinationPeer!)}`)
138
- const session = this.createRoutingSession(routedMessage, mode)
139
- const contacts = session.findMoreContacts()
120
+ + `to ${getDhtAddressFromRaw(routedMessage.target)}`)
121
+ const session = this.createRoutingSession(routedMessage, mode, excludedPeer)
122
+ const contacts = session.updateAndGetRoutablePeers()
140
123
  if (contacts.length > 0) {
141
124
  this.addRoutingSession(session)
142
125
  // eslint-disable-next-line promise/catch-or-return
143
126
  logger.trace('starting to raceEvents from routingSession: ' + session.sessionId)
144
127
  let eventReceived: Promise<unknown>
128
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
145
129
  executeSafePromise(async () => {
146
130
  eventReceived = raceEvents3<RoutingSessionEvents>(
147
131
  session,
@@ -151,6 +135,7 @@ export class Router implements IRouter {
151
135
  })
152
136
  setImmediate(async () => {
153
137
  try {
138
+ // TODO use config option or named constant?
154
139
  await withTimeout(eventReceived, 10000)
155
140
  logger.trace('raceEvents ended from routingSession: ' + session.sessionId)
156
141
  } catch (e) {
@@ -162,27 +147,31 @@ export class Router implements IRouter {
162
147
  session.sendMoreRequests(contacts)
163
148
  return createRouteMessageAck(routedMessage)
164
149
  } else {
165
- if (areEqualPeerDescriptors(routedMessage.sourcePeer!, this.localPeerDescriptor)) {
166
- logger.debug(
167
- `Failed to send (routeMessage: ${this.serviceId}) to ${getNodeIdFromPeerDescriptor(routedMessage.destinationPeer!)}`
168
- )
169
- }
170
- logger.trace('noCandidatesFound sessionId: ' + session.sessionId)
171
- return createRouteMessageAck(routedMessage, RoutingErrors.NO_CANDIDATES_FOUND)
150
+ logger.trace('no targets', { sessionId: session.sessionId })
151
+ return createRouteMessageAck(routedMessage, RouteMessageError.NO_TARGETS)
172
152
  }
173
153
  }
174
154
 
175
- private createRoutingSession(routedMessage: RouteMessageWrapper, mode: RoutingMode): RoutingSession {
176
- logger.trace('routing session created with connections: ' + this.connections.size)
177
- return new RoutingSession(
178
- this.rpcCommunicator,
179
- this.localPeerDescriptor,
155
+ private createRoutingSession(routedMessage: RouteMessageWrapper, mode: RoutingMode, excludedNode?: DhtAddress): RoutingSession {
156
+ const excludedNodeIds = new Set<DhtAddress>(routedMessage.routingPath.map((descriptor) => getNodeIdFromPeerDescriptor(descriptor)))
157
+ if (excludedNode) {
158
+ excludedNodeIds.add(excludedNode)
159
+ }
160
+ routedMessage.parallelRootNodeIds.forEach((nodeId) => {
161
+ excludedNodeIds.add(nodeId as DhtAddress)
162
+ })
163
+ logger.trace('routing session created with connections: ' + this.config.connections.size)
164
+ return new RoutingSession({
165
+ rpcCommunicator: this.config.rpcCommunicator,
166
+ localPeerDescriptor: this.config.localPeerDescriptor,
180
167
  routedMessage,
181
- this.connections,
182
- areEqualPeerDescriptors(this.localPeerDescriptor, routedMessage.sourcePeer!) ? 2 : 1,
168
+ connections: this.config.connections,
169
+ // TODO use config option or named constant?
170
+ parallelism: areEqualPeerDescriptors(this.config.localPeerDescriptor, routedMessage.sourcePeer!) ? 2 : 1,
183
171
  mode,
184
- routedMessage.routingPath.map((descriptor) => peerIdFromPeerDescriptor(descriptor))
185
- )
172
+ excludedNodeIds,
173
+ routingTablesCache: this.routingTablesCache
174
+ })
186
175
  }
187
176
 
188
177
  public isMostLikelyDuplicate(requestId: string): boolean {
@@ -201,6 +190,19 @@ export class Router implements IRouter {
201
190
  this.ongoingRoutingSessions.delete(sessionId)
202
191
  }
203
192
 
193
+ onNodeConnected(peerDescriptor: PeerDescriptor): void {
194
+ const remote = new RoutingRemoteContact(peerDescriptor, this.config.localPeerDescriptor, this.config.rpcCommunicator)
195
+ this.routingTablesCache.onNodeConnected(remote)
196
+ }
197
+
198
+ onNodeDisconnected(peerDescriptor: PeerDescriptor): void {
199
+ this.routingTablesCache.onNodeDisconnected(getNodeIdFromPeerDescriptor(peerDescriptor))
200
+ }
201
+
202
+ public resetCache(): void {
203
+ this.routingTablesCache.reset()
204
+ }
205
+
204
206
  public stop(): void {
205
207
  this.stopped = true
206
208
  this.ongoingRoutingSessions.forEach((session, _id) => {
@@ -212,27 +214,28 @@ export class Router implements IRouter {
212
214
  })
213
215
  this.forwardingTable.clear()
214
216
  this.duplicateRequestDetector.clear()
217
+ this.routingTablesCache.reset()
215
218
  }
216
219
 
217
220
  private setForwardingEntries(routedMessage: RouteMessageWrapper): void {
218
221
  const reachableThroughWithoutSelf = routedMessage.reachableThrough.filter((peer) => {
219
- return !areEqualPeerDescriptors(peer, this.localPeerDescriptor)
222
+ return !areEqualPeerDescriptors(peer, this.config.localPeerDescriptor)
220
223
  })
221
224
 
222
225
  if (reachableThroughWithoutSelf.length > 0) {
223
- const sourceKey = keyFromPeerDescriptor(routedMessage.sourcePeer!)
224
- if (this.forwardingTable.has(sourceKey)) {
225
- const oldEntry = this.forwardingTable.get(sourceKey)
226
+ const sourceNodeId = getNodeIdFromPeerDescriptor(routedMessage.sourcePeer!)
227
+ if (this.forwardingTable.has(sourceNodeId)) {
228
+ const oldEntry = this.forwardingTable.get(sourceNodeId)
226
229
  clearTimeout(oldEntry!.timeout)
227
- this.forwardingTable.delete(sourceKey)
230
+ this.forwardingTable.delete(sourceNodeId)
228
231
  }
229
232
  const forwardingEntry: ForwardingTableEntry = {
230
233
  peerDescriptors: reachableThroughWithoutSelf,
231
234
  timeout: setTimeout(() => {
232
- this.forwardingTable.delete(sourceKey)
233
- }, 10000)
235
+ this.forwardingTable.delete(sourceNodeId)
236
+ }, 10000) // TODO use config option or named constant?
234
237
  }
235
- this.forwardingTable.set(sourceKey, forwardingEntry)
238
+ this.forwardingTable.set(sourceNodeId, forwardingEntry)
236
239
  }
237
240
  }
238
241
  }
@@ -1,26 +1,26 @@
1
- import { Logger } from '@streamr/utils'
2
- import { ConnectionManager } from '../../connection/ConnectionManager'
3
- import { areEqualPeerDescriptors, getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
4
- import { PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
1
+ import { Logger, areEqualBinaries } from '@streamr/utils'
2
+ import { Message, PeerDescriptor, RouteMessageAck, RouteMessageError, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
5
3
  import { IRouterRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
6
4
  import { DuplicateDetector } from './DuplicateDetector'
7
5
  import { RoutingMode } from './RoutingSession'
6
+ import { areEqualPeerDescriptors, getDhtAddressFromRaw, getNodeIdFromPeerDescriptor } from '../../identifiers'
7
+ import { v4 } from 'uuid'
8
8
 
9
9
  interface RouterRpcLocalConfig {
10
10
  doRouteMessage: (routedMessage: RouteMessageWrapper, mode?: RoutingMode) => RouteMessageAck
11
11
  addContact: (contact: PeerDescriptor, setActive: boolean) => void
12
12
  setForwardingEntries: (routedMessage: RouteMessageWrapper) => void
13
+ handleMessage: (message: Message) => void
13
14
  duplicateRequestDetector: DuplicateDetector
14
15
  localPeerDescriptor: PeerDescriptor
15
- connectionManager?: ConnectionManager
16
16
  }
17
17
 
18
18
  const logger = new Logger(module)
19
19
 
20
- export const createRouteMessageAck = (routedMessage: RouteMessageWrapper, error?: string): RouteMessageAck => {
20
+ export const createRouteMessageAck = (routedMessage: RouteMessageWrapper, error?: RouteMessageError): RouteMessageAck => {
21
21
  const ack: RouteMessageAck = {
22
22
  requestId: routedMessage.requestId,
23
- error: error ? error : ''
23
+ error
24
24
  }
25
25
  return ack
26
26
  }
@@ -36,16 +36,15 @@ export class RouterRpcLocal implements IRouterRpc {
36
36
  async routeMessage(routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
37
37
  if (this.config.duplicateRequestDetector.isMostLikelyDuplicate(routedMessage.requestId)) {
38
38
  logger.trace(`Routing message ${routedMessage.requestId} from ${getNodeIdFromPeerDescriptor(routedMessage.sourcePeer!)} `
39
- + `to ${getNodeIdFromPeerDescriptor(routedMessage.destinationPeer!)} is likely a duplicate`)
40
- return createRouteMessageAck(routedMessage, 'message given to routeMessage() service is likely a duplicate')
39
+ + `to ${getDhtAddressFromRaw(routedMessage.target)} is likely a duplicate`)
40
+ return createRouteMessageAck(routedMessage, RouteMessageError.DUPLICATE)
41
41
  }
42
42
  logger.trace(`Processing received routeMessage ${routedMessage.requestId}`)
43
- this.config.addContact(routedMessage.sourcePeer!, true)
44
43
  this.config.duplicateRequestDetector.add(routedMessage.requestId)
45
- if (areEqualPeerDescriptors(this.config.localPeerDescriptor, routedMessage.destinationPeer!)) {
44
+ if (areEqualBinaries(this.config.localPeerDescriptor.nodeId, routedMessage.target)) {
46
45
  logger.trace(`routing message targeted to self ${routedMessage.requestId}`)
47
46
  this.config.setForwardingEntries(routedMessage)
48
- this.config.connectionManager?.handleMessage(routedMessage.message!)
47
+ this.config.handleMessage(routedMessage.message!)
49
48
  return createRouteMessageAck(routedMessage)
50
49
  } else {
51
50
  return this.config.doRouteMessage(routedMessage)
@@ -55,13 +54,12 @@ export class RouterRpcLocal implements IRouterRpc {
55
54
  async forwardMessage(forwardMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
56
55
  if (this.config.duplicateRequestDetector.isMostLikelyDuplicate(forwardMessage.requestId)) {
57
56
  logger.trace(`Forwarding message ${forwardMessage.requestId} from ${getNodeIdFromPeerDescriptor(forwardMessage.sourcePeer!)} `
58
- + `to ${getNodeIdFromPeerDescriptor(forwardMessage.destinationPeer!)} is likely a duplicate`)
59
- return createRouteMessageAck(forwardMessage, 'message given to forwardMessage() service is likely a duplicate')
57
+ + `to ${getDhtAddressFromRaw(forwardMessage.target)} is likely a duplicate`)
58
+ return createRouteMessageAck(forwardMessage, RouteMessageError.DUPLICATE)
60
59
  }
61
60
  logger.trace(`Processing received forward routeMessage ${forwardMessage.requestId}`)
62
- this.config.addContact(forwardMessage.sourcePeer!, true)
63
61
  this.config.duplicateRequestDetector.add(forwardMessage.requestId)
64
- if (areEqualPeerDescriptors(this.config.localPeerDescriptor, forwardMessage.destinationPeer!)) {
62
+ if (areEqualBinaries(this.config.localPeerDescriptor.nodeId, forwardMessage.target)) {
65
63
  return this.forwardToDestination(forwardMessage)
66
64
  } else {
67
65
  return this.config.doRouteMessage(forwardMessage, RoutingMode.FORWARD)
@@ -72,10 +70,10 @@ export class RouterRpcLocal implements IRouterRpc {
72
70
  logger.trace(`Forwarding found message targeted to self ${routedMessage.requestId}`)
73
71
  const forwardedMessage = routedMessage.message!
74
72
  if (areEqualPeerDescriptors(this.config.localPeerDescriptor, forwardedMessage.targetDescriptor!)) {
75
- this.config.connectionManager?.handleMessage(forwardedMessage)
73
+ this.config.handleMessage(forwardedMessage)
76
74
  return createRouteMessageAck(routedMessage)
77
75
  }
78
- return this.config.doRouteMessage({ ...routedMessage, destinationPeer: forwardedMessage.targetDescriptor })
76
+ return this.config.doRouteMessage({ ...routedMessage, requestId: v4(), target: forwardedMessage.targetDescriptor!.nodeId })
79
77
  }
80
78
 
81
79
  }
@@ -1,37 +1,36 @@
1
- import { RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
1
+ import { Logger, areEqualBinaries } from '@streamr/utils'
2
2
  import { v4 } from 'uuid'
3
- import {
4
- areEqualPeerDescriptors,
5
- getNodeIdFromPeerDescriptor
6
- } from '../../helpers/peerIdFromPeerDescriptor'
7
- import { IRouterRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
8
- import { Remote } from '../contact/Remote'
9
- import { Logger } from '@streamr/utils'
3
+ import { RouteMessageError, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
4
+ import { RouterRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
5
+ import { RpcRemote } from '../contact/RpcRemote'
10
6
  import { getPreviousPeer } from './getPreviousPeer'
7
+ import { getNodeIdFromPeerDescriptor } from '../../identifiers'
11
8
 
12
9
  const logger = new Logger(module)
13
10
 
14
- export class RouterRpcRemote extends Remote<IRouterRpcClient> {
11
+ export class RouterRpcRemote extends RpcRemote<RouterRpcClient> {
15
12
 
16
13
  async routeMessage(params: RouteMessageWrapper): Promise<boolean> {
17
14
  const message: RouteMessageWrapper = {
18
- destinationPeer: params.destinationPeer,
15
+ target: params.target,
19
16
  sourcePeer: params.sourcePeer,
20
17
  message: params.message,
21
18
  requestId: params.requestId ?? v4(),
22
19
  reachableThrough: params.reachableThrough ?? [],
23
- routingPath: params.routingPath
20
+ routingPath: params.routingPath,
21
+ parallelRootNodeIds: params.parallelRootNodeIds
24
22
  }
25
- const options = this.formDhtRpcOptions()
23
+ const options = this.formDhtRpcOptions({
24
+ connect: false
25
+ })
26
26
  try {
27
27
  const ack = await this.getClient().routeMessage(message, options)
28
28
  // Success signal if sent to destination and error includes duplicate
29
- if (
30
- areEqualPeerDescriptors(params.destinationPeer!, this.getPeerDescriptor())
31
- && ack.error.includes('duplicate')
29
+ if (ack.error === RouteMessageError.DUPLICATE
30
+ && areEqualBinaries(params.target, this.getPeerDescriptor().nodeId)
32
31
  ) {
33
32
  return true
34
- } else if (ack.error.length > 0) {
33
+ } else if (ack.error !== undefined) {
35
34
  return false
36
35
  }
37
36
  } catch (err) {
@@ -39,7 +38,8 @@ export class RouterRpcRemote extends Remote<IRouterRpcClient> {
39
38
  const fromNode = previousPeer
40
39
  ? getNodeIdFromPeerDescriptor(previousPeer)
41
40
  : getNodeIdFromPeerDescriptor(params.sourcePeer!)
42
- logger.trace(`Failed to send routeMessage from ${fromNode} to ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())} with: ${err}`)
41
+ const toNode = getNodeIdFromPeerDescriptor(this.getPeerDescriptor())
42
+ logger.trace(`Failed to send routeMessage from ${fromNode} to ${toNode} with: ${err}`)
43
43
  return false
44
44
  }
45
45
  return true
@@ -47,17 +47,20 @@ export class RouterRpcRemote extends Remote<IRouterRpcClient> {
47
47
 
48
48
  async forwardMessage(params: RouteMessageWrapper): Promise<boolean> {
49
49
  const message: RouteMessageWrapper = {
50
- destinationPeer: params.destinationPeer,
50
+ target: params.target,
51
51
  sourcePeer: params.sourcePeer,
52
52
  message: params.message,
53
53
  requestId: params.requestId ?? v4(),
54
54
  reachableThrough: params.reachableThrough ?? [],
55
- routingPath: params.routingPath
55
+ routingPath: params.routingPath,
56
+ parallelRootNodeIds: params.parallelRootNodeIds
56
57
  }
57
- const options = this.formDhtRpcOptions()
58
+ const options = this.formDhtRpcOptions({
59
+ connect: false
60
+ })
58
61
  try {
59
62
  const ack = await this.getClient().forwardMessage(message, options)
60
- if (ack.error.length > 0) {
63
+ if (ack.error !== undefined) {
61
64
  return false
62
65
  }
63
66
  } catch (err) {
@@ -65,9 +68,8 @@ export class RouterRpcRemote extends Remote<IRouterRpcClient> {
65
68
  const fromNode = previousPeer
66
69
  ? getNodeIdFromPeerDescriptor(previousPeer)
67
70
  : getNodeIdFromPeerDescriptor(params.sourcePeer!)
68
- logger.trace(
69
- `Failed to send forwardMessage from ${fromNode} to ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())} with: ${err}`
70
- )
71
+ const toNode = getNodeIdFromPeerDescriptor(this.getPeerDescriptor())
72
+ logger.trace(`Failed to send forwardMessage from ${fromNode} to ${toNode} with: ${err}`)
71
73
  return false
72
74
  }
73
75
  return true