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

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