@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ConnectionType } from '../IConnection'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
HandshakeError,
|
|
4
5
|
PeerDescriptor,
|
|
5
6
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
6
7
|
import { Logger } from '@streamr/utils'
|
|
@@ -8,7 +9,7 @@ import { ManagedConnection } from '../ManagedConnection'
|
|
|
8
9
|
import { PeerIDKey } from '../../helpers/PeerID'
|
|
9
10
|
import { Simulator } from './Simulator'
|
|
10
11
|
import { SimulatorConnection } from './SimulatorConnection'
|
|
11
|
-
import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
12
|
+
import { getNodeIdFromPeerDescriptor, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
12
13
|
|
|
13
14
|
const logger = new Logger(module)
|
|
14
15
|
|
|
@@ -16,32 +17,32 @@ export class SimulatorConnector {
|
|
|
16
17
|
|
|
17
18
|
private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
|
|
18
19
|
private stopped = false
|
|
19
|
-
private
|
|
20
|
+
private localPeerDescriptor: PeerDescriptor
|
|
20
21
|
private simulator: Simulator
|
|
21
|
-
private
|
|
22
|
+
private onNewConnection: (connection: ManagedConnection) => boolean
|
|
22
23
|
|
|
23
24
|
constructor(
|
|
24
|
-
|
|
25
|
+
localPeerDescriptor: PeerDescriptor,
|
|
25
26
|
simulator: Simulator,
|
|
26
|
-
|
|
27
|
+
onNewConnection: (connection: ManagedConnection) => boolean
|
|
27
28
|
) {
|
|
28
|
-
this.
|
|
29
|
+
this.localPeerDescriptor = localPeerDescriptor
|
|
29
30
|
this.simulator = simulator
|
|
30
|
-
this.
|
|
31
|
+
this.onNewConnection = onNewConnection
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
34
|
-
logger.trace('connect() ' +
|
|
35
|
+
logger.trace('connect() ' + getNodeIdFromPeerDescriptor(targetPeerDescriptor))
|
|
35
36
|
const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
|
|
36
37
|
const existingConnection = this.connectingConnections.get(peerKey)
|
|
37
38
|
if (existingConnection) {
|
|
38
39
|
return existingConnection
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
const connection = new SimulatorConnection(this.
|
|
42
|
+
const connection = new SimulatorConnection(this.localPeerDescriptor, targetPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, this.simulator)
|
|
42
43
|
|
|
43
|
-
const managedConnection = new ManagedConnection(this.
|
|
44
|
-
managedConnection.
|
|
44
|
+
const managedConnection = new ManagedConnection(this.localPeerDescriptor, ConnectionType.SIMULATOR_CLIENT, connection, undefined)
|
|
45
|
+
managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
|
|
45
46
|
|
|
46
47
|
this.connectingConnections.set(peerKey, managedConnection)
|
|
47
48
|
connection.once('disconnected', () => {
|
|
@@ -57,31 +58,29 @@ export class SimulatorConnector {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
public getPeerDescriptor(): PeerDescriptor {
|
|
60
|
-
return this.
|
|
61
|
+
return this.localPeerDescriptor
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
public handleIncomingConnection(sourceConnection: SimulatorConnection): void {
|
|
64
|
-
logger.trace(
|
|
65
|
+
logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' incoming connection, stopped: ' + this.stopped)
|
|
65
66
|
if (this.stopped) {
|
|
66
67
|
return
|
|
67
68
|
}
|
|
68
|
-
const connection = new SimulatorConnection(this.
|
|
69
|
-
sourceConnection.
|
|
69
|
+
const connection = new SimulatorConnection(this.localPeerDescriptor,
|
|
70
|
+
sourceConnection.localPeerDescriptor, ConnectionType.SIMULATOR_SERVER, this.simulator)
|
|
70
71
|
|
|
71
|
-
const managedConnection = new ManagedConnection(this.
|
|
72
|
+
const managedConnection = new ManagedConnection(this.localPeerDescriptor, ConnectionType.SIMULATOR_SERVER, undefined, connection)
|
|
72
73
|
|
|
73
74
|
logger.trace('connected')
|
|
74
75
|
|
|
75
76
|
managedConnection.once('handshakeRequest', () => {
|
|
76
|
-
logger.trace(
|
|
77
|
-
logger.trace('incoming handshake request')
|
|
77
|
+
logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' incoming handshake request')
|
|
78
78
|
|
|
79
|
-
if (this.
|
|
80
|
-
logger.trace(
|
|
79
|
+
if (this.onNewConnection(managedConnection)) {
|
|
80
|
+
logger.trace(getNodeIdFromPeerDescriptor(sourceConnection.localPeerDescriptor) + ' calling acceptHandshake')
|
|
81
81
|
managedConnection.acceptHandshake()
|
|
82
82
|
} else {
|
|
83
|
-
managedConnection.rejectHandshake(
|
|
84
|
-
managedConnection.destroy()
|
|
83
|
+
managedConnection.rejectHandshake(HandshakeError.DUPLICATE_CONNECTION)
|
|
85
84
|
}
|
|
86
85
|
})
|
|
87
86
|
|
|
@@ -92,7 +91,7 @@ export class SimulatorConnector {
|
|
|
92
91
|
this.stopped = true
|
|
93
92
|
const conns = Array.from(this.connectingConnections.values())
|
|
94
93
|
await Promise.allSettled(conns.map((conn) =>
|
|
95
|
-
conn.close(
|
|
94
|
+
conn.close(false)
|
|
96
95
|
))
|
|
97
96
|
}
|
|
98
97
|
}
|
|
@@ -5,9 +5,9 @@ import { Simulator } from './Simulator'
|
|
|
5
5
|
import { SimulatorConnectorFacade } from '../ConnectorFacade'
|
|
6
6
|
|
|
7
7
|
export class SimulatorTransport extends ConnectionManager {
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(localPeerDescriptor: PeerDescriptor, simulator: Simulator) {
|
|
9
9
|
super({
|
|
10
|
-
createConnectorFacade: () => new SimulatorConnectorFacade(
|
|
10
|
+
createConnectorFacade: () => new SimulatorConnectorFacade(localPeerDescriptor, simulator),
|
|
11
11
|
metricsContext: new MetricsContext()
|
|
12
12
|
})
|
|
13
13
|
}
|
package/src/connection/{WebRTC/BrowserWebRtcConnection.ts → webrtc/BrowserWebrtcConnection.ts}
RENAMED
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
import EventEmitter from 'eventemitter3'
|
|
2
|
-
import {
|
|
2
|
+
import { WebrtcConnectionEvents, IWebrtcConnection, RtcDescription } from './IWebrtcConnection'
|
|
3
3
|
import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
|
|
4
4
|
import { Logger } from '@streamr/utils'
|
|
5
|
-
import {
|
|
6
|
-
import { IceServer } from './WebRtcConnectorRpcLocal'
|
|
5
|
+
import { IceServer } from './WebrtcConnector'
|
|
7
6
|
|
|
8
7
|
const logger = new Logger(module)
|
|
9
8
|
|
|
10
|
-
export const
|
|
9
|
+
export const WEBRTC_CLEANUP = new class {
|
|
11
10
|
// eslint-disable-next-line class-methods-use-this
|
|
12
11
|
cleanUp(): void {
|
|
13
12
|
}
|
|
14
13
|
}
|
|
15
14
|
|
|
16
|
-
type Events =
|
|
15
|
+
type Events = WebrtcConnectionEvents & ConnectionEvents
|
|
17
16
|
|
|
18
17
|
interface Params {
|
|
19
18
|
iceServers?: IceServer[]
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
export class
|
|
21
|
+
export class NodeWebrtcConnection extends EventEmitter<Events> implements IWebrtcConnection, IConnection {
|
|
23
22
|
|
|
24
|
-
public
|
|
23
|
+
public connectionId: ConnectionID
|
|
25
24
|
public readonly connectionType: ConnectionType = ConnectionType.WEBRTC
|
|
26
25
|
|
|
27
26
|
// We need to keep track of connection state ourselves because
|
|
@@ -39,7 +38,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
|
|
|
39
38
|
constructor(params: Params) {
|
|
40
39
|
super()
|
|
41
40
|
this.connectionId = new ConnectionID()
|
|
42
|
-
this.iceServers = params.iceServers
|
|
41
|
+
this.iceServers = params.iceServers ?? []
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
public start(isOffering: boolean): void {
|
|
@@ -135,17 +134,17 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
|
|
|
135
134
|
|
|
136
135
|
// IConnection implementation
|
|
137
136
|
|
|
138
|
-
public async close(
|
|
139
|
-
this.doClose(
|
|
137
|
+
public async close(gracefulLeave: boolean, reason?: string): Promise<void> {
|
|
138
|
+
this.doClose(gracefulLeave, reason)
|
|
140
139
|
}
|
|
141
140
|
|
|
142
|
-
private doClose(
|
|
141
|
+
private doClose(gracefulLeave: boolean, reason?: string): void {
|
|
143
142
|
if (!this.closed) {
|
|
144
143
|
this.closed = true
|
|
145
144
|
this.lastState = 'closed'
|
|
146
145
|
|
|
147
146
|
this.stopListening()
|
|
148
|
-
this.emit('disconnected',
|
|
147
|
+
this.emit('disconnected', gracefulLeave, undefined, reason)
|
|
149
148
|
|
|
150
149
|
this.removeAllListeners()
|
|
151
150
|
|
|
@@ -173,7 +172,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
|
|
|
173
172
|
|
|
174
173
|
public destroy(): void {
|
|
175
174
|
this.removeAllListeners()
|
|
176
|
-
this.doClose(
|
|
175
|
+
this.doClose(false)
|
|
177
176
|
}
|
|
178
177
|
|
|
179
178
|
public send(data: Uint8Array): void {
|
|
@@ -192,7 +191,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IWebRt
|
|
|
192
191
|
|
|
193
192
|
dataChannel.onclose = () => {
|
|
194
193
|
logger.trace('dc.onClosed')
|
|
195
|
-
this.doClose(
|
|
194
|
+
this.doClose(false)
|
|
196
195
|
}
|
|
197
196
|
|
|
198
197
|
dataChannel.onerror = (err) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface WebrtcConnectionEvents {
|
|
2
2
|
localDescription: (description: string, type: string) => void
|
|
3
3
|
localCandidate: (candidate: string, mid: string) => void
|
|
4
4
|
}
|
|
@@ -8,7 +8,7 @@ export enum RtcDescription {
|
|
|
8
8
|
ANSWER = 'answer'
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export interface
|
|
11
|
+
export interface IWebrtcConnection {
|
|
12
12
|
start(isOffering: boolean): void
|
|
13
13
|
|
|
14
14
|
on(event: 'localDescription', listener: (description: string, type: string) => void): this
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IWebrtcConnection, WebrtcConnectionEvents } from './IWebrtcConnection'
|
|
2
2
|
import { ConnectionType, IConnection, ConnectionID, ConnectionEvents } from '../IConnection'
|
|
3
3
|
import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
|
|
4
4
|
import EventEmitter from 'eventemitter3'
|
|
5
5
|
import nodeDatachannel, { DataChannel, DescriptionType, PeerConnection } from 'node-datachannel'
|
|
6
6
|
import { Logger } from '@streamr/utils'
|
|
7
|
-
import {
|
|
8
|
-
import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
9
|
-
import { DisconnectionType } from '../../transport/ITransport'
|
|
7
|
+
import { IllegalRtcPeerConnectionState } from '../../helpers/errors'
|
|
8
|
+
import { getNodeIdFromPeerDescriptor, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
10
9
|
import { iceServerAsString } from './iceServerAsString'
|
|
11
|
-
import { IceServer } from './
|
|
10
|
+
import { IceServer } from './WebrtcConnector'
|
|
12
11
|
import { PortRange } from '../ConnectionManager'
|
|
13
12
|
|
|
14
13
|
const logger = new Logger(module)
|
|
15
14
|
|
|
16
|
-
export const
|
|
15
|
+
export const WEBRTC_CLEANUP = new class {
|
|
17
16
|
// eslint-disable-next-line class-methods-use-this
|
|
18
17
|
cleanUp(): void {
|
|
19
18
|
nodeDatachannel.cleanup()
|
|
@@ -33,7 +32,7 @@ export interface Params {
|
|
|
33
32
|
// Re-defined accoring to https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.generated.d.ts
|
|
34
33
|
// because importing single dom definitions in not possible
|
|
35
34
|
|
|
36
|
-
enum
|
|
35
|
+
enum RtcPeerConnectionStateEnum {
|
|
37
36
|
closed = 'closed',
|
|
38
37
|
connected = 'connected',
|
|
39
38
|
connecting = 'connecting',
|
|
@@ -44,16 +43,16 @@ enum RTCPeerConnectionStateEnum {
|
|
|
44
43
|
|
|
45
44
|
nodeDatachannel.initLogger('Fatal')
|
|
46
45
|
|
|
47
|
-
type
|
|
46
|
+
type RtcPeerConnectionState = keyof typeof RtcPeerConnectionStateEnum
|
|
48
47
|
|
|
49
|
-
type Events =
|
|
48
|
+
type Events = WebrtcConnectionEvents & ConnectionEvents
|
|
50
49
|
|
|
51
|
-
export class
|
|
50
|
+
export class NodeWebrtcConnection extends EventEmitter<Events> implements IConnection, IWebrtcConnection {
|
|
52
51
|
|
|
53
52
|
public connectionId: ConnectionID
|
|
54
53
|
private connection?: PeerConnection
|
|
55
54
|
private dataChannel?: DataChannel
|
|
56
|
-
private lastState:
|
|
55
|
+
private lastState: RtcPeerConnectionState = 'connecting'
|
|
57
56
|
private remoteDescriptionSet = false
|
|
58
57
|
private connectingTimeoutRef?: NodeJS.Timeout
|
|
59
58
|
|
|
@@ -81,9 +80,8 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
public start(isOffering: boolean): void {
|
|
84
|
-
logger.trace(`Staring new connection for peer: ${keyFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
85
83
|
const peerIdKey = keyFromPeerDescriptor(this.remotePeerDescriptor)
|
|
86
|
-
logger.trace(`
|
|
84
|
+
logger.trace(`Starting new connection for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`, { isOffering })
|
|
87
85
|
this.connection = new PeerConnection(peerIdKey, {
|
|
88
86
|
iceServers: this.iceServers.map(iceServerAsString),
|
|
89
87
|
maxMessageSize: this.maxMessageSize,
|
|
@@ -93,7 +91,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
93
91
|
|
|
94
92
|
this.connectingTimeoutRef = setTimeout(() => {
|
|
95
93
|
logger.trace('connectingTimeout, this.closed === ' + this.closed)
|
|
96
|
-
this.doClose(
|
|
94
|
+
this.doClose(false)
|
|
97
95
|
}, this.connectingTimeout)
|
|
98
96
|
|
|
99
97
|
this.connection.onStateChange((state: string) => this.onStateChange(state))
|
|
@@ -116,14 +114,14 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
116
114
|
public async setRemoteDescription(description: string, type: string): Promise<void> {
|
|
117
115
|
if (this.connection) {
|
|
118
116
|
try {
|
|
119
|
-
logger.trace(`Setting remote descriptor for peer: ${
|
|
117
|
+
logger.trace(`Setting remote descriptor for peer: ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
120
118
|
this.connection.setRemoteDescription(description, type as DescriptionType)
|
|
121
119
|
this.remoteDescriptionSet = true
|
|
122
120
|
} catch (err) {
|
|
123
|
-
logger.
|
|
121
|
+
logger.debug(`Failed to set remote descriptor for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
124
122
|
}
|
|
125
123
|
} else {
|
|
126
|
-
this.doClose(
|
|
124
|
+
this.doClose(false, `Tried to set description for non-existent connection`)
|
|
127
125
|
}
|
|
128
126
|
}
|
|
129
127
|
|
|
@@ -131,17 +129,17 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
131
129
|
if (this.connection) {
|
|
132
130
|
if (this.remoteDescriptionSet) {
|
|
133
131
|
try {
|
|
134
|
-
logger.trace(`Setting remote candidate for peer: ${
|
|
132
|
+
logger.trace(`Setting remote candidate for peer: ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
135
133
|
this.connection.addRemoteCandidate(candidate, mid)
|
|
136
134
|
} catch (err) {
|
|
137
|
-
logger.
|
|
138
|
-
this.doClose('OTHER')
|
|
135
|
+
logger.debug(`Failed to set remote candidate for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
139
136
|
}
|
|
140
137
|
} else {
|
|
141
|
-
|
|
138
|
+
// TODO: should queue candidates until remote description is set?
|
|
139
|
+
this.doClose(false, `Tried to set candidate before description`)
|
|
142
140
|
}
|
|
143
141
|
} else {
|
|
144
|
-
this.doClose(
|
|
142
|
+
this.doClose(false, `Tried to set candidate for non-existent connection`)
|
|
145
143
|
}
|
|
146
144
|
}
|
|
147
145
|
|
|
@@ -150,25 +148,25 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
150
148
|
try {
|
|
151
149
|
this.dataChannel!.sendMessageBinary(data as Buffer)
|
|
152
150
|
} catch (err) {
|
|
153
|
-
logger.
|
|
151
|
+
logger.debug('Failed to send binary message to ' + getNodeIdFromPeerDescriptor(this.remotePeerDescriptor) + err)
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
}
|
|
157
155
|
|
|
158
|
-
public async close(
|
|
159
|
-
this.doClose(
|
|
156
|
+
public async close(gracefulLeave: boolean, reason?: string): Promise<void> {
|
|
157
|
+
this.doClose(gracefulLeave, reason)
|
|
160
158
|
}
|
|
161
159
|
|
|
162
|
-
private doClose(
|
|
160
|
+
private doClose(gracefulLeave: boolean, reason?: string): void {
|
|
163
161
|
if (!this.closed) {
|
|
164
162
|
logger.trace(
|
|
165
|
-
`Closing Node WebRTC Connection to ${
|
|
163
|
+
`Closing Node WebRTC Connection to ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`
|
|
166
164
|
+ `${reason ? `, reason: ${reason}` : ''}`
|
|
167
165
|
)
|
|
168
166
|
|
|
169
167
|
this.closed = true
|
|
170
168
|
|
|
171
|
-
this.emit('disconnected',
|
|
169
|
+
this.emit('disconnected', gracefulLeave, undefined, reason)
|
|
172
170
|
this.removeAllListeners()
|
|
173
171
|
|
|
174
172
|
if (this.connectingTimeoutRef) {
|
|
@@ -180,7 +178,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
180
178
|
logger.trace('closing datachannel')
|
|
181
179
|
this.dataChannel.close()
|
|
182
180
|
} catch (e) {
|
|
183
|
-
logger.
|
|
181
|
+
logger.trace('dc.close() errored: %s', e)
|
|
184
182
|
}
|
|
185
183
|
}
|
|
186
184
|
|
|
@@ -188,7 +186,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
188
186
|
try {
|
|
189
187
|
this.connection.close()
|
|
190
188
|
} catch (e) {
|
|
191
|
-
logger.
|
|
189
|
+
logger.trace('conn.close() errored: %s', e)
|
|
192
190
|
}
|
|
193
191
|
}
|
|
194
192
|
}
|
|
@@ -196,7 +194,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
196
194
|
|
|
197
195
|
public destroy(): void {
|
|
198
196
|
this.removeAllListeners()
|
|
199
|
-
this.doClose(
|
|
197
|
+
this.doClose(false)
|
|
200
198
|
}
|
|
201
199
|
|
|
202
200
|
private onDataChannel(dataChannel: DataChannel): void {
|
|
@@ -213,7 +211,7 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
213
211
|
|
|
214
212
|
dataChannel.onClosed(() => {
|
|
215
213
|
logger.trace(`dc.closed`)
|
|
216
|
-
this.doClose(
|
|
214
|
+
this.doClose(false, 'DataChannel closed')
|
|
217
215
|
})
|
|
218
216
|
|
|
219
217
|
dataChannel.onError((err) => logger.error('error', { err }))
|
|
@@ -233,23 +231,23 @@ export class NodeWebRtcConnection extends EventEmitter<Events> implements IConne
|
|
|
233
231
|
clearTimeout(this.connectingTimeoutRef)
|
|
234
232
|
}
|
|
235
233
|
this.dataChannel = dataChannel
|
|
236
|
-
logger.trace(`DataChannel opened for peer ${
|
|
234
|
+
logger.trace(`DataChannel opened for peer ${getNodeIdFromPeerDescriptor(this.remotePeerDescriptor)}`)
|
|
237
235
|
this.emit('connected')
|
|
238
236
|
}
|
|
239
237
|
|
|
240
238
|
private onStateChange(state: string): void {
|
|
241
239
|
logger.trace('onStateChange ' + state)
|
|
242
|
-
if (!Object.keys(
|
|
243
|
-
throw new
|
|
240
|
+
if (!Object.keys(RtcPeerConnectionStateEnum).filter((s) => isNaN(+s)).includes(state)) {
|
|
241
|
+
throw new IllegalRtcPeerConnectionState('NodeWebrtcConnection used an unknown state: ' + state)
|
|
244
242
|
} else {
|
|
245
|
-
this.lastState = state as
|
|
243
|
+
this.lastState = state as RtcPeerConnectionState
|
|
246
244
|
}
|
|
247
245
|
|
|
248
|
-
if (state ===
|
|
249
|
-
|| state ===
|
|
250
|
-
|| state ===
|
|
246
|
+
if (state === RtcPeerConnectionStateEnum.closed
|
|
247
|
+
|| state === RtcPeerConnectionStateEnum.disconnected
|
|
248
|
+
|| state === RtcPeerConnectionStateEnum.failed
|
|
251
249
|
) {
|
|
252
|
-
this.doClose(
|
|
250
|
+
this.doClose(false)
|
|
253
251
|
}
|
|
254
252
|
|
|
255
253
|
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IceCandidate,
|
|
3
|
+
PeerDescriptor,
|
|
4
|
+
RtcAnswer,
|
|
5
|
+
RtcOffer, WebrtcConnectionRequest
|
|
6
|
+
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
7
|
+
import { ITransport } from '../../transport/ITransport'
|
|
8
|
+
import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
|
|
9
|
+
import { NodeWebrtcConnection } from './NodeWebrtcConnection'
|
|
10
|
+
import { WebrtcConnectorRpcRemote } from './WebrtcConnectorRpcRemote'
|
|
11
|
+
import { WebrtcConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
12
|
+
import { PeerIDKey } from '../../helpers/PeerID'
|
|
13
|
+
import { ManagedWebrtcConnection } from '../ManagedWebrtcConnection'
|
|
14
|
+
import { Logger } from '@streamr/utils'
|
|
15
|
+
import * as Err from '../../helpers/errors'
|
|
16
|
+
import { ManagedConnection } from '../ManagedConnection'
|
|
17
|
+
import { toProtoRpcClient } from '@streamr/proto-rpc'
|
|
18
|
+
import {
|
|
19
|
+
areEqualPeerDescriptors,
|
|
20
|
+
getNodeIdFromPeerDescriptor,
|
|
21
|
+
keyFromPeerDescriptor,
|
|
22
|
+
peerIdFromPeerDescriptor
|
|
23
|
+
} from '../../helpers/peerIdFromPeerDescriptor'
|
|
24
|
+
import { PortRange } from '../ConnectionManager'
|
|
25
|
+
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
26
|
+
import { WebrtcConnectorRpcLocal } from './WebrtcConnectorRpcLocal'
|
|
27
|
+
|
|
28
|
+
const logger = new Logger(module)
|
|
29
|
+
|
|
30
|
+
export const replaceInternalIpWithExternalIp = (candidate: string, ip: string): string => {
|
|
31
|
+
const parsed = candidate.split(' ')
|
|
32
|
+
const type = parsed[7]
|
|
33
|
+
if (type === 'host') {
|
|
34
|
+
parsed[4] = ip
|
|
35
|
+
}
|
|
36
|
+
return parsed.join(' ')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface WebrtcConnectorConfig {
|
|
40
|
+
transport: ITransport
|
|
41
|
+
iceServers?: IceServer[]
|
|
42
|
+
allowPrivateAddresses?: boolean
|
|
43
|
+
bufferThresholdLow?: number
|
|
44
|
+
bufferThresholdHigh?: number
|
|
45
|
+
maxMessageSize?: number
|
|
46
|
+
connectionTimeout?: number
|
|
47
|
+
externalIp?: string
|
|
48
|
+
portRange?: PortRange
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface IceServer {
|
|
52
|
+
url: string
|
|
53
|
+
port: number
|
|
54
|
+
username?: string
|
|
55
|
+
password?: string
|
|
56
|
+
tcp?: boolean
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class WebrtcConnector {
|
|
60
|
+
|
|
61
|
+
private static readonly WEBRTC_CONNECTOR_SERVICE_ID = 'system/webrtc-connector'
|
|
62
|
+
private readonly rpcCommunicator: ListeningRpcCommunicator
|
|
63
|
+
private readonly ongoingConnectAttempts: Map<PeerIDKey, ManagedWebrtcConnection> = new Map()
|
|
64
|
+
private localPeerDescriptor?: PeerDescriptor
|
|
65
|
+
private stopped = false
|
|
66
|
+
private iceServers: IceServer[]
|
|
67
|
+
private config: WebrtcConnectorConfig
|
|
68
|
+
|
|
69
|
+
constructor(
|
|
70
|
+
config: WebrtcConnectorConfig,
|
|
71
|
+
onNewConnection: (connection: ManagedConnection) => boolean
|
|
72
|
+
) {
|
|
73
|
+
this.config = config
|
|
74
|
+
this.iceServers = config.iceServers ?? []
|
|
75
|
+
this.rpcCommunicator = new ListeningRpcCommunicator(WebrtcConnector.WEBRTC_CONNECTOR_SERVICE_ID, config.transport, {
|
|
76
|
+
rpcRequestTimeout: 15000
|
|
77
|
+
})
|
|
78
|
+
this.registerLocalRpcMethods(config, onNewConnection)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private registerLocalRpcMethods(
|
|
82
|
+
config: WebrtcConnectorConfig,
|
|
83
|
+
onNewConnection: (connection: ManagedConnection) => boolean
|
|
84
|
+
) {
|
|
85
|
+
const localRpc = new WebrtcConnectorRpcLocal({
|
|
86
|
+
connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
|
|
87
|
+
onNewConnection,
|
|
88
|
+
ongoingConnectAttempts: this.ongoingConnectAttempts,
|
|
89
|
+
rpcCommunicator: this.rpcCommunicator,
|
|
90
|
+
getLocalPeerDescriptor: () => this.localPeerDescriptor!,
|
|
91
|
+
allowPrivateAddresses: config.allowPrivateAddresses ?? true
|
|
92
|
+
})
|
|
93
|
+
this.rpcCommunicator.registerRpcNotification(WebrtcConnectionRequest, 'requestConnection',
|
|
94
|
+
async (_req: WebrtcConnectionRequest, context: ServerCallContext) => {
|
|
95
|
+
if (!this.stopped) {
|
|
96
|
+
return localRpc.requestConnection(context)
|
|
97
|
+
} else {
|
|
98
|
+
return {}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
this.rpcCommunicator.registerRpcNotification(RtcOffer, 'rtcOffer',
|
|
103
|
+
async (req: RtcOffer, context: ServerCallContext) => {
|
|
104
|
+
if (!this.stopped) {
|
|
105
|
+
return localRpc.rtcOffer(req, context)
|
|
106
|
+
} else {
|
|
107
|
+
return {}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
this.rpcCommunicator.registerRpcNotification(RtcAnswer, 'rtcAnswer',
|
|
112
|
+
async (req: RtcAnswer, context: ServerCallContext) => {
|
|
113
|
+
if (!this.stopped) {
|
|
114
|
+
return localRpc.rtcAnswer(req, context)
|
|
115
|
+
} else {
|
|
116
|
+
return {}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
)
|
|
120
|
+
this.rpcCommunicator.registerRpcNotification(IceCandidate, 'iceCandidate',
|
|
121
|
+
async (req: IceCandidate, context: ServerCallContext) => {
|
|
122
|
+
if (!this.stopped) {
|
|
123
|
+
return localRpc.iceCandidate(req, context)
|
|
124
|
+
} else {
|
|
125
|
+
return {}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
132
|
+
if (areEqualPeerDescriptors(targetPeerDescriptor, this.localPeerDescriptor!)) {
|
|
133
|
+
throw new Err.CannotConnectToSelf('Cannot open WebRTC Connection to self')
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
logger.trace(`Opening WebRTC connection to ${getNodeIdFromPeerDescriptor(targetPeerDescriptor)}`)
|
|
137
|
+
|
|
138
|
+
const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
|
|
139
|
+
const existingConnection = this.ongoingConnectAttempts.get(peerKey)
|
|
140
|
+
if (existingConnection) {
|
|
141
|
+
return existingConnection
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const connection = new NodeWebrtcConnection({
|
|
145
|
+
remotePeerDescriptor: targetPeerDescriptor,
|
|
146
|
+
iceServers: this.iceServers,
|
|
147
|
+
bufferThresholdLow: this.config.bufferThresholdLow,
|
|
148
|
+
bufferThresholdHigh: this.config.bufferThresholdHigh,
|
|
149
|
+
connectingTimeout: this.config.connectionTimeout,
|
|
150
|
+
portRange: this.config.portRange
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
const offering = this.isOffering(targetPeerDescriptor)
|
|
154
|
+
let managedConnection: ManagedWebrtcConnection
|
|
155
|
+
|
|
156
|
+
if (offering) {
|
|
157
|
+
managedConnection = new ManagedWebrtcConnection(this.localPeerDescriptor!, connection)
|
|
158
|
+
} else {
|
|
159
|
+
managedConnection = new ManagedWebrtcConnection(this.localPeerDescriptor!, undefined, connection)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
|
|
163
|
+
|
|
164
|
+
this.ongoingConnectAttempts.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
|
|
165
|
+
|
|
166
|
+
const delFunc = () => {
|
|
167
|
+
this.ongoingConnectAttempts.delete(peerKey)
|
|
168
|
+
connection.off('disconnected', delFunc)
|
|
169
|
+
managedConnection.off('handshakeCompleted', delFunc)
|
|
170
|
+
}
|
|
171
|
+
connection.on('disconnected', delFunc)
|
|
172
|
+
managedConnection.on('handshakeCompleted', delFunc)
|
|
173
|
+
|
|
174
|
+
const remoteConnector = new WebrtcConnectorRpcRemote(
|
|
175
|
+
this.localPeerDescriptor!,
|
|
176
|
+
targetPeerDescriptor,
|
|
177
|
+
toProtoRpcClient(new WebrtcConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
connection.on('localCandidate', (candidate: string, mid: string) => {
|
|
181
|
+
if (this.config.externalIp) {
|
|
182
|
+
candidate = replaceInternalIpWithExternalIp(candidate, this.config.externalIp)
|
|
183
|
+
logger.debug(`onLocalCandidate injected external ip ${candidate} ${mid}`)
|
|
184
|
+
}
|
|
185
|
+
remoteConnector.sendIceCandidate(candidate, mid, connection.connectionId.toString())
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
if (offering) {
|
|
189
|
+
connection.once('localDescription', (description: string) => {
|
|
190
|
+
remoteConnector.sendRtcOffer(description, connection.connectionId.toString())
|
|
191
|
+
})
|
|
192
|
+
} else {
|
|
193
|
+
connection.once('localDescription', (description: string) => {
|
|
194
|
+
remoteConnector.sendRtcAnswer(description, connection.connectionId.toString())
|
|
195
|
+
})
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
connection.start(offering)
|
|
199
|
+
|
|
200
|
+
if (!offering) {
|
|
201
|
+
remoteConnector.requestConnection()
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return managedConnection
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
setLocalPeerDescriptor(peerDescriptor: PeerDescriptor): void {
|
|
208
|
+
this.localPeerDescriptor = peerDescriptor
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public async stop(): Promise<void> {
|
|
212
|
+
logger.trace('stop()')
|
|
213
|
+
this.stopped = true
|
|
214
|
+
|
|
215
|
+
const attempts = Array.from(this.ongoingConnectAttempts.values())
|
|
216
|
+
await Promise.allSettled(attempts.map((conn) => conn.close(false)))
|
|
217
|
+
|
|
218
|
+
this.rpcCommunicator.destroy()
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public isOffering(targetPeerDescriptor: PeerDescriptor): boolean {
|
|
222
|
+
const myId = peerIdFromPeerDescriptor(this.localPeerDescriptor!)
|
|
223
|
+
const theirId = peerIdFromPeerDescriptor(targetPeerDescriptor)
|
|
224
|
+
return myId.hasSmallerHashThan(theirId)
|
|
225
|
+
}
|
|
226
|
+
}
|