@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
package/src/connection/{WebSocket/WebSocketConnectorRpcLocal.ts → websocket/WebsocketConnector.ts}
RENAMED
|
@@ -1,112 +1,150 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClientWebsocket } from './ClientWebsocket'
|
|
2
2
|
import { IConnection, ConnectionType } from '../IConnection'
|
|
3
3
|
import { ITransport } from '../../transport/ITransport'
|
|
4
4
|
import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
|
|
5
|
-
import {
|
|
5
|
+
import { WebsocketConnectorRpcLocal } from './WebsocketConnectorRpcLocal'
|
|
6
|
+
import { WebsocketConnectorRpcRemote } from './WebsocketConnectorRpcRemote'
|
|
6
7
|
import {
|
|
7
8
|
ConnectivityMethod,
|
|
8
9
|
ConnectivityResponse,
|
|
9
|
-
NodeType,
|
|
10
10
|
PeerDescriptor,
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
WebsocketConnectionRequest,
|
|
12
|
+
WebsocketConnectionResponse
|
|
13
13
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
14
|
-
import {
|
|
14
|
+
import { WebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
15
15
|
import { Logger, binaryToHex, wait } from '@streamr/utils'
|
|
16
|
-
import { IWebSocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
17
16
|
import { ManagedConnection } from '../ManagedConnection'
|
|
18
|
-
import {
|
|
17
|
+
import { WebsocketServer } from './WebsocketServer'
|
|
19
18
|
import { ConnectivityChecker } from '../ConnectivityChecker'
|
|
20
19
|
import { NatType, PortRange, TlsCertificate } from '../ConnectionManager'
|
|
21
20
|
import { PeerIDKey } from '../../helpers/PeerID'
|
|
22
|
-
import {
|
|
21
|
+
import { ServerWebsocket } from './ServerWebsocket'
|
|
23
22
|
import { toProtoRpcClient } from '@streamr/proto-rpc'
|
|
24
23
|
import { Handshaker } from '../Handshaker'
|
|
25
24
|
import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
26
25
|
import { ParsedUrlQuery } from 'querystring'
|
|
27
26
|
import { range, sample } from 'lodash'
|
|
28
|
-
import { isPrivateIPv4 } from '../../helpers/AddressTools'
|
|
29
27
|
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
30
|
-
import {
|
|
31
|
-
|
|
28
|
+
import { expectedConnectionType } from '../../helpers/Connectivity'
|
|
29
|
+
import { WebsocketServerStartError } from '../../helpers/errors'
|
|
30
|
+
import { AutoCertifierClientFacade } from './AutoCertifierClientFacade'
|
|
32
31
|
const logger = new Logger(module)
|
|
33
32
|
|
|
34
|
-
export const
|
|
33
|
+
export const connectivityMethodToWebsocketUrl = (ws: ConnectivityMethod): string => {
|
|
35
34
|
return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
const canOpenConnectionFromBrowser = (websocketServer: ConnectivityMethod) => {
|
|
39
|
-
const hasPrivateAddress = ((websocketServer.host === 'localhost') || isPrivateIPv4(websocketServer.host))
|
|
40
|
-
return websocketServer.tls || hasPrivateAddress
|
|
41
|
-
}
|
|
42
|
-
|
|
43
37
|
const ENTRY_POINT_CONNECTION_ATTEMPTS = 5
|
|
44
38
|
|
|
45
|
-
interface
|
|
39
|
+
interface WebsocketConnectorConfig {
|
|
46
40
|
transport: ITransport
|
|
47
|
-
canConnect: (peerDescriptor: PeerDescriptor
|
|
41
|
+
canConnect: (peerDescriptor: PeerDescriptor) => boolean
|
|
48
42
|
onIncomingConnection: (connection: ManagedConnection) => boolean
|
|
49
43
|
portRange?: PortRange
|
|
50
44
|
maxMessageSize?: number
|
|
51
45
|
host?: string
|
|
52
46
|
entrypoints?: PeerDescriptor[]
|
|
53
47
|
tlsCertificate?: TlsCertificate
|
|
48
|
+
autoCertifierTransport: ITransport
|
|
49
|
+
autoCertifierUrl: string
|
|
50
|
+
autoCertifierConfigFile: string
|
|
51
|
+
serverEnableTls: boolean
|
|
54
52
|
}
|
|
55
53
|
|
|
56
|
-
export class
|
|
54
|
+
export class WebsocketConnector {
|
|
57
55
|
|
|
58
56
|
private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocket-connector'
|
|
59
57
|
private readonly rpcCommunicator: ListeningRpcCommunicator
|
|
60
|
-
private readonly
|
|
61
|
-
private readonly webSocketServer?: WebSocketServer
|
|
58
|
+
private readonly websocketServer?: WebsocketServer
|
|
62
59
|
private connectivityChecker?: ConnectivityChecker
|
|
63
60
|
private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
|
|
64
61
|
private onIncomingConnection: (connection: ManagedConnection) => boolean
|
|
65
62
|
private host?: string
|
|
66
63
|
private readonly entrypoints?: PeerDescriptor[]
|
|
67
64
|
private readonly tlsCertificate?: TlsCertificate
|
|
65
|
+
private readonly autoCertifierTransport: ITransport
|
|
66
|
+
private readonly autoCertifierUrl: string
|
|
67
|
+
private readonly autoCertifierConfigFile: string
|
|
68
|
+
private readonly serverEnableTls: boolean
|
|
69
|
+
private autoCertifierClient?: AutoCertifierClientFacade
|
|
68
70
|
private selectedPort?: number
|
|
69
|
-
private
|
|
71
|
+
private localPeerDescriptor?: PeerDescriptor
|
|
70
72
|
private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
|
|
71
|
-
private
|
|
73
|
+
private abortController = new AbortController()
|
|
72
74
|
|
|
73
|
-
constructor(config:
|
|
74
|
-
this.
|
|
75
|
+
constructor(config: WebsocketConnectorConfig) {
|
|
76
|
+
this.websocketServer = config.portRange ? new WebsocketServer({
|
|
75
77
|
portRange: config.portRange!,
|
|
76
78
|
tlsCertificate: config.tlsCertificate,
|
|
77
|
-
maxMessageSize: config.maxMessageSize
|
|
79
|
+
maxMessageSize: config.maxMessageSize,
|
|
80
|
+
enableTls: config.serverEnableTls
|
|
78
81
|
}) : undefined
|
|
79
82
|
this.onIncomingConnection = config.onIncomingConnection
|
|
80
83
|
this.host = config.host
|
|
81
84
|
this.entrypoints = config.entrypoints
|
|
82
85
|
this.tlsCertificate = config.tlsCertificate
|
|
83
|
-
|
|
84
|
-
this.
|
|
85
|
-
|
|
86
|
-
this.
|
|
86
|
+
this.autoCertifierTransport = config.autoCertifierTransport
|
|
87
|
+
this.autoCertifierUrl = config.autoCertifierUrl
|
|
88
|
+
this.autoCertifierConfigFile = config.autoCertifierConfigFile
|
|
89
|
+
this.serverEnableTls = config.serverEnableTls
|
|
90
|
+
this.rpcCommunicator = new ListeningRpcCommunicator(WebsocketConnector.WEBSOCKET_CONNECTOR_SERVICE_ID, config.transport, {
|
|
87
91
|
rpcRequestTimeout: 15000
|
|
88
92
|
})
|
|
93
|
+
this.registerLocalRpcMethods(config)
|
|
94
|
+
}
|
|
89
95
|
|
|
96
|
+
private registerLocalRpcMethods(config: WebsocketConnectorConfig) {
|
|
97
|
+
const rpcLocal = new WebsocketConnectorRpcLocal({
|
|
98
|
+
canConnect: (peerDescriptor: PeerDescriptor) => config.canConnect(peerDescriptor),
|
|
99
|
+
connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
|
|
100
|
+
onIncomingConnection: (connection: ManagedConnection) => config.onIncomingConnection(connection),
|
|
101
|
+
abortSignal: this.abortController.signal
|
|
102
|
+
})
|
|
90
103
|
this.rpcCommunicator.registerRpcMethod(
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
WebsocketConnectionRequest,
|
|
105
|
+
WebsocketConnectionResponse,
|
|
93
106
|
'requestConnection',
|
|
94
|
-
(req:
|
|
107
|
+
async (req: WebsocketConnectionRequest, context: ServerCallContext) => {
|
|
108
|
+
if (!this.abortController.signal.aborted) {
|
|
109
|
+
return rpcLocal.requestConnection(req, context)
|
|
110
|
+
} else {
|
|
111
|
+
return { accepted: false }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
95
114
|
)
|
|
96
115
|
}
|
|
97
116
|
|
|
98
117
|
private attachHandshaker(connection: IConnection) {
|
|
99
|
-
const handshaker = new Handshaker(this.
|
|
118
|
+
const handshaker = new Handshaker(this.localPeerDescriptor!, connection)
|
|
100
119
|
handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
|
|
101
120
|
this.onServerSocketHandshakeRequest(peerDescriptor, connection)
|
|
102
121
|
})
|
|
103
122
|
}
|
|
104
123
|
|
|
124
|
+
public async autoCertify(): Promise<void> {
|
|
125
|
+
this.autoCertifierClient = new AutoCertifierClientFacade({
|
|
126
|
+
configFile: this.autoCertifierConfigFile,
|
|
127
|
+
transport: this.autoCertifierTransport,
|
|
128
|
+
url: this.autoCertifierUrl,
|
|
129
|
+
wsServerPort: this.selectedPort!,
|
|
130
|
+
setHost: (hostName: string) => this.setHost(hostName),
|
|
131
|
+
updateCertificate: (certificate: string, privateKey: string) => this.websocketServer!.updateCertificate(certificate, privateKey)
|
|
132
|
+
})
|
|
133
|
+
logger.trace(`AutoCertifying subdomain...`)
|
|
134
|
+
await this.autoCertifierClient!.start()
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private setHost(hostName: string): void {
|
|
138
|
+
logger.trace(`Setting host name to ${hostName}`)
|
|
139
|
+
this.host = hostName
|
|
140
|
+
this.connectivityChecker!.setHost(hostName)
|
|
141
|
+
}
|
|
142
|
+
|
|
105
143
|
public async start(): Promise<void> {
|
|
106
|
-
if (!this.
|
|
107
|
-
this.
|
|
144
|
+
if (!this.abortController.signal.aborted && this.websocketServer) {
|
|
145
|
+
this.websocketServer.on('connected', (connection: IConnection) => {
|
|
108
146
|
|
|
109
|
-
const serverSocket = connection as unknown as
|
|
147
|
+
const serverSocket = connection as unknown as ServerWebsocket
|
|
110
148
|
if (serverSocket.resourceURL &&
|
|
111
149
|
serverSocket.resourceURL.query) {
|
|
112
150
|
const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
|
|
@@ -122,63 +160,55 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
|
|
|
122
160
|
this.attachHandshaker(connection)
|
|
123
161
|
}
|
|
124
162
|
})
|
|
125
|
-
const port = await this.
|
|
163
|
+
const port = await this.websocketServer.start()
|
|
126
164
|
this.selectedPort = port
|
|
127
|
-
this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.
|
|
165
|
+
this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.serverEnableTls, this.host)
|
|
128
166
|
}
|
|
129
167
|
}
|
|
130
168
|
|
|
131
|
-
public async checkConnectivity(): Promise<ConnectivityResponse> {
|
|
169
|
+
public async checkConnectivity(selfSigned: boolean): Promise<ConnectivityResponse> {
|
|
132
170
|
// TODO: this could throw if the server is not running
|
|
133
171
|
const noServerConnectivityResponse: ConnectivityResponse = {
|
|
134
|
-
openInternet: false,
|
|
135
172
|
host: '127.0.0.1',
|
|
136
173
|
natType: NatType.UNKNOWN
|
|
137
174
|
}
|
|
138
|
-
if (this.
|
|
175
|
+
if (this.abortController.signal.aborted) {
|
|
139
176
|
return noServerConnectivityResponse
|
|
140
177
|
}
|
|
141
178
|
for (const reattempt of range(ENTRY_POINT_CONNECTION_ATTEMPTS)) {
|
|
142
179
|
const entryPoint = sample(this.entrypoints)!
|
|
143
180
|
try {
|
|
144
|
-
if (!this.
|
|
145
|
-
// If no websocket server, return openInternet: false
|
|
181
|
+
if (!this.websocketServer) {
|
|
146
182
|
return noServerConnectivityResponse
|
|
147
183
|
} else {
|
|
148
|
-
if (!this.entrypoints || this.entrypoints.length
|
|
184
|
+
if (!this.entrypoints || this.entrypoints.length === 0) {
|
|
149
185
|
// return connectivity info given in config
|
|
150
186
|
const preconfiguredConnectivityResponse: ConnectivityResponse = {
|
|
151
|
-
openInternet: true,
|
|
152
187
|
host: this.host!,
|
|
153
188
|
natType: NatType.OPEN_INTERNET,
|
|
154
189
|
websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
|
|
155
190
|
}
|
|
156
191
|
return preconfiguredConnectivityResponse
|
|
157
192
|
} else {
|
|
158
|
-
// Do real connectivity checking
|
|
159
|
-
return await this.connectivityChecker!.sendConnectivityRequest(entryPoint)
|
|
193
|
+
// Do real connectivity checking
|
|
194
|
+
return await this.connectivityChecker!.sendConnectivityRequest(entryPoint, selfSigned)
|
|
160
195
|
}
|
|
161
196
|
}
|
|
162
197
|
} catch (err) {
|
|
163
198
|
if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
|
|
164
199
|
const error = `Failed to connect to entrypoint with id ${binaryToHex(entryPoint.kademliaId)} `
|
|
165
|
-
+ `and URL ${
|
|
200
|
+
+ `and URL ${connectivityMethodToWebsocketUrl(entryPoint.websocket!)}`
|
|
166
201
|
logger.error(error, { error: err })
|
|
167
202
|
await wait(2000)
|
|
168
203
|
}
|
|
169
204
|
}
|
|
170
205
|
}
|
|
171
|
-
throw
|
|
206
|
+
throw new WebsocketServerStartError(`Failed to connect to the entrypoints after ${ENTRY_POINT_CONNECTION_ATTEMPTS} attempts`)
|
|
172
207
|
}
|
|
173
208
|
|
|
174
209
|
public isPossibleToFormConnection(targetPeerDescriptor: PeerDescriptor): boolean {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
} else if (targetPeerDescriptor.websocket !== undefined) {
|
|
178
|
-
return (this.ownPeerDescriptor!.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(targetPeerDescriptor.websocket)
|
|
179
|
-
} else {
|
|
180
|
-
return false
|
|
181
|
-
}
|
|
210
|
+
const connectionType = expectedConnectionType(this.localPeerDescriptor!, targetPeerDescriptor)
|
|
211
|
+
return (connectionType === ConnectionType.WEBSOCKET_CLIENT || connectionType === ConnectionType.WEBSOCKET_SERVER)
|
|
182
212
|
}
|
|
183
213
|
|
|
184
214
|
public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
@@ -188,14 +218,14 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
|
|
|
188
218
|
return existingConnection
|
|
189
219
|
}
|
|
190
220
|
|
|
191
|
-
if (this.
|
|
192
|
-
return this.requestConnectionFromPeer(this.
|
|
221
|
+
if (this.localPeerDescriptor!.websocket && !targetPeerDescriptor.websocket) {
|
|
222
|
+
return this.requestConnectionFromPeer(this.localPeerDescriptor!, targetPeerDescriptor)
|
|
193
223
|
} else {
|
|
194
|
-
const socket = new
|
|
224
|
+
const socket = new ClientWebsocket()
|
|
195
225
|
|
|
196
|
-
const url =
|
|
226
|
+
const url = connectivityMethodToWebsocketUrl(targetPeerDescriptor.websocket!)
|
|
197
227
|
|
|
198
|
-
const managedConnection = new ManagedConnection(this.
|
|
228
|
+
const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
|
|
199
229
|
managedConnection.setPeerDescriptor(targetPeerDescriptor)
|
|
200
230
|
|
|
201
231
|
this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
|
|
@@ -216,33 +246,33 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
|
|
|
216
246
|
}
|
|
217
247
|
}
|
|
218
248
|
|
|
219
|
-
private requestConnectionFromPeer(
|
|
249
|
+
private requestConnectionFromPeer(localPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
220
250
|
setImmediate(() => {
|
|
221
|
-
const remoteConnector = new
|
|
222
|
-
|
|
251
|
+
const remoteConnector = new WebsocketConnectorRpcRemote(
|
|
252
|
+
localPeerDescriptor,
|
|
223
253
|
targetPeerDescriptor,
|
|
224
|
-
toProtoRpcClient(new
|
|
254
|
+
toProtoRpcClient(new WebsocketConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
|
|
225
255
|
)
|
|
226
|
-
remoteConnector.requestConnection(
|
|
256
|
+
remoteConnector.requestConnection(localPeerDescriptor.websocket!.host, localPeerDescriptor.websocket!.port)
|
|
227
257
|
})
|
|
228
|
-
const managedConnection = new ManagedConnection(this.
|
|
258
|
+
const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
|
|
229
259
|
managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
|
|
230
260
|
managedConnection.setPeerDescriptor(targetPeerDescriptor)
|
|
231
261
|
this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
|
|
232
262
|
return managedConnection
|
|
233
263
|
}
|
|
234
264
|
|
|
235
|
-
private onServerSocketHandshakeRequest
|
|
265
|
+
private onServerSocketHandshakeRequest(peerDescriptor: PeerDescriptor, serverWebsocket: IConnection) {
|
|
236
266
|
|
|
237
267
|
const peerId = peerIdFromPeerDescriptor(peerDescriptor)
|
|
238
268
|
|
|
239
269
|
if (this.ongoingConnectRequests.has(peerId.toKey())) {
|
|
240
270
|
const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
|
|
241
|
-
ongoingConnectReguest.attachImplementation(
|
|
271
|
+
ongoingConnectReguest.attachImplementation(serverWebsocket)
|
|
242
272
|
ongoingConnectReguest.acceptHandshake()
|
|
243
273
|
this.ongoingConnectRequests.delete(peerId.toKey())
|
|
244
274
|
} else {
|
|
245
|
-
const managedConnection = new ManagedConnection(this.
|
|
275
|
+
const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebsocket)
|
|
246
276
|
|
|
247
277
|
managedConnection.setPeerDescriptor(peerDescriptor)
|
|
248
278
|
|
|
@@ -255,41 +285,20 @@ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
|
|
|
255
285
|
}
|
|
256
286
|
}
|
|
257
287
|
|
|
258
|
-
public
|
|
259
|
-
this.
|
|
288
|
+
public setLocalPeerDescriptor(localPeerDescriptor: PeerDescriptor): void {
|
|
289
|
+
this.localPeerDescriptor = localPeerDescriptor
|
|
260
290
|
}
|
|
261
291
|
|
|
262
292
|
public async destroy(): Promise<void> {
|
|
263
|
-
this.
|
|
293
|
+
this.abortController.abort()
|
|
264
294
|
this.rpcCommunicator.destroy()
|
|
265
295
|
|
|
266
296
|
const requests = Array.from(this.ongoingConnectRequests.values())
|
|
267
|
-
await Promise.allSettled(requests.map((conn) => conn.close(
|
|
297
|
+
await Promise.allSettled(requests.map((conn) => conn.close(false)))
|
|
268
298
|
|
|
269
299
|
const attempts = Array.from(this.connectingConnections.values())
|
|
270
|
-
await Promise.allSettled(attempts.map((conn) => conn.close(
|
|
300
|
+
await Promise.allSettled(attempts.map((conn) => conn.close(false)))
|
|
271
301
|
this.connectivityChecker?.destroy()
|
|
272
|
-
await this.
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// IWebSocketConnectorRpc implementation
|
|
276
|
-
public async requestConnection(request: WebSocketConnectionRequest, context: ServerCallContext): Promise<WebSocketConnectionResponse> {
|
|
277
|
-
const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
|
|
278
|
-
if (!this.destroyed && this.canConnectFunction(senderPeerDescriptor, request.ip, request.port)) {
|
|
279
|
-
setImmediate(() => {
|
|
280
|
-
if (this.destroyed) {
|
|
281
|
-
return
|
|
282
|
-
}
|
|
283
|
-
const connection = this.connect(senderPeerDescriptor)
|
|
284
|
-
this.onIncomingConnection(connection)
|
|
285
|
-
})
|
|
286
|
-
const res: WebSocketConnectionResponse = {
|
|
287
|
-
accepted: true
|
|
288
|
-
}
|
|
289
|
-
return res
|
|
290
|
-
}
|
|
291
|
-
return {
|
|
292
|
-
accepted: false
|
|
293
|
-
}
|
|
302
|
+
await this.websocketServer?.stop()
|
|
294
303
|
}
|
|
295
304
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
2
|
+
import {
|
|
3
|
+
PeerDescriptor,
|
|
4
|
+
WebsocketConnectionRequest,
|
|
5
|
+
WebsocketConnectionResponse
|
|
6
|
+
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
7
|
+
import { IWebsocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
8
|
+
import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
|
|
9
|
+
import { ManagedConnection } from '../ManagedConnection'
|
|
10
|
+
|
|
11
|
+
interface WebsocketConnectorRpcLocalConfig {
|
|
12
|
+
canConnect: (peerDescriptor: PeerDescriptor) => boolean
|
|
13
|
+
connect: (targetPeerDescriptor: PeerDescriptor) => ManagedConnection
|
|
14
|
+
onIncomingConnection: (connection: ManagedConnection) => boolean
|
|
15
|
+
abortSignal: AbortSignal
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class WebsocketConnectorRpcLocal implements IWebsocketConnectorRpc {
|
|
19
|
+
|
|
20
|
+
private readonly config: WebsocketConnectorRpcLocalConfig
|
|
21
|
+
|
|
22
|
+
constructor(config: WebsocketConnectorRpcLocalConfig) {
|
|
23
|
+
this.config = config
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public async requestConnection(_request: WebsocketConnectionRequest, context: ServerCallContext): Promise<WebsocketConnectionResponse> {
|
|
27
|
+
const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
|
|
28
|
+
if (this.config.canConnect(senderPeerDescriptor)) {
|
|
29
|
+
setImmediate(() => {
|
|
30
|
+
if (this.config.abortSignal.aborted) {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
const connection = this.config.connect(senderPeerDescriptor)
|
|
34
|
+
this.config.onIncomingConnection(connection)
|
|
35
|
+
})
|
|
36
|
+
return { accepted: true }
|
|
37
|
+
} else {
|
|
38
|
+
return { accepted: false }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PeerDescriptor,
|
|
3
|
-
|
|
3
|
+
WebsocketConnectionRequest
|
|
4
4
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
5
|
-
import {
|
|
5
|
+
import { IWebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
6
6
|
import { Logger } from '@streamr/utils'
|
|
7
7
|
import * as Err from '../../helpers/errors'
|
|
8
8
|
import { ProtoRpcClient } from '@streamr/proto-rpc'
|
|
@@ -11,34 +11,28 @@ import { Remote } from '../../dht/contact/Remote'
|
|
|
11
11
|
|
|
12
12
|
const logger = new Logger(module)
|
|
13
13
|
|
|
14
|
-
export class
|
|
14
|
+
export class WebsocketConnectorRpcRemote extends Remote<IWebsocketConnectorRpcClient> {
|
|
15
15
|
|
|
16
16
|
constructor(
|
|
17
17
|
localPeerDescriptor: PeerDescriptor,
|
|
18
18
|
remotePeerDescriptor: PeerDescriptor,
|
|
19
|
-
client: ProtoRpcClient<
|
|
19
|
+
client: ProtoRpcClient<IWebsocketConnectorRpcClient>
|
|
20
20
|
) {
|
|
21
21
|
super(localPeerDescriptor, remotePeerDescriptor, 'DUMMY', client)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
async requestConnection(ip: string, port: number): Promise<boolean> {
|
|
25
25
|
logger.trace(`Requesting WebSocket connection from ${keyFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
|
|
26
|
-
const request:
|
|
26
|
+
const request: WebsocketConnectionRequest = {
|
|
27
27
|
ip,
|
|
28
28
|
port
|
|
29
29
|
}
|
|
30
30
|
const options = this.formDhtRpcOptions()
|
|
31
31
|
try {
|
|
32
32
|
const res = await this.getClient().requestConnection(request, options)
|
|
33
|
-
|
|
34
|
-
if (res.reason) {
|
|
35
|
-
logger.debug('WebSocketConnectionRequest Rejected', {
|
|
36
|
-
stack: new Err.WebSocketConnectionRequestRejected(res.reason).stack
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
33
|
return res.accepted
|
|
40
34
|
} catch (err) {
|
|
41
|
-
logger.debug(new Err.
|
|
35
|
+
logger.debug(new Err.WebsocketConnectionRequestRejected('WebsocketConnectionRequest rejected', err).stack!)
|
|
42
36
|
return false
|
|
43
37
|
}
|
|
44
38
|
}
|
|
@@ -2,16 +2,15 @@ import { createServer as createHttpServer, Server as HttpServer, IncomingMessage
|
|
|
2
2
|
import { createServer as createHttpsServer, Server as HttpsServer } from 'https'
|
|
3
3
|
import EventEmitter from 'eventemitter3'
|
|
4
4
|
import { server as WsServer } from 'websocket'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
ConnectionSourceEvents
|
|
8
|
-
} from '../IConnectionSource'
|
|
9
|
-
|
|
5
|
+
import { ServerWebsocket } from './ServerWebsocket'
|
|
6
|
+
import { ConnectionSourceEvents } from '../IConnectionSource'
|
|
10
7
|
import { Logger, asAbortable } from '@streamr/utils'
|
|
11
|
-
import {
|
|
8
|
+
import { createSelfSignedCertificate } from '@streamr/autocertifier-client'
|
|
9
|
+
import { WebsocketServerStartError } from '../../helpers/errors'
|
|
12
10
|
import { PortRange, TlsCertificate } from '../ConnectionManager'
|
|
13
11
|
import { range } from 'lodash'
|
|
14
12
|
import fs from 'fs'
|
|
13
|
+
import { UUID } from '../../helpers/UUID'
|
|
15
14
|
|
|
16
15
|
const logger = new Logger(module)
|
|
17
16
|
|
|
@@ -22,24 +21,27 @@ const logger = new Logger(module)
|
|
|
22
21
|
|
|
23
22
|
declare class NodeJsWsServer extends WsServer { }
|
|
24
23
|
|
|
25
|
-
interface
|
|
24
|
+
interface WebsocketServerConfig {
|
|
26
25
|
portRange: PortRange
|
|
26
|
+
enableTls: boolean
|
|
27
27
|
tlsCertificate?: TlsCertificate
|
|
28
28
|
maxMessageSize?: number
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export class
|
|
31
|
+
export class WebsocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
32
32
|
|
|
33
33
|
private httpServer?: HttpServer | HttpsServer
|
|
34
34
|
private wsServer?: WsServer
|
|
35
35
|
private readonly abortController = new AbortController()
|
|
36
36
|
private readonly portRange: PortRange
|
|
37
37
|
private readonly tlsCertificate?: TlsCertificate
|
|
38
|
+
private readonly enableTls: boolean
|
|
38
39
|
private readonly maxMessageSize: number
|
|
39
40
|
|
|
40
|
-
constructor(config:
|
|
41
|
+
constructor(config: WebsocketServerConfig) {
|
|
41
42
|
super()
|
|
42
43
|
this.portRange = config.portRange
|
|
44
|
+
this.enableTls = config.enableTls
|
|
43
45
|
this.tlsCertificate = config.tlsCertificate
|
|
44
46
|
this.maxMessageSize = config.maxMessageSize ?? 1048576
|
|
45
47
|
}
|
|
@@ -48,33 +50,42 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
48
50
|
const ports = range(this.portRange.min, this.portRange.max + 1)
|
|
49
51
|
for (const port of ports) {
|
|
50
52
|
try {
|
|
51
|
-
await asAbortable(this.startServer(port, this.
|
|
53
|
+
await asAbortable(this.startServer(port, this.enableTls), this.abortController.signal)
|
|
52
54
|
return port
|
|
53
55
|
} catch (err) {
|
|
54
56
|
if (err.originalError?.code === 'EADDRINUSE') {
|
|
55
57
|
logger.debug(`failed to start WebSocket server on port: ${port} reattempting on next port`)
|
|
56
58
|
} else {
|
|
57
|
-
throw new
|
|
59
|
+
throw new WebsocketServerStartError(err)
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
|
-
throw new
|
|
63
|
+
throw new WebsocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
// If tlsCertificate has been given the tls boolean is ignored
|
|
67
|
+
// TODO: could be simplified?
|
|
68
|
+
private startServer(port: number, tls: boolean): Promise<void> {
|
|
65
69
|
const requestListener = (request: IncomingMessage, response: ServerResponse<IncomingMessage>) => {
|
|
66
70
|
logger.trace('Received request for ' + request.url)
|
|
67
71
|
response.writeHead(404)
|
|
68
72
|
response.end()
|
|
69
73
|
}
|
|
70
74
|
return new Promise((resolve, reject) => {
|
|
71
|
-
this.
|
|
72
|
-
createHttpsServer({
|
|
73
|
-
key: fs.readFileSync(tlsCertificate.privateKeyFileName),
|
|
74
|
-
cert: fs.readFileSync(tlsCertificate.certFileName)
|
|
75
|
+
if (this.tlsCertificate) {
|
|
76
|
+
this.httpServer = createHttpsServer({
|
|
77
|
+
key: fs.readFileSync(this.tlsCertificate.privateKeyFileName),
|
|
78
|
+
cert: fs.readFileSync(this.tlsCertificate.certFileName)
|
|
79
|
+
}, requestListener)
|
|
80
|
+
} else if (!tls) {
|
|
81
|
+
this.httpServer = createHttpServer(requestListener)
|
|
82
|
+
} else {
|
|
83
|
+
const certificate = createSelfSignedCertificate('streamr-self-signed-' + new UUID().toString(), 1000)
|
|
84
|
+
this.httpServer = createHttpsServer({
|
|
85
|
+
key: certificate.serverKey,
|
|
86
|
+
cert: certificate.serverCert
|
|
75
87
|
}, requestListener)
|
|
76
|
-
|
|
77
|
-
createHttpServer(requestListener)
|
|
88
|
+
}
|
|
78
89
|
|
|
79
90
|
function originIsAllowed() {
|
|
80
91
|
return true
|
|
@@ -94,10 +105,10 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
94
105
|
|
|
95
106
|
logger.trace('IConnection accepted.')
|
|
96
107
|
|
|
97
|
-
this.emit('connected', new
|
|
108
|
+
this.emit('connected', new ServerWebsocket(connection, request.resourceURL))
|
|
98
109
|
})
|
|
99
110
|
this.httpServer.once('error', (err: Error) => {
|
|
100
|
-
reject(new
|
|
111
|
+
reject(new WebsocketServerStartError('Starting Websocket server failed', err))
|
|
101
112
|
})
|
|
102
113
|
|
|
103
114
|
this.httpServer.once('listening', () => {
|
|
@@ -109,11 +120,18 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
109
120
|
// Listen only to IPv4 network interfaces, default value listens to IPv6 as well
|
|
110
121
|
this.httpServer.listen(port, '0.0.0.0')
|
|
111
122
|
} catch (e) {
|
|
112
|
-
reject(new
|
|
123
|
+
reject(new WebsocketServerStartError('Websocket server threw an exception', e))
|
|
113
124
|
}
|
|
114
125
|
})
|
|
115
126
|
}
|
|
116
127
|
|
|
128
|
+
public updateCertificate(cert: string, key: string): void {
|
|
129
|
+
(this.httpServer! as HttpsServer).setSecureContext({
|
|
130
|
+
cert,
|
|
131
|
+
key
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
|
|
117
135
|
public stop(): Promise<void> {
|
|
118
136
|
this.abortController.abort()
|
|
119
137
|
this.removeAllListeners()
|