@streamr/dht 100.0.0-pretestnet.0 → 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 (317) 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} +108 -102
  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} +18 -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} +51 -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 +48 -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 +5 -1
  165. package/dist/src/transport/ListeningRpcCommunicator.js +8 -2
  166. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  167. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
  168. package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
  169. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  170. package/dist/src/types/ServiceID.d.ts +1 -0
  171. package/dist/src/types/ServiceID.js +3 -0
  172. package/dist/src/types/ServiceID.js.map +1 -0
  173. package/karma.config.js +4 -4
  174. package/package.json +10 -8
  175. package/protos/DhtRpc.proto +32 -35
  176. package/src/connection/ConnectionLockHandler.ts +19 -17
  177. package/src/connection/ConnectionLockRpcLocal.ts +74 -0
  178. package/src/connection/ConnectionLockRpcRemote.ts +7 -6
  179. package/src/connection/ConnectionManager.ts +59 -95
  180. package/src/connection/ConnectivityChecker.ts +30 -26
  181. package/src/connection/ConnectorFacade.ts +74 -34
  182. package/src/connection/Handshaker.ts +9 -9
  183. package/src/connection/IConnection.ts +5 -6
  184. package/src/connection/ManagedConnection.ts +21 -22
  185. package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +9 -9
  186. package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
  187. package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +23 -24
  188. package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +13 -13
  189. package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
  190. package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +12 -13
  191. package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
  192. package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +32 -33
  193. package/src/connection/webrtc/WebrtcConnector.ts +225 -0
  194. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
  195. package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
  196. package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
  197. package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
  198. package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +19 -17
  199. package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +21 -27
  200. package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts} +110 -101
  201. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
  202. package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +6 -12
  203. package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
  204. package/src/dht/DhtNode.ts +144 -179
  205. package/src/dht/DhtNodeRpcLocal.ts +68 -0
  206. package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +12 -13
  207. package/src/dht/ExternalApiRpcLocal.ts +46 -0
  208. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  209. package/src/dht/contact/Remote.ts +32 -4
  210. package/src/dht/contact/SortedContactList.ts +4 -4
  211. package/src/dht/discovery/DiscoverySession.ts +23 -20
  212. package/src/dht/discovery/PeerDiscovery.ts +14 -17
  213. package/src/dht/find/FindRpcLocal.ts +35 -0
  214. package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +26 -25
  215. package/src/dht/find/FindSessionRpcLocal.ts +25 -0
  216. package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
  217. package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +78 -71
  218. package/src/dht/routing/FindRpcRemote.ts +40 -0
  219. package/src/dht/routing/Router.ts +70 -105
  220. package/src/dht/routing/RouterRpcLocal.ts +81 -0
  221. package/src/dht/routing/RouterRpcRemote.ts +15 -45
  222. package/src/dht/routing/RoutingSession.ts +56 -61
  223. package/src/dht/routing/getPreviousPeer.ts +6 -0
  224. package/src/dht/store/StoreRpcLocal.ts +44 -37
  225. package/src/dht/store/StoreRpcRemote.ts +4 -8
  226. package/src/exports.ts +11 -5
  227. package/src/helpers/Connectivity.ts +19 -0
  228. package/src/helpers/errors.ts +3 -3
  229. package/src/helpers/protoClasses.ts +6 -6
  230. package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
  231. package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
  232. package/src/proto/packages/dht/protos/DhtRpc.ts +87 -114
  233. package/src/rpc-protocol/DhtCallContext.ts +0 -1
  234. package/src/transport/ITransport.ts +5 -8
  235. package/src/transport/ListeningRpcCommunicator.ts +14 -4
  236. package/src/transport/RoutingRpcCommunicator.ts +3 -4
  237. package/src/types/ServiceID.ts +1 -0
  238. package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +6 -6
  239. package/test/benchmark/KademliaCorrectness.test.ts +2 -2
  240. package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
  241. package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
  242. package/test/end-to-end/Layer0.test.ts +35 -17
  243. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +24 -6
  244. package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
  245. package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
  246. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
  247. package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
  248. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
  249. package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
  250. package/test/end-to-end/memory-leak.test.ts +85 -0
  251. package/test/integration/ConnectionLocking.test.ts +4 -4
  252. package/test/integration/ConnectionManager.test.ts +37 -28
  253. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  254. package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
  255. package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
  256. package/test/integration/DhtRpc.test.ts +5 -5
  257. package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +3 -3
  258. package/test/integration/Layer1-scale.test.ts +1 -1
  259. package/test/integration/MigrateData.test.ts +6 -5
  260. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
  261. package/test/integration/MultipleEntryPointJoining.test.ts +6 -6
  262. package/test/integration/RouteMessage.test.ts +26 -26
  263. package/test/integration/RpcErrors.test.ts +10 -10
  264. package/test/integration/ScaleDownDht.test.ts +3 -3
  265. package/test/integration/SimultaneousConnections.test.ts +10 -7
  266. package/test/integration/Store.test.ts +1 -1
  267. package/test/integration/StoreAndDelete.test.ts +1 -1
  268. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
  269. package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +4 -4
  270. package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
  271. package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
  272. package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
  273. package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
  274. package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
  275. package/test/unit/ConnectivityHelpers.test.ts +69 -0
  276. package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
  277. package/test/unit/Router.test.ts +26 -26
  278. package/test/unit/UUID.test.ts +1 -1
  279. package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
  280. package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
  281. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
  282. package/test/utils/FakeRpcCommunicator.ts +23 -0
  283. package/test/utils/mock/Transport.ts +1 -1
  284. package/test/utils/utils.ts +14 -24
  285. package/tsconfig.browser.json +1 -1
  286. package/tsconfig.jest.json +3 -2
  287. package/tsconfig.node.json +3 -2
  288. package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
  289. package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
  290. package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
  291. package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
  292. package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
  293. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
  294. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
  295. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
  296. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
  297. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
  298. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
  299. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
  300. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
  301. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
  302. package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
  303. package/dist/src/dht/RemoteDhtNode.js.map +0 -1
  304. package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
  305. package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
  306. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
  307. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
  308. package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
  309. package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
  310. package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
  311. package/src/dht/registerExternalApiRpcMethods.ts +0 -44
  312. package/test/utils/mock/RecursiveFinder.ts +0 -19
  313. /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
  314. /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
  315. /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
  316. /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
  317. /package/src/connection/{Simulator → simulator}/pings.ts +0 -0
@@ -2,8 +2,8 @@ import EventEmitter from 'eventemitter3'
2
2
  import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
3
3
  import { connection as WsConnection } from 'websocket'
4
4
  import { Logger } from '@streamr/utils'
5
- import { DisconnectionType } from '../../transport/ITransport'
6
5
  import { Url } from 'url'
6
+ import { GOING_AWAY } from './ClientWebsocket'
7
7
 
8
8
  const logger = new Logger(module)
9
9
 
@@ -18,7 +18,7 @@ enum MessageType {
18
18
  BINARY = 'binary'
19
19
  }
20
20
 
21
- export class ServerWebSocket extends EventEmitter<ConnectionEvents> implements IConnection {
21
+ export class ServerWebsocket extends EventEmitter<ConnectionEvents> implements IConnection {
22
22
 
23
23
  public readonly connectionId: ConnectionID
24
24
  public readonly connectionType = ConnectionType.WEBSOCKET_SERVER
@@ -33,40 +33,34 @@ export class ServerWebSocket extends EventEmitter<ConnectionEvents> implements I
33
33
  this.connectionId = new ConnectionID()
34
34
 
35
35
  socket.on('message', (message) => {
36
- if (!this.stopped) {
37
- logger.trace('ServerWebSocket::onMessage')
38
- if (message.type === MessageType.UTF8) {
39
- logger.debug('Received string Message: ' + message.utf8Data)
40
- } else if (message.type === MessageType.BINARY) {
41
- logger.trace('Received Binary Message of ' + message.binaryData.length + ' bytes')
42
- this.emit('data',
43
- new Uint8Array(message.binaryData.buffer, message.binaryData.byteOffset,
44
- message.binaryData.byteLength / Uint8Array.BYTES_PER_ELEMENT))
45
- }
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))
46
44
  }
47
45
  })
48
46
  socket.on('close', (reasonCode, description) => {
49
- if (!this.stopped) {
50
- logger.trace(' Peer ' + socket.remoteAddress + ' disconnected.')
51
- this.doDisconnect('OTHER', reasonCode, description)
52
- }
47
+ logger.trace('Peer ' + socket.remoteAddress + ' disconnected.')
48
+ this.doDisconnect(reasonCode, description)
53
49
  })
54
50
 
55
51
  socket.on('error', (error) => {
56
- if (!this.stopped) {
57
- this.emit('error', error.name)
58
- }
52
+ this.emit('error', error.name)
59
53
  })
60
54
 
61
55
  this.socket = socket
62
56
  }
63
57
 
64
- private doDisconnect(disconnectionType: DisconnectionType, reasonCode: number, description: string): void {
58
+ private doDisconnect(reasonCode: number, description: string): void {
65
59
  this.stopped = true
66
60
  this.socket?.removeAllListeners()
67
61
  this.socket = undefined
68
-
69
- this.emit('disconnected', disconnectionType, reasonCode, description)
62
+ const gracefulLeave = reasonCode === GOING_AWAY
63
+ this.emit('disconnected', gracefulLeave, reasonCode, description)
70
64
  }
71
65
 
72
66
  public send(data: Uint8Array): void {
@@ -80,16 +74,16 @@ export class ServerWebSocket extends EventEmitter<ConnectionEvents> implements I
80
74
  this.socket.sendBytes(Buffer.from(data))
81
75
  }
82
76
  } else {
83
- logger.error('Tried to call send() on a stopped socket')
77
+ logger.debug('Tried to call send() on a stopped socket')
84
78
  }
85
79
 
86
80
  }
87
81
 
88
- public async close(): Promise<void> {
82
+ public async close(gracefulLeave: boolean): Promise<void> {
89
83
  if (!this.stopped) {
90
- this.socket?.close()
84
+ this.socket?.close(gracefulLeave === true ? GOING_AWAY : undefined)
91
85
  } else {
92
- logger.error('Tried to close a stopped connection')
86
+ logger.debug('Tried to close a stopped connection')
93
87
  }
94
88
  }
95
89
 
@@ -103,7 +97,7 @@ export class ServerWebSocket extends EventEmitter<ConnectionEvents> implements I
103
97
  }
104
98
  this.stopped = true
105
99
  } else {
106
- logger.error('Tried to destroy() a stopped connection')
100
+ logger.debug('Tried to destroy() a stopped connection')
107
101
  }
108
102
  }
109
103
 
@@ -1,112 +1,150 @@
1
- import { ClientWebSocket } from './ClientWebSocket'
1
+ import { ClientWebsocket } from './ClientWebsocket'
2
2
  import { IConnection, ConnectionType } from '../IConnection'
3
3
  import { ITransport } from '../../transport/ITransport'
4
4
  import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
5
- import { WebSocketConnectorRpcRemote } from './WebSocketConnectorRpcRemote'
5
+ import { WebsocketConnectorRpcLocal } from './WebsocketConnectorRpcLocal'
6
+ import { WebsocketConnectorRpcRemote } from './WebsocketConnectorRpcRemote'
6
7
  import {
7
8
  ConnectivityMethod,
8
9
  ConnectivityResponse,
9
- NodeType,
10
10
  PeerDescriptor,
11
- WebSocketConnectionRequest,
12
- WebSocketConnectionResponse
11
+ WebsocketConnectionRequest,
12
+ WebsocketConnectionResponse
13
13
  } from '../../proto/packages/dht/protos/DhtRpc'
14
- import { WebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
14
+ import { WebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
15
15
  import { Logger, binaryToHex, wait } from '@streamr/utils'
16
- import { IWebSocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
17
16
  import { ManagedConnection } from '../ManagedConnection'
18
- import { WebSocketServer } from './WebSocketServer'
17
+ import { WebsocketServer } from './WebsocketServer'
19
18
  import { ConnectivityChecker } from '../ConnectivityChecker'
20
19
  import { NatType, PortRange, TlsCertificate } from '../ConnectionManager'
21
20
  import { PeerIDKey } from '../../helpers/PeerID'
22
- import { ServerWebSocket } from './ServerWebSocket'
21
+ import { ServerWebsocket } from './ServerWebsocket'
23
22
  import { toProtoRpcClient } from '@streamr/proto-rpc'
24
23
  import { Handshaker } from '../Handshaker'
25
24
  import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
26
25
  import { ParsedUrlQuery } from 'querystring'
27
26
  import { range, sample } from 'lodash'
28
- import { isPrivateIPv4 } from '../../helpers/AddressTools'
29
27
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
30
- import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
31
-
28
+ import { expectedConnectionType } from '../../helpers/Connectivity'
29
+ import { WebsocketServerStartError } from '../../helpers/errors'
30
+ import { AutoCertifierClientFacade } from './AutoCertifierClientFacade'
32
31
  const logger = new Logger(module)
33
32
 
34
- export const connectivityMethodToWebSocketUrl = (ws: ConnectivityMethod): string => {
33
+ export const connectivityMethodToWebsocketUrl = (ws: ConnectivityMethod): string => {
35
34
  return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port
36
35
  }
37
36
 
38
- const canOpenConnectionFromBrowser = (websocketServer: ConnectivityMethod) => {
39
- const hasPrivateAddress = ((websocketServer.host === 'localhost') || isPrivateIPv4(websocketServer.host))
40
- return websocketServer.tls || hasPrivateAddress
41
- }
42
-
43
37
  const ENTRY_POINT_CONNECTION_ATTEMPTS = 5
44
38
 
45
- interface WebSocketConnectorRpcLocalConfig {
39
+ interface WebsocketConnectorConfig {
46
40
  transport: ITransport
47
- canConnect: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
41
+ canConnect: (peerDescriptor: PeerDescriptor) => boolean
48
42
  onIncomingConnection: (connection: ManagedConnection) => boolean
49
43
  portRange?: PortRange
50
44
  maxMessageSize?: number
51
45
  host?: string
52
46
  entrypoints?: PeerDescriptor[]
53
47
  tlsCertificate?: TlsCertificate
48
+ autoCertifierTransport: ITransport
49
+ autoCertifierUrl: string
50
+ autoCertifierConfigFile: string
51
+ serverEnableTls: boolean
54
52
  }
55
53
 
56
- export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
54
+ export class WebsocketConnector {
57
55
 
58
56
  private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocket-connector'
59
57
  private readonly rpcCommunicator: ListeningRpcCommunicator
60
- private readonly canConnectFunction: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
61
- private readonly webSocketServer?: WebSocketServer
58
+ private readonly websocketServer?: WebsocketServer
62
59
  private connectivityChecker?: ConnectivityChecker
63
60
  private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
64
61
  private onIncomingConnection: (connection: ManagedConnection) => boolean
65
62
  private host?: string
66
63
  private readonly entrypoints?: PeerDescriptor[]
67
64
  private readonly tlsCertificate?: TlsCertificate
65
+ private readonly autoCertifierTransport: ITransport
66
+ private readonly autoCertifierUrl: string
67
+ private readonly autoCertifierConfigFile: string
68
+ private readonly serverEnableTls: boolean
69
+ private autoCertifierClient?: AutoCertifierClientFacade
68
70
  private selectedPort?: number
69
- private ownPeerDescriptor?: PeerDescriptor
71
+ private localPeerDescriptor?: PeerDescriptor
70
72
  private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
71
- private destroyed = false
73
+ private abortController = new AbortController()
72
74
 
73
- constructor(config: WebSocketConnectorRpcLocalConfig) {
74
- this.webSocketServer = config.portRange ? new WebSocketServer({
75
+ constructor(config: WebsocketConnectorConfig) {
76
+ this.websocketServer = config.portRange ? new WebsocketServer({
75
77
  portRange: config.portRange!,
76
78
  tlsCertificate: config.tlsCertificate,
77
- maxMessageSize: config.maxMessageSize
79
+ maxMessageSize: config.maxMessageSize,
80
+ enableTls: config.serverEnableTls
78
81
  }) : undefined
79
82
  this.onIncomingConnection = config.onIncomingConnection
80
83
  this.host = config.host
81
84
  this.entrypoints = config.entrypoints
82
85
  this.tlsCertificate = config.tlsCertificate
83
-
84
- this.canConnectFunction = config.canConnect.bind(this)
85
-
86
- this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnectorRpcLocal.WEBSOCKET_CONNECTOR_SERVICE_ID, config.transport, {
86
+ this.autoCertifierTransport = config.autoCertifierTransport
87
+ this.autoCertifierUrl = config.autoCertifierUrl
88
+ this.autoCertifierConfigFile = config.autoCertifierConfigFile
89
+ this.serverEnableTls = config.serverEnableTls
90
+ this.rpcCommunicator = new ListeningRpcCommunicator(WebsocketConnector.WEBSOCKET_CONNECTOR_SERVICE_ID, config.transport, {
87
91
  rpcRequestTimeout: 15000
88
92
  })
93
+ this.registerLocalRpcMethods(config)
94
+ }
89
95
 
96
+ private registerLocalRpcMethods(config: WebsocketConnectorConfig) {
97
+ const rpcLocal = new WebsocketConnectorRpcLocal({
98
+ canConnect: (peerDescriptor: PeerDescriptor) => config.canConnect(peerDescriptor),
99
+ connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
100
+ onIncomingConnection: (connection: ManagedConnection) => config.onIncomingConnection(connection),
101
+ abortSignal: this.abortController.signal
102
+ })
90
103
  this.rpcCommunicator.registerRpcMethod(
91
- WebSocketConnectionRequest,
92
- WebSocketConnectionResponse,
104
+ WebsocketConnectionRequest,
105
+ WebsocketConnectionResponse,
93
106
  'requestConnection',
94
- (req: WebSocketConnectionRequest, context: ServerCallContext) => this.requestConnection(req, context)
107
+ async (req: WebsocketConnectionRequest, context: ServerCallContext) => {
108
+ if (!this.abortController.signal.aborted) {
109
+ return rpcLocal.requestConnection(req, context)
110
+ } else {
111
+ return { accepted: false }
112
+ }
113
+ }
95
114
  )
96
115
  }
97
116
 
98
117
  private attachHandshaker(connection: IConnection) {
99
- const handshaker = new Handshaker(this.ownPeerDescriptor!, connection)
118
+ const handshaker = new Handshaker(this.localPeerDescriptor!, connection)
100
119
  handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
101
120
  this.onServerSocketHandshakeRequest(peerDescriptor, connection)
102
121
  })
103
122
  }
104
123
 
124
+ public async autoCertify(): Promise<void> {
125
+ this.autoCertifierClient = new AutoCertifierClientFacade({
126
+ configFile: this.autoCertifierConfigFile,
127
+ transport: this.autoCertifierTransport,
128
+ url: this.autoCertifierUrl,
129
+ wsServerPort: this.selectedPort!,
130
+ setHost: (hostName: string) => this.setHost(hostName),
131
+ updateCertificate: (certificate: string, privateKey: string) => this.websocketServer!.updateCertificate(certificate, privateKey)
132
+ })
133
+ logger.trace(`AutoCertifying subdomain...`)
134
+ await this.autoCertifierClient!.start()
135
+ }
136
+
137
+ private setHost(hostName: string): void {
138
+ logger.trace(`Setting host name to ${hostName}`)
139
+ this.host = hostName
140
+ this.connectivityChecker!.setHost(hostName)
141
+ }
142
+
105
143
  public async start(): Promise<void> {
106
- if (!this.destroyed && this.webSocketServer) {
107
- this.webSocketServer.on('connected', (connection: IConnection) => {
144
+ if (!this.abortController.signal.aborted && this.websocketServer) {
145
+ this.websocketServer.on('connected', (connection: IConnection) => {
108
146
 
109
- const serverSocket = connection as unknown as ServerWebSocket
147
+ const serverSocket = connection as unknown as ServerWebsocket
110
148
  if (serverSocket.resourceURL &&
111
149
  serverSocket.resourceURL.query) {
112
150
  const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
@@ -122,63 +160,55 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
122
160
  this.attachHandshaker(connection)
123
161
  }
124
162
  })
125
- const port = await this.webSocketServer.start()
163
+ const port = await this.websocketServer.start()
126
164
  this.selectedPort = port
127
- this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.tlsCertificate !== undefined, this.host)
165
+ this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.serverEnableTls, this.host)
128
166
  }
129
167
  }
130
168
 
131
- public async checkConnectivity(): Promise<ConnectivityResponse> {
169
+ public async checkConnectivity(selfSigned: boolean): Promise<ConnectivityResponse> {
132
170
  // TODO: this could throw if the server is not running
133
171
  const noServerConnectivityResponse: ConnectivityResponse = {
134
- openInternet: false,
135
172
  host: '127.0.0.1',
136
173
  natType: NatType.UNKNOWN
137
174
  }
138
- if (this.destroyed) {
175
+ if (this.abortController.signal.aborted) {
139
176
  return noServerConnectivityResponse
140
177
  }
141
178
  for (const reattempt of range(ENTRY_POINT_CONNECTION_ATTEMPTS)) {
142
179
  const entryPoint = sample(this.entrypoints)!
143
180
  try {
144
- if (!this.webSocketServer) {
145
- // If no websocket server, return openInternet: false
181
+ if (!this.websocketServer) {
146
182
  return noServerConnectivityResponse
147
183
  } else {
148
- if (!this.entrypoints || this.entrypoints.length < 1) {
184
+ if (!this.entrypoints || this.entrypoints.length === 0) {
149
185
  // return connectivity info given in config
150
186
  const preconfiguredConnectivityResponse: ConnectivityResponse = {
151
- openInternet: true,
152
187
  host: this.host!,
153
188
  natType: NatType.OPEN_INTERNET,
154
189
  websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
155
190
  }
156
191
  return preconfiguredConnectivityResponse
157
192
  } else {
158
- // Do real connectivity checking
159
- return await this.connectivityChecker!.sendConnectivityRequest(entryPoint)
193
+ // Do real connectivity checking
194
+ return await this.connectivityChecker!.sendConnectivityRequest(entryPoint, selfSigned)
160
195
  }
161
196
  }
162
197
  } catch (err) {
163
198
  if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
164
199
  const error = `Failed to connect to entrypoint with id ${binaryToHex(entryPoint.kademliaId)} `
165
- + `and URL ${connectivityMethodToWebSocketUrl(entryPoint.websocket!)}`
200
+ + `and URL ${connectivityMethodToWebsocketUrl(entryPoint.websocket!)}`
166
201
  logger.error(error, { error: err })
167
202
  await wait(2000)
168
203
  }
169
204
  }
170
205
  }
171
- throw Error(`Failed to connect to the entrypoints after ${ENTRY_POINT_CONNECTION_ATTEMPTS} attempts`)
206
+ throw new WebsocketServerStartError(`Failed to connect to the entrypoints after ${ENTRY_POINT_CONNECTION_ATTEMPTS} attempts`)
172
207
  }
173
208
 
174
209
  public isPossibleToFormConnection(targetPeerDescriptor: PeerDescriptor): boolean {
175
- if (this.ownPeerDescriptor!.websocket !== undefined) {
176
- return (targetPeerDescriptor.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(this.ownPeerDescriptor!.websocket)
177
- } else if (targetPeerDescriptor.websocket !== undefined) {
178
- return (this.ownPeerDescriptor!.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(targetPeerDescriptor.websocket)
179
- } else {
180
- return false
181
- }
210
+ const connectionType = expectedConnectionType(this.localPeerDescriptor!, targetPeerDescriptor)
211
+ return (connectionType === ConnectionType.WEBSOCKET_CLIENT || connectionType === ConnectionType.WEBSOCKET_SERVER)
182
212
  }
183
213
 
184
214
  public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
@@ -188,14 +218,14 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
188
218
  return existingConnection
189
219
  }
190
220
 
191
- if (this.ownPeerDescriptor!.websocket && !targetPeerDescriptor.websocket) {
192
- return this.requestConnectionFromPeer(this.ownPeerDescriptor!, targetPeerDescriptor)
221
+ if (this.localPeerDescriptor!.websocket && !targetPeerDescriptor.websocket) {
222
+ return this.requestConnectionFromPeer(this.localPeerDescriptor!, targetPeerDescriptor)
193
223
  } else {
194
- const socket = new ClientWebSocket()
224
+ const socket = new ClientWebsocket()
195
225
 
196
- const url = connectivityMethodToWebSocketUrl(targetPeerDescriptor.websocket!)
226
+ const url = connectivityMethodToWebsocketUrl(targetPeerDescriptor.websocket!)
197
227
 
198
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
228
+ const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
199
229
  managedConnection.setPeerDescriptor(targetPeerDescriptor)
200
230
 
201
231
  this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
@@ -216,33 +246,33 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
216
246
  }
217
247
  }
218
248
 
219
- private requestConnectionFromPeer(ownPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
249
+ private requestConnectionFromPeer(localPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
220
250
  setImmediate(() => {
221
- const remoteConnector = new WebSocketConnectorRpcRemote(
222
- ownPeerDescriptor,
251
+ const remoteConnector = new WebsocketConnectorRpcRemote(
252
+ localPeerDescriptor,
223
253
  targetPeerDescriptor,
224
- toProtoRpcClient(new WebSocketConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
254
+ toProtoRpcClient(new WebsocketConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
225
255
  )
226
- remoteConnector.requestConnection(ownPeerDescriptor.websocket!.host, ownPeerDescriptor.websocket!.port)
256
+ remoteConnector.requestConnection(localPeerDescriptor.websocket!.host, localPeerDescriptor.websocket!.port)
227
257
  })
228
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
258
+ const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
229
259
  managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
230
260
  managedConnection.setPeerDescriptor(targetPeerDescriptor)
231
261
  this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
232
262
  return managedConnection
233
263
  }
234
264
 
235
- private onServerSocketHandshakeRequest = (peerDescriptor: PeerDescriptor, serverWebSocket: IConnection) => {
265
+ private onServerSocketHandshakeRequest(peerDescriptor: PeerDescriptor, serverWebsocket: IConnection) {
236
266
 
237
267
  const peerId = peerIdFromPeerDescriptor(peerDescriptor)
238
268
 
239
269
  if (this.ongoingConnectRequests.has(peerId.toKey())) {
240
270
  const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
241
- ongoingConnectReguest.attachImplementation(serverWebSocket)
271
+ ongoingConnectReguest.attachImplementation(serverWebsocket)
242
272
  ongoingConnectReguest.acceptHandshake()
243
273
  this.ongoingConnectRequests.delete(peerId.toKey())
244
274
  } else {
245
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
275
+ const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebsocket)
246
276
 
247
277
  managedConnection.setPeerDescriptor(peerDescriptor)
248
278
 
@@ -255,41 +285,20 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
255
285
  }
256
286
  }
257
287
 
258
- public setOwnPeerDescriptor(ownPeerDescriptor: PeerDescriptor): void {
259
- this.ownPeerDescriptor = ownPeerDescriptor
288
+ public setLocalPeerDescriptor(localPeerDescriptor: PeerDescriptor): void {
289
+ this.localPeerDescriptor = localPeerDescriptor
260
290
  }
261
291
 
262
292
  public async destroy(): Promise<void> {
263
- this.destroyed = true
264
- this.rpcCommunicator.stop()
293
+ this.abortController.abort()
294
+ this.rpcCommunicator.destroy()
265
295
 
266
296
  const requests = Array.from(this.ongoingConnectRequests.values())
267
- await Promise.allSettled(requests.map((conn) => conn.close('OTHER')))
297
+ await Promise.allSettled(requests.map((conn) => conn.close(false)))
268
298
 
269
299
  const attempts = Array.from(this.connectingConnections.values())
270
- await Promise.allSettled(attempts.map((conn) => conn.close('OTHER')))
300
+ await Promise.allSettled(attempts.map((conn) => conn.close(false)))
271
301
  this.connectivityChecker?.destroy()
272
- await this.webSocketServer?.stop()
273
- }
274
-
275
- // IWebSocketConnectorRpc implementation
276
- public async requestConnection(request: WebSocketConnectionRequest, context: ServerCallContext): Promise<WebSocketConnectionResponse> {
277
- const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
278
- if (!this.destroyed && this.canConnectFunction(senderPeerDescriptor, request.ip, request.port)) {
279
- setImmediate(() => {
280
- if (this.destroyed) {
281
- return
282
- }
283
- const connection = this.connect(senderPeerDescriptor)
284
- this.onIncomingConnection(connection)
285
- })
286
- const res: WebSocketConnectionResponse = {
287
- accepted: true
288
- }
289
- return res
290
- }
291
- return {
292
- accepted: false
293
- }
302
+ await this.websocketServer?.stop()
294
303
  }
295
304
  }
@@ -0,0 +1,41 @@
1
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
+ import {
3
+ PeerDescriptor,
4
+ WebsocketConnectionRequest,
5
+ WebsocketConnectionResponse
6
+ } from '../../proto/packages/dht/protos/DhtRpc'
7
+ import { IWebsocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
8
+ import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
9
+ import { ManagedConnection } from '../ManagedConnection'
10
+
11
+ interface WebsocketConnectorRpcLocalConfig {
12
+ canConnect: (peerDescriptor: PeerDescriptor) => boolean
13
+ connect: (targetPeerDescriptor: PeerDescriptor) => ManagedConnection
14
+ onIncomingConnection: (connection: ManagedConnection) => boolean
15
+ abortSignal: AbortSignal
16
+ }
17
+
18
+ export class WebsocketConnectorRpcLocal implements IWebsocketConnectorRpc {
19
+
20
+ private readonly config: WebsocketConnectorRpcLocalConfig
21
+
22
+ constructor(config: WebsocketConnectorRpcLocalConfig) {
23
+ this.config = config
24
+ }
25
+
26
+ public async requestConnection(_request: WebsocketConnectionRequest, context: ServerCallContext): Promise<WebsocketConnectionResponse> {
27
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
28
+ if (this.config.canConnect(senderPeerDescriptor)) {
29
+ setImmediate(() => {
30
+ if (this.config.abortSignal.aborted) {
31
+ return
32
+ }
33
+ const connection = this.config.connect(senderPeerDescriptor)
34
+ this.config.onIncomingConnection(connection)
35
+ })
36
+ return { accepted: true }
37
+ } else {
38
+ return { accepted: false }
39
+ }
40
+ }
41
+ }
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  PeerDescriptor,
3
- WebSocketConnectionRequest
3
+ WebsocketConnectionRequest
4
4
  } from '../../proto/packages/dht/protos/DhtRpc'
5
- import { IWebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
5
+ import { IWebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
6
6
  import { Logger } from '@streamr/utils'
7
7
  import * as Err from '../../helpers/errors'
8
8
  import { ProtoRpcClient } from '@streamr/proto-rpc'
@@ -11,34 +11,28 @@ import { Remote } from '../../dht/contact/Remote'
11
11
 
12
12
  const logger = new Logger(module)
13
13
 
14
- export class WebSocketConnectorRpcRemote extends Remote<IWebSocketConnectorRpcClient> {
14
+ export class WebsocketConnectorRpcRemote extends Remote<IWebsocketConnectorRpcClient> {
15
15
 
16
16
  constructor(
17
17
  localPeerDescriptor: PeerDescriptor,
18
18
  remotePeerDescriptor: PeerDescriptor,
19
- client: ProtoRpcClient<IWebSocketConnectorRpcClient>
19
+ client: ProtoRpcClient<IWebsocketConnectorRpcClient>
20
20
  ) {
21
21
  super(localPeerDescriptor, remotePeerDescriptor, 'DUMMY', client)
22
22
  }
23
23
 
24
24
  async requestConnection(ip: string, port: number): Promise<boolean> {
25
25
  logger.trace(`Requesting WebSocket connection from ${keyFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
26
- const request: WebSocketConnectionRequest = {
26
+ const request: WebsocketConnectionRequest = {
27
27
  ip,
28
28
  port
29
29
  }
30
30
  const options = this.formDhtRpcOptions()
31
31
  try {
32
32
  const res = await this.getClient().requestConnection(request, options)
33
-
34
- if (res.reason) {
35
- logger.debug('WebSocketConnectionRequest Rejected', {
36
- stack: new Err.WebSocketConnectionRequestRejected(res.reason).stack
37
- })
38
- }
39
33
  return res.accepted
40
34
  } catch (err) {
41
- logger.debug(new Err.WebSocketConnectionRequestRejected('WebSocketConnectionRequest rejected', err).stack!)
35
+ logger.debug(new Err.WebsocketConnectionRequestRejected('WebsocketConnectionRequest rejected', err).stack!)
42
36
  return false
43
37
  }
44
38
  }