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