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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +7 -8
  2. package/dist/src/connection/ConnectionLockHandler.js +16 -14
  3. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  4. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +20 -0
  5. package/dist/src/connection/ConnectionLockRpcLocal.js +47 -0
  6. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -0
  7. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -3
  8. package/dist/src/connection/ConnectionLockRpcRemote.js +6 -6
  9. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  10. package/dist/src/connection/ConnectionManager.d.ts +5 -8
  11. package/dist/src/connection/ConnectionManager.js +77 -107
  12. package/dist/src/connection/ConnectionManager.js.map +1 -1
  13. package/dist/src/connection/ConnectivityChecker.d.ts +7 -6
  14. package/dist/src/connection/ConnectivityChecker.js +23 -20
  15. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  16. package/dist/src/connection/ConnectorFacade.d.ts +15 -12
  17. package/dist/src/connection/ConnectorFacade.js +61 -26
  18. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  19. package/dist/src/connection/Handshaker.d.ts +2 -2
  20. package/dist/src/connection/Handshaker.js +28 -28
  21. package/dist/src/connection/Handshaker.js.map +1 -1
  22. package/dist/src/connection/IConnection.d.ts +5 -6
  23. package/dist/src/connection/IConnection.js.map +1 -1
  24. package/dist/src/connection/ManagedConnection.d.ts +3 -4
  25. package/dist/src/connection/ManagedConnection.js +30 -30
  26. package/dist/src/connection/ManagedConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedWebrtcConnection.d.ts +7 -0
  28. package/dist/src/connection/ManagedWebrtcConnection.js +20 -0
  29. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -0
  30. package/dist/src/connection/{Simulator → simulator}/Simulator.js +3 -3
  31. package/dist/src/connection/{Simulator → simulator}/Simulator.js.map +1 -1
  32. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.d.ts +3 -4
  33. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.js +22 -22
  34. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -0
  35. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.d.ts +2 -2
  36. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js +11 -11
  37. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js.map +1 -1
  38. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.d.ts +1 -1
  39. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.js +2 -2
  40. package/dist/src/connection/simulator/SimulatorTransport.js.map +1 -0
  41. package/dist/src/connection/{Simulator → simulator}/pings.js.map +1 -1
  42. package/dist/src/connection/{WebRTC/IWebRtcConnection.d.ts → webrtc/IWebrtcConnection.d.ts} +2 -2
  43. package/dist/src/connection/{WebRTC/IWebRtcConnection.js → webrtc/IWebrtcConnection.js} +1 -1
  44. package/dist/src/connection/webrtc/IWebrtcConnection.js.map +1 -0
  45. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.d.ts → webrtc/NodeWebrtcConnection.d.ts} +6 -7
  46. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.js → webrtc/NodeWebrtcConnection.js} +36 -36
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -0
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +38 -0
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +178 -0
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -0
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +26 -0
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +99 -0
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -0
  54. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.d.ts → webrtc/WebrtcConnectorRpcRemote.d.ts} +4 -4
  55. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.js → webrtc/WebrtcConnectorRpcRemote.js} +6 -8
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -0
  57. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.d.ts +1 -1
  58. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +26 -0
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +37 -0
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -0
  62. package/dist/src/connection/{WebSocket/ClientWebSocket.d.ts → websocket/ClientWebsocket.d.ts} +5 -4
  63. package/dist/src/connection/{WebSocket/ClientWebSocket.js → websocket/ClientWebsocket.js} +20 -16
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -0
  65. package/dist/src/connection/{WebSocket/ServerWebSocket.d.ts → websocket/ServerWebsocket.d.ts} +2 -2
  66. package/dist/src/connection/{WebSocket/ServerWebSocket.js → websocket/ServerWebsocket.js} +23 -27
  67. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -0
  68. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.d.ts → websocket/WebsocketConnector.d.ts} +23 -15
  69. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.js → websocket/WebsocketConnector.js} +107 -101
  70. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -0
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +17 -0
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +26 -0
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -0
  74. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.d.ts → websocket/WebsocketConnectorRpcRemote.d.ts} +3 -3
  75. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js → websocket/WebsocketConnectorRpcRemote.js} +5 -10
  76. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js.map → websocket/WebsocketConnectorRpcRemote.js.map} +1 -1
  77. package/dist/src/connection/{WebSocket/WebSocketServer.d.ts → websocket/WebsocketServer.d.ts} +6 -3
  78. package/dist/src/connection/{WebSocket/WebSocketServer.js → websocket/WebsocketServer.js} +39 -19
  79. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +11 -19
  81. package/dist/src/dht/DhtNode.js +119 -150
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +22 -0
  84. package/dist/src/dht/DhtNodeRpcLocal.js +42 -0
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -0
  86. package/dist/src/dht/{RemoteDhtNode.d.ts → DhtNodeRpcRemote.d.ts} +5 -3
  87. package/dist/src/dht/{RemoteDhtNode.js → DhtNodeRpcRemote.js} +17 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -0
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +16 -0
  90. package/dist/src/dht/ExternalApiRpcLocal.js +30 -0
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -0
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
  93. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/contact/Remote.d.ts +4 -1
  96. package/dist/src/dht/contact/Remote.js +28 -2
  97. package/dist/src/dht/contact/Remote.js.map +1 -1
  98. package/dist/src/dht/contact/SortedContactList.d.ts +2 -2
  99. package/dist/src/dht/contact/SortedContactList.js +3 -3
  100. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  101. package/dist/src/dht/discovery/DiscoverySession.d.ts +9 -7
  102. package/dist/src/dht/discovery/DiscoverySession.js +8 -8
  103. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  104. package/dist/src/dht/discovery/PeerDiscovery.d.ts +7 -10
  105. package/dist/src/dht/discovery/PeerDiscovery.js +5 -5
  106. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  107. package/dist/src/dht/find/FindRpcLocal.d.ts +14 -0
  108. package/dist/src/dht/find/FindRpcLocal.js +25 -0
  109. package/dist/src/dht/find/FindRpcLocal.js.map +1 -0
  110. package/dist/src/dht/find/{RecursiveFindSession.d.ts → FindSession.d.ts} +12 -13
  111. package/dist/src/dht/find/{RecursiveFindSession.js → FindSession.js} +17 -15
  112. package/dist/src/dht/find/FindSession.js.map +1 -0
  113. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +12 -0
  114. package/dist/src/dht/find/FindSessionRpcLocal.js +17 -0
  115. package/dist/src/dht/find/FindSessionRpcLocal.js.map +1 -0
  116. package/dist/src/dht/find/{RemoteRecursiveFindSession.d.ts → FindSessionRpcRemote.d.ts} +2 -2
  117. package/dist/src/dht/find/{RemoteRecursiveFindSession.js → FindSessionRpcRemote.js} +5 -5
  118. package/dist/src/dht/find/FindSessionRpcRemote.js.map +1 -0
  119. package/dist/src/dht/find/{RecursiveFinder.d.ts → Finder.d.ts} +16 -19
  120. package/dist/src/dht/find/{RecursiveFinder.js → Finder.js} +50 -46
  121. package/dist/src/dht/find/Finder.js.map +1 -0
  122. package/dist/src/dht/routing/FindRpcRemote.d.ts +6 -0
  123. package/dist/src/dht/routing/FindRpcRemote.js +41 -0
  124. package/dist/src/dht/routing/FindRpcRemote.js.map +1 -0
  125. package/dist/src/dht/routing/Router.d.ts +10 -17
  126. package/dist/src/dht/routing/Router.js +47 -90
  127. package/dist/src/dht/routing/Router.js.map +1 -1
  128. package/dist/src/dht/routing/RouterRpcLocal.d.ts +22 -0
  129. package/dist/src/dht/routing/RouterRpcLocal.js +66 -0
  130. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -0
  131. package/dist/src/dht/routing/RouterRpcRemote.d.ts +0 -1
  132. package/dist/src/dht/routing/RouterRpcRemote.js +15 -43
  133. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  134. package/dist/src/dht/routing/RoutingSession.d.ts +17 -8
  135. package/dist/src/dht/routing/RoutingSession.js +124 -131
  136. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  137. package/dist/src/dht/routing/getPreviousPeer.d.ts +2 -0
  138. package/dist/src/dht/routing/getPreviousPeer.js +9 -0
  139. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -0
  140. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -8
  141. package/dist/src/dht/store/StoreRpcLocal.js +25 -24
  142. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  143. package/dist/src/dht/store/StoreRpcRemote.js +3 -7
  144. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  145. package/dist/src/exports.d.ts +11 -5
  146. package/dist/src/exports.js +17 -4
  147. package/dist/src/exports.js.map +1 -1
  148. package/dist/src/helpers/Connectivity.d.ts +4 -0
  149. package/dist/src/helpers/Connectivity.js +24 -0
  150. package/dist/src/helpers/Connectivity.js.map +1 -0
  151. package/dist/src/helpers/errors.d.ts +3 -3
  152. package/dist/src/helpers/errors.js +7 -7
  153. package/dist/src/helpers/protoClasses.js +3 -3
  154. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +56 -39
  155. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +49 -36
  156. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  157. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +64 -84
  158. package/dist/src/proto/packages/dht/protos/DhtRpc.js +64 -66
  159. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  160. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -21
  161. package/dist/src/rpc-protocol/DhtCallContext.d.ts +0 -1
  162. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  163. package/dist/src/transport/ITransport.d.ts +5 -6
  164. package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -1
  165. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  166. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
  167. package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
  168. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  169. package/dist/src/types/ServiceID.d.ts +1 -0
  170. package/dist/src/types/ServiceID.js +3 -0
  171. package/dist/src/types/ServiceID.js.map +1 -0
  172. package/karma.config.js +4 -4
  173. package/package.json +10 -8
  174. package/protos/DhtRpc.proto +32 -35
  175. package/src/connection/ConnectionLockHandler.ts +19 -17
  176. package/src/connection/ConnectionLockRpcLocal.ts +74 -0
  177. package/src/connection/ConnectionLockRpcRemote.ts +7 -6
  178. package/src/connection/ConnectionManager.ts +59 -95
  179. package/src/connection/ConnectivityChecker.ts +30 -26
  180. package/src/connection/ConnectorFacade.ts +74 -34
  181. package/src/connection/Handshaker.ts +9 -9
  182. package/src/connection/IConnection.ts +5 -6
  183. package/src/connection/ManagedConnection.ts +21 -22
  184. package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +9 -9
  185. package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
  186. package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +23 -24
  187. package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +13 -13
  188. package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
  189. package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +12 -13
  190. package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
  191. package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +32 -33
  192. package/src/connection/webrtc/WebrtcConnector.ts +225 -0
  193. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
  194. package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
  195. package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
  196. package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
  197. package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +19 -17
  198. package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +21 -27
  199. package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts} +109 -100
  200. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
  201. package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +6 -12
  202. package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
  203. package/src/dht/DhtNode.ts +144 -179
  204. package/src/dht/DhtNodeRpcLocal.ts +68 -0
  205. package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +12 -13
  206. package/src/dht/ExternalApiRpcLocal.ts +46 -0
  207. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  208. package/src/dht/contact/Remote.ts +32 -4
  209. package/src/dht/contact/SortedContactList.ts +4 -4
  210. package/src/dht/discovery/DiscoverySession.ts +23 -20
  211. package/src/dht/discovery/PeerDiscovery.ts +14 -17
  212. package/src/dht/find/FindRpcLocal.ts +35 -0
  213. package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +25 -25
  214. package/src/dht/find/FindSessionRpcLocal.ts +25 -0
  215. package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
  216. package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +77 -71
  217. package/src/dht/routing/FindRpcRemote.ts +40 -0
  218. package/src/dht/routing/Router.ts +69 -105
  219. package/src/dht/routing/RouterRpcLocal.ts +81 -0
  220. package/src/dht/routing/RouterRpcRemote.ts +15 -45
  221. package/src/dht/routing/RoutingSession.ts +56 -61
  222. package/src/dht/routing/getPreviousPeer.ts +6 -0
  223. package/src/dht/store/StoreRpcLocal.ts +44 -37
  224. package/src/dht/store/StoreRpcRemote.ts +4 -8
  225. package/src/exports.ts +11 -5
  226. package/src/helpers/Connectivity.ts +19 -0
  227. package/src/helpers/errors.ts +3 -3
  228. package/src/helpers/protoClasses.ts +6 -6
  229. package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
  230. package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
  231. package/src/proto/packages/dht/protos/DhtRpc.ts +87 -114
  232. package/src/rpc-protocol/DhtCallContext.ts +0 -1
  233. package/src/transport/ITransport.ts +5 -8
  234. package/src/transport/ListeningRpcCommunicator.ts +2 -1
  235. package/src/transport/RoutingRpcCommunicator.ts +3 -4
  236. package/src/types/ServiceID.ts +1 -0
  237. package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +6 -6
  238. package/test/benchmark/KademliaCorrectness.test.ts +2 -2
  239. package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
  240. package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
  241. package/test/end-to-end/Layer0.test.ts +35 -17
  242. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +24 -6
  243. package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
  244. package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
  245. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
  246. package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
  247. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
  248. package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
  249. package/test/end-to-end/memory-leak.test.ts +85 -0
  250. package/test/integration/ConnectionLocking.test.ts +4 -4
  251. package/test/integration/ConnectionManager.test.ts +37 -28
  252. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  253. package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
  254. package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
  255. package/test/integration/DhtRpc.test.ts +5 -5
  256. package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +3 -3
  257. package/test/integration/Layer1-scale.test.ts +1 -1
  258. package/test/integration/MigrateData.test.ts +6 -5
  259. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
  260. package/test/integration/MultipleEntryPointJoining.test.ts +6 -6
  261. package/test/integration/RouteMessage.test.ts +26 -26
  262. package/test/integration/RpcErrors.test.ts +10 -10
  263. package/test/integration/ScaleDownDht.test.ts +3 -3
  264. package/test/integration/SimultaneousConnections.test.ts +10 -7
  265. package/test/integration/Store.test.ts +1 -1
  266. package/test/integration/StoreAndDelete.test.ts +1 -1
  267. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
  268. package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +4 -4
  269. package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
  270. package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
  271. package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
  272. package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
  273. package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
  274. package/test/unit/ConnectivityHelpers.test.ts +69 -0
  275. package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
  276. package/test/unit/Router.test.ts +26 -26
  277. package/test/unit/UUID.test.ts +1 -1
  278. package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
  279. package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
  280. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
  281. package/test/utils/FakeRpcCommunicator.ts +23 -0
  282. package/test/utils/mock/Transport.ts +1 -1
  283. package/test/utils/utils.ts +14 -24
  284. package/tsconfig.browser.json +1 -1
  285. package/tsconfig.jest.json +3 -2
  286. package/tsconfig.node.json +3 -2
  287. package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
  288. package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
  289. package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
  290. package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
  291. package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
  292. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
  293. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
  294. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
  295. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
  296. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
  297. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
  298. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
  299. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
  300. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
  301. package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
  302. package/dist/src/dht/RemoteDhtNode.js.map +0 -1
  303. package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
  304. package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
  305. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
  306. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
  307. package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
  308. package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
  309. package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
  310. package/src/dht/registerExternalApiRpcMethods.ts +0 -44
  311. package/test/utils/mock/RecursiveFinder.ts +0 -19
  312. /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
  313. /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
  314. /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
  315. /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
  316. /package/src/connection/{Simulator → simulator}/pings.ts +0 -0
@@ -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
293
+ this.abortController.abort()
264
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
  }
@@ -2,16 +2,15 @@ import { createServer as createHttpServer, Server as HttpServer, IncomingMessage
2
2
  import { createServer as createHttpsServer, Server as HttpsServer } from 'https'
3
3
  import EventEmitter from 'eventemitter3'
4
4
  import { server as WsServer } from 'websocket'
5
- import { ServerWebSocket } from './ServerWebSocket'
6
- import {
7
- ConnectionSourceEvents
8
- } from '../IConnectionSource'
9
-
5
+ import { ServerWebsocket } from './ServerWebsocket'
6
+ import { ConnectionSourceEvents } from '../IConnectionSource'
10
7
  import { Logger, asAbortable } from '@streamr/utils'
11
- import { WebSocketServerStartError } from '../../helpers/errors'
8
+ import { createSelfSignedCertificate } from '@streamr/autocertifier-client'
9
+ import { WebsocketServerStartError } from '../../helpers/errors'
12
10
  import { PortRange, TlsCertificate } from '../ConnectionManager'
13
11
  import { range } from 'lodash'
14
12
  import fs from 'fs'
13
+ import { UUID } from '../../helpers/UUID'
15
14
 
16
15
  const logger = new Logger(module)
17
16
 
@@ -22,24 +21,27 @@ const logger = new Logger(module)
22
21
 
23
22
  declare class NodeJsWsServer extends WsServer { }
24
23
 
25
- interface WebSocketServerConfig {
24
+ interface WebsocketServerConfig {
26
25
  portRange: PortRange
26
+ enableTls: boolean
27
27
  tlsCertificate?: TlsCertificate
28
28
  maxMessageSize?: number
29
29
  }
30
30
 
31
- export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
31
+ export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
32
32
 
33
33
  private httpServer?: HttpServer | HttpsServer
34
34
  private wsServer?: WsServer
35
35
  private readonly abortController = new AbortController()
36
36
  private readonly portRange: PortRange
37
37
  private readonly tlsCertificate?: TlsCertificate
38
+ private readonly enableTls: boolean
38
39
  private readonly maxMessageSize: number
39
40
 
40
- constructor(config: WebSocketServerConfig) {
41
+ constructor(config: WebsocketServerConfig) {
41
42
  super()
42
43
  this.portRange = config.portRange
44
+ this.enableTls = config.enableTls
43
45
  this.tlsCertificate = config.tlsCertificate
44
46
  this.maxMessageSize = config.maxMessageSize ?? 1048576
45
47
  }
@@ -48,33 +50,42 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
48
50
  const ports = range(this.portRange.min, this.portRange.max + 1)
49
51
  for (const port of ports) {
50
52
  try {
51
- await asAbortable(this.startServer(port, this.tlsCertificate), this.abortController.signal)
53
+ await asAbortable(this.startServer(port, this.enableTls), this.abortController.signal)
52
54
  return port
53
55
  } catch (err) {
54
56
  if (err.originalError?.code === 'EADDRINUSE') {
55
57
  logger.debug(`failed to start WebSocket server on port: ${port} reattempting on next port`)
56
58
  } else {
57
- throw new WebSocketServerStartError(err)
59
+ throw new WebsocketServerStartError(err)
58
60
  }
59
61
  }
60
62
  }
61
- throw new WebSocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
63
+ throw new WebsocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
62
64
  }
63
65
 
64
- private startServer(port: number, tlsCertificate?: TlsCertificate): Promise<void> {
66
+ // If tlsCertificate has been given the tls boolean is ignored
67
+ // TODO: could be simplified?
68
+ private startServer(port: number, tls: boolean): Promise<void> {
65
69
  const requestListener = (request: IncomingMessage, response: ServerResponse<IncomingMessage>) => {
66
70
  logger.trace('Received request for ' + request.url)
67
71
  response.writeHead(404)
68
72
  response.end()
69
73
  }
70
74
  return new Promise((resolve, reject) => {
71
- this.httpServer = tlsCertificate ?
72
- createHttpsServer({
73
- key: fs.readFileSync(tlsCertificate.privateKeyFileName),
74
- cert: fs.readFileSync(tlsCertificate.certFileName)
75
+ if (this.tlsCertificate) {
76
+ this.httpServer = createHttpsServer({
77
+ key: fs.readFileSync(this.tlsCertificate.privateKeyFileName),
78
+ cert: fs.readFileSync(this.tlsCertificate.certFileName)
79
+ }, requestListener)
80
+ } else if (!tls) {
81
+ this.httpServer = createHttpServer(requestListener)
82
+ } else {
83
+ const certificate = createSelfSignedCertificate('streamr-self-signed-' + new UUID().toString(), 1000)
84
+ this.httpServer = createHttpsServer({
85
+ key: certificate.serverKey,
86
+ cert: certificate.serverCert
75
87
  }, requestListener)
76
- :
77
- createHttpServer(requestListener)
88
+ }
78
89
 
79
90
  function originIsAllowed() {
80
91
  return true
@@ -94,10 +105,10 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
94
105
 
95
106
  logger.trace('IConnection accepted.')
96
107
 
97
- this.emit('connected', new ServerWebSocket(connection, request.resourceURL))
108
+ this.emit('connected', new ServerWebsocket(connection, request.resourceURL))
98
109
  })
99
110
  this.httpServer.once('error', (err: Error) => {
100
- reject(new WebSocketServerStartError('Starting Websocket server failed', err))
111
+ reject(new WebsocketServerStartError('Starting Websocket server failed', err))
101
112
  })
102
113
 
103
114
  this.httpServer.once('listening', () => {
@@ -109,11 +120,18 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
109
120
  // Listen only to IPv4 network interfaces, default value listens to IPv6 as well
110
121
  this.httpServer.listen(port, '0.0.0.0')
111
122
  } catch (e) {
112
- reject(new WebSocketServerStartError('Websocket server threw an exception', e))
123
+ reject(new WebsocketServerStartError('Websocket server threw an exception', e))
113
124
  }
114
125
  })
115
126
  }
116
127
 
128
+ public updateCertificate(cert: string, key: string): void {
129
+ (this.httpServer! as HttpsServer).setSecureContext({
130
+ cert,
131
+ key
132
+ })
133
+ }
134
+
117
135
  public stop(): Promise<void> {
118
136
  this.abortController.abort()
119
137
  this.removeAllListeners()