@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.
- package/dist/src/connection/ConnectionLockHandler.d.ts +7 -8
- package/dist/src/connection/ConnectionLockHandler.js +16 -14
- package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
- package/dist/src/connection/ConnectionLockRpcLocal.d.ts +20 -0
- package/dist/src/connection/ConnectionLockRpcLocal.js +47 -0
- package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -0
- package/dist/src/connection/ConnectionLockRpcRemote.d.ts +4 -3
- package/dist/src/connection/ConnectionLockRpcRemote.js +6 -6
- package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
- package/dist/src/connection/ConnectionManager.d.ts +5 -8
- package/dist/src/connection/ConnectionManager.js +77 -107
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectivityChecker.d.ts +7 -6
- package/dist/src/connection/ConnectivityChecker.js +23 -20
- package/dist/src/connection/ConnectivityChecker.js.map +1 -1
- package/dist/src/connection/ConnectorFacade.d.ts +15 -12
- package/dist/src/connection/ConnectorFacade.js +61 -26
- package/dist/src/connection/ConnectorFacade.js.map +1 -1
- package/dist/src/connection/Handshaker.d.ts +2 -2
- package/dist/src/connection/Handshaker.js +28 -28
- package/dist/src/connection/Handshaker.js.map +1 -1
- package/dist/src/connection/IConnection.d.ts +5 -6
- package/dist/src/connection/IConnection.js.map +1 -1
- package/dist/src/connection/ManagedConnection.d.ts +3 -4
- package/dist/src/connection/ManagedConnection.js +30 -30
- package/dist/src/connection/ManagedConnection.js.map +1 -1
- package/dist/src/connection/ManagedWebrtcConnection.d.ts +7 -0
- package/dist/src/connection/ManagedWebrtcConnection.js +20 -0
- package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -0
- package/dist/src/connection/{Simulator → simulator}/Simulator.js +3 -3
- package/dist/src/connection/{Simulator → simulator}/Simulator.js.map +1 -1
- package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.d.ts +3 -4
- package/dist/src/connection/{Simulator → simulator}/SimulatorConnection.js +22 -22
- package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -0
- package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.d.ts +2 -2
- package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js +11 -11
- package/dist/src/connection/{Simulator → simulator}/SimulatorConnector.js.map +1 -1
- package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.d.ts +1 -1
- package/dist/src/connection/{Simulator → simulator}/SimulatorTransport.js +2 -2
- package/dist/src/connection/simulator/SimulatorTransport.js.map +1 -0
- package/dist/src/connection/{Simulator → simulator}/pings.js.map +1 -1
- package/dist/src/connection/{WebRTC/IWebRtcConnection.d.ts → webrtc/IWebrtcConnection.d.ts} +2 -2
- package/dist/src/connection/{WebRTC/IWebRtcConnection.js → webrtc/IWebrtcConnection.js} +1 -1
- package/dist/src/connection/webrtc/IWebrtcConnection.js.map +1 -0
- package/dist/src/connection/{WebRTC/NodeWebRtcConnection.d.ts → webrtc/NodeWebrtcConnection.d.ts} +6 -7
- package/dist/src/connection/{WebRTC/NodeWebRtcConnection.js → webrtc/NodeWebrtcConnection.js} +36 -36
- package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -0
- package/dist/src/connection/webrtc/WebrtcConnector.d.ts +38 -0
- package/dist/src/connection/webrtc/WebrtcConnector.js +178 -0
- package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -0
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +26 -0
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +99 -0
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.d.ts → webrtc/WebrtcConnectorRpcRemote.d.ts} +4 -4
- package/dist/src/connection/{WebRTC/WebRtcConnectorRpcRemote.js → webrtc/WebrtcConnectorRpcRemote.js} +6 -8
- package/dist/src/connection/webrtc/WebrtcConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.d.ts +1 -1
- package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js.map +1 -1
- package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +26 -0
- package/dist/src/connection/websocket/AutoCertifierClientFacade.js +37 -0
- package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -0
- package/dist/src/connection/{WebSocket/ClientWebSocket.d.ts → websocket/ClientWebsocket.d.ts} +5 -4
- package/dist/src/connection/{WebSocket/ClientWebSocket.js → websocket/ClientWebsocket.js} +20 -16
- package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -0
- package/dist/src/connection/{WebSocket/ServerWebSocket.d.ts → websocket/ServerWebsocket.d.ts} +2 -2
- package/dist/src/connection/{WebSocket/ServerWebSocket.js → websocket/ServerWebsocket.js} +23 -27
- package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -0
- package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.d.ts → websocket/WebsocketConnector.d.ts} +23 -15
- package/dist/src/connection/{WebSocket/WebSocketConnectorRpcLocal.js → websocket/WebsocketConnector.js} +107 -101
- package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -0
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +17 -0
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +26 -0
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.d.ts → websocket/WebsocketConnectorRpcRemote.d.ts} +3 -3
- package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js → websocket/WebsocketConnectorRpcRemote.js} +5 -10
- package/dist/src/connection/{WebSocket/WebSocketConnectorRpcRemote.js.map → websocket/WebsocketConnectorRpcRemote.js.map} +1 -1
- package/dist/src/connection/{WebSocket/WebSocketServer.d.ts → websocket/WebsocketServer.d.ts} +6 -3
- package/dist/src/connection/{WebSocket/WebSocketServer.js → websocket/WebsocketServer.js} +39 -19
- package/dist/src/connection/websocket/WebsocketServer.js.map +1 -0
- package/dist/src/dht/DhtNode.d.ts +11 -19
- package/dist/src/dht/DhtNode.js +119 -150
- package/dist/src/dht/DhtNode.js.map +1 -1
- package/dist/src/dht/DhtNodeRpcLocal.d.ts +22 -0
- package/dist/src/dht/DhtNodeRpcLocal.js +42 -0
- package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -0
- package/dist/src/dht/{RemoteDhtNode.d.ts → DhtNodeRpcRemote.d.ts} +5 -3
- package/dist/src/dht/{RemoteDhtNode.js → DhtNodeRpcRemote.js} +17 -21
- package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -0
- package/dist/src/dht/ExternalApiRpcLocal.d.ts +16 -0
- package/dist/src/dht/ExternalApiRpcLocal.js +30 -0
- package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -0
- package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
- package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
- package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
- package/dist/src/dht/contact/Remote.d.ts +4 -1
- package/dist/src/dht/contact/Remote.js +28 -2
- package/dist/src/dht/contact/Remote.js.map +1 -1
- package/dist/src/dht/contact/SortedContactList.d.ts +2 -2
- package/dist/src/dht/contact/SortedContactList.js +3 -3
- package/dist/src/dht/contact/SortedContactList.js.map +1 -1
- package/dist/src/dht/discovery/DiscoverySession.d.ts +9 -7
- package/dist/src/dht/discovery/DiscoverySession.js +8 -8
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +7 -10
- package/dist/src/dht/discovery/PeerDiscovery.js +5 -5
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/find/FindRpcLocal.d.ts +14 -0
- package/dist/src/dht/find/FindRpcLocal.js +25 -0
- package/dist/src/dht/find/FindRpcLocal.js.map +1 -0
- package/dist/src/dht/find/{RecursiveFindSession.d.ts → FindSession.d.ts} +12 -13
- package/dist/src/dht/find/{RecursiveFindSession.js → FindSession.js} +17 -15
- package/dist/src/dht/find/FindSession.js.map +1 -0
- package/dist/src/dht/find/FindSessionRpcLocal.d.ts +12 -0
- package/dist/src/dht/find/FindSessionRpcLocal.js +17 -0
- package/dist/src/dht/find/FindSessionRpcLocal.js.map +1 -0
- package/dist/src/dht/find/{RemoteRecursiveFindSession.d.ts → FindSessionRpcRemote.d.ts} +2 -2
- package/dist/src/dht/find/{RemoteRecursiveFindSession.js → FindSessionRpcRemote.js} +5 -5
- package/dist/src/dht/find/FindSessionRpcRemote.js.map +1 -0
- package/dist/src/dht/find/{RecursiveFinder.d.ts → Finder.d.ts} +16 -19
- package/dist/src/dht/find/{RecursiveFinder.js → Finder.js} +50 -46
- package/dist/src/dht/find/Finder.js.map +1 -0
- package/dist/src/dht/routing/FindRpcRemote.d.ts +6 -0
- package/dist/src/dht/routing/FindRpcRemote.js +41 -0
- package/dist/src/dht/routing/FindRpcRemote.js.map +1 -0
- package/dist/src/dht/routing/Router.d.ts +10 -17
- package/dist/src/dht/routing/Router.js +47 -90
- package/dist/src/dht/routing/Router.js.map +1 -1
- package/dist/src/dht/routing/RouterRpcLocal.d.ts +22 -0
- package/dist/src/dht/routing/RouterRpcLocal.js +66 -0
- package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -0
- package/dist/src/dht/routing/RouterRpcRemote.d.ts +0 -1
- package/dist/src/dht/routing/RouterRpcRemote.js +15 -43
- package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
- package/dist/src/dht/routing/RoutingSession.d.ts +17 -8
- package/dist/src/dht/routing/RoutingSession.js +124 -131
- package/dist/src/dht/routing/RoutingSession.js.map +1 -1
- package/dist/src/dht/routing/getPreviousPeer.d.ts +2 -0
- package/dist/src/dht/routing/getPreviousPeer.js +9 -0
- package/dist/src/dht/routing/getPreviousPeer.js.map +1 -0
- package/dist/src/dht/store/StoreRpcLocal.d.ts +11 -8
- package/dist/src/dht/store/StoreRpcLocal.js +25 -24
- package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
- package/dist/src/dht/store/StoreRpcRemote.js +3 -7
- package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
- package/dist/src/exports.d.ts +11 -5
- package/dist/src/exports.js +17 -4
- package/dist/src/exports.js.map +1 -1
- package/dist/src/helpers/Connectivity.d.ts +4 -0
- package/dist/src/helpers/Connectivity.js +24 -0
- package/dist/src/helpers/Connectivity.js.map +1 -0
- package/dist/src/helpers/errors.d.ts +3 -3
- package/dist/src/helpers/errors.js +7 -7
- package/dist/src/helpers/protoClasses.js +3 -3
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +56 -39
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +49 -36
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +64 -84
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +64 -66
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +26 -21
- package/dist/src/rpc-protocol/DhtCallContext.d.ts +0 -1
- package/dist/src/rpc-protocol/DhtCallContext.js.map +1 -1
- package/dist/src/transport/ITransport.d.ts +5 -6
- package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -1
- package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
- package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -1
- package/dist/src/transport/RoutingRpcCommunicator.js +0 -1
- package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
- package/dist/src/types/ServiceID.d.ts +1 -0
- package/dist/src/types/ServiceID.js +3 -0
- package/dist/src/types/ServiceID.js.map +1 -0
- package/karma.config.js +4 -4
- package/package.json +10 -8
- package/protos/DhtRpc.proto +32 -35
- package/src/connection/ConnectionLockHandler.ts +19 -17
- package/src/connection/ConnectionLockRpcLocal.ts +74 -0
- package/src/connection/ConnectionLockRpcRemote.ts +7 -6
- package/src/connection/ConnectionManager.ts +59 -95
- package/src/connection/ConnectivityChecker.ts +30 -26
- package/src/connection/ConnectorFacade.ts +74 -34
- package/src/connection/Handshaker.ts +9 -9
- package/src/connection/IConnection.ts +5 -6
- package/src/connection/ManagedConnection.ts +21 -22
- package/src/connection/{ManagedWebRtcConnection.ts → ManagedWebrtcConnection.ts} +9 -9
- package/src/connection/{Simulator → simulator}/Simulator.ts +4 -4
- package/src/connection/{Simulator → simulator}/SimulatorConnection.ts +23 -24
- package/src/connection/{Simulator → simulator}/SimulatorConnector.ts +13 -13
- package/src/connection/{Simulator → simulator}/SimulatorTransport.ts +2 -2
- package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts} +12 -13
- package/src/connection/{WebRTC/IWebRtcConnection.ts → webrtc/IWebrtcConnection.ts} +2 -2
- package/src/connection/{WebRTC/NodeWebRtcConnection.ts → webrtc/NodeWebrtcConnection.ts} +32 -33
- package/src/connection/webrtc/WebrtcConnector.ts +225 -0
- package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +132 -0
- package/src/connection/{WebRTC/WebRtcConnectorRpcRemote.ts → webrtc/WebrtcConnectorRpcRemote.ts} +6 -7
- package/src/connection/{WebRTC → webrtc}/iceServerAsString.ts +1 -1
- package/src/connection/websocket/AutoCertifierClientFacade.ts +91 -0
- package/src/connection/{WebSocket/ClientWebSocket.ts → websocket/ClientWebsocket.ts} +19 -17
- package/src/connection/{WebSocket/ServerWebSocket.ts → websocket/ServerWebsocket.ts} +21 -27
- package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts} +109 -100
- package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +41 -0
- package/src/connection/{WebSocket/WebSocketConnectorRpcRemote.ts → websocket/WebsocketConnectorRpcRemote.ts} +6 -12
- package/src/connection/{WebSocket/WebSocketServer.ts → websocket/WebsocketServer.ts} +40 -22
- package/src/dht/DhtNode.ts +144 -179
- package/src/dht/DhtNodeRpcLocal.ts +68 -0
- package/src/dht/{RemoteDhtNode.ts → DhtNodeRpcRemote.ts} +12 -13
- package/src/dht/ExternalApiRpcLocal.ts +46 -0
- package/src/dht/ExternalApiRpcRemote.ts +4 -4
- package/src/dht/contact/Remote.ts +32 -4
- package/src/dht/contact/SortedContactList.ts +4 -4
- package/src/dht/discovery/DiscoverySession.ts +23 -20
- package/src/dht/discovery/PeerDiscovery.ts +14 -17
- package/src/dht/find/FindRpcLocal.ts +35 -0
- package/src/dht/find/{RecursiveFindSession.ts → FindSession.ts} +25 -25
- package/src/dht/find/FindSessionRpcLocal.ts +25 -0
- package/src/dht/find/{RemoteRecursiveFindSession.ts → FindSessionRpcRemote.ts} +9 -5
- package/src/dht/find/{RecursiveFinder.ts → Finder.ts} +77 -71
- package/src/dht/routing/FindRpcRemote.ts +40 -0
- package/src/dht/routing/Router.ts +69 -105
- package/src/dht/routing/RouterRpcLocal.ts +81 -0
- package/src/dht/routing/RouterRpcRemote.ts +15 -45
- package/src/dht/routing/RoutingSession.ts +56 -61
- package/src/dht/routing/getPreviousPeer.ts +6 -0
- package/src/dht/store/StoreRpcLocal.ts +44 -37
- package/src/dht/store/StoreRpcRemote.ts +4 -8
- package/src/exports.ts +11 -5
- package/src/helpers/Connectivity.ts +19 -0
- package/src/helpers/errors.ts +3 -3
- package/src/helpers/protoClasses.ts +6 -6
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +75 -59
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +26 -21
- package/src/proto/packages/dht/protos/DhtRpc.ts +87 -114
- package/src/rpc-protocol/DhtCallContext.ts +0 -1
- package/src/transport/ITransport.ts +5 -8
- package/src/transport/ListeningRpcCommunicator.ts +2 -1
- package/src/transport/RoutingRpcCommunicator.ts +3 -4
- package/src/types/ServiceID.ts +1 -0
- package/test/benchmark/{RecursiveFind.test.ts → Find.test.ts} +6 -6
- package/test/benchmark/KademliaCorrectness.test.ts +2 -2
- package/test/benchmark/kademlia-simulation/SimulationNode.ts +3 -3
- package/test/end-to-end/Layer0-Layer1.test.ts +13 -5
- package/test/end-to-end/Layer0.test.ts +35 -17
- package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +24 -6
- package/test/end-to-end/{Layer0WebRTC-Layer1.test.ts → Layer0Webrtc-Layer1.test.ts} +1 -1
- package/test/end-to-end/{Layer0WebRTC.test.ts → Layer0Webrtc.test.ts} +14 -10
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +8 -4
- package/test/end-to-end/{Layer1-Scale-WebRTC.test.ts → Layer1-Scale-Webrtc.test.ts} +2 -2
- package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +52 -0
- package/test/end-to-end/{WebSocketConnectionRequest.test.ts → WebsocketConnectionRequest.test.ts} +16 -8
- package/test/end-to-end/memory-leak.test.ts +85 -0
- package/test/integration/ConnectionLocking.test.ts +4 -4
- package/test/integration/ConnectionManager.test.ts +37 -28
- package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
- package/test/integration/DhtNodeExternalAPI.test.ts +10 -10
- package/test/integration/{RemoteDhtNode.test.ts → DhtNodeRpcRemote.test.ts} +10 -10
- package/test/integration/DhtRpc.test.ts +5 -5
- package/test/integration/{RecursiveFind.test.ts → Find.test.ts} +3 -3
- package/test/integration/Layer1-scale.test.ts +1 -1
- package/test/integration/MigrateData.test.ts +6 -5
- package/test/integration/Mock-Layer1-Layer0.test.ts +1 -1
- package/test/integration/MultipleEntryPointJoining.test.ts +6 -6
- package/test/integration/RouteMessage.test.ts +26 -26
- package/test/integration/RpcErrors.test.ts +10 -10
- package/test/integration/ScaleDownDht.test.ts +3 -3
- package/test/integration/SimultaneousConnections.test.ts +10 -7
- package/test/integration/Store.test.ts +1 -1
- package/test/integration/StoreAndDelete.test.ts +1 -1
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +12 -12
- package/test/integration/{WebRtcConnectionManagement.test.ts → WebrtcConnectionManagement.test.ts} +4 -4
- package/test/integration/{WebRtcConnectorRpc.test.ts → WebrtcConnectorRpc.test.ts} +7 -8
- package/test/integration/{WebSocket.test.ts → Websocket.test.ts} +14 -13
- package/test/integration/{WebSocketConnectionManagement.test.ts → WebsocketConnectionManagement.test.ts} +4 -4
- package/test/integration/{WebSocketConnectorRpc.test.ts → WebsocketConnectorRpc.test.ts} +15 -15
- package/test/unit/AutoCertifierClientFacade.test.ts +58 -0
- package/test/unit/ConnectivityHelpers.test.ts +69 -0
- package/test/unit/{RecursiveFinder.test.ts → Finder.test.ts} +19 -17
- package/test/unit/Router.test.ts +26 -26
- package/test/unit/UUID.test.ts +1 -1
- package/test/unit/{WebSocketConnectorRpcLocal.test.ts → WebsocketConnector.test.ts} +8 -8
- package/test/unit/{WebSocketServer.test.ts → WebsocketServer.test.ts} +20 -14
- package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +1 -1
- package/test/utils/FakeRpcCommunicator.ts +23 -0
- package/test/utils/mock/Transport.ts +1 -1
- package/test/utils/utils.ts +14 -24
- package/tsconfig.browser.json +1 -1
- package/tsconfig.jest.json +3 -2
- package/tsconfig.node.json +3 -2
- package/dist/src/connection/ManagedWebRtcConnection.d.ts +0 -7
- package/dist/src/connection/ManagedWebRtcConnection.js +0 -20
- package/dist/src/connection/ManagedWebRtcConnection.js.map +0 -1
- package/dist/src/connection/Simulator/SimulatorConnection.js.map +0 -1
- package/dist/src/connection/Simulator/SimulatorTransport.js.map +0 -1
- package/dist/src/connection/WebRTC/IWebRtcConnection.js.map +0 -1
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +0 -1
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.d.ts +0 -51
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js +0 -249
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +0 -1
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +0 -1
- package/dist/src/connection/WebSocket/ClientWebSocket.js.map +0 -1
- package/dist/src/connection/WebSocket/ServerWebSocket.js.map +0 -1
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +0 -1
- package/dist/src/connection/WebSocket/WebSocketServer.js.map +0 -1
- package/dist/src/dht/RemoteDhtNode.js.map +0 -1
- package/dist/src/dht/find/RecursiveFindSession.js.map +0 -1
- package/dist/src/dht/find/RecursiveFinder.js.map +0 -1
- package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +0 -1
- package/dist/src/dht/registerExternalApiRpcMethods.d.ts +0 -2
- package/dist/src/dht/registerExternalApiRpcMethods.js +0 -32
- package/dist/src/dht/registerExternalApiRpcMethods.js.map +0 -1
- package/src/connection/WebRTC/WebRtcConnectorRpcLocal.ts +0 -335
- package/src/dht/registerExternalApiRpcMethods.ts +0 -44
- package/test/utils/mock/RecursiveFinder.ts +0 -19
- /package/dist/src/connection/{Simulator → simulator}/Simulator.d.ts +0 -0
- /package/dist/src/connection/{Simulator → simulator}/pings.d.ts +0 -0
- /package/dist/src/connection/{Simulator → simulator}/pings.js +0 -0
- /package/dist/src/connection/{WebRTC → webrtc}/iceServerAsString.js +0 -0
- /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
|
-
|
|
16
|
+
localPeerDescriptor: PeerDescriptor,
|
|
16
17
|
targetPeerDescriptor: PeerDescriptor,
|
|
17
18
|
client: ProtoRpcClient<IConnectionLockRpcClient>
|
|
18
19
|
) {
|
|
19
|
-
super(
|
|
20
|
+
super(localPeerDescriptor, targetPeerDescriptor, 'DUMMY', client)
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
public async lockRequest(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
33
|
+
import { WEBRTC_CLEANUP } from './webrtc/NodeWebrtcConnection'
|
|
35
34
|
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
36
|
-
import {
|
|
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.
|
|
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
|
|
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) =>
|
|
154
|
+
(req: LockRequest, context: ServerCallContext) => lockRpcLocal.lockRequest(req, context))
|
|
147
155
|
this.rpcCommunicator.registerRpcNotification(UnlockRequest, 'unlockRequest',
|
|
148
|
-
(req: UnlockRequest, context: ServerCallContext) =>
|
|
156
|
+
(req: UnlockRequest, context: ServerCallContext) => lockRpcLocal.unlockRequest(req, context))
|
|
149
157
|
this.rpcCommunicator.registerRpcMethod(DisconnectNotice, DisconnectNoticeResponse, 'gracefulDisconnect',
|
|
150
|
-
(req: DisconnectNotice, context: ServerCallContext) =>
|
|
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.
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
282
|
+
return areEqualPeerDescriptors(peerDescriptor, this.getLocalPeerDescriptor()) || this.isOwnWebsocketServer(peerDescriptor)
|
|
276
283
|
}
|
|
277
284
|
|
|
278
|
-
private
|
|
279
|
-
const
|
|
280
|
-
if ((peerDescriptor.websocket !== undefined) && (
|
|
281
|
-
return ((peerDescriptor.websocket.port ===
|
|
282
|
-
&& (peerDescriptor.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
|
-
|
|
294
|
-
|
|
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
|
|
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
|
|
372
|
-
logger.trace(keyOrUnknownFromPeerDescriptor(connection.getPeerDescriptor()) + ' onDisconnected() ' +
|
|
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() ' +
|
|
381
|
-
this.emit('disconnected', connection.getPeerDescriptor()!,
|
|
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', (
|
|
405
|
-
this.onDisconnected(connection,
|
|
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.
|
|
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,
|
|
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(
|
|
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,
|
|
461
|
+
this.emit('disconnected', peerDescriptor, false)
|
|
460
462
|
}
|
|
461
463
|
}
|
|
462
464
|
|
|
463
|
-
public lockConnection(targetDescriptor: PeerDescriptor,
|
|
464
|
-
if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.
|
|
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.
|
|
471
|
+
this.getLocalPeerDescriptor(),
|
|
470
472
|
targetDescriptor,
|
|
471
473
|
toProtoRpcClient(new ConnectionLockRpcClient(this.rpcCommunicator!.getRpcClientTransport()))
|
|
472
474
|
)
|
|
473
|
-
this.locks.addLocalLocked(peerIdKey,
|
|
474
|
-
rpcRemote.lockRequest(
|
|
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,
|
|
480
|
-
if (this.state === ConnectionManagerState.STOPPED || areEqualPeerDescriptors(targetDescriptor, this.
|
|
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,
|
|
486
|
+
this.locks.removeLocalLocked(peerIdKey, lockId)
|
|
485
487
|
const rpcRemote = new ConnectionLockRpcRemote(
|
|
486
|
-
this.
|
|
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(
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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 {
|
|
9
|
+
import { ClientWebsocket } from './websocket/ClientWebsocket'
|
|
10
10
|
import { v4 } from 'uuid'
|
|
11
11
|
import { NatType } from './ConnectionManager'
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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
|
|
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
|
|
27
|
+
private readonly websocketPort: number
|
|
28
28
|
private readonly tls: boolean
|
|
29
|
-
private
|
|
29
|
+
private host?: string
|
|
30
30
|
|
|
31
|
-
constructor(
|
|
32
|
-
this.
|
|
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 ${
|
|
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.
|
|
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(
|
|
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(
|
|
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
|
|
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:
|
|
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 ${
|
|
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(
|
|
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
|
|
178
|
-
const url = `${
|
|
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) {
|