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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/README.md +90 -8
  2. package/dist/package.json +70 -0
  3. package/dist/src/connection/Connection.d.ts +1 -0
  4. package/dist/src/connection/Connection.js +10 -3
  5. package/dist/src/connection/Connection.js.map +1 -1
  6. package/dist/src/connection/ConnectionLockHandler.d.ts +14 -14
  7. package/dist/src/connection/ConnectionLockHandler.js +22 -16
  8. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  9. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +3 -3
  10. package/dist/src/connection/ConnectionLockRpcLocal.js +7 -6
  11. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
  12. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -6
  13. package/dist/src/connection/ConnectionLockRpcRemote.js +10 -37
  14. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  15. package/dist/src/connection/ConnectionManager.d.ts +19 -20
  16. package/dist/src/connection/ConnectionManager.js +132 -117
  17. package/dist/src/connection/ConnectionManager.js.map +1 -1
  18. package/dist/src/connection/ConnectorFacade.d.ts +3 -2
  19. package/dist/src/connection/ConnectorFacade.js +10 -3
  20. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  21. package/dist/src/connection/Handshaker.d.ts +3 -1
  22. package/dist/src/connection/Handshaker.js +19 -10
  23. package/dist/src/connection/Handshaker.js.map +1 -1
  24. package/dist/src/connection/IConnection.d.ts +2 -7
  25. package/dist/src/connection/IConnection.js +1 -8
  26. package/dist/src/connection/IConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedConnection.d.ts +5 -7
  28. package/dist/src/connection/ManagedConnection.js +42 -26
  29. package/dist/src/connection/ManagedConnection.js.map +1 -1
  30. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -1
  31. package/dist/src/connection/connectivityChecker.d.ts +9 -0
  32. package/dist/src/connection/connectivityChecker.js +130 -0
  33. package/dist/src/connection/connectivityChecker.js.map +1 -0
  34. package/dist/src/connection/connectivityRequestHandler.d.ts +3 -0
  35. package/dist/src/connection/connectivityRequestHandler.js +101 -0
  36. package/dist/src/connection/connectivityRequestHandler.js.map +1 -0
  37. package/dist/src/connection/simulator/Simulator.d.ts +0 -3
  38. package/dist/src/connection/simulator/Simulator.js +34 -69
  39. package/dist/src/connection/simulator/Simulator.js.map +1 -1
  40. package/dist/src/connection/simulator/SimulatorConnection.js +27 -25
  41. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
  42. package/dist/src/connection/simulator/SimulatorConnector.js +16 -12
  43. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
  44. package/dist/src/connection/simulator/pings.js.map +1 -1
  45. package/dist/src/connection/webrtc/NodeWebrtcConnection.d.ts +2 -3
  46. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +40 -27
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +1 -2
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +36 -32
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +4 -2
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +28 -22
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  54. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.d.ts +3 -6
  55. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js +2 -5
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -1
  57. package/dist/src/connection/webrtc/iceServerAsString.js +1 -1
  58. package/dist/src/connection/webrtc/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +1 -2
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +6 -4
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -1
  62. package/dist/src/connection/websocket/ClientWebsocket.d.ts +1 -0
  63. package/dist/src/connection/websocket/ClientWebsocket.js +14 -7
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -1
  65. package/dist/src/connection/websocket/WebsocketConnector.d.ts +3 -9
  66. package/dist/src/connection/websocket/WebsocketConnector.js +142 -74
  67. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  68. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +5 -3
  69. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +9 -12
  70. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -1
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +4 -7
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js +7 -44
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -1
  74. package/dist/src/connection/websocket/WebsocketServer.d.ts +1 -4
  75. package/dist/src/connection/websocket/WebsocketServer.js +49 -40
  76. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  77. package/dist/src/connection/websocket/{ServerWebsocket.d.ts → WebsocketServerConnection.d.ts} +8 -4
  78. package/dist/src/connection/websocket/WebsocketServerConnection.js +97 -0
  79. package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +45 -49
  81. package/dist/src/dht/DhtNode.js +229 -317
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +10 -9
  84. package/dist/src/dht/DhtNodeRpcLocal.js +19 -11
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  86. package/dist/src/dht/DhtNodeRpcRemote.d.ts +15 -10
  87. package/dist/src/dht/DhtNodeRpcRemote.js +38 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -1
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +7 -6
  90. package/dist/src/dht/ExternalApiRpcLocal.js +9 -13
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +6 -5
  93. package/dist/src/dht/ExternalApiRpcRemote.js +10 -7
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/PeerManager.d.ts +61 -0
  96. package/dist/src/dht/PeerManager.js +288 -0
  97. package/dist/src/dht/PeerManager.js.map +1 -0
  98. package/dist/src/dht/contact/Contact.d.ts +2 -2
  99. package/dist/src/dht/contact/Contact.js +4 -3
  100. package/dist/src/dht/contact/Contact.js.map +1 -1
  101. package/dist/src/dht/contact/ContactList.d.ts +8 -8
  102. package/dist/src/dht/contact/ContactList.js +12 -7
  103. package/dist/src/dht/contact/ContactList.js.map +1 -1
  104. package/dist/src/dht/contact/RandomContactList.d.ts +4 -4
  105. package/dist/src/dht/contact/RandomContactList.js +13 -12
  106. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  107. package/dist/src/dht/contact/RingContactList.d.ts +31 -0
  108. package/dist/src/dht/contact/RingContactList.js +133 -0
  109. package/dist/src/dht/contact/RingContactList.js.map +1 -0
  110. package/dist/src/dht/contact/{Remote.d.ts → RpcRemote.d.ts} +8 -7
  111. package/dist/src/dht/contact/{Remote.js → RpcRemote.js} +16 -13
  112. package/dist/src/dht/contact/RpcRemote.js.map +1 -0
  113. package/dist/src/dht/contact/SortedContactList.d.ts +29 -15
  114. package/dist/src/dht/contact/SortedContactList.js +79 -42
  115. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  116. package/dist/src/dht/contact/ringIdentifiers.d.ts +16 -0
  117. package/dist/src/dht/contact/ringIdentifiers.js +54 -0
  118. package/dist/src/dht/contact/ringIdentifiers.js.map +1 -0
  119. package/dist/src/dht/discovery/DiscoverySession.d.ts +8 -18
  120. package/dist/src/dht/discovery/DiscoverySession.js +32 -48
  121. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  122. package/dist/src/dht/discovery/PeerDiscovery.d.ts +16 -12
  123. package/dist/src/dht/discovery/PeerDiscovery.js +82 -39
  124. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  125. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +29 -0
  126. package/dist/src/dht/discovery/RingDiscoverySession.js +123 -0
  127. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -0
  128. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +36 -0
  129. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +166 -0
  130. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -0
  131. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.d.ts +14 -0
  132. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js +26 -0
  133. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js.map +1 -0
  134. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.d.ts +6 -0
  135. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js +44 -0
  136. package/dist/src/dht/recursive-operation/RecursiveOperationRpcRemote.js.map +1 -0
  137. package/dist/src/dht/recursive-operation/RecursiveOperationSession.d.ts +44 -0
  138. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +187 -0
  139. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -0
  140. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.d.ts +14 -0
  141. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js +20 -0
  142. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js.map +1 -0
  143. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.d.ts +6 -0
  144. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js +21 -0
  145. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.js.map +1 -0
  146. package/dist/src/dht/routing/DuplicateDetector.d.ts +2 -4
  147. package/dist/src/dht/routing/DuplicateDetector.js +10 -15
  148. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  149. package/dist/src/dht/routing/Router.d.ts +11 -27
  150. package/dist/src/dht/routing/Router.js +92 -58
  151. package/dist/src/dht/routing/Router.js.map +1 -1
  152. package/dist/src/dht/routing/RouterRpcLocal.d.ts +3 -4
  153. package/dist/src/dht/routing/RouterRpcLocal.js +17 -16
  154. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
  155. package/dist/src/dht/routing/RouterRpcRemote.d.ts +3 -3
  156. package/dist/src/dht/routing/RouterRpcRemote.js +29 -20
  157. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  158. package/dist/src/dht/routing/RoutingSession.d.ts +29 -21
  159. package/dist/src/dht/routing/RoutingSession.js +93 -68
  160. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  161. package/dist/src/dht/routing/RoutingTablesCache.d.ts +24 -0
  162. package/dist/src/dht/routing/RoutingTablesCache.js +46 -0
  163. package/dist/src/dht/routing/RoutingTablesCache.js.map +1 -0
  164. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -1
  165. package/dist/src/dht/store/LocalDataStore.d.ts +9 -14
  166. package/dist/src/dht/store/LocalDataStore.js +46 -72
  167. package/dist/src/dht/store/LocalDataStore.js.map +1 -1
  168. package/dist/src/dht/store/StoreManager.d.ts +33 -0
  169. package/dist/src/dht/store/StoreManager.js +182 -0
  170. package/dist/src/dht/store/StoreManager.js.map +1 -0
  171. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -41
  172. package/dist/src/dht/store/StoreRpcLocal.js +27 -234
  173. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  174. package/dist/src/dht/store/StoreRpcRemote.d.ts +6 -7
  175. package/dist/src/dht/store/StoreRpcRemote.js +10 -20
  176. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  177. package/dist/src/exports.d.ts +5 -3
  178. package/dist/src/exports.js +10 -8
  179. package/dist/src/exports.js.map +1 -1
  180. package/dist/src/helpers/AddressTools.js +2 -0
  181. package/dist/src/helpers/AddressTools.js.map +1 -1
  182. package/dist/src/helpers/Connectivity.js.map +1 -1
  183. package/dist/src/helpers/MapWithTtl.d.ts +14 -0
  184. package/dist/src/helpers/MapWithTtl.js +60 -0
  185. package/dist/src/helpers/MapWithTtl.js.map +1 -0
  186. package/dist/src/helpers/createPeerDescriptor.d.ts +3 -0
  187. package/dist/src/helpers/createPeerDescriptor.js +57 -0
  188. package/dist/src/helpers/createPeerDescriptor.js.map +1 -0
  189. package/dist/src/helpers/createPeerDescriptorSignaturePayload.d.ts +2 -0
  190. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js +30 -0
  191. package/dist/src/helpers/createPeerDescriptorSignaturePayload.js.map +1 -0
  192. package/dist/src/helpers/debugHelpers.js.map +1 -1
  193. package/dist/src/helpers/errors.js +2 -0
  194. package/dist/src/helpers/errors.js.map +1 -1
  195. package/dist/src/helpers/offering.d.ts +4 -0
  196. package/dist/src/helpers/offering.js +18 -0
  197. package/dist/src/helpers/offering.js.map +1 -0
  198. package/dist/src/helpers/protoClasses.js +2 -3
  199. package/dist/src/helpers/protoClasses.js.map +1 -1
  200. package/dist/src/helpers/protoToString.js.map +1 -1
  201. package/dist/src/helpers/version.d.ts +6 -0
  202. package/dist/src/helpers/version.js +38 -0
  203. package/dist/src/helpers/version.js.map +1 -0
  204. package/dist/src/identifiers.d.ts +10 -0
  205. package/dist/src/identifiers.js +31 -0
  206. package/dist/src/identifiers.js.map +1 -0
  207. package/dist/src/proto/google/protobuf/any.js +8 -8
  208. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  209. package/dist/src/proto/google/protobuf/empty.js +2 -4
  210. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  211. package/dist/src/proto/google/protobuf/timestamp.js +10 -10
  212. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  213. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +46 -49
  214. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +63 -54
  215. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  216. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +226 -232
  217. package/dist/src/proto/packages/dht/protos/DhtRpc.js +146 -168
  218. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  219. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -29
  220. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  221. package/dist/src/rpc-protocol/DhtCallContext.d.ts +2 -2
  222. package/dist/src/rpc-protocol/DhtCallContext.js +8 -0
  223. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  224. package/dist/src/rpc-protocol/DhtRpcOptions.d.ts +2 -1
  225. package/dist/src/transport/ITransport.d.ts +10 -2
  226. package/dist/src/transport/ITransport.js +5 -0
  227. package/dist/src/transport/ITransport.js.map +1 -1
  228. package/dist/src/transport/ListeningRpcCommunicator.js +3 -1
  229. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  230. package/dist/src/transport/RoutingRpcCommunicator.d.ts +4 -2
  231. package/dist/src/transport/RoutingRpcCommunicator.js +19 -12
  232. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  233. package/jest.config.js +4 -1
  234. package/karma-setup.js +2 -0
  235. package/karma.config.js +13 -9
  236. package/package.json +17 -14
  237. package/protos/DhtRpc.proto +76 -76
  238. package/src/connection/Connection.ts +6 -1
  239. package/src/connection/ConnectionLockHandler.ts +30 -22
  240. package/src/connection/ConnectionLockRpcLocal.ts +7 -12
  241. package/src/connection/ConnectionLockRpcRemote.ts +9 -19
  242. package/src/connection/ConnectionManager.ts +132 -138
  243. package/src/connection/ConnectorFacade.ts +10 -9
  244. package/src/connection/Handshaker.ts +24 -12
  245. package/src/connection/IConnection.ts +2 -8
  246. package/src/connection/ManagedConnection.ts +34 -35
  247. package/src/connection/connectivityChecker.ts +109 -0
  248. package/src/connection/connectivityRequestHandler.ts +103 -0
  249. package/src/connection/simulator/Simulator.ts +6 -37
  250. package/src/connection/simulator/SimulatorConnection.ts +23 -25
  251. package/src/connection/simulator/SimulatorConnector.ts +11 -11
  252. package/src/connection/webrtc/BrowserWebrtcConnection.ts +17 -25
  253. package/src/connection/webrtc/NodeWebrtcConnection.ts +25 -27
  254. package/src/connection/webrtc/WebrtcConnector.ts +31 -36
  255. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +31 -25
  256. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +4 -14
  257. package/src/connection/webrtc/iceServerAsString.ts +1 -1
  258. package/src/connection/websocket/AutoCertifierClientFacade.ts +4 -6
  259. package/src/connection/websocket/ClientWebsocket.ts +10 -4
  260. package/src/connection/websocket/WebsocketConnector.ts +120 -97
  261. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +13 -15
  262. package/src/connection/websocket/WebsocketConnectorRpcRemote.ts +7 -27
  263. package/src/connection/websocket/WebsocketServer.ts +50 -53
  264. package/src/connection/websocket/WebsocketServerConnection.ts +104 -0
  265. package/src/dht/DhtNode.ts +289 -410
  266. package/src/dht/DhtNodeRpcLocal.ts +25 -17
  267. package/src/dht/DhtNodeRpcRemote.ts +43 -27
  268. package/src/dht/ExternalApiRpcLocal.ts +30 -17
  269. package/src/dht/ExternalApiRpcRemote.ts +14 -11
  270. package/src/dht/PeerManager.ts +339 -0
  271. package/src/dht/contact/Contact.ts +4 -4
  272. package/src/dht/contact/ContactList.ts +11 -10
  273. package/src/dht/contact/RandomContactList.ts +15 -15
  274. package/src/dht/contact/RingContactList.ts +151 -0
  275. package/src/dht/contact/{Remote.ts → RpcRemote.ts} +16 -19
  276. package/src/dht/contact/SortedContactList.ts +120 -72
  277. package/src/dht/contact/ringIdentifiers.ts +62 -0
  278. package/src/dht/discovery/DiscoverySession.ts +36 -61
  279. package/src/dht/discovery/PeerDiscovery.ts +98 -43
  280. package/src/dht/discovery/RingDiscoverySession.ts +160 -0
  281. package/src/dht/recursive-operation/RecursiveOperationManager.ts +246 -0
  282. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +34 -0
  283. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +43 -0
  284. package/src/dht/recursive-operation/RecursiveOperationSession.ts +232 -0
  285. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +35 -0
  286. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +30 -0
  287. package/src/dht/routing/DuplicateDetector.ts +9 -21
  288. package/src/dht/routing/Router.ts +95 -92
  289. package/src/dht/routing/RouterRpcLocal.ts +16 -18
  290. package/src/dht/routing/RouterRpcRemote.ts +26 -24
  291. package/src/dht/routing/RoutingSession.ts +119 -98
  292. package/src/dht/routing/RoutingTablesCache.ts +58 -0
  293. package/src/dht/routing/getPreviousPeer.ts +1 -1
  294. package/src/dht/store/LocalDataStore.ts +47 -77
  295. package/src/dht/store/StoreManager.ts +209 -0
  296. package/src/dht/store/StoreRpcLocal.ts +39 -308
  297. package/src/dht/store/StoreRpcRemote.ts +13 -31
  298. package/src/exports.ts +13 -3
  299. package/src/helpers/AddressTools.ts +2 -0
  300. package/src/helpers/MapWithTtl.ts +71 -0
  301. package/src/helpers/createPeerDescriptor.ts +57 -0
  302. package/src/helpers/createPeerDescriptorSignaturePayload.ts +28 -0
  303. package/src/helpers/offering.ts +15 -0
  304. package/src/helpers/protoClasses.ts +4 -6
  305. package/src/helpers/version.ts +32 -0
  306. package/src/identifiers.ts +29 -0
  307. package/src/proto/google/protobuf/any.ts +4 -4
  308. package/src/proto/google/protobuf/empty.ts +2 -4
  309. package/src/proto/google/protobuf/timestamp.ts +4 -4
  310. package/src/proto/packages/dht/protos/DhtRpc.client.ts +65 -68
  311. package/src/proto/packages/dht/protos/DhtRpc.server.ts +27 -30
  312. package/src/proto/packages/dht/protos/DhtRpc.ts +297 -313
  313. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  314. package/src/rpc-protocol/DhtCallContext.ts +2 -2
  315. package/src/rpc-protocol/DhtRpcOptions.ts +2 -1
  316. package/src/transport/ITransport.ts +11 -2
  317. package/src/transport/ListeningRpcCommunicator.ts +1 -1
  318. package/src/transport/RoutingRpcCommunicator.ts +21 -14
  319. package/test/RandomGraphSimulation.ts +3 -2
  320. package/test/benchmark/Find.test.ts +13 -28
  321. package/test/benchmark/KademliaCorrectness.test.ts +24 -28
  322. package/test/benchmark/RingCorrectness.test.ts +157 -0
  323. package/test/benchmark/SortedContactListBenchmark.test.ts +151 -0
  324. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +41 -0
  325. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +72 -0
  326. package/test/benchmark/kademlia-simulation/Contact.ts +9 -9
  327. package/test/benchmark/kademlia-simulation/KademliaSimulation.ts +11 -11
  328. package/test/benchmark/kademlia-simulation/SimulationNode.ts +29 -25
  329. package/test/data/generateGroundTruthData.ts +7 -6
  330. package/test/end-to-end/Layer0-Layer1.test.ts +11 -15
  331. package/test/end-to-end/Layer0.test.ts +19 -22
  332. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +19 -21
  333. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +26 -28
  334. package/test/end-to-end/Layer0Webrtc.test.ts +19 -19
  335. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +10 -18
  336. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +8 -15
  337. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +2 -2
  338. package/test/end-to-end/WebsocketConnectionRequest.test.ts +8 -9
  339. package/test/end-to-end/memory-leak.test.ts +19 -24
  340. package/test/integration/ConnectionLocking.test.ts +66 -60
  341. package/test/integration/ConnectionManager.test.ts +43 -63
  342. package/test/integration/ConnectivityChecking.test.ts +52 -0
  343. package/test/integration/DhtJoinPeerDiscovery.test.ts +8 -12
  344. package/test/integration/DhtNodeExternalAPI.test.ts +17 -21
  345. package/test/integration/DhtNodeRpcRemote.test.ts +19 -26
  346. package/test/integration/DhtRpc.test.ts +20 -24
  347. package/test/integration/Find.test.ts +10 -12
  348. package/test/integration/Layer1-scale.test.ts +25 -37
  349. package/test/integration/Mock-Layer1-Layer0.test.ts +39 -59
  350. package/test/integration/MultipleEntryPointJoining.test.ts +14 -14
  351. package/test/integration/ReplicateData.test.ts +106 -0
  352. package/test/integration/RouteMessage.test.ts +42 -68
  353. package/test/integration/RouterRpcRemote.test.ts +19 -24
  354. package/test/integration/ScaleDownDht.test.ts +14 -12
  355. package/test/integration/SimultaneousConnections.test.ts +112 -111
  356. package/test/integration/Store.test.ts +43 -27
  357. package/test/integration/StoreAndDelete.test.ts +36 -48
  358. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +59 -0
  359. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +17 -37
  360. package/test/integration/StoreRpcRemote.test.ts +20 -32
  361. package/test/integration/WebrtcConnectionManagement.test.ts +39 -25
  362. package/test/integration/WebrtcConnectorRpc.test.ts +6 -11
  363. package/test/integration/WebsocketConnectionManagement.test.ts +87 -22
  364. package/test/integration/WebsocketConnectorRpc.test.ts +14 -24
  365. package/test/integration/{RpcErrors.test.ts → rpc-connections-over-webrpc.test.ts} +15 -26
  366. package/test/unit/AddressTools.test.ts +4 -0
  367. package/test/unit/ConnectivityHelpers.test.ts +9 -17
  368. package/test/unit/DuplicateDetector.test.ts +8 -5
  369. package/test/unit/LocalDataStore.test.ts +78 -75
  370. package/test/unit/PeerManager.test.ts +33 -0
  371. package/test/unit/RandomContactList.test.ts +12 -9
  372. package/test/unit/RecursiveOperationManager.test.ts +157 -0
  373. package/test/unit/RecursiveOperationSession.test.ts +68 -0
  374. package/test/unit/Router.test.ts +52 -35
  375. package/test/unit/RoutingSession.test.ts +79 -0
  376. package/test/unit/SortedContactList.test.ts +61 -30
  377. package/test/unit/StoreManager.test.ts +138 -0
  378. package/test/unit/WebsocketConnector.test.ts +27 -35
  379. package/test/unit/connectivityRequestHandler.test.ts +104 -0
  380. package/test/unit/createPeerDescriptor.test.ts +69 -0
  381. package/test/unit/customMatchers.test.ts +16 -0
  382. package/test/unit/version.test.ts +18 -0
  383. package/test/utils/FakeTransport.ts +47 -0
  384. package/test/utils/customMatchers.ts +71 -0
  385. package/test/utils/mock/MockRpcCommunicator.ts +7 -0
  386. package/test/utils/mock/Router.ts +13 -3
  387. package/test/utils/mock/Transport.ts +1 -1
  388. package/test/utils/mock/mockDataEntry.ts +38 -0
  389. package/test/utils/utils.ts +104 -107
  390. package/tsconfig.browser.json +2 -1
  391. package/tsconfig.jest.json +4 -2
  392. package/tsconfig.node.json +4 -2
  393. package/dist/src/connection/ConnectivityChecker.d.ts +0 -17
  394. package/dist/src/connection/ConnectivityChecker.js +0 -208
  395. package/dist/src/connection/ConnectivityChecker.js.map +0 -1
  396. package/dist/src/connection/websocket/ServerWebsocket.js +0 -100
  397. package/dist/src/connection/websocket/ServerWebsocket.js.map +0 -1
  398. package/dist/src/dht/contact/Remote.js.map +0 -1
  399. package/dist/src/dht/find/FindRpcLocal.d.ts +0 -14
  400. package/dist/src/dht/find/FindRpcLocal.js +0 -25
  401. package/dist/src/dht/find/FindRpcLocal.js.map +0 -1
  402. package/dist/src/dht/find/FindSession.d.ts +0 -44
  403. package/dist/src/dht/find/FindSession.js +0 -145
  404. package/dist/src/dht/find/FindSession.js.map +0 -1
  405. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +0 -12
  406. package/dist/src/dht/find/FindSessionRpcLocal.js +0 -17
  407. package/dist/src/dht/find/FindSessionRpcLocal.js.map +0 -1
  408. package/dist/src/dht/find/FindSessionRpcRemote.d.ts +0 -6
  409. package/dist/src/dht/find/FindSessionRpcRemote.js +0 -21
  410. package/dist/src/dht/find/FindSessionRpcRemote.js.map +0 -1
  411. package/dist/src/dht/find/Finder.d.ts +0 -49
  412. package/dist/src/dht/find/Finder.js +0 -184
  413. package/dist/src/dht/find/Finder.js.map +0 -1
  414. package/dist/src/dht/routing/FindRpcRemote.d.ts +0 -6
  415. package/dist/src/dht/routing/FindRpcRemote.js +0 -41
  416. package/dist/src/dht/routing/FindRpcRemote.js.map +0 -1
  417. package/dist/src/helpers/PeerID.d.ts +0 -24
  418. package/dist/src/helpers/PeerID.js +0 -78
  419. package/dist/src/helpers/PeerID.js.map +0 -1
  420. package/dist/src/helpers/UUID.d.ts +0 -8
  421. package/dist/src/helpers/UUID.js +0 -36
  422. package/dist/src/helpers/UUID.js.map +0 -1
  423. package/dist/src/helpers/kademliaId.d.ts +0 -1
  424. package/dist/src/helpers/kademliaId.js +0 -14
  425. package/dist/src/helpers/kademliaId.js.map +0 -1
  426. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +0 -6
  427. package/dist/src/helpers/peerIdFromPeerDescriptor.js +0 -23
  428. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +0 -1
  429. package/src/connection/ConnectivityChecker.ts +0 -199
  430. package/src/connection/websocket/ServerWebsocket.ts +0 -114
  431. package/src/dht/find/FindRpcLocal.ts +0 -35
  432. package/src/dht/find/FindSession.ts +0 -178
  433. package/src/dht/find/FindSessionRpcLocal.ts +0 -25
  434. package/src/dht/find/FindSessionRpcRemote.ts +0 -30
  435. package/src/dht/find/Finder.ts +0 -275
  436. package/src/dht/routing/FindRpcRemote.ts +0 -40
  437. package/src/helpers/PeerID.ts +0 -88
  438. package/src/helpers/UUID.ts +0 -35
  439. package/src/helpers/kademliaId.ts +0 -8
  440. package/src/helpers/peerIdFromPeerDescriptor.ts +0 -20
  441. package/test/integration/MigrateData.test.ts +0 -204
  442. package/test/unit/Finder.test.ts +0 -110
  443. package/test/unit/PeerID.test.ts +0 -22
  444. package/test/unit/UUID.test.ts +0 -55
@@ -1,199 +0,0 @@
1
- import {
2
- ConnectivityRequest, ConnectivityResponse,
3
- Message, MessageType, PeerDescriptor
4
- } from '../proto/packages/dht/protos/DhtRpc'
5
- import { ConnectionEvents, IConnection } from './IConnection'
6
- import { Logger, runAndRaceEvents3, RunAndRaceEventsReturnType } from '@streamr/utils'
7
- import * as Err from '../helpers/errors'
8
- import { ClientWebsocket } from './websocket/ClientWebsocket'
9
- import { v4 } from 'uuid'
10
- import { NatType } from './ConnectionManager'
11
- import { ServerWebsocket } from './websocket/ServerWebsocket'
12
- import { connectivityMethodToWebsocketUrl } from './websocket/WebsocketConnector'
13
-
14
- const logger = new Logger(module)
15
-
16
- // Class for handling both client and server side of the connectivity
17
- // checks. This is attached to all ServerWebsockets to listen to
18
- // ConnectivityRequest messages.
19
-
20
- export class ConnectivityChecker {
21
-
22
- private static readonly CONNECTIVITY_CHECKER_SERVICE_ID = 'system/connectivity-checker'
23
- private static readonly CONNECTIVITY_CHECKER_TIMEOUT = 5000
24
- private destroyed = false
25
- private readonly websocketPort: number
26
- private readonly tls: boolean
27
- private host?: string
28
-
29
- constructor(websocketPort: number, tls: boolean, host?: string) {
30
- this.websocketPort = websocketPort
31
- this.tls = tls
32
- this.host = host
33
- }
34
-
35
- public async sendConnectivityRequest(entryPoint: PeerDescriptor, selfSigned: boolean): Promise<ConnectivityResponse> {
36
- if (this.destroyed) {
37
- throw new Err.ConnectionFailed('ConnectivityChecker is destroyed')
38
- }
39
- let outgoingConnection: IConnection
40
- const wsServerInfo = {
41
- host: entryPoint.websocket!.host,
42
- port: entryPoint.websocket!.port,
43
- tls: entryPoint.websocket!.tls,
44
- }
45
- const url = connectivityMethodToWebsocketUrl(wsServerInfo, 'connectivityRequest')
46
- try {
47
- outgoingConnection = await this.connectAsync({
48
- url,
49
- selfSigned
50
- })
51
- } catch (e) {
52
- throw new Err.ConnectionFailed(`Failed to connect to the entrypoint ${url}`, e)
53
- }
54
- // send connectivity request
55
- const connectivityRequestMessage: ConnectivityRequest = { port: this.websocketPort, host: this.host, tls: this.tls, selfSigned }
56
- const msg: Message = {
57
- serviceId: ConnectivityChecker.CONNECTIVITY_CHECKER_SERVICE_ID,
58
- messageType: MessageType.CONNECTIVITY_REQUEST, messageId: v4(),
59
- body: {
60
- oneofKind: 'connectivityRequest',
61
- connectivityRequest: connectivityRequestMessage
62
- }
63
- }
64
- const responseAwaiter = () => {
65
- return new Promise((resolve: (res: ConnectivityResponse) => void, reject) => {
66
- const timeoutId = setTimeout(() => {
67
- outgoingConnection.close(false)
68
- reject(new Err.ConnectivityResponseTimeout('timeout'))
69
- }, ConnectivityChecker.CONNECTIVITY_CHECKER_TIMEOUT)
70
- const listener = (bytes: Uint8Array) => {
71
- outgoingConnection.close(false)
72
- try {
73
- const message: Message = Message.fromBinary(bytes)
74
- if (message.body.oneofKind === 'connectivityResponse') {
75
- logger.trace('ConnectivityResponse received: ' + JSON.stringify(Message.toJson(message)))
76
- const connectivityResponseMessage = message.body.connectivityResponse
77
- outgoingConnection!.off('data', listener)
78
- clearTimeout(timeoutId)
79
- resolve(connectivityResponseMessage)
80
- } else {
81
- return
82
- }
83
- } catch (err) {
84
- logger.trace(`Could not parse message: ${err}`)
85
- }
86
- }
87
- outgoingConnection!.on('data', listener)
88
- })
89
- }
90
- try {
91
- const retPromise = responseAwaiter()
92
- outgoingConnection.send(Message.toBinary(msg))
93
- logger.trace('ConnectivityRequest sent: ' + JSON.stringify(Message.toJson(msg)))
94
- return await retPromise
95
- } catch (e) {
96
- logger.error('error getting connectivityresponse')
97
- throw e
98
- }
99
- }
100
-
101
- public setHost(hostName: string): void {
102
- this.host = hostName
103
- }
104
-
105
- public listenToIncomingConnectivityRequests(connectionToListenTo: ServerWebsocket): void {
106
- connectionToListenTo.on('data', (data: Uint8Array) => {
107
- logger.trace('server received data')
108
- try {
109
- const message = Message.fromBinary(data)
110
- if (message.body.oneofKind === 'connectivityRequest') {
111
- logger.trace('ConnectivityRequest received: ' + JSON.stringify(Message.toJson(message)))
112
- this.handleIncomingConnectivityRequest(connectionToListenTo, message.body.connectivityRequest).then(() => {
113
- logger.trace('handleIncomingConnectivityRequest ok')
114
- return
115
- }).catch((e) => {
116
- logger.error('handleIncomingConnectivityRequest' + e)
117
- })
118
- }
119
- } catch (err) {
120
- logger.trace(`Could not parse message: ${err}`)
121
- }
122
-
123
- })
124
- }
125
-
126
- private async handleIncomingConnectivityRequest(
127
- connection: ServerWebsocket,
128
- connectivityRequest: ConnectivityRequest
129
- ): Promise<void> {
130
- if (this.destroyed) {
131
- return
132
- }
133
- let outgoingConnection: IConnection | undefined
134
- let connectivityResponseMessage: ConnectivityResponse | undefined
135
- const host = connectivityRequest.host ?? connection.getRemoteAddress()
136
- try {
137
- const wsServerInfo = {
138
- host,
139
- port: connectivityRequest.port,
140
- tls: connectivityRequest.tls
141
- }
142
- const url = connectivityMethodToWebsocketUrl(wsServerInfo, 'connectivityProbe')
143
- logger.trace(`Attempting Connectivity Check to ${url}`)
144
- outgoingConnection = await this.connectAsync({
145
- url,
146
- selfSigned: connectivityRequest.selfSigned
147
- })
148
- } catch (err) {
149
- logger.debug('error', { err })
150
- connectivityResponseMessage = {
151
- host,
152
- natType: NatType.UNKNOWN
153
- }
154
- }
155
- if (outgoingConnection) {
156
- outgoingConnection.close(false)
157
- logger.trace('Connectivity test produced positive result, communicating reply to the requester ' + host + ':' + connectivityRequest.port)
158
- connectivityResponseMessage = {
159
- host,
160
- natType: NatType.OPEN_INTERNET,
161
- websocket: { host, port: connectivityRequest.port, tls: connectivityRequest.tls }
162
- }
163
- }
164
- const msg: Message = {
165
- serviceId: ConnectivityChecker.CONNECTIVITY_CHECKER_SERVICE_ID,
166
- messageType: MessageType.CONNECTIVITY_RESPONSE, messageId: v4(),
167
- body: {
168
- oneofKind: 'connectivityResponse',
169
- connectivityResponse: connectivityResponseMessage!
170
- }
171
- }
172
- connection.send(Message.toBinary(msg))
173
- logger.trace('ConnectivityResponse sent: ' + JSON.stringify(Message.toJson(msg)))
174
- }
175
-
176
- // eslint-disable-next-line class-methods-use-this
177
- private async connectAsync({ url, selfSigned, timeoutMs = 1000, }:
178
- { url: string, selfSigned: boolean, timeoutMs?: number }
179
- ): Promise<IConnection> {
180
- const socket = new ClientWebsocket()
181
- let result: RunAndRaceEventsReturnType<ConnectionEvents>
182
- try {
183
- result = await runAndRaceEvents3<ConnectionEvents>([
184
- () => { socket.connect(url, selfSigned) }],
185
- socket, ['connected', 'error'],
186
- timeoutMs)
187
- } catch (e) {
188
- throw (new Err.ConnectionFailed('WebSocket connection timed out'))
189
- }
190
- if (result.winnerName === 'error') {
191
- throw (new Err.ConnectionFailed('Could not open WebSocket connection'))
192
- }
193
- return socket
194
- }
195
-
196
- public destroy(): void {
197
- this.destroyed = true
198
- }
199
- }
@@ -1,114 +0,0 @@
1
- import EventEmitter from 'eventemitter3'
2
- import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
3
- import { connection as WsConnection } from 'websocket'
4
- import { Logger } from '@streamr/utils'
5
- import { Url } from 'url'
6
- import { GOING_AWAY } from './ClientWebsocket'
7
-
8
- const logger = new Logger(module)
9
-
10
- // NodeJsBuffer is global defined in preload.js of Karma
11
- // It is used to make Karma/Electron tests to use the NodeJS
12
- // implementation of Buffer instead of the browser polyfill
13
-
14
- declare let NodeJsBuffer: BufferConstructor
15
-
16
- enum MessageType {
17
- UTF8 = 'utf8',
18
- BINARY = 'binary'
19
- }
20
-
21
- export class ServerWebsocket extends EventEmitter<ConnectionEvents> implements IConnection {
22
-
23
- public readonly connectionId: ConnectionID
24
- public readonly connectionType = ConnectionType.WEBSOCKET_SERVER
25
- public readonly resourceURL: Url
26
- private socket?: WsConnection
27
- private stopped = false
28
-
29
- constructor(socket: WsConnection, resourceURL: Url) {
30
- super()
31
-
32
- this.resourceURL = resourceURL
33
- this.connectionId = new ConnectionID()
34
-
35
- socket.on('message', (message) => {
36
- logger.trace('ServerWebsocket::onMessage')
37
- if (message.type === MessageType.UTF8) {
38
- logger.debug('Received string Message: ' + message.utf8Data)
39
- } else if (message.type === MessageType.BINARY) {
40
- logger.trace('Received Binary Message of ' + message.binaryData.length + ' bytes')
41
- this.emit('data',
42
- new Uint8Array(message.binaryData.buffer, message.binaryData.byteOffset,
43
- message.binaryData.byteLength / Uint8Array.BYTES_PER_ELEMENT))
44
- }
45
- })
46
- socket.on('close', (reasonCode, description) => {
47
- logger.trace('Peer ' + socket.remoteAddress + ' disconnected.')
48
- this.doDisconnect(reasonCode, description)
49
- })
50
-
51
- socket.on('error', (error) => {
52
- this.emit('error', error.name)
53
- })
54
-
55
- this.socket = socket
56
- }
57
-
58
- private doDisconnect(reasonCode: number, description: string): void {
59
- this.stopped = true
60
- this.socket?.removeAllListeners()
61
- this.socket = undefined
62
- const gracefulLeave = reasonCode === GOING_AWAY
63
- this.emit('disconnected', gracefulLeave, reasonCode, description)
64
- }
65
-
66
- public send(data: Uint8Array): void {
67
- // If in an Karma / Electron test, use the NodeJS implementation
68
- // of Buffer instead of the browser polyfill
69
-
70
- if (!this.stopped && this.socket) {
71
- if (typeof NodeJsBuffer !== 'undefined') {
72
- this.socket.sendBytes(NodeJsBuffer.from(data))
73
- } else {
74
- this.socket.sendBytes(Buffer.from(data))
75
- }
76
- } else {
77
- logger.debug('Tried to call send() on a stopped socket')
78
- }
79
-
80
- }
81
-
82
- public async close(gracefulLeave: boolean): Promise<void> {
83
- this.emit('disconnected', gracefulLeave, undefined, 'close() called')
84
- this.removeAllListeners()
85
- if (!this.stopped) {
86
- this.socket?.close(gracefulLeave === true ? GOING_AWAY : undefined)
87
- } else {
88
- logger.debug('Tried to close a stopped connection')
89
- }
90
- }
91
-
92
- public destroy(): void {
93
- if (!this.stopped) {
94
- this.removeAllListeners()
95
- if (this.socket) {
96
- this.socket.removeAllListeners()
97
- this.socket.close()
98
- this.socket = undefined
99
- }
100
- this.stopped = true
101
- } else {
102
- logger.debug('Tried to destroy() a stopped connection')
103
- }
104
- }
105
-
106
- public getRemoteAddress(): string {
107
- if (!this.stopped && this.socket) {
108
- return this.socket.remoteAddress
109
- } else {
110
- logger.error('Tried to get the remoteAddress of a stopped connection')
111
- return ''
112
- }
113
- }
114
- }
@@ -1,35 +0,0 @@
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 { getNodeIdFromPeerDescriptor } 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 senderId = getNodeIdFromPeerDescriptor(getPreviousPeer(routedMessage) ?? routedMessage.sourcePeer!)
30
- logger.trace(`Received routeFindRequest call from ${senderId}`)
31
- this.config.addContact(routedMessage.sourcePeer!, true)
32
- this.config.addToDuplicateDetector(routedMessage.requestId)
33
- return this.config.doRouteFindRequest(routedMessage)
34
- }
35
- }
@@ -1,178 +0,0 @@
1
- import EventEmitter from 'eventemitter3'
2
- import { PeerID, PeerIDKey } from '../../helpers/PeerID'
3
- import { DataEntry, PeerDescriptor, FindResponse } from '../../proto/packages/dht/protos/DhtRpc'
4
- import { ITransport } from '../../transport/ITransport'
5
- import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
6
- import { Contact } from '../contact/Contact'
7
- import { SortedContactList } from '../contact/SortedContactList'
8
- import { FindResult } from './Finder'
9
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
- import { ServiceID } from '../../types/ServiceID'
11
- import { FindSessionRpcLocal } from './FindSessionRpcLocal'
12
-
13
- export interface FindSessionEvents {
14
- findCompleted: (results: PeerDescriptor[]) => void
15
- }
16
-
17
- export interface FindSessionConfig {
18
- serviceId: ServiceID
19
- transport: ITransport
20
- kademliaIdToFind: Uint8Array
21
- localPeerId: PeerID
22
- waitedRoutingPathCompletions: number
23
- fetchData: boolean
24
- }
25
-
26
- export class FindSession extends EventEmitter<FindSessionEvents> {
27
- private readonly serviceId: ServiceID
28
- private readonly transport: ITransport
29
- private readonly kademliaIdToFind: Uint8Array
30
- private readonly localPeerId: PeerID
31
- private readonly waitedRoutingPathCompletions: number
32
- private readonly rpcCommunicator: ListeningRpcCommunicator
33
- private readonly fetchData: boolean
34
- private results: SortedContactList<Contact>
35
- private foundData: Map<string, DataEntry> = new Map()
36
- private allKnownHops: Set<PeerIDKey> = new Set()
37
- private reportedHops: Set<PeerIDKey> = new Set()
38
- private reportFindCompletedTimeout?: NodeJS.Timeout
39
- private findCompletedEmitted = false
40
- private noCloserNodesReceivedCounter = 0
41
-
42
- constructor(config: FindSessionConfig) {
43
- super()
44
- this.serviceId = config.serviceId
45
- this.transport = config.transport
46
- this.kademliaIdToFind = config.kademliaIdToFind
47
- this.localPeerId = config.localPeerId
48
- this.waitedRoutingPathCompletions = config.waitedRoutingPathCompletions
49
- this.results = new SortedContactList(PeerID.fromValue(this.kademliaIdToFind), 10, undefined, true)
50
- this.fetchData = config.fetchData
51
- this.rpcCommunicator = new ListeningRpcCommunicator(this.serviceId, this.transport, {
52
- rpcRequestTimeout: 15000
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
- })
63
- this.rpcCommunicator.registerRpcNotification(FindResponse, 'sendFindResponse',
64
- (req: FindResponse) => rpcLocal.sendFindResponse(req))
65
- }
66
-
67
- private isFindCompleted(): boolean {
68
- const unreportedHops: Set<PeerIDKey> = new Set(this.allKnownHops)
69
- this.reportedHops.forEach((id) => {
70
- unreportedHops.delete(id)
71
- })
72
- if (this.noCloserNodesReceivedCounter >= 1 && unreportedHops.size === 0) {
73
- if (this.fetchData
74
- && (this.hasNonStaleData() || this.noCloserNodesReceivedCounter >= this.waitedRoutingPathCompletions)) {
75
- return true
76
- } else if (this.fetchData) {
77
- return false
78
- }
79
- return true
80
- }
81
- return false
82
- }
83
-
84
- private hasNonStaleData(): boolean {
85
- return Array.from(this.foundData.values()).some((entry) => entry.stale === false)
86
- }
87
-
88
- public doSendFindResponse(
89
- routingPath: PeerDescriptor[],
90
- nodes: PeerDescriptor[],
91
- dataEntries: DataEntry[],
92
- noCloserNodesFound?: boolean
93
- ): void {
94
- this.addKnownHops(routingPath)
95
- if (routingPath.length >= 1) {
96
- this.setHopAsReported(routingPath[routingPath.length - 1])
97
- }
98
- nodes.forEach((descriptor: PeerDescriptor) => {
99
- this.results.addContact(new Contact(descriptor))
100
- })
101
- this.processFoundData(dataEntries)
102
- if (noCloserNodesFound) {
103
- this.onNoCloserPeersFound()
104
- }
105
- }
106
-
107
- private addKnownHops(routingPath: PeerDescriptor[]) {
108
- routingPath.forEach((desc) => {
109
- const newPeerId = PeerID.fromValue(desc.kademliaId)
110
- if (!this.localPeerId.equals(newPeerId)) {
111
- this.allKnownHops.add(newPeerId.toKey())
112
- }
113
- })
114
- }
115
-
116
- private setHopAsReported(desc: PeerDescriptor) {
117
- const newPeerId = PeerID.fromValue(desc.kademliaId)
118
- if (!this.localPeerId.equals(newPeerId)) {
119
- this.reportedHops.add(newPeerId.toKey())
120
- }
121
- if (this.isFindCompleted()) {
122
- if (!this.findCompletedEmitted && this.isFindCompleted()) {
123
- if (this.reportFindCompletedTimeout) {
124
- clearTimeout(this.reportFindCompletedTimeout)
125
- this.reportFindCompletedTimeout = undefined
126
- }
127
- this.emit('findCompleted', this.results.getAllContacts().map((contact) => contact.getPeerDescriptor()))
128
- this.findCompletedEmitted = true
129
- }
130
- }
131
- }
132
-
133
- private processFoundData(dataEntries: DataEntry[]): void {
134
- dataEntries.forEach((entry) => {
135
- const storerKey = keyFromPeerDescriptor(entry.storer!)
136
- const existingEntry = this.foundData.get(storerKey)
137
- if (!existingEntry || existingEntry.storerTime! < entry.storerTime!
138
- || (existingEntry.storerTime! <= entry.storerTime! && entry.deleted)) {
139
- this.foundData.set(storerKey, entry)
140
- }
141
- })
142
- }
143
-
144
- private onNoCloserPeersFound(): void {
145
- this.noCloserNodesReceivedCounter += 1
146
- if (this.isFindCompleted()) {
147
- this.emit('findCompleted', this.results.getAllContacts().map((contact) => contact.getPeerDescriptor()))
148
- this.findCompletedEmitted = true
149
- if (this.reportFindCompletedTimeout) {
150
- clearTimeout(this.reportFindCompletedTimeout)
151
- this.reportFindCompletedTimeout = undefined
152
- }
153
- } else {
154
- if (!this.reportFindCompletedTimeout && !this.findCompletedEmitted) {
155
- this.reportFindCompletedTimeout = setTimeout(() => {
156
- if (!this.findCompletedEmitted) {
157
- this.emit('findCompleted', this.results.getAllContacts().map((contact) => contact.getPeerDescriptor()))
158
- this.findCompletedEmitted = true
159
- }
160
- }, 4000)
161
- }
162
- }
163
- }
164
-
165
- public getResults = (): FindResult => ({
166
- closestNodes: this.results.getAllContacts().map((contact) => contact.getPeerDescriptor()),
167
- dataEntries: (this.foundData && this.foundData.size > 0) ? Array.from(this.foundData.values()) : undefined
168
- })
169
-
170
- public stop(): void {
171
- if (this.reportFindCompletedTimeout) {
172
- clearTimeout(this.reportFindCompletedTimeout)
173
- this.reportFindCompletedTimeout = undefined
174
- }
175
- this.rpcCommunicator.destroy()
176
- this.emit('findCompleted', [])
177
- }
178
- }
@@ -1,25 +0,0 @@
1
- import { IFindSessionRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
2
- import { Empty } from '../../proto/google/protobuf/empty'
3
- import { DataEntry, FindResponse, PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
4
- import { Logger } from '@streamr/utils'
5
-
6
- const logger = new Logger(module)
7
-
8
- interface FindSessionRpcLocalConfig {
9
- doSendFindResponse: (routingPath: PeerDescriptor[], nodes: PeerDescriptor[], dataEntries: DataEntry[], noCloserNodesFound?: boolean) => void
10
- }
11
-
12
- export class FindSessionRpcLocal implements IFindSessionRpc {
13
-
14
- private readonly config: FindSessionRpcLocalConfig
15
-
16
- constructor(config: FindSessionRpcLocalConfig) {
17
- this.config = config
18
- }
19
-
20
- async sendFindResponse(report: FindResponse): Promise<Empty> {
21
- logger.trace('FindResponse arrived: ' + JSON.stringify(report))
22
- this.config.doSendFindResponse(report.routingPath, report.closestConnectedPeers, report.dataEntries, report.noCloserNodesFound)
23
- return {}
24
- }
25
- }
@@ -1,30 +0,0 @@
1
- import {
2
- DataEntry,
3
- PeerDescriptor,
4
- FindResponse
5
- } from '../../proto/packages/dht/protos/DhtRpc'
6
- import { IFindSessionRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
7
- import { Logger } from '@streamr/utils'
8
- import { Remote } from '../contact/Remote'
9
-
10
- const logger = new Logger(module)
11
-
12
- export class FindSessionRpcRemote extends Remote<IFindSessionRpcClient> {
13
-
14
- sendFindResponse(
15
- routingPath: PeerDescriptor[],
16
- closestNodes: PeerDescriptor[],
17
- dataEntries: DataEntry[],
18
- noCloserNodesFound: boolean
19
- ): void {
20
- const report: FindResponse = {
21
- routingPath,
22
- closestConnectedPeers: closestNodes,
23
- dataEntries,
24
- noCloserNodesFound
25
- }
26
- this.getClient().sendFindResponse(report, this.formDhtRpcOptions()).catch((_e) => {
27
- logger.trace('Failed to send FindResponse')
28
- })
29
- }
30
- }