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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +7 -8
  2. package/dist/src/connection/ConnectionLockHandler.js +16 -14
  3. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  4. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +20 -0
  5. package/dist/src/connection/ConnectionLockRpcLocal.js +47 -0
  6. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -0
  7. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -3
  8. package/dist/src/connection/ConnectionLockRpcRemote.js +6 -6
  9. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  10. package/dist/src/connection/ConnectionManager.d.ts +5 -8
  11. package/dist/src/connection/ConnectionManager.js +77 -107
  12. package/dist/src/connection/ConnectionManager.js.map +1 -1
  13. package/dist/src/connection/ConnectivityChecker.d.ts +7 -6
  14. package/dist/src/connection/ConnectivityChecker.js +23 -20
  15. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  16. package/dist/src/connection/ConnectorFacade.d.ts +15 -12
  17. package/dist/src/connection/ConnectorFacade.js +61 -26
  18. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  19. package/dist/src/connection/Handshaker.d.ts +2 -2
  20. package/dist/src/connection/Handshaker.js +28 -28
  21. package/dist/src/connection/Handshaker.js.map +1 -1
  22. package/dist/src/connection/IConnection.d.ts +5 -6
  23. package/dist/src/connection/IConnection.js.map +1 -1
  24. package/dist/src/connection/ManagedConnection.d.ts +3 -4
  25. package/dist/src/connection/ManagedConnection.js +30 -30
  26. package/dist/src/connection/ManagedConnection.js.map +1 -1
  27. package/dist/src/connection/ManagedWebrtcConnection.d.ts +7 -0
  28. package/dist/src/connection/ManagedWebrtcConnection.js +20 -0
  29. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -0
  30. package/dist/src/connection/{Simulator → simulator}/Simulator.js +3 -3
  31. package/dist/src/connection/{Simulator → simulator}/Simulator.js.map +1 -1
  32. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.d.ts +3 -4
  33. package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.js +22 -22
  34. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -0
  35. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.d.ts +2 -2
  36. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js +11 -11
  37. package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js.map +1 -1
  38. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.d.ts +1 -1
  39. package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.js +2 -2
  40. package/dist/src/connection/simulator/SimulatorTransport.js.map +1 -0
  41. package/dist/src/connection/{Simulator → simulator}/pings.js.map +1 -1
  42. package/dist/src/connection/{WebRTC/IWebRtcConnection.d.ts → webrtc/IWebrtcConnection.d.ts} +2 -2
  43. package/dist/src/connection/{WebRTC/IWebRtcConnection.js → webrtc/IWebrtcConnection.js} +1 -1
  44. package/dist/src/connection/webrtc/IWebrtcConnection.js.map +1 -0
  45. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.d.ts → webrtc/NodeWebrtcConnection.d.ts} +6 -7
  46. package/dist/src/connection/{WebRTC/NodeWebRtcConnection.js → webrtc/NodeWebrtcConnection.js} +36 -36
  47. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -0
  48. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +38 -0
  49. package/dist/src/connection/webrtc/WebrtcConnector.js +178 -0
  50. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -0
  51. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +26 -0
  52. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +99 -0
  53. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -0
  54. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.d.ts → webrtc/WebrtcConnectorRpcRemote.d.ts} +4 -4
  55. package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.js → webrtc/WebrtcConnectorRpcRemote.js} +6 -8
  56. package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -0
  57. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.d.ts +1 -1
  58. package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js.map +1 -1
  59. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +26 -0
  60. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +37 -0
  61. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -0
  62. package/dist/src/connection/{WebSocket/ClientWebSocket.d.ts → websocket/ClientWebsocket.d.ts} +5 -4
  63. package/dist/src/connection/{WebSocket/ClientWebSocket.js → websocket/ClientWebsocket.js} +20 -16
  64. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -0
  65. package/dist/src/connection/{WebSocket/ServerWebSocket.d.ts → websocket/ServerWebsocket.d.ts} +2 -2
  66. package/dist/src/connection/{WebSocket/ServerWebSocket.js → websocket/ServerWebsocket.js} +23 -27
  67. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -0
  68. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.d.ts → websocket/WebsocketConnector.d.ts} +23 -15
  69. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.js → websocket/WebsocketConnector.js} +107 -101
  70. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -0
  71. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +17 -0
  72. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +26 -0
  73. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -0
  74. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.d.ts → websocket/WebsocketConnectorRpcRemote.d.ts} +3 -3
  75. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js → websocket/WebsocketConnectorRpcRemote.js} +5 -10
  76. package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js.map → websocket/WebsocketConnectorRpcRemote.js.map} +1 -1
  77. package/dist/src/connection/{WebSocket/WebSocketServer.d.ts → websocket/WebsocketServer.d.ts} +6 -3
  78. package/dist/src/connection/{WebSocket/WebSocketServer.js → websocket/WebsocketServer.js} +39 -19
  79. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -0
  80. package/dist/src/dht/DhtNode.d.ts +11 -19
  81. package/dist/src/dht/DhtNode.js +119 -150
  82. package/dist/src/dht/DhtNode.js.map +1 -1
  83. package/dist/src/dht/DhtNodeRpcLocal.d.ts +22 -0
  84. package/dist/src/dht/DhtNodeRpcLocal.js +42 -0
  85. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -0
  86. package/dist/src/dht/{RemoteDhtNode.d.ts → DhtNodeRpcRemote.d.ts} +5 -3
  87. package/dist/src/dht/{RemoteDhtNode.js → DhtNodeRpcRemote.js} +17 -21
  88. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -0
  89. package/dist/src/dht/ExternalApiRpcLocal.d.ts +16 -0
  90. package/dist/src/dht/ExternalApiRpcLocal.js +30 -0
  91. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -0
  92. package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
  93. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  94. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  95. package/dist/src/dht/contact/Remote.d.ts +4 -1
  96. package/dist/src/dht/contact/Remote.js +28 -2
  97. package/dist/src/dht/contact/Remote.js.map +1 -1
  98. package/dist/src/dht/contact/SortedContactList.d.ts +2 -2
  99. package/dist/src/dht/contact/SortedContactList.js +3 -3
  100. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  101. package/dist/src/dht/discovery/DiscoverySession.d.ts +9 -7
  102. package/dist/src/dht/discovery/DiscoverySession.js +8 -8
  103. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  104. package/dist/src/dht/discovery/PeerDiscovery.d.ts +7 -10
  105. package/dist/src/dht/discovery/PeerDiscovery.js +5 -5
  106. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  107. package/dist/src/dht/find/FindRpcLocal.d.ts +14 -0
  108. package/dist/src/dht/find/FindRpcLocal.js +25 -0
  109. package/dist/src/dht/find/FindRpcLocal.js.map +1 -0
  110. package/dist/src/dht/find/{RecursiveFindSession.d.ts → FindSession.d.ts} +12 -13
  111. package/dist/src/dht/find/{RecursiveFindSession.js → FindSession.js} +17 -15
  112. package/dist/src/dht/find/FindSession.js.map +1 -0
  113. package/dist/src/dht/find/FindSessionRpcLocal.d.ts +12 -0
  114. package/dist/src/dht/find/FindSessionRpcLocal.js +17 -0
  115. package/dist/src/dht/find/FindSessionRpcLocal.js.map +1 -0
  116. package/dist/src/dht/find/{RemoteRecursiveFindSession.d.ts → FindSessionRpcRemote.d.ts} +2 -2
  117. package/dist/src/dht/find/{RemoteRecursiveFindSession.js → FindSessionRpcRemote.js} +5 -5
  118. package/dist/src/dht/find/FindSessionRpcRemote.js.map +1 -0
  119. package/dist/src/dht/find/{RecursiveFinder.d.ts → Finder.d.ts} +16 -19
  120. package/dist/src/dht/find/{RecursiveFinder.js → Finder.js} +50 -46
  121. package/dist/src/dht/find/Finder.js.map +1 -0
  122. package/dist/src/dht/routing/FindRpcRemote.d.ts +6 -0
  123. package/dist/src/dht/routing/FindRpcRemote.js +41 -0
  124. package/dist/src/dht/routing/FindRpcRemote.js.map +1 -0
  125. package/dist/src/dht/routing/Router.d.ts +10 -17
  126. package/dist/src/dht/routing/Router.js +47 -90
  127. package/dist/src/dht/routing/Router.js.map +1 -1
  128. package/dist/src/dht/routing/RouterRpcLocal.d.ts +22 -0
  129. package/dist/src/dht/routing/RouterRpcLocal.js +66 -0
  130. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -0
  131. package/dist/src/dht/routing/RouterRpcRemote.d.ts +0 -1
  132. package/dist/src/dht/routing/RouterRpcRemote.js +15 -43
  133. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  134. package/dist/src/dht/routing/RoutingSession.d.ts +17 -8
  135. package/dist/src/dht/routing/RoutingSession.js +124 -131
  136. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  137. package/dist/src/dht/routing/getPreviousPeer.d.ts +2 -0
  138. package/dist/src/dht/routing/getPreviousPeer.js +9 -0
  139. package/dist/src/dht/routing/getPreviousPeer.js.map +1 -0
  140. package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -8
  141. package/dist/src/dht/store/StoreRpcLocal.js +25 -24
  142. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  143. package/dist/src/dht/store/StoreRpcRemote.js +3 -7
  144. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  145. package/dist/src/exports.d.ts +11 -5
  146. package/dist/src/exports.js +17 -4
  147. package/dist/src/exports.js.map +1 -1
  148. package/dist/src/helpers/Connectivity.d.ts +4 -0
  149. package/dist/src/helpers/Connectivity.js +24 -0
  150. package/dist/src/helpers/Connectivity.js.map +1 -0
  151. package/dist/src/helpers/errors.d.ts +3 -3
  152. package/dist/src/helpers/errors.js +7 -7
  153. package/dist/src/helpers/protoClasses.js +3 -3
  154. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +56 -39
  155. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +49 -36
  156. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  157. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +64 -84
  158. package/dist/src/proto/packages/dht/protos/DhtRpc.js +64 -66
  159. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  160. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -21
  161. package/dist/src/rpc-protocol/DhtCallContext.d.ts +0 -1
  162. package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
  163. package/dist/src/transport/ITransport.d.ts +5 -6
  164. package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -1
  165. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  166. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
  167. package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
  168. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  169. package/dist/src/types/ServiceID.d.ts +1 -0
  170. package/dist/src/types/ServiceID.js +3 -0
  171. package/dist/src/types/ServiceID.js.map +1 -0
  172. package/karma.config.js +4 -4
  173. package/package.json +10 -8
  174. package/protos/DhtRpc.proto +32 -35
  175. package/src/connection/ConnectionLockHandler.ts +19 -17
  176. package/src/connection/ConnectionLockRpcLocal.ts +74 -0
  177. package/src/connection/ConnectionLockRpcRemote.ts +7 -6
  178. package/src/connection/ConnectionManager.ts +59 -95
  179. package/src/connection/ConnectivityChecker.ts +30 -26
  180. package/src/connection/ConnectorFacade.ts +74 -34
  181. package/src/connection/Handshaker.ts +9 -9
  182. package/src/connection/IConnection.ts +5 -6
  183. package/src/connection/ManagedConnection.ts +21 -22
  184. package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +9 -9
  185. package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
  186. package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +23 -24
  187. package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +13 -13
  188. package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
  189. package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +12 -13
  190. package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
  191. package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +32 -33
  192. package/src/connection/webrtc/WebrtcConnector.ts +225 -0
  193. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
  194. package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
  195. package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
  196. package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
  197. package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +19 -17
  198. package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +21 -27
  199. package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts} +109 -100
  200. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
  201. package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +6 -12
  202. package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
  203. package/src/dht/DhtNode.ts +144 -179
  204. package/src/dht/DhtNodeRpcLocal.ts +68 -0
  205. package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +12 -13
  206. package/src/dht/ExternalApiRpcLocal.ts +46 -0
  207. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  208. package/src/dht/contact/Remote.ts +32 -4
  209. package/src/dht/contact/SortedContactList.ts +4 -4
  210. package/src/dht/discovery/DiscoverySession.ts +23 -20
  211. package/src/dht/discovery/PeerDiscovery.ts +14 -17
  212. package/src/dht/find/FindRpcLocal.ts +35 -0
  213. package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +25 -25
  214. package/src/dht/find/FindSessionRpcLocal.ts +25 -0
  215. package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
  216. package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +77 -71
  217. package/src/dht/routing/FindRpcRemote.ts +40 -0
  218. package/src/dht/routing/Router.ts +69 -105
  219. package/src/dht/routing/RouterRpcLocal.ts +81 -0
  220. package/src/dht/routing/RouterRpcRemote.ts +15 -45
  221. package/src/dht/routing/RoutingSession.ts +56 -61
  222. package/src/dht/routing/getPreviousPeer.ts +6 -0
  223. package/src/dht/store/StoreRpcLocal.ts +44 -37
  224. package/src/dht/store/StoreRpcRemote.ts +4 -8
  225. package/src/exports.ts +11 -5
  226. package/src/helpers/Connectivity.ts +19 -0
  227. package/src/helpers/errors.ts +3 -3
  228. package/src/helpers/protoClasses.ts +6 -6
  229. package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
  230. package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
  231. package/src/proto/packages/dht/protos/DhtRpc.ts +87 -114
  232. package/src/rpc-protocol/DhtCallContext.ts +0 -1
  233. package/src/transport/ITransport.ts +5 -8
  234. package/src/transport/ListeningRpcCommunicator.ts +2 -1
  235. package/src/transport/RoutingRpcCommunicator.ts +3 -4
  236. package/src/types/ServiceID.ts +1 -0
  237. package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +6 -6
  238. package/test/benchmark/KademliaCorrectness.test.ts +2 -2
  239. package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
  240. package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
  241. package/test/end-to-end/Layer0.test.ts +35 -17
  242. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +24 -6
  243. package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
  244. package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
  245. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
  246. package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
  247. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
  248. package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
  249. package/test/end-to-end/memory-leak.test.ts +85 -0
  250. package/test/integration/ConnectionLocking.test.ts +4 -4
  251. package/test/integration/ConnectionManager.test.ts +37 -28
  252. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  253. package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
  254. package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
  255. package/test/integration/DhtRpc.test.ts +5 -5
  256. package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +3 -3
  257. package/test/integration/Layer1-scale.test.ts +1 -1
  258. package/test/integration/MigrateData.test.ts +6 -5
  259. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
  260. package/test/integration/MultipleEntryPointJoining.test.ts +6 -6
  261. package/test/integration/RouteMessage.test.ts +26 -26
  262. package/test/integration/RpcErrors.test.ts +10 -10
  263. package/test/integration/ScaleDownDht.test.ts +3 -3
  264. package/test/integration/SimultaneousConnections.test.ts +10 -7
  265. package/test/integration/Store.test.ts +1 -1
  266. package/test/integration/StoreAndDelete.test.ts +1 -1
  267. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
  268. package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +4 -4
  269. package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
  270. package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
  271. package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
  272. package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
  273. package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
  274. package/test/unit/ConnectivityHelpers.test.ts +69 -0
  275. package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
  276. package/test/unit/Router.test.ts +26 -26
  277. package/test/unit/UUID.test.ts +1 -1
  278. package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
  279. package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
  280. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
  281. package/test/utils/FakeRpcCommunicator.ts +23 -0
  282. package/test/utils/mock/Transport.ts +1 -1
  283. package/test/utils/utils.ts +14 -24
  284. package/tsconfig.browser.json +1 -1
  285. package/tsconfig.jest.json +3 -2
  286. package/tsconfig.node.json +3 -2
  287. package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
  288. package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
  289. package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
  290. package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
  291. package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
  292. package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
  293. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
  294. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
  295. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
  296. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
  297. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
  298. package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
  299. package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
  300. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
  301. package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
  302. package/dist/src/dht/RemoteDhtNode.js.map +0 -1
  303. package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
  304. package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
  305. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
  306. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
  307. package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
  308. package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
  309. package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
  310. package/src/dht/registerExternalApiRpcMethods.ts +0 -44
  311. package/test/utils/mock/RecursiveFinder.ts +0 -19
  312. /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
  313. /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
  314. /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
  315. /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
  316. /package/src/connection/{Simulator → simulator}/pings.ts +0 -0
@@ -0,0 +1,74 @@
1
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
+ import { Logger } from '@streamr/utils'
3
+ import {
4
+ areEqualPeerDescriptors,
5
+ keyFromPeerDescriptor,
6
+ peerIdFromPeerDescriptor
7
+ } from '../helpers/peerIdFromPeerDescriptor'
8
+ import { Empty } from '../proto/google/protobuf/empty'
9
+ import {
10
+ DisconnectMode,
11
+ DisconnectNotice,
12
+ LockRequest,
13
+ LockResponse,
14
+ PeerDescriptor,
15
+ UnlockRequest
16
+ } from '../proto/packages/dht/protos/DhtRpc'
17
+ import { IConnectionLockRpc } from '../proto/packages/dht/protos/DhtRpc.server'
18
+ import { DhtCallContext } from '../rpc-protocol/DhtCallContext'
19
+ import { PeerIDKey } from '../helpers/PeerID'
20
+ import { keyOrUnknownFromPeerDescriptor } from './ConnectionManager'
21
+ import { LockID } from './ConnectionLockHandler'
22
+
23
+ interface ConnectionLockRpcLocalConfig {
24
+ addRemoteLocked: (id: PeerIDKey, lockId: LockID) => void
25
+ removeRemoteLocked: (id: PeerIDKey, lockId: LockID) => void
26
+ closeConnection: (peerDescriptor: PeerDescriptor, gracefulLeave: boolean, reason?: string) => void
27
+ getLocalPeerDescriptor: () => PeerDescriptor
28
+ }
29
+
30
+ const logger = new Logger(module)
31
+
32
+ export class ConnectionLockRpcLocal implements IConnectionLockRpc {
33
+
34
+ private readonly config: ConnectionLockRpcLocalConfig
35
+
36
+ constructor(config: ConnectionLockRpcLocalConfig) {
37
+ this.config = config
38
+ }
39
+
40
+ async lockRequest(lockRequest: LockRequest, context: ServerCallContext): Promise<LockResponse> {
41
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
42
+ const remotePeerId = peerIdFromPeerDescriptor(senderPeerDescriptor)
43
+ if (areEqualPeerDescriptors(senderPeerDescriptor, this.config.getLocalPeerDescriptor())) {
44
+ const response: LockResponse = {
45
+ accepted: false
46
+ }
47
+ return response
48
+ }
49
+ this.config.addRemoteLocked(remotePeerId.toKey(), lockRequest.lockId)
50
+ const response: LockResponse = {
51
+ accepted: true
52
+ }
53
+ return response
54
+ }
55
+
56
+ async unlockRequest(unlockRequest: UnlockRequest, context: ServerCallContext): Promise<Empty> {
57
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
58
+ const peerIdKey = keyFromPeerDescriptor(senderPeerDescriptor)
59
+ this.config.removeRemoteLocked(peerIdKey, unlockRequest.lockId)
60
+ return {}
61
+ }
62
+
63
+ async gracefulDisconnect(disconnectNotice: DisconnectNotice, context: ServerCallContext): Promise<Empty> {
64
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
65
+ logger.trace(keyOrUnknownFromPeerDescriptor(senderPeerDescriptor) + ' received gracefulDisconnect notice')
66
+
67
+ if (disconnectNotice.disconnectMode === DisconnectMode.LEAVING) {
68
+ this.config.closeConnection(senderPeerDescriptor, true, 'graceful leave notified')
69
+ } else {
70
+ this.config.closeConnection(senderPeerDescriptor, false, 'graceful disconnect notified')
71
+ }
72
+ return {}
73
+ }
74
+ }
@@ -6,23 +6,24 @@ import { LockRequest, UnlockRequest, PeerDescriptor, DisconnectNotice, Disconnec
6
6
  import * as Err from '../helpers/errors'
7
7
  import { keyFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
8
8
  import { Remote } from '../dht/contact/Remote'
9
+ import { LockID } from './ConnectionLockHandler'
9
10
 
10
11
  const logger = new Logger(module)
11
12
 
12
13
  export class ConnectionLockRpcRemote extends Remote<IConnectionLockRpcClient> {
13
14
 
14
15
  constructor(
15
- ownPeerDescriptor: PeerDescriptor,
16
+ localPeerDescriptor: PeerDescriptor,
16
17
  targetPeerDescriptor: PeerDescriptor,
17
18
  client: ProtoRpcClient<IConnectionLockRpcClient>
18
19
  ) {
19
- super(ownPeerDescriptor, targetPeerDescriptor, 'DUMMY', client)
20
+ super(localPeerDescriptor, targetPeerDescriptor, 'DUMMY', client)
20
21
  }
21
22
 
22
- public async lockRequest(serviceId: string): Promise<boolean> {
23
+ public async lockRequest(lockId: LockID): Promise<boolean> {
23
24
  logger.trace(`Requesting locked connection to ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
24
25
  const request: LockRequest = {
25
- serviceId
26
+ lockId
26
27
  }
27
28
  const options = this.formDhtRpcOptions()
28
29
  try {
@@ -34,10 +35,10 @@ export class ConnectionLockRpcRemote extends Remote<IConnectionLockRpcClient> {
34
35
  }
35
36
  }
36
37
 
37
- public unlockRequest(serviceId: string): void {
38
+ public unlockRequest(lockId: LockID): void {
38
39
  logger.trace(`Requesting connection to be unlocked from ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
39
40
  const request: UnlockRequest = {
40
- serviceId
41
+ lockId
41
42
  }
42
43
  const options = this.formDhtRpcOptions({
43
44
  notification: true
@@ -12,7 +12,6 @@ import {
12
12
  peerIdFromPeerDescriptor
13
13
  } from '../helpers/peerIdFromPeerDescriptor'
14
14
  import { protoToString } from '../helpers/protoToString'
15
- import { Empty } from '../proto/google/protobuf/empty'
16
15
  import {
17
16
  DisconnectMode,
18
17
  DisconnectNotice,
@@ -25,15 +24,15 @@ import {
25
24
  UnlockRequest
26
25
  } from '../proto/packages/dht/protos/DhtRpc'
27
26
  import { ConnectionLockRpcClient } from '../proto/packages/dht/protos/DhtRpc.client'
28
- import { DisconnectionType, ITransport, TransportEvents } from '../transport/ITransport'
27
+ import { ITransport, TransportEvents } from '../transport/ITransport'
29
28
  import { RoutingRpcCommunicator } from '../transport/RoutingRpcCommunicator'
30
- import { ConnectionLockHandler } from './ConnectionLockHandler'
29
+ import { ConnectionLockHandler, LockID } from './ConnectionLockHandler'
31
30
  import { ConnectorFacade } from './ConnectorFacade'
32
31
  import { ManagedConnection, Events as ManagedConnectionEvents } from './ManagedConnection'
33
32
  import { ConnectionLockRpcRemote } from './ConnectionLockRpcRemote'
34
- import { WEB_RTC_CLEANUP } from './WebRTC/NodeWebRtcConnection'
33
+ import { WEBRTC_CLEANUP } from './webrtc/NodeWebrtcConnection'
35
34
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
36
- import { DhtCallContext } from '../rpc-protocol/DhtCallContext'
35
+ import { ConnectionLockRpcLocal } from './ConnectionLockRpcLocal'
37
36
 
38
37
  export interface ConnectionManagerConfig {
39
38
  maxConnections?: number
@@ -96,7 +95,7 @@ const INTERNAL_SERVICE_ID = 'system/connection-manager'
96
95
  // should only be used only for log output. TODO remove this method if we no longer use
97
96
  // peerDescriptors which can be undefined, e.g.
98
97
  // - if we refactor ConnectionManager so that it doesn't process handshake requests too early
99
- // and therefore this.ownPeerDescriptor can't be undefine (NET-1129)
98
+ // and therefore this.localPeerDescriptor can't be undefine (NET-1129)
100
99
  // - if the peerDescriptor of ManagedConnection is always available
101
100
  // - if we create stricter types for incoming messages (message.sourceDescriptor or
102
101
  // disconnectNotice.peerDescriptor)
@@ -126,8 +125,9 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
126
125
  super()
127
126
  this.config = config
128
127
  this.onData = this.onData.bind(this)
128
+ this.send = this.send.bind(this)
129
129
  this.onIncomingConnection = this.onIncomingConnection.bind(this)
130
- this.metricsContext = this.config.metricsContext || new MetricsContext()
130
+ this.metricsContext = this.config.metricsContext ?? new MetricsContext()
131
131
  this.metrics = {
132
132
  sendMessagesPerSecond: new RateMetric(),
133
133
  sendBytesPerSecond: new RateMetric(),
@@ -142,19 +142,27 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
142
142
  this.rpcCommunicator = new RoutingRpcCommunicator(INTERNAL_SERVICE_ID, this.send, {
143
143
  rpcRequestTimeout: 10000
144
144
  })
145
+ const lockRpcLocal = new ConnectionLockRpcLocal({
146
+ addRemoteLocked: (id: PeerIDKey, serviceId: string) => this.locks.addRemoteLocked(id, serviceId),
147
+ removeRemoteLocked: (id: PeerIDKey, serviceId: string) => this.locks.removeRemoteLocked(id, serviceId),
148
+ closeConnection: (peerDescriptor: PeerDescriptor, gracefulLeave: boolean, reason?: string) => {
149
+ this.closeConnection(peerDescriptor, gracefulLeave, reason)
150
+ },
151
+ getLocalPeerDescriptor: () => this.getLocalPeerDescriptor()
152
+ })
145
153
  this.rpcCommunicator.registerRpcMethod(LockRequest, LockResponse, 'lockRequest',
146
- (req: LockRequest, context: ServerCallContext) => this.lockRequest(req, context))
154
+ (req: LockRequest, context: ServerCallContext) => lockRpcLocal.lockRequest(req, context))
147
155
  this.rpcCommunicator.registerRpcNotification(UnlockRequest, 'unlockRequest',
148
- (req: UnlockRequest, context: ServerCallContext) => this.unlockRequest(req, context))
156
+ (req: UnlockRequest, context: ServerCallContext) => lockRpcLocal.unlockRequest(req, context))
149
157
  this.rpcCommunicator.registerRpcMethod(DisconnectNotice, DisconnectNoticeResponse, 'gracefulDisconnect',
150
- (req: DisconnectNotice, context: ServerCallContext) => this.gracefulDisconnect(req, context))
158
+ (req: DisconnectNotice, context: ServerCallContext) => lockRpcLocal.gracefulDisconnect(req, context))
151
159
  }
152
160
 
153
161
  public garbageCollectConnections(maxConnections: number, lastUsedLimit: number): void {
154
162
  if (this.connections.size <= maxConnections) {
155
163
  return
156
164
  }
157
- const disconnectionCandidates = new SortedContactList<Contact>(peerIdFromPeerDescriptor(this.getOwnPeerDescriptor()), 100000)
165
+ const disconnectionCandidates = new SortedContactList<Contact>(peerIdFromPeerDescriptor(this.getLocalPeerDescriptor()), 100000)
158
166
  this.connections.forEach((connection) => {
159
167
  if (!this.locks.isLocked(connection.peerIdKey) && Date.now() - connection.getLastUsed() > lastUsedLimit) {
160
168
  logger.trace('disconnecting in timeout interval: ' + keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor()))
@@ -178,7 +186,8 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
178
186
  logger.trace(`Starting ConnectionManager...`)
179
187
  await this.connectorFacade.start(
180
188
  (connection: ManagedConnection) => this.onIncomingConnection(connection),
181
- (peerDescriptor: PeerDescriptor) => this.canConnect(peerDescriptor)
189
+ (peerDescriptor: PeerDescriptor) => this.canConnect(peerDescriptor),
190
+ this
182
191
  )
183
192
  // Garbage collection of connections
184
193
  this.disconnectorIntervalRef = setInterval(() => {
@@ -209,7 +218,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
209
218
  } else {
210
219
  logger.trace('handshake of connection not completed, force-closing')
211
220
  const eventReceived = waitForEvent3<ManagedConnectionEvents>(peer, 'disconnected', 2000)
212
- peer.close('OTHER')
221
+ peer.close(true)
213
222
  try {
214
223
  await eventReceived
215
224
  logger.trace('resolving after receiving disconnected event from non-handshaked connection')
@@ -224,10 +233,10 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
224
233
  this.duplicateMessageDetector.clear()
225
234
  this.locks.clear()
226
235
  this.removeAllListeners()
227
- // TODO would it make sense to move this call to WebRtcConnector#stop()?
236
+ // TODO would it make sense to move this call to WebrtcConnector#stop()?
228
237
  // - but note that we should call this only after connections have been closed
229
238
  // (i.e the this.gracefullyDisconnectAsync() calls above)
230
- WEB_RTC_CLEANUP.cleanUp()
239
+ WEBRTC_CLEANUP.cleanUp()
231
240
  }
232
241
 
233
242
  public getNumberOfLocalLockedConnections(): number {
@@ -246,7 +255,6 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
246
255
  if (this.state === ConnectionManagerState.STOPPED && !doNotMindStopped) {
247
256
  return
248
257
  }
249
-
250
258
  const peerDescriptor = message.targetDescriptor!
251
259
  if (this.isConnectionToSelf(peerDescriptor)) {
252
260
  throw new Err.CannotConnectToSelf('Cannot send to self')
@@ -254,8 +262,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
254
262
  logger.trace(`Sending message to: ${keyFromPeerDescriptor(peerDescriptor)}`)
255
263
  message = {
256
264
  ...message,
257
- targetDescriptor: message.targetDescriptor || peerDescriptor,
258
- sourceDescriptor: message.sourceDescriptor || this.getOwnPeerDescriptor(),
265
+ sourceDescriptor: this.getLocalPeerDescriptor()
259
266
  }
260
267
  const peerIdKey = keyFromPeerDescriptor(peerDescriptor)
261
268
  let connection = this.connections.get(peerIdKey)
@@ -272,14 +279,14 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
272
279
  }
273
280
 
274
281
  private isConnectionToSelf(peerDescriptor: PeerDescriptor): boolean {
275
- return areEqualPeerDescriptors(peerDescriptor, this.getOwnPeerDescriptor()) || this.isOwnWebSocketServer(peerDescriptor)
282
+ return areEqualPeerDescriptors(peerDescriptor, this.getLocalPeerDescriptor()) || this.isOwnWebsocketServer(peerDescriptor)
276
283
  }
277
284
 
278
- private isOwnWebSocketServer(peerDescriptor: PeerDescriptor): boolean {
279
- const ownPeerDescriptor = this.getOwnPeerDescriptor()
280
- if ((peerDescriptor.websocket !== undefined) && (ownPeerDescriptor.websocket !== undefined)) {
281
- return ((peerDescriptor.websocket.port === ownPeerDescriptor.websocket.port)
282
- && (peerDescriptor.websocket.host === ownPeerDescriptor.websocket.host))
285
+ private isOwnWebsocketServer(peerDescriptor: PeerDescriptor): boolean {
286
+ const localPeerDescriptor = this.getLocalPeerDescriptor()
287
+ if ((peerDescriptor.websocket !== undefined) && (localPeerDescriptor.websocket !== undefined)) {
288
+ return ((peerDescriptor.websocket.port === localPeerDescriptor.websocket.port)
289
+ && (peerDescriptor.websocket.host === localPeerDescriptor.websocket.host))
283
290
  } else {
284
291
  return false
285
292
  }
@@ -290,13 +297,8 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
290
297
  return this.connections.get(peerIdKey)
291
298
  }
292
299
 
293
- // TODO remove this method or getOwnPeerDescriptor
294
- public getPeerDescriptor(): PeerDescriptor {
295
- return this.getOwnPeerDescriptor()
296
- }
297
-
298
- private getOwnPeerDescriptor(): PeerDescriptor {
299
- return this.connectorFacade.getOwnPeerDescriptor()!
300
+ public getLocalPeerDescriptor(): PeerDescriptor {
301
+ return this.connectorFacade.getLocalPeerDescriptor()!
300
302
  }
301
303
 
302
304
  public hasConnection(peerDescriptor: PeerDescriptor): boolean {
@@ -361,15 +363,15 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
361
363
  }
362
364
  }
363
365
 
364
- private onConnected = (connection: ManagedConnection) => {
366
+ private onConnected(connection: ManagedConnection) {
365
367
  const peerDescriptor = connection.getPeerDescriptor()!
366
368
  this.emit('connected', peerDescriptor)
367
369
  logger.trace(keyFromPeerDescriptor(peerDescriptor) + ' onConnected() ' + connection.connectionType)
368
370
  this.onConnectionCountChange()
369
371
  }
370
372
 
371
- private onDisconnected = (connection: ManagedConnection, disconnectionType: DisconnectionType) => {
372
- logger.trace(keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor()) + ' onDisconnected() ' + disconnectionType)
373
+ private onDisconnected(connection: ManagedConnection, gracefulLeave: boolean) {
374
+ logger.trace(keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor()) + ' onDisconnected() gracefulLeave: ' + gracefulLeave)
373
375
 
374
376
  const peerIdKey = keyFromPeerDescriptor(connection.getPeerDescriptor()!)
375
377
  const storedConnection = this.connections.get(peerIdKey)
@@ -377,8 +379,8 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
377
379
  this.locks.clearAllLocks(peerIdKey)
378
380
  this.connections.delete(peerIdKey)
379
381
  logger.trace(keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor())
380
- + ' deleted connection in onDisconnected() ' + disconnectionType)
381
- this.emit('disconnected', connection.getPeerDescriptor()!, disconnectionType)
382
+ + ' deleted connection in onDisconnected() gracefulLeave: ' + gracefulLeave)
383
+ this.emit('disconnected', connection.getPeerDescriptor()!, gracefulLeave)
382
384
  this.onConnectionCountChange()
383
385
  } else {
384
386
  logger.trace(keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor())
@@ -401,14 +403,14 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
401
403
  return false
402
404
  }
403
405
  connection.on('managedData', this.onData)
404
- connection.on('disconnected', (disconnectionType: DisconnectionType) => {
405
- this.onDisconnected(connection, disconnectionType)
406
+ connection.on('disconnected', (gracefulLeave: boolean) => {
407
+ this.onDisconnected(connection, gracefulLeave)
406
408
  })
407
409
  this.emit('newConnection', connection)
408
410
  if (connection.isHandshakeCompleted()) {
409
411
  this.onConnected(connection)
410
412
  } else {
411
- connection.once('handshakeCompleted', ()=> {
413
+ connection.once('handshakeCompleted', () => {
412
414
  this.onConnected(connection)
413
415
  })
414
416
  }
@@ -420,7 +422,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
420
422
  const newPeerID = peerIdFromPeerDescriptor(newConnection.getPeerDescriptor()!)
421
423
  const peerIdKey = keyFromPeerDescriptor(newConnection.getPeerDescriptor()!)
422
424
  if (this.connections.has(peerIdKey)) {
423
- if (newPeerID.hasSmallerHashThan(peerIdFromPeerDescriptor(this.getOwnPeerDescriptor()))) {
425
+ if (newPeerID.hasSmallerHashThan(peerIdFromPeerDescriptor(this.getLocalPeerDescriptor()))) {
424
426
  logger.trace(keyOrUnknownFromPeerDescriptor(newConnection.getPeerDescriptor())
425
427
  + ' acceptIncomingConnection() replace current connection')
426
428
  // replace the current connection
@@ -446,54 +448,54 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
446
448
  return true
447
449
  }
448
450
 
449
- private async closeConnection(peerDescriptor: PeerDescriptor, disconnectionType: DisconnectionType, reason?: string): Promise<void> {
451
+ private async closeConnection(peerDescriptor: PeerDescriptor, gracefulLeave: boolean, reason?: string): Promise<void> {
450
452
  logger.trace(keyFromPeerDescriptor(peerDescriptor) + ' ' + 'closeConnection() ' + reason)
451
453
  const id = keyFromPeerDescriptor(peerDescriptor)
452
454
  this.locks.clearAllLocks(id)
453
455
  if (this.connections.has(id)) {
454
456
  const connectionToClose = this.connections.get(id)!
455
- await connectionToClose.close(disconnectionType)
457
+ await connectionToClose.close(gracefulLeave)
456
458
 
457
459
  } else {
458
460
  logger.trace(keyFromPeerDescriptor(peerDescriptor) + ' ' + 'closeConnection() this.connections did not have the id')
459
- this.emit('disconnected', peerDescriptor, 'OTHER')
461
+ this.emit('disconnected', peerDescriptor, false)
460
462
  }
461
463
  }
462
464
 
463
- public lockConnection(targetDescriptor: PeerDescriptor, serviceId: ServiceId): void {
464
- if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getOwnPeerDescriptor())) {
465
+ public lockConnection(targetDescriptor: PeerDescriptor, lockId: LockID): void {
466
+ if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getLocalPeerDescriptor())) {
465
467
  return
466
468
  }
467
469
  const peerIdKey = keyFromPeerDescriptor(targetDescriptor)
468
470
  const rpcRemote = new ConnectionLockRpcRemote(
469
- this.getOwnPeerDescriptor(),
471
+ this.getLocalPeerDescriptor(),
470
472
  targetDescriptor,
471
473
  toProtoRpcClient(new ConnectionLockRpcClient(this.rpcCommunicator!.getRpcClientTransport()))
472
474
  )
473
- this.locks.addLocalLocked(peerIdKey, serviceId)
474
- rpcRemote.lockRequest(serviceId)
475
+ this.locks.addLocalLocked(peerIdKey, lockId)
476
+ rpcRemote.lockRequest(lockId)
475
477
  .then((_accepted) => logger.trace('LockRequest successful'))
476
478
  .catch((err) => { logger.debug(err) })
477
479
  }
478
480
 
479
- public unlockConnection(targetDescriptor: PeerDescriptor, serviceId: ServiceId): void {
480
- if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getOwnPeerDescriptor())) {
481
+ public unlockConnection(targetDescriptor: PeerDescriptor, lockId: LockID): void {
482
+ if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getLocalPeerDescriptor())) {
481
483
  return
482
484
  }
483
485
  const peerIdKey = keyFromPeerDescriptor(targetDescriptor)
484
- this.locks.removeLocalLocked(peerIdKey, serviceId)
486
+ this.locks.removeLocalLocked(peerIdKey, lockId)
485
487
  const rpcRemote = new ConnectionLockRpcRemote(
486
- this.getOwnPeerDescriptor(),
488
+ this.getLocalPeerDescriptor(),
487
489
  targetDescriptor,
488
490
  toProtoRpcClient(new ConnectionLockRpcClient(this.rpcCommunicator!.getRpcClientTransport()))
489
491
  )
490
492
  if (this.connections.has(peerIdKey)) {
491
- rpcRemote.unlockRequest(serviceId)
493
+ rpcRemote.unlockRequest(lockId)
492
494
  }
493
495
  }
494
496
 
495
497
  public weakLockConnection(targetDescriptor: PeerDescriptor): void {
496
- if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getOwnPeerDescriptor())) {
498
+ if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getLocalPeerDescriptor())) {
497
499
  return
498
500
  }
499
501
  const peerIdKey = keyFromPeerDescriptor(targetDescriptor)
@@ -501,7 +503,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
501
503
  }
502
504
 
503
505
  public weakUnlockConnection(targetDescriptor: PeerDescriptor): void {
504
- if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getOwnPeerDescriptor())) {
506
+ if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.getLocalPeerDescriptor())) {
505
507
  return
506
508
  }
507
509
  const peerIdKey = keyFromPeerDescriptor(targetDescriptor)
@@ -526,7 +528,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
526
528
  })
527
529
  .catch((e) => {
528
530
  logger.trace('force-closing connection after timeout ' + e)
529
- connection.close('OTHER')
531
+ connection.close(true)
530
532
  })
531
533
  .finally(() => {
532
534
  logger.trace('resolving after receiving disconnected event')
@@ -546,7 +548,7 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
546
548
  private async doGracefullyDisconnectAsync(targetDescriptor: PeerDescriptor, disconnectMode: DisconnectMode): Promise<void> {
547
549
  logger.trace(keyFromPeerDescriptor(targetDescriptor) + ' gracefullyDisconnectAsync()')
548
550
  const rpcRemote = new ConnectionLockRpcRemote(
549
- this.getOwnPeerDescriptor(),
551
+ this.getLocalPeerDescriptor(),
550
552
  targetDescriptor,
551
553
  toProtoRpcClient(new ConnectionLockRpcClient(this.rpcCommunicator!.getRpcClientTransport()))
552
554
  )
@@ -563,44 +565,6 @@ export class ConnectionManager extends EventEmitter<Events> implements ITranspor
563
565
  .map((managedConnection: ManagedConnection) => managedConnection.getPeerDescriptor()!)
564
566
  }
565
567
 
566
- // ConnectionLockRpc local RPC method
567
- private async lockRequest(lockRequest: LockRequest, context: ServerCallContext): Promise<LockResponse> {
568
- const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
569
- const remotePeerId = peerIdFromPeerDescriptor(senderPeerDescriptor)
570
- if (areEqualPeerDescriptors(senderPeerDescriptor, this.getOwnPeerDescriptor())) {
571
- const response: LockResponse = {
572
- accepted: false
573
- }
574
- return response
575
- }
576
- this.locks.addRemoteLocked(remotePeerId.toKey(), lockRequest.serviceId)
577
- const response: LockResponse = {
578
- accepted: true
579
- }
580
- return response
581
- }
582
-
583
- // ConnectionLockRpc local RPC method
584
- private async unlockRequest(unlockRequest: UnlockRequest, context: ServerCallContext): Promise<Empty> {
585
- const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
586
- const peerIdKey = keyFromPeerDescriptor(senderPeerDescriptor)
587
- this.locks.removeRemoteLocked(peerIdKey, unlockRequest.serviceId)
588
- return {}
589
- }
590
-
591
- // ConnectionLockRpc local RPC method
592
- private async gracefulDisconnect(disconnectNotice: DisconnectNotice, context: ServerCallContext): Promise<Empty> {
593
- const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
594
- logger.trace(keyOrUnknownFromPeerDescriptor(senderPeerDescriptor) + ' received gracefulDisconnect notice')
595
-
596
- if (disconnectNotice.disconnectMode === DisconnectMode.LEAVING) {
597
- this.closeConnection(senderPeerDescriptor, 'INCOMING_GRACEFUL_LEAVE', 'graceful leave notified')
598
- } else {
599
- this.closeConnection(senderPeerDescriptor, 'INCOMING_GRACEFUL_DISCONNECT', 'graceful disconnect notified')
600
- }
601
- return {}
602
- }
603
-
604
568
  private onConnectionCountChange() {
605
569
  this.metrics.connectionAverageCount.record(this.connections.size)
606
570
  }
@@ -6,16 +6,16 @@ import {
6
6
  import { ConnectionEvents, IConnection } from './IConnection'
7
7
  import { Logger, runAndRaceEvents3, RunAndRaceEventsReturnType } from '@streamr/utils'
8
8
  import * as Err from '../helpers/errors'
9
- import { ClientWebSocket } from './WebSocket/ClientWebSocket'
9
+ import { ClientWebsocket } from './websocket/ClientWebsocket'
10
10
  import { v4 } from 'uuid'
11
11
  import { NatType } from './ConnectionManager'
12
- import { ServerWebSocket } from './WebSocket/ServerWebSocket'
13
- import { connectivityMethodToWebSocketUrl } from './WebSocket/WebSocketConnectorRpcLocal'
12
+ import { ServerWebsocket } from './websocket/ServerWebsocket'
13
+ import { connectivityMethodToWebsocketUrl } from './websocket/WebsocketConnector'
14
14
 
15
15
  const logger = new Logger(module)
16
16
 
17
17
  // Class for handling both client and server side of the connectivity
18
- // checks. This is attached to all ServerWebSockets to listen to
18
+ // checks. This is attached to all ServerWebsockets to listen to
19
19
  // ConnectivityRequest messages.
20
20
 
21
21
  export enum ConnectionMode { REQUEST = 'connectivityRequest', PROBE = 'connectivityProbe' }
@@ -24,17 +24,17 @@ export class ConnectivityChecker {
24
24
  private static readonly CONNECTIVITY_CHECKER_SERVICE_ID = 'system/connectivity-checker'
25
25
  private static readonly CONNECTIVITY_CHECKER_TIMEOUT = 5000
26
26
  private destroyed = false
27
- private readonly webSocketPort: number
27
+ private readonly websocketPort: number
28
28
  private readonly tls: boolean
29
- private readonly host?: string
29
+ private host?: string
30
30
 
31
- constructor(webSocketPort: number, tls: boolean, host?: string) {
32
- this.webSocketPort = webSocketPort
31
+ constructor(websocketPort: number, tls: boolean, host?: string) {
32
+ this.websocketPort = websocketPort
33
33
  this.tls = tls
34
34
  this.host = host
35
35
  }
36
36
 
37
- public async sendConnectivityRequest(entryPoint: PeerDescriptor): Promise<ConnectivityResponse> {
37
+ public async sendConnectivityRequest(entryPoint: PeerDescriptor, selfSigned: boolean): Promise<ConnectivityResponse> {
38
38
  if (this.destroyed) {
39
39
  throw new Err.ConnectionFailed('ConnectivityChecker is destroyed')
40
40
  }
@@ -46,13 +46,14 @@ export class ConnectivityChecker {
46
46
  port: entryPoint.websocket!.port,
47
47
  tls: entryPoint.websocket!.tls,
48
48
  },
49
- mode: ConnectionMode.REQUEST
49
+ mode: ConnectionMode.REQUEST,
50
+ selfSigned
50
51
  })
51
52
  } catch (e) {
52
- throw new Err.ConnectionFailed(`Failed to connect to the entrypoint ${connectivityMethodToWebSocketUrl(entryPoint.websocket!)}`, e)
53
+ throw new Err.ConnectionFailed(`Failed to connect to the entrypoint ${connectivityMethodToWebsocketUrl(entryPoint.websocket!)}`, e)
53
54
  }
54
55
  // send connectivity request
55
- const connectivityRequestMessage: ConnectivityRequest = { port: this.webSocketPort, host: this.host, tls: this.tls }
56
+ const connectivityRequestMessage: ConnectivityRequest = { port: this.websocketPort, host: this.host, tls: this.tls, selfSigned }
56
57
  const msg: Message = {
57
58
  serviceId: ConnectivityChecker.CONNECTIVITY_CHECKER_SERVICE_ID,
58
59
  messageType: MessageType.CONNECTIVITY_REQUEST, messageId: v4(),
@@ -64,11 +65,11 @@ export class ConnectivityChecker {
64
65
  const responseAwaiter = () => {
65
66
  return new Promise((resolve: (res: ConnectivityResponse) => void, reject) => {
66
67
  const timeoutId = setTimeout(() => {
67
- outgoingConnection.close('OTHER')
68
+ outgoingConnection.close(false)
68
69
  reject(new Err.ConnectivityResponseTimeout('timeout'))
69
70
  }, ConnectivityChecker.CONNECTIVITY_CHECKER_TIMEOUT)
70
71
  const listener = (bytes: Uint8Array) => {
71
- outgoingConnection.close('OTHER')
72
+ outgoingConnection.close(false)
72
73
  try {
73
74
  const message: Message = Message.fromBinary(bytes)
74
75
  if (message.body.oneofKind === 'connectivityResponse') {
@@ -98,7 +99,11 @@ export class ConnectivityChecker {
98
99
  }
99
100
  }
100
101
 
101
- public listenToIncomingConnectivityRequests(connectionToListenTo: ServerWebSocket): void {
102
+ public setHost(hostName: string): void {
103
+ this.host = hostName
104
+ }
105
+
106
+ public listenToIncomingConnectivityRequests(connectionToListenTo: ServerWebsocket): void {
102
107
  connectionToListenTo.on('data', (data: Uint8Array) => {
103
108
  logger.trace('server received data')
104
109
  try {
@@ -120,7 +125,7 @@ export class ConnectivityChecker {
120
125
  }
121
126
 
122
127
  private async handleIncomingConnectivityRequest(
123
- connection: ServerWebSocket,
128
+ connection: ServerWebsocket,
124
129
  connectivityRequest: ConnectivityRequest
125
130
  ): Promise<void> {
126
131
  if (this.destroyed) {
@@ -135,24 +140,23 @@ export class ConnectivityChecker {
135
140
  port: connectivityRequest.port,
136
141
  tls: connectivityRequest.tls
137
142
  }
138
- logger.trace(`Attempting Connectivity Check to ${connectivityMethodToWebSocketUrl(wsServerInfo)}`)
143
+ logger.trace(`Attempting Connectivity Check to ${connectivityMethodToWebsocketUrl(wsServerInfo)}`)
139
144
  outgoingConnection = await this.connectAsync({
140
145
  wsServerInfo,
141
- mode: ConnectionMode.PROBE
146
+ mode: ConnectionMode.PROBE,
147
+ selfSigned: connectivityRequest.selfSigned
142
148
  })
143
149
  } catch (err) {
144
150
  logger.debug('error', { err })
145
151
  connectivityResponseMessage = {
146
- openInternet: false,
147
152
  host,
148
153
  natType: NatType.UNKNOWN
149
154
  }
150
155
  }
151
156
  if (outgoingConnection) {
152
- outgoingConnection.close('OTHER')
157
+ outgoingConnection.close(false)
153
158
  logger.trace('Connectivity test produced positive result, communicating reply to the requester ' + host + ':' + connectivityRequest.port)
154
159
  connectivityResponseMessage = {
155
- openInternet: true,
156
160
  host,
157
161
  natType: NatType.OPEN_INTERNET,
158
162
  websocket: { host, port: connectivityRequest.port, tls: connectivityRequest.tls }
@@ -171,15 +175,15 @@ export class ConnectivityChecker {
171
175
  }
172
176
 
173
177
  // eslint-disable-next-line class-methods-use-this
174
- private async connectAsync({ wsServerInfo, mode, timeoutMs = 1000, }:
175
- { wsServerInfo: ConnectivityMethod, mode: ConnectionMode, timeoutMs?: number }
178
+ private async connectAsync({ wsServerInfo, mode, selfSigned, timeoutMs = 1000, }:
179
+ { wsServerInfo: ConnectivityMethod, mode: ConnectionMode, selfSigned: boolean, timeoutMs?: number }
176
180
  ): Promise<IConnection> {
177
- const socket = new ClientWebSocket()
178
- const url = `${connectivityMethodToWebSocketUrl(wsServerInfo)}?${mode}=true`
181
+ const socket = new ClientWebsocket()
182
+ const url = `${connectivityMethodToWebsocketUrl(wsServerInfo)}?${mode}=true`
179
183
  let result: RunAndRaceEventsReturnType<ConnectionEvents>
180
184
  try {
181
185
  result = await runAndRaceEvents3<ConnectionEvents>([
182
- () => { socket.connect(url) }],
186
+ () => { socket.connect(url, selfSigned) }],
183
187
  socket, ['connected', 'error'],
184
188
  timeoutMs)
185
189
  } catch (e) {