@streamr/dht 100.0.0-pretestnet.2 → 100.0.0-pretestnet.3

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 (316) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +7 -8
  2. package/dist/src/connection/ConnectionLockHandler.js +16 -14
  3. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  4. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +20 -0
  5. package/dist/src/connection/ConnectionLockRpcLocal.js +47 -0
  6. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -0
  7. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -3
  8. package/dist/src/connection/ConnectionLockRpcRemote.js +6 -6
  9. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  10. package/dist/src/connection/ConnectionManager.d.ts +5 -8
  11. package/dist/src/connection/ConnectionManager.js +77 -107
  12. package/dist/src/connection/ConnectionManager.js.map +1 -1
  13. package/dist/src/connection/ConnectivityChecker.d.ts +7 -6
  14. package/dist/src/connection/ConnectivityChecker.js +23 -20
  15. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  16. package/dist/src/connection/ConnectorFacade.d.ts +15 -12
  17. package/dist/src/connection/ConnectorFacade.js +61 -26
  18. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  19. package/dist/src/connection/Handshaker.d.ts +2 -2
  20. package/dist/src/connection/Handshaker.js +28 -28
  21. package/dist/src/connection/Handshaker.js.map +1 -1
  22. package/dist/src/connection/IConnection.d.ts +5 -6
  23. package/dist/src/connection/IConnection.js.map +1 -1
  24. package/dist/src/connection/ManagedConnection.d.ts +3 -4
  25. package/dist/src/connection/ManagedConnection.js +30 -30
  26. package/dist/src/connection/ManagedConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedWebrtcConnection.d.ts +7 -0
  28. package/dist/src/connection/ManagedWebrtcConnection.js +20 -0
  29. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -0
  30. package/dist/src/connection/{Simulator → simulator}/Simulator.js +3 -3
  31. package/dist/src/connection/{Simulator → simulator}/Simulator.js.map +1 -1
  32. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.d.ts +3 -4
  33. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.js +22 -22
  34. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -0
  35. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.d.ts +2 -2
  36. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js +11 -11
  37. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js.map +1 -1
  38. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.d.ts +1 -1
  39. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.js +2 -2
  40. package/dist/src/connection/simulator/SimulatorTransport.js.map +1 -0
  41. package/dist/src/connection/{Simulator → simulator}/pings.js.map +1 -1
  42. package/dist/src/connection/{WebRTC/IWebRtcConnection.d.ts → webrtc/IWebrtcConnection.d.ts} +2 -2
  43. package/dist/src/connection/{WebRTC/IWebRtcConnection.js → webrtc/IWebrtcConnection.js} +1 -1
  44. package/dist/src/connection/webrtc/IWebrtcConnection.js.map +1 -0
  45. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.d.ts → webrtc/NodeWebrtcConnection.d.ts} +6 -7
  46. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.js → webrtc/NodeWebrtcConnection.js} +36 -36
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -0
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +38 -0
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +178 -0
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -0
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +26 -0
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +99 -0
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -0
  54. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.d.ts → webrtc/WebrtcConnectorRpcRemote.d.ts} +4 -4
  55. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.js → webrtc/WebrtcConnectorRpcRemote.js} +6 -8
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -0
  57. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.d.ts +1 -1
  58. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +26 -0
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +37 -0
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -0
  62. package/dist/src/connection/{WebSocket/ClientWebSocket.d.ts → websocket/ClientWebsocket.d.ts} +5 -4
  63. package/dist/src/connection/{WebSocket/ClientWebSocket.js → websocket/ClientWebsocket.js} +20 -16
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -0
  65. package/dist/src/connection/{WebSocket/ServerWebSocket.d.ts → websocket/ServerWebsocket.d.ts} +2 -2
  66. package/dist/src/connection/{WebSocket/ServerWebSocket.js → websocket/ServerWebsocket.js} +23 -27
  67. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -0
  68. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.d.ts → websocket/WebsocketConnector.d.ts} +23 -15
  69. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.js → websocket/WebsocketConnector.js} +107 -101
  70. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -0
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +17 -0
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +26 -0
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -0
  74. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.d.ts → websocket/WebsocketConnectorRpcRemote.d.ts} +3 -3
  75. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js → websocket/WebsocketConnectorRpcRemote.js} +5 -10
  76. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js.map → websocket/WebsocketConnectorRpcRemote.js.map} +1 -1
  77. package/dist/src/connection/{WebSocket/WebSocketServer.d.ts → websocket/WebsocketServer.d.ts} +6 -3
  78. package/dist/src/connection/{WebSocket/WebSocketServer.js → websocket/WebsocketServer.js} +39 -19
  79. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +11 -19
  81. package/dist/src/dht/DhtNode.js +119 -150
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +22 -0
  84. package/dist/src/dht/DhtNodeRpcLocal.js +42 -0
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -0
  86. package/dist/src/dht/{RemoteDhtNode.d.ts → DhtNodeRpcRemote.d.ts} +5 -3
  87. package/dist/src/dht/{RemoteDhtNode.js → DhtNodeRpcRemote.js} +17 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -0
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +16 -0
  90. package/dist/src/dht/ExternalApiRpcLocal.js +30 -0
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -0
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
  93. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/contact/Remote.d.ts +4 -1
  96. package/dist/src/dht/contact/Remote.js +28 -2
  97. package/dist/src/dht/contact/Remote.js.map +1 -1
  98. package/dist/src/dht/contact/SortedContactList.d.ts +2 -2
  99. package/dist/src/dht/contact/SortedContactList.js +3 -3
  100. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  101. package/dist/src/dht/discovery/DiscoverySession.d.ts +9 -7
  102. package/dist/src/dht/discovery/DiscoverySession.js +8 -8
  103. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  104. package/dist/src/dht/discovery/PeerDiscovery.d.ts +7 -10
  105. package/dist/src/dht/discovery/PeerDiscovery.js +5 -5
  106. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  107. package/dist/src/dht/find/FindRpcLocal.d.ts +14 -0
  108. package/dist/src/dht/find/FindRpcLocal.js +25 -0
  109. package/dist/src/dht/find/FindRpcLocal.js.map +1 -0
  110. package/dist/src/dht/find/{RecursiveFindSession.d.ts → FindSession.d.ts} +12 -13
  111. package/dist/src/dht/find/{RecursiveFindSession.js → FindSession.js} +17 -15
  112. package/dist/src/dht/find/FindSession.js.map +1 -0
  113. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +12 -0
  114. package/dist/src/dht/find/FindSessionRpcLocal.js +17 -0
  115. package/dist/src/dht/find/FindSessionRpcLocal.js.map +1 -0
  116. package/dist/src/dht/find/{RemoteRecursiveFindSession.d.ts → FindSessionRpcRemote.d.ts} +2 -2
  117. package/dist/src/dht/find/{RemoteRecursiveFindSession.js → FindSessionRpcRemote.js} +5 -5
  118. package/dist/src/dht/find/FindSessionRpcRemote.js.map +1 -0
  119. package/dist/src/dht/find/{RecursiveFinder.d.ts → Finder.d.ts} +16 -19
  120. package/dist/src/dht/find/{RecursiveFinder.js → Finder.js} +50 -46
  121. package/dist/src/dht/find/Finder.js.map +1 -0
  122. package/dist/src/dht/routing/FindRpcRemote.d.ts +6 -0
  123. package/dist/src/dht/routing/FindRpcRemote.js +41 -0
  124. package/dist/src/dht/routing/FindRpcRemote.js.map +1 -0
  125. package/dist/src/dht/routing/Router.d.ts +10 -17
  126. package/dist/src/dht/routing/Router.js +47 -90
  127. package/dist/src/dht/routing/Router.js.map +1 -1
  128. package/dist/src/dht/routing/RouterRpcLocal.d.ts +22 -0
  129. package/dist/src/dht/routing/RouterRpcLocal.js +66 -0
  130. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -0
  131. package/dist/src/dht/routing/RouterRpcRemote.d.ts +0 -1
  132. package/dist/src/dht/routing/RouterRpcRemote.js +15 -43
  133. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  134. package/dist/src/dht/routing/RoutingSession.d.ts +17 -8
  135. package/dist/src/dht/routing/RoutingSession.js +124 -131
  136. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  137. package/dist/src/dht/routing/getPreviousPeer.d.ts +2 -0
  138. package/dist/src/dht/routing/getPreviousPeer.js +9 -0
  139. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -0
  140. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -8
  141. package/dist/src/dht/store/StoreRpcLocal.js +25 -24
  142. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  143. package/dist/src/dht/store/StoreRpcRemote.js +3 -7
  144. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  145. package/dist/src/exports.d.ts +11 -5
  146. package/dist/src/exports.js +17 -4
  147. package/dist/src/exports.js.map +1 -1
  148. package/dist/src/helpers/Connectivity.d.ts +4 -0
  149. package/dist/src/helpers/Connectivity.js +24 -0
  150. package/dist/src/helpers/Connectivity.js.map +1 -0
  151. package/dist/src/helpers/errors.d.ts +3 -3
  152. package/dist/src/helpers/errors.js +7 -7
  153. package/dist/src/helpers/protoClasses.js +3 -3
  154. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +56 -39
  155. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +49 -36
  156. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  157. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +64 -84
  158. package/dist/src/proto/packages/dht/protos/DhtRpc.js +64 -66
  159. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  160. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -21
  161. package/dist/src/rpc-protocol/DhtCallContext.d.ts +0 -1
  162. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  163. package/dist/src/transport/ITransport.d.ts +5 -6
  164. package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -1
  165. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  166. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
  167. package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
  168. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  169. package/dist/src/types/ServiceID.d.ts +1 -0
  170. package/dist/src/types/ServiceID.js +3 -0
  171. package/dist/src/types/ServiceID.js.map +1 -0
  172. package/karma.config.js +4 -4
  173. package/package.json +10 -8
  174. package/protos/DhtRpc.proto +32 -35
  175. package/src/connection/ConnectionLockHandler.ts +19 -17
  176. package/src/connection/ConnectionLockRpcLocal.ts +74 -0
  177. package/src/connection/ConnectionLockRpcRemote.ts +7 -6
  178. package/src/connection/ConnectionManager.ts +59 -95
  179. package/src/connection/ConnectivityChecker.ts +30 -26
  180. package/src/connection/ConnectorFacade.ts +74 -34
  181. package/src/connection/Handshaker.ts +9 -9
  182. package/src/connection/IConnection.ts +5 -6
  183. package/src/connection/ManagedConnection.ts +21 -22
  184. package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +9 -9
  185. package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
  186. package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +23 -24
  187. package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +13 -13
  188. package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
  189. package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +12 -13
  190. package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
  191. package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +32 -33
  192. package/src/connection/webrtc/WebrtcConnector.ts +225 -0
  193. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
  194. package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
  195. package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
  196. package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
  197. package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +19 -17
  198. package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +21 -27
  199. package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts} +109 -100
  200. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
  201. package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +6 -12
  202. package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
  203. package/src/dht/DhtNode.ts +144 -179
  204. package/src/dht/DhtNodeRpcLocal.ts +68 -0
  205. package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +12 -13
  206. package/src/dht/ExternalApiRpcLocal.ts +46 -0
  207. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  208. package/src/dht/contact/Remote.ts +32 -4
  209. package/src/dht/contact/SortedContactList.ts +4 -4
  210. package/src/dht/discovery/DiscoverySession.ts +23 -20
  211. package/src/dht/discovery/PeerDiscovery.ts +14 -17
  212. package/src/dht/find/FindRpcLocal.ts +35 -0
  213. package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +25 -25
  214. package/src/dht/find/FindSessionRpcLocal.ts +25 -0
  215. package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
  216. package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +77 -71
  217. package/src/dht/routing/FindRpcRemote.ts +40 -0
  218. package/src/dht/routing/Router.ts +69 -105
  219. package/src/dht/routing/RouterRpcLocal.ts +81 -0
  220. package/src/dht/routing/RouterRpcRemote.ts +15 -45
  221. package/src/dht/routing/RoutingSession.ts +56 -61
  222. package/src/dht/routing/getPreviousPeer.ts +6 -0
  223. package/src/dht/store/StoreRpcLocal.ts +44 -37
  224. package/src/dht/store/StoreRpcRemote.ts +4 -8
  225. package/src/exports.ts +11 -5
  226. package/src/helpers/Connectivity.ts +19 -0
  227. package/src/helpers/errors.ts +3 -3
  228. package/src/helpers/protoClasses.ts +6 -6
  229. package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
  230. package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
  231. package/src/proto/packages/dht/protos/DhtRpc.ts +87 -114
  232. package/src/rpc-protocol/DhtCallContext.ts +0 -1
  233. package/src/transport/ITransport.ts +5 -8
  234. package/src/transport/ListeningRpcCommunicator.ts +2 -1
  235. package/src/transport/RoutingRpcCommunicator.ts +3 -4
  236. package/src/types/ServiceID.ts +1 -0
  237. package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +6 -6
  238. package/test/benchmark/KademliaCorrectness.test.ts +2 -2
  239. package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
  240. package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
  241. package/test/end-to-end/Layer0.test.ts +35 -17
  242. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +24 -6
  243. package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
  244. package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
  245. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
  246. package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
  247. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
  248. package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
  249. package/test/end-to-end/memory-leak.test.ts +85 -0
  250. package/test/integration/ConnectionLocking.test.ts +4 -4
  251. package/test/integration/ConnectionManager.test.ts +37 -28
  252. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  253. package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
  254. package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
  255. package/test/integration/DhtRpc.test.ts +5 -5
  256. package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +3 -3
  257. package/test/integration/Layer1-scale.test.ts +1 -1
  258. package/test/integration/MigrateData.test.ts +6 -5
  259. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
  260. package/test/integration/MultipleEntryPointJoining.test.ts +6 -6
  261. package/test/integration/RouteMessage.test.ts +26 -26
  262. package/test/integration/RpcErrors.test.ts +10 -10
  263. package/test/integration/ScaleDownDht.test.ts +3 -3
  264. package/test/integration/SimultaneousConnections.test.ts +10 -7
  265. package/test/integration/Store.test.ts +1 -1
  266. package/test/integration/StoreAndDelete.test.ts +1 -1
  267. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
  268. package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +4 -4
  269. package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
  270. package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
  271. package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
  272. package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
  273. package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
  274. package/test/unit/ConnectivityHelpers.test.ts +69 -0
  275. package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
  276. package/test/unit/Router.test.ts +26 -26
  277. package/test/unit/UUID.test.ts +1 -1
  278. package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
  279. package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
  280. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
  281. package/test/utils/FakeRpcCommunicator.ts +23 -0
  282. package/test/utils/mock/Transport.ts +1 -1
  283. package/test/utils/utils.ts +14 -24
  284. package/tsconfig.browser.json +1 -1
  285. package/tsconfig.jest.json +3 -2
  286. package/tsconfig.node.json +3 -2
  287. package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
  288. package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
  289. package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
  290. package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
  291. package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
  292. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
  293. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
  294. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
  295. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
  296. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
  297. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
  298. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
  299. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
  300. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
  301. package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
  302. package/dist/src/dht/RemoteDhtNode.js.map +0 -1
  303. package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
  304. package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
  305. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
  306. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
  307. package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
  308. package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
  309. package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
  310. package/src/dht/registerExternalApiRpcMethods.ts +0 -44
  311. package/test/utils/mock/RecursiveFinder.ts +0 -19
  312. /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
  313. /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
  314. /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
  315. /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
  316. /package/src/connection/{Simulator → simulator}/pings.ts +0 -0
@@ -0,0 +1,68 @@
1
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
+ import { Logger } from '@streamr/utils'
3
+ import KBucket from 'k-bucket'
4
+ import { keyFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
5
+ import { Empty } from '../proto/google/protobuf/empty'
6
+ import {
7
+ ClosestPeersRequest,
8
+ ClosestPeersResponse,
9
+ LeaveNotice,
10
+ PeerDescriptor,
11
+ PingRequest,
12
+ PingResponse
13
+ } from '../proto/packages/dht/protos/DhtRpc'
14
+ import { IDhtNodeRpc } from '../proto/packages/dht/protos/DhtRpc.server'
15
+ import { DhtCallContext } from '../rpc-protocol/DhtCallContext'
16
+ import { DhtNodeRpcRemote } from './DhtNodeRpcRemote'
17
+
18
+ interface DhtNodeRpcLocalConfig {
19
+ bucket: KBucket<DhtNodeRpcRemote>
20
+ serviceId: string
21
+ peerDiscoveryQueryBatchSize: number
22
+ addNewContact: (contact: PeerDescriptor) => void
23
+ removeContact: (contact: PeerDescriptor) => void
24
+ }
25
+
26
+ const logger = new Logger(module)
27
+
28
+ export class DhtNodeRpcLocal implements IDhtNodeRpc {
29
+
30
+ private readonly config: DhtNodeRpcLocalConfig
31
+
32
+ constructor(config: DhtNodeRpcLocalConfig) {
33
+ this.config = config
34
+ }
35
+
36
+ async getClosestPeers(request: ClosestPeersRequest, context: ServerCallContext): Promise<ClosestPeersResponse> {
37
+ this.config.addNewContact((context as DhtCallContext).incomingSourceDescriptor!)
38
+ const response = {
39
+ peers: this.getClosestPeerDescriptors(request.kademliaId, this.config.peerDiscoveryQueryBatchSize),
40
+ requestId: request.requestId
41
+ }
42
+ return response
43
+ }
44
+
45
+ private getClosestPeerDescriptors(kademliaId: Uint8Array, limit: number): PeerDescriptor[] {
46
+ const closestPeers = this.config.bucket.closest(kademliaId, limit)
47
+ return closestPeers.map((rpcRemote: DhtNodeRpcRemote) => rpcRemote.getPeerDescriptor())
48
+ }
49
+
50
+ async ping(request: PingRequest, context: ServerCallContext): Promise<PingResponse> {
51
+ logger.trace('received ping request: ' + keyFromPeerDescriptor((context as DhtCallContext).incomingSourceDescriptor!))
52
+ setImmediate(() => {
53
+ this.config.addNewContact((context as DhtCallContext).incomingSourceDescriptor!)
54
+ })
55
+ const response: PingResponse = {
56
+ requestId: request.requestId
57
+ }
58
+ return response
59
+ }
60
+
61
+ async leaveNotice(_request: LeaveNotice, context: ServerCallContext): Promise<Empty> {
62
+ // TODO check signature??
63
+ const sender = (context as DhtCallContext).incomingSourceDescriptor!
64
+ logger.trace('received leave notice: ' + keyFromPeerDescriptor(sender))
65
+ this.config.removeContact(sender)
66
+ return {}
67
+ }
68
+ }
@@ -1,6 +1,7 @@
1
- import { IDhtRpcServiceClient } from '../proto/packages/dht/protos/DhtRpc.client'
1
+ import { IDhtNodeRpcClient } from '../proto/packages/dht/protos/DhtRpc.client'
2
2
  import {
3
3
  ClosestPeersRequest,
4
+ LeaveNotice,
4
5
  PeerDescriptor,
5
6
  PingRequest
6
7
  } from '../proto/packages/dht/protos/DhtRpc'
@@ -10,6 +11,7 @@ import { ProtoRpcClient } from '@streamr/proto-rpc'
10
11
  import { Remote } from './contact/Remote'
11
12
  import { PeerID } from '../helpers/PeerID'
12
13
  import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
14
+ import { ServiceID } from '../types/ServiceID'
13
15
 
14
16
  const logger = new Logger(module)
15
17
 
@@ -19,21 +21,22 @@ export interface KBucketContact {
19
21
  vectorClock: number
20
22
  }
21
23
 
22
- export class RemoteDhtNode extends Remote<IDhtRpcServiceClient> implements KBucketContact {
24
+ export class DhtNodeRpcRemote extends Remote<IDhtNodeRpcClient> implements KBucketContact {
23
25
 
24
26
  private static counter = 0
25
27
  public vectorClock: number
26
28
  public readonly id: Uint8Array
27
29
 
28
30
  constructor(
29
- ownPeerDescriptor: PeerDescriptor,
31
+ localPeerDescriptor: PeerDescriptor,
30
32
  peerDescriptor: PeerDescriptor,
31
- client: ProtoRpcClient<IDhtRpcServiceClient>,
32
- serviceId: string
33
+ client: ProtoRpcClient<IDhtNodeRpcClient>,
34
+ serviceId: ServiceID,
35
+ rpcRequestTimeout?: number
33
36
  ) {
34
- super(ownPeerDescriptor, peerDescriptor, serviceId, client)
37
+ super(localPeerDescriptor, peerDescriptor, serviceId, client, rpcRequestTimeout)
35
38
  this.id = this.getPeerId().value
36
- this.vectorClock = RemoteDhtNode.counter++
39
+ this.vectorClock = DhtNodeRpcRemote.counter++
37
40
  }
38
41
 
39
42
  async getClosestPeers(kademliaId: Uint8Array): Promise<PeerDescriptor[]> {
@@ -56,9 +59,7 @@ export class RemoteDhtNode extends Remote<IDhtRpcServiceClient> implements KBuck
56
59
  const request: PingRequest = {
57
60
  requestId: v4()
58
61
  }
59
- const options = this.formDhtRpcOptions({
60
- timeout: 10000
61
- })
62
+ const options = this.formDhtRpcOptions()
62
63
  try {
63
64
  const pong = await this.getClient().ping(request, options)
64
65
  if (pong.requestId === request.requestId) {
@@ -70,8 +71,6 @@ export class RemoteDhtNode extends Remote<IDhtRpcServiceClient> implements KBuck
70
71
  return false
71
72
  }
72
73
 
73
- /*
74
- TODO remove or start using this method in NET-1131
75
74
  leaveNotice(): void {
76
75
  logger.trace(`Sending leaveNotice on ${this.getServiceId()} from ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
77
76
  const request: LeaveNotice = {
@@ -83,7 +82,7 @@ export class RemoteDhtNode extends Remote<IDhtRpcServiceClient> implements KBuck
83
82
  this.getClient().leaveNotice(request, options).catch((e) => {
84
83
  logger.trace('Failed to send leaveNotice' + e)
85
84
  })
86
- }*/
85
+ }
87
86
 
88
87
  getPeerId(): PeerID {
89
88
  return peerIdFromPeerDescriptor(this.getPeerDescriptor())
@@ -0,0 +1,46 @@
1
+ import { IExternalApiRpc } from '../proto/packages/dht/protos/DhtRpc.server'
2
+ import {
3
+ ExternalFindDataRequest,
4
+ ExternalFindDataResponse,
5
+ ExternalStoreDataRequest,
6
+ ExternalStoreDataResponse,
7
+ PeerDescriptor
8
+ } from '../proto/packages/dht/protos/DhtRpc'
9
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
10
+ import { DhtCallContext } from '../rpc-protocol/DhtCallContext'
11
+ import { FindResult } from './find/Finder'
12
+ import { Any } from '../proto/google/protobuf/any'
13
+
14
+ interface ExternalApiRpcLocalConfig {
15
+ startFind: (idToFind: Uint8Array, fetchData: boolean, excludedPeer: PeerDescriptor) => Promise<FindResult>
16
+ storeDataToDht: (key: Uint8Array, data: Any) => Promise<PeerDescriptor[]>
17
+ }
18
+
19
+ export class ExternalApiRpcLocal implements IExternalApiRpc {
20
+
21
+ private readonly config: ExternalApiRpcLocalConfig
22
+
23
+ constructor(config: ExternalApiRpcLocalConfig) {
24
+ this.config = config
25
+ }
26
+
27
+ async externalFindData(findDataRequest: ExternalFindDataRequest, context: ServerCallContext): Promise<ExternalFindDataResponse> {
28
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
29
+ const result = await this.config.startFind(findDataRequest.kademliaId, true, senderPeerDescriptor)
30
+ if (result.dataEntries) {
31
+ return ExternalFindDataResponse.create({ dataEntries: result.dataEntries })
32
+ } else {
33
+ return ExternalFindDataResponse.create({
34
+ dataEntries: [],
35
+ error: 'Could not find data with the given key'
36
+ })
37
+ }
38
+ }
39
+
40
+ async externalStoreData(request: ExternalStoreDataRequest): Promise<ExternalStoreDataResponse> {
41
+ const result = await this.config.storeDataToDht(request.key, request.data!)
42
+ return ExternalStoreDataResponse.create({
43
+ storers: result
44
+ })
45
+ }
46
+ }
@@ -1,19 +1,19 @@
1
1
  import { Any } from '../proto/google/protobuf/any'
2
- import { DataEntry, ExternalStoreDataRequest, FindDataRequest, PeerDescriptor } from '../proto/packages/dht/protos/DhtRpc'
2
+ import { DataEntry, ExternalStoreDataRequest, ExternalFindDataRequest, PeerDescriptor } from '../proto/packages/dht/protos/DhtRpc'
3
3
  import { IExternalApiRpcClient } from '../proto/packages/dht/protos/DhtRpc.client'
4
4
  import { Remote } from './contact/Remote'
5
5
 
6
6
  export class ExternalApiRpcRemote extends Remote<IExternalApiRpcClient> {
7
7
 
8
- async findData(idToFind: Uint8Array): Promise<DataEntry[]> {
9
- const request: FindDataRequest = {
8
+ async externalFindData(idToFind: Uint8Array): Promise<DataEntry[]> {
9
+ const request: ExternalFindDataRequest = {
10
10
  kademliaId: idToFind
11
11
  }
12
12
  const options = this.formDhtRpcOptions({
13
13
  timeout: 10000
14
14
  })
15
15
  try {
16
- const data = await this.getClient().findData(request, options)
16
+ const data = await this.getClient().externalFindData(request, options)
17
17
  return data.dataEntries
18
18
  } catch (err) {
19
19
  return []
@@ -1,24 +1,51 @@
1
1
  import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
2
2
  import { ProtoRpcClient } from '@streamr/proto-rpc'
3
3
  import { DhtRpcOptions } from '../../rpc-protocol/DhtRpcOptions'
4
+ import { ServiceID } from '../../types/ServiceID'
5
+ import { ConnectionType } from '../../connection/IConnection'
6
+ import { expectedConnectionType } from '../../helpers/Connectivity'
7
+
8
+ // Should connect directly to the server, timeout can be low
9
+ const WEBSOCKET_CLIENT_TIMEOUT = 5000
10
+ // Requires a WebsocketConnectionRequest to be routed to the client before the connection can be opened
11
+ // takes a little bit longer than WEBSOCKET_CLIENT
12
+ const WEBSOCKET_SERVER_TIMEOUT = 7500
13
+ // WebRTC connections require lots of signalling to open and might take a longer time.
14
+ const WEBRTC_TIMEOUT = 15000
15
+ // default timeout for existing connections
16
+ export const EXISTING_CONNECTION_TIMEOUT = 5000
17
+
18
+ const getRpcTimeout = (localPeerDescriptor: PeerDescriptor, remotePeerDescriptor: PeerDescriptor): number => {
19
+ const connectionType = expectedConnectionType(localPeerDescriptor, remotePeerDescriptor)
20
+ if (connectionType === ConnectionType.WEBSOCKET_CLIENT) {
21
+ return WEBSOCKET_CLIENT_TIMEOUT
22
+ } else if (connectionType === ConnectionType.WEBSOCKET_SERVER) {
23
+ return WEBSOCKET_SERVER_TIMEOUT
24
+ } else if (connectionType === ConnectionType.WEBRTC) {
25
+ return WEBRTC_TIMEOUT
26
+ }
27
+ return WEBRTC_TIMEOUT
28
+ }
4
29
 
5
30
  export abstract class Remote<T> {
6
31
 
7
32
  private readonly localPeerDescriptor: PeerDescriptor
8
33
  private readonly remotePeerDescriptor: PeerDescriptor
9
- private readonly serviceId: string
34
+ private readonly serviceId: ServiceID
10
35
  private readonly client: ProtoRpcClient<T>
11
-
36
+ private readonly rpcTimeout?: number
12
37
  constructor(
13
38
  localPeerDescriptor: PeerDescriptor,
14
39
  remotePeerDescriptor: PeerDescriptor,
15
- serviceId: string,
16
- client: ProtoRpcClient<T>
40
+ serviceId: ServiceID,
41
+ client: ProtoRpcClient<T>,
42
+ rpcTimeout?: number
17
43
  ) {
18
44
  this.localPeerDescriptor = localPeerDescriptor
19
45
  this.remotePeerDescriptor = remotePeerDescriptor
20
46
  this.client = client
21
47
  this.serviceId = serviceId
48
+ this.rpcTimeout = rpcTimeout
22
49
  }
23
50
 
24
51
  getPeerDescriptor(): PeerDescriptor {
@@ -41,6 +68,7 @@ export abstract class Remote<T> {
41
68
  return {
42
69
  sourceDescriptor: this.localPeerDescriptor,
43
70
  targetDescriptor: this.remotePeerDescriptor,
71
+ timeout: this.rpcTimeout ?? getRpcTimeout(this.localPeerDescriptor, this.remotePeerDescriptor),
44
72
  ...opts
45
73
  }
46
74
  }
@@ -4,7 +4,7 @@ import { ContactList, ContactState } from './ContactList'
4
4
 
5
5
  export class SortedContactList<C extends { getPeerId: () => PeerID }> extends ContactList<C> {
6
6
 
7
- private allowOwnPeerId: boolean
7
+ private allowLocalPeerId: boolean
8
8
  private peerIdDistanceLimit?: PeerID
9
9
  private excludedPeerIDs?: PeerID[]
10
10
 
@@ -12,13 +12,13 @@ export class SortedContactList<C extends { getPeerId: () => PeerID }> extends Co
12
12
  ownId: PeerID,
13
13
  maxSize: number,
14
14
  defaultContactQueryLimit?: number,
15
- allowOwnPeerId = false,
15
+ allowLocalPeerId = false,
16
16
  peerIdDistanceLimit?: PeerID,
17
17
  excludedPeerIDs?: PeerID[]
18
18
  ) {
19
19
  super(ownId, maxSize, defaultContactQueryLimit)
20
20
  this.compareIds = this.compareIds.bind(this)
21
- this.allowOwnPeerId = allowOwnPeerId
21
+ this.allowLocalPeerId = allowLocalPeerId
22
22
  this.peerIdDistanceLimit = peerIdDistanceLimit
23
23
  this.excludedPeerIDs = excludedPeerIDs
24
24
  }
@@ -37,7 +37,7 @@ export class SortedContactList<C extends { getPeerId: () => PeerID }> extends Co
37
37
  return
38
38
  }
39
39
 
40
- if ((!this.allowOwnPeerId && this.ownId.equals(contact.getPeerId())) ||
40
+ if ((!this.allowLocalPeerId && this.ownId.equals(contact.getPeerId())) ||
41
41
  (this.peerIdDistanceLimit !== undefined && this.compareIds(this.peerIdDistanceLimit, contact.getPeerId()) < 0)) {
42
42
  return
43
43
  }
@@ -5,10 +5,11 @@ import KBucket from 'k-bucket'
5
5
  import { v4 } from 'uuid'
6
6
  import { PeerID } from '../../helpers/PeerID'
7
7
  import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
8
- import { DhtRpcServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
8
+ import { DhtNodeRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
9
9
  import { SortedContactList } from '../contact/SortedContactList'
10
- import { RemoteDhtNode } from '../RemoteDhtNode'
10
+ import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote'
11
11
  import { areEqualPeerDescriptors, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
12
+ import { ServiceID } from '../../types/ServiceID'
12
13
 
13
14
  const logger = new Logger(module)
14
15
 
@@ -17,15 +18,16 @@ interface DiscoverySessionEvents {
17
18
  }
18
19
 
19
20
  interface DiscoverySessionConfig {
20
- bucket: KBucket<RemoteDhtNode>
21
- neighborList: SortedContactList<RemoteDhtNode>
21
+ bucket: KBucket<DhtNodeRpcRemote>
22
+ neighborList: SortedContactList<DhtNodeRpcRemote>
22
23
  targetId: Uint8Array
23
- ownPeerDescriptor: PeerDescriptor
24
- serviceId: string
24
+ localPeerDescriptor: PeerDescriptor
25
+ serviceId: ServiceID
25
26
  rpcCommunicator: RpcCommunicator
26
27
  parallelism: number
27
28
  noProgressLimit: number
28
- newContactListener?: (remoteDhtNode: RemoteDhtNode) => void
29
+ newContactListener?: (rpcRemote: DhtNodeRpcRemote) => void
30
+ rpcRequestTimeout?: number
29
31
  }
30
32
 
31
33
  export class DiscoverySession {
@@ -47,24 +49,25 @@ export class DiscoverySession {
47
49
  return
48
50
  }
49
51
  contacts.forEach((contact) => {
50
- if (!areEqualPeerDescriptors(contact, this.config.ownPeerDescriptor)) {
51
- const remoteDhtNode = new RemoteDhtNode(
52
- this.config.ownPeerDescriptor,
52
+ if (!areEqualPeerDescriptors(contact, this.config.localPeerDescriptor)) {
53
+ const rpcRemote = new DhtNodeRpcRemote(
54
+ this.config.localPeerDescriptor,
53
55
  contact,
54
- toProtoRpcClient(new DhtRpcServiceClient(this.config.rpcCommunicator.getRpcClientTransport())),
55
- this.config.serviceId
56
+ toProtoRpcClient(new DhtNodeRpcClient(this.config.rpcCommunicator.getRpcClientTransport())),
57
+ this.config.serviceId,
58
+ this.config.rpcRequestTimeout
56
59
  )
57
60
  if (this.config.newContactListener) {
58
- this.config.newContactListener(remoteDhtNode)
61
+ this.config.newContactListener(rpcRemote)
59
62
  }
60
- if (!this.config.neighborList.getContact(remoteDhtNode.getPeerId())) {
61
- this.config.neighborList.addContact(remoteDhtNode)
63
+ if (!this.config.neighborList.getContact(rpcRemote.getPeerId())) {
64
+ this.config.neighborList.addContact(rpcRemote)
62
65
  }
63
66
  }
64
67
  })
65
68
  }
66
69
 
67
- private async getClosestPeersFromContact(contact: RemoteDhtNode): Promise<PeerDescriptor[]> {
70
+ private async getClosestPeersFromContact(contact: DhtNodeRpcRemote): Promise<PeerDescriptor[]> {
68
71
  if (this.stopped) {
69
72
  return []
70
73
  }
@@ -90,7 +93,7 @@ export class DiscoverySession {
90
93
  }
91
94
  }
92
95
 
93
- private onClosestPeersRequestFailed(peer: RemoteDhtNode) {
96
+ private onClosestPeersRequestFailed(peer: DhtNodeRpcRemote) {
94
97
  if (!this.ongoingClosestPeersRequests.has(peer.getPeerId().toKey())) {
95
98
  return
96
99
  }
@@ -104,7 +107,7 @@ export class DiscoverySession {
104
107
  return
105
108
  }
106
109
  const uncontacted = this.config.neighborList.getUncontactedContacts(this.config.parallelism)
107
- if (uncontacted.length < 1 || this.noProgressCounter >= this.config.noProgressLimit) {
110
+ if (uncontacted.length === 0 || this.noProgressCounter >= this.config.noProgressLimit) {
108
111
  this.emitter.emit('discoveryCompleted')
109
112
  this.stopped = true
110
113
  return
@@ -125,8 +128,8 @@ export class DiscoverySession {
125
128
  }
126
129
  }
127
130
 
128
- public async findClosestNodes(timeout: number): Promise<SortedContactList<RemoteDhtNode>> {
129
- if (this.config.neighborList.getUncontactedContacts(this.config.parallelism).length < 1) {
131
+ public async findClosestNodes(timeout: number): Promise<SortedContactList<DhtNodeRpcRemote>> {
132
+ if (this.config.neighborList.getUncontactedContacts(this.config.parallelism).length === 0) {
130
133
  logger.trace('getUncontactedContacts length was 0 in beginning of discovery, this.neighborList.size: '
131
134
  + this.config.neighborList.getSize())
132
135
  return this.config.neighborList
@@ -1,31 +1,28 @@
1
1
  import { DiscoverySession } from './DiscoverySession'
2
- import { RemoteDhtNode } from '../RemoteDhtNode'
2
+ import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote'
3
3
  import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
4
4
  import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
5
5
  import { Logger, scheduleAtInterval, setAbortableTimeout } from '@streamr/utils'
6
6
  import KBucket from 'k-bucket'
7
7
  import { SortedContactList } from '../contact/SortedContactList'
8
8
  import { ConnectionManager } from '../../connection/ConnectionManager'
9
- import { PeerIDKey } from '../../helpers/PeerID'
10
9
  import { RoutingRpcCommunicator } from '../../transport/RoutingRpcCommunicator'
11
- import { RandomContactList } from '../contact/RandomContactList'
12
10
  import { createRandomKademliaId } from '../../helpers/kademliaId'
11
+ import { ServiceID } from '../../types/ServiceID'
13
12
 
14
13
  interface PeerDiscoveryConfig {
15
14
  rpcCommunicator: RoutingRpcCommunicator
16
- ownPeerDescriptor: PeerDescriptor
17
- bucket: KBucket<RemoteDhtNode>
18
- connections: Map<PeerIDKey, RemoteDhtNode>
19
- neighborList: SortedContactList<RemoteDhtNode>
20
- randomPeers: RandomContactList<RemoteDhtNode>
21
- openInternetPeers: SortedContactList<RemoteDhtNode>
15
+ localPeerDescriptor: PeerDescriptor
16
+ bucket: KBucket<DhtNodeRpcRemote>
17
+ neighborList: SortedContactList<DhtNodeRpcRemote>
22
18
  joinNoProgressLimit: number
23
19
  peerDiscoveryQueryBatchSize: number
24
- serviceId: string
20
+ serviceId: ServiceID
25
21
  parallelism: number
26
22
  joinTimeout: number
27
23
  addContact: (contact: PeerDescriptor, setActive?: boolean) => void
28
24
  connectionManager?: ConnectionManager
25
+ rpcRequestTimeout?: number
29
26
  }
30
27
 
31
28
  const logger = new Logger(module)
@@ -54,12 +51,12 @@ export class PeerDiscovery {
54
51
  `Joining ${this.config.serviceId === 'layer0' ? 'The Streamr Network' : `Control Layer for ${this.config.serviceId}`}`
55
52
  + ` via entrypoint ${keyFromPeerDescriptor(entryPointDescriptor)}`
56
53
  )
57
- if (areEqualPeerDescriptors(entryPointDescriptor, this.config.ownPeerDescriptor)) {
54
+ if (areEqualPeerDescriptors(entryPointDescriptor, this.config.localPeerDescriptor)) {
58
55
  return
59
56
  }
60
57
  this.config.connectionManager?.lockConnection(entryPointDescriptor, `${this.config.serviceId}::joinDht`)
61
58
  this.config.addContact(entryPointDescriptor)
62
- const targetId = peerIdFromPeerDescriptor(this.config.ownPeerDescriptor).value
59
+ const targetId = peerIdFromPeerDescriptor(this.config.localPeerDescriptor).value
63
60
  const closest = this.config.bucket.closest(targetId, this.config.peerDiscoveryQueryBatchSize)
64
61
  this.config.neighborList.addContacts(closest)
65
62
  const sessions = [this.createSession(targetId)]
@@ -76,12 +73,12 @@ export class PeerDiscovery {
76
73
  bucket: this.config.bucket,
77
74
  neighborList: this.config.neighborList,
78
75
  targetId,
79
- ownPeerDescriptor: this.config.ownPeerDescriptor,
76
+ localPeerDescriptor: this.config.localPeerDescriptor,
80
77
  serviceId: this.config.serviceId,
81
78
  rpcCommunicator: this.config.rpcCommunicator,
82
79
  parallelism: this.config.parallelism,
83
80
  noProgressLimit: this.config.joinNoProgressLimit,
84
- newContactListener: (newPeer: RemoteDhtNode) => this.config.addContact(newPeer.getPeerDescriptor())
81
+ newContactListener: (newPeer: DhtNodeRpcRemote) => this.config.addContact(newPeer.getPeerDescriptor())
85
82
  }
86
83
  return new DiscoverySession(sessionOptions)
87
84
  }
@@ -139,9 +136,9 @@ export class PeerDiscovery {
139
136
  if (this.isStopped()) {
140
137
  return
141
138
  }
142
- const nodes = this.config.bucket.closest(peerIdFromPeerDescriptor(this.config.ownPeerDescriptor).value, this.config.parallelism)
143
- await Promise.allSettled(nodes.map(async (peer: RemoteDhtNode) => {
144
- const contacts = await peer.getClosestPeers(this.config.ownPeerDescriptor.kademliaId)
139
+ const nodes = this.config.bucket.closest(peerIdFromPeerDescriptor(this.config.localPeerDescriptor).value, this.config.parallelism)
140
+ await Promise.allSettled(nodes.map(async (peer: DhtNodeRpcRemote) => {
141
+ const contacts = await peer.getClosestPeers(this.config.localPeerDescriptor.kademliaId)
145
142
  contacts.forEach((contact) => {
146
143
  this.config.addContact(contact)
147
144
  })
@@ -0,0 +1,35 @@
1
+ import { Logger } from '@streamr/utils'
2
+ import { PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
3
+ import { IFindRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
4
+ import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
5
+ import { createRouteMessageAck } from '../routing/RouterRpcLocal'
6
+ import { getPreviousPeer } from '../routing/getPreviousPeer'
7
+
8
+ const logger = new Logger(module)
9
+
10
+ interface FindRpcLocalConfig {
11
+ doRouteFindRequest: (routedMessage: RouteMessageWrapper) => RouteMessageAck
12
+ addContact: (contact: PeerDescriptor, setActive?: boolean) => void
13
+ isMostLikelyDuplicate: (requestId: string) => boolean
14
+ addToDuplicateDetector: (requestId: string) => void
15
+ }
16
+
17
+ export class FindRpcLocal implements IFindRpc {
18
+
19
+ private readonly config: FindRpcLocalConfig
20
+
21
+ constructor(config: FindRpcLocalConfig) {
22
+ this.config = config
23
+ }
24
+
25
+ async routeFindRequest(routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
26
+ if (this.config.isMostLikelyDuplicate(routedMessage.requestId)) {
27
+ return createRouteMessageAck(routedMessage, 'message given to routeFindRequest() service is likely a duplicate')
28
+ }
29
+ const senderKey = keyFromPeerDescriptor(getPreviousPeer(routedMessage) ?? routedMessage.sourcePeer!)
30
+ logger.trace(`Received routeFindRequest call from ${senderKey}`)
31
+ this.config.addContact(routedMessage.sourcePeer!, true)
32
+ this.config.addToDuplicateDetector(routedMessage.requestId)
33
+ return this.config.doRouteFindRequest(routedMessage)
34
+ }
35
+ }
@@ -1,36 +1,33 @@
1
- import { Logger } from '@streamr/utils'
2
1
  import EventEmitter from 'eventemitter3'
3
2
  import { PeerID, PeerIDKey } from '../../helpers/PeerID'
4
3
  import { DataEntry, PeerDescriptor, FindResponse } from '../../proto/packages/dht/protos/DhtRpc'
5
- import { IRecursiveFindSessionService } from '../../proto/packages/dht/protos/DhtRpc.server'
6
- import { Empty } from '../../proto/google/protobuf/empty'
7
4
  import { ITransport } from '../../transport/ITransport'
8
5
  import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
9
6
  import { Contact } from '../contact/Contact'
10
7
  import { SortedContactList } from '../contact/SortedContactList'
11
- import { RecursiveFindResult } from './RecursiveFinder'
8
+ import { FindResult } from './Finder'
12
9
  import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
+ import { ServiceID } from '../../types/ServiceID'
11
+ import { FindSessionRpcLocal } from './FindSessionRpcLocal'
13
12
 
14
- export interface RecursiveFindSessionEvents {
13
+ export interface FindSessionEvents {
15
14
  findCompleted: (results: PeerDescriptor[]) => void
16
15
  }
17
16
 
18
- const logger = new Logger(module)
19
-
20
- export interface RecursiveFindSessionConfig {
21
- serviceId: string
17
+ export interface FindSessionConfig {
18
+ serviceId: ServiceID
22
19
  transport: ITransport
23
20
  kademliaIdToFind: Uint8Array
24
- ownPeerId: PeerID
21
+ localPeerId: PeerID
25
22
  waitedRoutingPathCompletions: number
26
23
  fetchData: boolean
27
24
  }
28
25
 
29
- export class RecursiveFindSession extends EventEmitter<RecursiveFindSessionEvents> implements IRecursiveFindSessionService {
30
- private readonly serviceId: string
26
+ export class FindSession extends EventEmitter<FindSessionEvents> {
27
+ private readonly serviceId: ServiceID
31
28
  private readonly transport: ITransport
32
29
  private readonly kademliaIdToFind: Uint8Array
33
- private readonly ownPeerId: PeerID
30
+ private readonly localPeerId: PeerID
34
31
  private readonly waitedRoutingPathCompletions: number
35
32
  private readonly rpcCommunicator: ListeningRpcCommunicator
36
33
  private readonly fetchData: boolean
@@ -42,20 +39,29 @@ export class RecursiveFindSession extends EventEmitter<RecursiveFindSessionEvent
42
39
  private findCompletedEmitted = false
43
40
  private noCloserNodesReceivedCounter = 0
44
41
 
45
- constructor(config: RecursiveFindSessionConfig) {
42
+ constructor(config: FindSessionConfig) {
46
43
  super()
47
44
  this.serviceId = config.serviceId
48
45
  this.transport = config.transport
49
46
  this.kademliaIdToFind = config.kademliaIdToFind
50
- this.ownPeerId = config.ownPeerId
47
+ this.localPeerId = config.localPeerId
51
48
  this.waitedRoutingPathCompletions = config.waitedRoutingPathCompletions
52
49
  this.results = new SortedContactList(PeerID.fromValue(this.kademliaIdToFind), 10, undefined, true)
53
50
  this.fetchData = config.fetchData
54
51
  this.rpcCommunicator = new ListeningRpcCommunicator(this.serviceId, this.transport, {
55
52
  rpcRequestTimeout: 15000
56
53
  })
54
+ this.registerLocalRpcMethods()
55
+ }
56
+
57
+ private registerLocalRpcMethods() {
58
+ const rpcLocal = new FindSessionRpcLocal({
59
+ doSendFindResponse: (routingPath: PeerDescriptor[], nodes: PeerDescriptor[], dataEntries: DataEntry[], noCloserNodesFound?: boolean) => {
60
+ this.doSendFindResponse(routingPath, nodes, dataEntries, noCloserNodesFound)
61
+ }
62
+ })
57
63
  this.rpcCommunicator.registerRpcNotification(FindResponse, 'sendFindResponse',
58
- (req: FindResponse) => this.sendFindResponse(req))
64
+ (req: FindResponse) => rpcLocal.sendFindResponse(req))
59
65
  }
60
66
 
61
67
  private isFindCompleted(): boolean {
@@ -101,7 +107,7 @@ export class RecursiveFindSession extends EventEmitter<RecursiveFindSessionEvent
101
107
  private addKnownHops(routingPath: PeerDescriptor[]) {
102
108
  routingPath.forEach((desc) => {
103
109
  const newPeerId = PeerID.fromValue(desc.kademliaId)
104
- if (!this.ownPeerId.equals(newPeerId)) {
110
+ if (!this.localPeerId.equals(newPeerId)) {
105
111
  this.allKnownHops.add(newPeerId.toKey())
106
112
  }
107
113
  })
@@ -109,7 +115,7 @@ export class RecursiveFindSession extends EventEmitter<RecursiveFindSessionEvent
109
115
 
110
116
  private setHopAsReported(desc: PeerDescriptor) {
111
117
  const newPeerId = PeerID.fromValue(desc.kademliaId)
112
- if (!this.ownPeerId.equals(newPeerId)) {
118
+ if (!this.localPeerId.equals(newPeerId)) {
113
119
  this.reportedHops.add(newPeerId.toKey())
114
120
  }
115
121
  if (this.isFindCompleted()) {
@@ -156,13 +162,7 @@ export class RecursiveFindSession extends EventEmitter<RecursiveFindSessionEvent
156
162
  }
157
163
  }
158
164
 
159
- public async sendFindResponse(report: FindResponse): Promise<Empty> {
160
- logger.trace('recursiveFindReport arrived: ' + JSON.stringify(report))
161
- this.doSendFindResponse(report.routingPath, report.closestConnectedPeers, report.dataEntries, report.noCloserNodesFound)
162
- return {}
163
- }
164
-
165
- public getResults = (): RecursiveFindResult => ({
165
+ public getResults = (): FindResult => ({
166
166
  closestNodes: this.results.getAllContacts().map((contact) => contact.getPeerDescriptor()),
167
167
  dataEntries: (this.foundData && this.foundData.size > 0) ? Array.from(this.foundData.values()) : undefined
168
168
  })