@streamr/dht 0.0.1-tatum.6 → 0.0.1-tatum.8
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 +1 -1
- package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
- package/dist/src/connection/ConnectionLockRpcRemote.d.ts +10 -0
- package/dist/src/connection/{RemoteConnectionLocker.js → ConnectionLockRpcRemote.js} +21 -35
- package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -0
- package/dist/src/connection/ConnectionManager.d.ts +17 -41
- package/dist/src/connection/ConnectionManager.js +148 -212
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectivityChecker.js +16 -13
- package/dist/src/connection/ConnectivityChecker.js.map +1 -1
- package/dist/src/connection/ConnectorFacade.d.ts +49 -0
- package/dist/src/connection/ConnectorFacade.js +83 -0
- package/dist/src/connection/ConnectorFacade.js.map +1 -0
- package/dist/src/connection/Handshaker.d.ts +1 -2
- package/dist/src/connection/Handshaker.js +1 -4
- package/dist/src/connection/Handshaker.js.map +1 -1
- package/dist/src/connection/ManagedConnection.d.ts +2 -6
- package/dist/src/connection/ManagedConnection.js +27 -36
- package/dist/src/connection/ManagedConnection.js.map +1 -1
- package/dist/src/connection/ManagedWebRtcConnection.d.ts +1 -1
- package/dist/src/connection/ManagedWebRtcConnection.js +2 -2
- package/dist/src/connection/ManagedWebRtcConnection.js.map +1 -1
- package/dist/src/connection/Simulator/Simulator.d.ts +0 -2
- package/dist/src/connection/Simulator/Simulator.js +0 -5
- package/dist/src/connection/Simulator/Simulator.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorConnection.js +16 -13
- package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorConnector.d.ts +2 -3
- package/dist/src/connection/Simulator/SimulatorConnector.js +12 -14
- package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -1
- package/dist/src/connection/Simulator/SimulatorTransport.js +6 -1
- package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -1
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +3 -1
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +12 -12
- package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -1
- package/dist/src/connection/WebRTC/{WebRtcConnector.d.ts → WebRtcConnectorRpcLocal.d.ts} +13 -13
- package/dist/src/connection/WebRTC/{WebRtcConnector.js → WebRtcConnectorRpcLocal.js} +46 -38
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.d.ts +11 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js +55 -0
- package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/WebRTC/iceServerAsString.d.ts +1 -1
- package/dist/src/connection/WebSocket/{WebSocketConnector.d.ts → WebSocketConnectorRpcLocal.d.ts} +21 -11
- package/dist/src/connection/WebSocket/{WebSocketConnector.js → WebSocketConnectorRpcLocal.js} +80 -59
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.d.ts +8 -0
- package/dist/src/connection/WebSocket/{RemoteWebSocketConnector.js → WebSocketConnectorRpcRemote.js} +12 -16
- package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/WebSocket/WebSocketServer.d.ts +11 -1
- package/dist/src/connection/WebSocket/WebSocketServer.js +15 -10
- package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -1
- package/dist/src/dht/DhtNode.d.ts +18 -55
- package/dist/src/dht/DhtNode.js +122 -145
- package/dist/src/dht/DhtNode.js.map +1 -1
- package/dist/src/dht/{RemoteExternalApi.d.ts → ExternalApiRpcRemote.d.ts} +2 -2
- package/dist/src/dht/{RemoteExternalApi.js → ExternalApiRpcRemote.js} +5 -6
- package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -0
- package/dist/src/dht/{DhtPeer.d.ts → RemoteDhtNode.d.ts} +2 -3
- package/dist/src/dht/{DhtPeer.js → RemoteDhtNode.js} +21 -19
- package/dist/src/dht/RemoteDhtNode.js.map +1 -0
- package/dist/src/dht/contact/ContactList.d.ts +0 -1
- package/dist/src/dht/contact/ContactList.js +0 -3
- package/dist/src/dht/contact/ContactList.js.map +1 -1
- package/dist/src/dht/contact/RandomContactList.d.ts +0 -1
- package/dist/src/dht/contact/RandomContactList.js +0 -3
- package/dist/src/dht/contact/RandomContactList.js.map +1 -1
- package/dist/src/dht/contact/SortedContactList.d.ts +0 -3
- package/dist/src/dht/contact/SortedContactList.js +0 -9
- package/dist/src/dht/contact/SortedContactList.js.map +1 -1
- package/dist/src/dht/discovery/DiscoverySession.d.ts +5 -7
- package/dist/src/dht/discovery/DiscoverySession.js +9 -10
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +12 -11
- package/dist/src/dht/discovery/PeerDiscovery.js +33 -37
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/find/RecursiveFindSession.d.ts +9 -10
- package/dist/src/dht/find/RecursiveFindSession.js +13 -13
- package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
- package/dist/src/dht/find/RecursiveFinder.d.ts +9 -11
- package/dist/src/dht/find/RecursiveFinder.js +35 -36
- package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
- package/dist/src/dht/find/RemoteRecursiveFindSession.d.ts +1 -1
- package/dist/src/dht/find/RemoteRecursiveFindSession.js +4 -4
- package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +1 -1
- package/dist/src/dht/registerExternalApiRpcMethods.d.ts +1 -1
- package/dist/src/dht/registerExternalApiRpcMethods.js +4 -3
- package/dist/src/dht/registerExternalApiRpcMethods.js.map +1 -1
- package/dist/src/dht/routing/DuplicateDetector.d.ts +1 -2
- package/dist/src/dht/routing/DuplicateDetector.js +2 -7
- package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
- package/dist/src/dht/routing/Router.d.ts +12 -15
- package/dist/src/dht/routing/Router.js +30 -33
- package/dist/src/dht/routing/Router.js.map +1 -1
- package/dist/src/dht/routing/{RemoteRouter.d.ts → RouterRpcRemote.d.ts} +2 -2
- package/dist/src/dht/routing/{RemoteRouter.js → RouterRpcRemote.js} +5 -5
- package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -0
- package/dist/src/dht/routing/RoutingSession.d.ts +3 -4
- package/dist/src/dht/routing/RoutingSession.js +6 -5
- package/dist/src/dht/routing/RoutingSession.js.map +1 -1
- package/dist/src/dht/store/{DataStore.d.ts → StoreRpcLocal.d.ts} +6 -6
- package/dist/src/dht/store/{DataStore.js → StoreRpcLocal.js} +34 -34
- package/dist/src/dht/store/StoreRpcLocal.js.map +1 -0
- package/dist/src/dht/store/{RemoteStore.d.ts → StoreRpcRemote.d.ts} +2 -2
- package/dist/src/dht/store/{RemoteStore.js → StoreRpcRemote.js} +4 -4
- package/dist/src/dht/store/StoreRpcRemote.js.map +1 -0
- package/dist/src/exports.d.ts +2 -8
- package/dist/src/exports.js +2 -14
- package/dist/src/exports.js.map +1 -1
- package/dist/src/helpers/PeerID.d.ts +0 -1
- package/dist/src/helpers/PeerID.js +0 -6
- package/dist/src/helpers/PeerID.js.map +1 -1
- package/dist/src/helpers/browser/isBrowserEnvironment.d.ts +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment.js +6 -0
- package/dist/src/helpers/browser/isBrowserEnvironment.js.map +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.d.ts +1 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.js +7 -0
- package/dist/src/helpers/browser/isBrowserEnvironment_override.js.map +1 -0
- package/dist/src/helpers/kademliaId.d.ts +1 -0
- package/dist/src/helpers/kademliaId.js +14 -0
- package/dist/src/helpers/kademliaId.js.map +1 -0
- package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -1
- package/dist/src/helpers/peerIdFromPeerDescriptor.js +3 -3
- package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
- package/dist/src/helpers/protoClasses.js +2 -2
- package/dist/src/helpers/protoClasses.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +29 -29
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +39 -39
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +49 -162
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +47 -88
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +15 -15
- package/dist/src/transport/RoutingRpcCommunicator.js +1 -0
- package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
- package/package.json +10 -9
- package/protos/DhtRpc.proto +30 -60
- package/src/connection/ConnectionLockHandler.ts +1 -1
- package/src/connection/ConnectionLockRpcRemote.ts +62 -0
- package/src/connection/ConnectionManager.ts +178 -274
- package/src/connection/ConnectivityChecker.ts +15 -12
- package/src/connection/ConnectorFacade.ts +140 -0
- package/src/connection/Handshaker.ts +0 -5
- package/src/connection/ManagedConnection.ts +26 -40
- package/src/connection/ManagedWebRtcConnection.ts +0 -2
- package/src/connection/Simulator/Simulator.ts +0 -7
- package/src/connection/Simulator/SimulatorConnection.ts +16 -13
- package/src/connection/Simulator/SimulatorConnector.ts +13 -19
- package/src/connection/Simulator/SimulatorTransport.ts +6 -1
- package/src/connection/WebRTC/NodeWebRtcConnection.ts +15 -14
- package/src/connection/WebRTC/{WebRtcConnector.ts → WebRtcConnectorRpcLocal.ts} +68 -56
- package/src/connection/WebRTC/WebRtcConnectorRpcRemote.ts +71 -0
- package/src/connection/WebRTC/iceServerAsString.ts +1 -1
- package/src/connection/WebSocket/{WebSocketConnector.ts → WebSocketConnectorRpcLocal.ts} +102 -79
- package/src/connection/WebSocket/WebSocketConnectorRpcRemote.ts +45 -0
- package/src/connection/WebSocket/WebSocketServer.ts +26 -8
- package/src/dht/DhtNode.ts +176 -203
- package/src/dht/{RemoteExternalApi.ts → ExternalApiRpcRemote.ts} +3 -4
- package/src/dht/{DhtPeer.ts → RemoteDhtNode.ts} +11 -9
- package/src/dht/contact/ContactList.ts +0 -4
- package/src/dht/contact/RandomContactList.ts +0 -4
- package/src/dht/contact/SortedContactList.ts +0 -12
- package/src/dht/discovery/DiscoverySession.ts +20 -23
- package/src/dht/discovery/PeerDiscovery.ts +47 -45
- package/src/dht/find/RecursiveFindSession.ts +21 -22
- package/src/dht/find/RecursiveFinder.ts +45 -49
- package/src/dht/find/RemoteRecursiveFindSession.ts +6 -6
- package/src/dht/registerExternalApiRpcMethods.ts +8 -5
- package/src/dht/routing/DuplicateDetector.ts +3 -10
- package/src/dht/routing/Router.ts +39 -45
- package/src/dht/routing/{RemoteRouter.ts → RouterRpcRemote.ts} +4 -4
- package/src/dht/routing/RoutingSession.ts +15 -15
- package/src/dht/store/{DataStore.ts → StoreRpcLocal.ts} +42 -42
- package/src/dht/store/{RemoteStore.ts → StoreRpcRemote.ts} +2 -2
- package/src/exports.ts +2 -8
- package/src/helpers/PeerID.ts +0 -7
- package/src/helpers/browser/isBrowserEnvironment.ts +1 -0
- package/src/helpers/browser/isBrowserEnvironment_override.ts +3 -0
- package/src/helpers/kademliaId.ts +8 -0
- package/src/helpers/peerIdFromPeerDescriptor.ts +1 -1
- package/src/helpers/protoClasses.ts +4 -4
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +54 -54
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +15 -15
- package/src/proto/packages/dht/protos/DhtRpc.ts +77 -216
- package/src/transport/RoutingRpcCommunicator.ts +1 -0
- package/test/benchmark/KademliaCorrectness.test.ts +4 -2
- package/test/benchmark/RecursiveFind.test.ts +6 -6
- package/test/end-to-end/Layer0-Layer1.test.ts +9 -9
- package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +5 -5
- package/test/end-to-end/Layer0WebRTC.test.ts +5 -6
- package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +13 -8
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +15 -10
- package/test/end-to-end/WebSocketConnectionRequest.test.ts +5 -5
- package/test/integration/ConnectionLocking.test.ts +32 -26
- package/test/integration/ConnectionManager.test.ts +90 -93
- package/test/integration/DhtJoinPeerDiscovery.test.ts +53 -0
- package/test/integration/DhtRpc.test.ts +4 -6
- package/test/integration/Layer1-scale.test.ts +8 -8
- package/test/integration/MigrateData.test.ts +9 -9
- package/test/integration/Mock-Layer1-Layer0.test.ts +1 -2
- package/test/integration/RecursiveFind.test.ts +5 -5
- package/test/integration/{DhtPeer.test.ts → RemoteDhtNode.test.ts} +11 -12
- package/test/integration/RouteMessage.test.ts +7 -9
- package/test/integration/{RemoteRouter.test.ts → RouterRpcRemote.test.ts} +13 -14
- package/test/integration/RpcErrors.test.ts +25 -10
- package/test/integration/ScaleDownDht.test.ts +8 -8
- package/test/integration/SimultaneousConnections.test.ts +35 -36
- package/test/integration/Store.test.ts +8 -9
- package/test/integration/StoreAndDelete.test.ts +11 -11
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +7 -7
- package/test/integration/{RemoteStore.test.ts → StoreRpcRemote.test.ts} +17 -18
- package/test/integration/WebRtcConnectionManagement.test.ts +26 -19
- package/test/integration/WebRtcConnectorRpc.test.ts +17 -32
- package/test/integration/WebSocket.test.ts +4 -2
- package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
- package/test/integration/WebSocketConnectorRpc.test.ts +10 -15
- package/test/unit/DuplicateDetector.test.ts +3 -4
- package/test/unit/LocalDataStore.test.ts +6 -8
- package/test/unit/RandomContactList.test.ts +1 -1
- package/test/unit/RecursiveFinder.test.ts +13 -18
- package/test/unit/Router.test.ts +18 -21
- package/test/unit/WebSocketConnectorRpcLocal.test.ts +64 -0
- package/test/unit/WebSocketServer.test.ts +24 -12
- package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +1 -1
- package/test/utils/mock/RecursiveFinder.ts +2 -2
- package/test/utils/mock/Router.ts +9 -11
- package/test/utils/mock/Transport.ts +2 -2
- package/test/utils/utils.ts +55 -74
- package/dist/src/connection/RemoteConnectionLocker.d.ts +0 -13
- package/dist/src/connection/RemoteConnectionLocker.js.map +0 -1
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.d.ts +0 -12
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js +0 -74
- package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js.map +0 -1
- package/dist/src/connection/WebRTC/WebRtcConnector.js.map +0 -1
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.d.ts +0 -9
- package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +0 -1
- package/dist/src/connection/WebSocket/WebSocketConnector.js.map +0 -1
- package/dist/src/dht/DhtPeer.js.map +0 -1
- package/dist/src/dht/RemoteExternalApi.js.map +0 -1
- package/dist/src/dht/routing/RemoteRouter.js.map +0 -1
- package/dist/src/dht/store/DataStore.js.map +0 -1
- package/dist/src/dht/store/RemoteStore.js.map +0 -1
- package/dist/src/helpers/browser/isBrowser.d.ts +0 -1
- package/dist/src/helpers/browser/isBrowser.js +0 -6
- package/dist/src/helpers/browser/isBrowser.js.map +0 -1
- package/dist/src/helpers/browser/isNodeJS.d.ts +0 -1
- package/dist/src/helpers/browser/isNodeJS.js +0 -6
- package/dist/src/helpers/browser/isNodeJS.js.map +0 -1
- package/src/connection/RemoteConnectionLocker.ts +0 -84
- package/src/connection/WebRTC/RemoteWebrtcConnector.ts +0 -93
- package/src/connection/WebSocket/RemoteWebSocketConnector.ts +0 -49
- package/src/helpers/browser/isBrowser.ts +0 -1
- package/src/helpers/browser/isNodeJS.ts +0 -1
- package/test/integration/DhtWithMockConnectionLatencies.test.ts +0 -46
- package/test/integration/DhtWithMockConnections.test.ts +0 -46
- package/test/integration/DhtWithRealConnectionLatencies.test.ts +0 -47
|
@@ -2,18 +2,18 @@ import { ClientWebSocket } from './ClientWebSocket'
|
|
|
2
2
|
import { IConnection, ConnectionType } from '../IConnection'
|
|
3
3
|
import { ITransport } from '../../transport/ITransport'
|
|
4
4
|
import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
|
|
5
|
-
import {
|
|
5
|
+
import { WebSocketConnectorRpcRemote } from './WebSocketConnectorRpcRemote'
|
|
6
6
|
import {
|
|
7
7
|
ConnectivityMethod,
|
|
8
8
|
ConnectivityResponse,
|
|
9
|
+
NodeType,
|
|
9
10
|
PeerDescriptor,
|
|
10
11
|
WebSocketConnectionRequest,
|
|
11
12
|
WebSocketConnectionResponse
|
|
12
13
|
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
13
|
-
import {
|
|
14
|
-
import { Logger, wait } from '@streamr/utils'
|
|
15
|
-
import {
|
|
16
|
-
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
14
|
+
import { WebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
15
|
+
import { Logger, binaryToHex, wait } from '@streamr/utils'
|
|
16
|
+
import { IWebSocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
|
|
17
17
|
import { ManagedConnection } from '../ManagedConnection'
|
|
18
18
|
import { WebSocketServer } from './WebSocketServer'
|
|
19
19
|
import { ConnectivityChecker } from '../ConnectivityChecker'
|
|
@@ -24,7 +24,10 @@ import { toProtoRpcClient } from '@streamr/proto-rpc'
|
|
|
24
24
|
import { Handshaker } from '../Handshaker'
|
|
25
25
|
import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
26
26
|
import { ParsedUrlQuery } from 'querystring'
|
|
27
|
-
import { sample } from 'lodash'
|
|
27
|
+
import { range, sample } from 'lodash'
|
|
28
|
+
import { isPrivateIPv4 } from '../../helpers/AddressTools'
|
|
29
|
+
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
30
|
+
import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
|
|
28
31
|
|
|
29
32
|
const logger = new Logger(module)
|
|
30
33
|
|
|
@@ -32,47 +35,55 @@ export const connectivityMethodToWebSocketUrl = (ws: ConnectivityMethod): string
|
|
|
32
35
|
return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
const canOpenConnectionFromBrowser = (websocketServer: ConnectivityMethod) => {
|
|
39
|
+
const hasPrivateAddress = ((websocketServer.host === 'localhost') || isPrivateIPv4(websocketServer.host))
|
|
40
|
+
return websocketServer.tls || hasPrivateAddress
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
const ENTRY_POINT_CONNECTION_ATTEMPTS = 5
|
|
36
44
|
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
interface WebSocketConnectorRpcLocalConfig {
|
|
46
|
+
transport: ITransport
|
|
47
|
+
canConnect: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
|
|
48
|
+
onIncomingConnection: (connection: ManagedConnection) => boolean
|
|
49
|
+
portRange?: PortRange
|
|
50
|
+
maxMessageSize?: number
|
|
51
|
+
host?: string
|
|
52
|
+
entrypoints?: PeerDescriptor[]
|
|
53
|
+
tlsCertificate?: TlsCertificate
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
|
|
57
|
+
|
|
58
|
+
private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocket-connector'
|
|
39
59
|
private readonly rpcCommunicator: ListeningRpcCommunicator
|
|
40
60
|
private readonly canConnectFunction: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
|
|
41
61
|
private readonly webSocketServer?: WebSocketServer
|
|
42
62
|
private connectivityChecker?: ConnectivityChecker
|
|
43
63
|
private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
|
|
44
|
-
private
|
|
45
|
-
private portRange?: PortRange
|
|
64
|
+
private onIncomingConnection: (connection: ManagedConnection) => boolean
|
|
46
65
|
private host?: string
|
|
47
|
-
private entrypoints?: PeerDescriptor[]
|
|
66
|
+
private readonly entrypoints?: PeerDescriptor[]
|
|
48
67
|
private readonly tlsCertificate?: TlsCertificate
|
|
49
68
|
private selectedPort?: number
|
|
50
|
-
private readonly protocolVersion: string
|
|
51
69
|
private ownPeerDescriptor?: PeerDescriptor
|
|
52
70
|
private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
|
|
53
71
|
private destroyed = false
|
|
54
72
|
|
|
55
|
-
constructor(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
this.
|
|
69
|
-
this.host = host
|
|
70
|
-
this.entrypoints = entrypoints
|
|
71
|
-
this.tlsCertificate = tlsCertificate
|
|
72
|
-
|
|
73
|
-
this.canConnectFunction = fnCanConnect.bind(this)
|
|
74
|
-
|
|
75
|
-
this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnector.WEBSOCKET_CONNECTOR_SERVICE_ID, rpcTransport, {
|
|
73
|
+
constructor(config: WebSocketConnectorRpcLocalConfig) {
|
|
74
|
+
this.webSocketServer = config.portRange ? new WebSocketServer({
|
|
75
|
+
portRange: config.portRange!,
|
|
76
|
+
tlsCertificate: config.tlsCertificate,
|
|
77
|
+
maxMessageSize: config.maxMessageSize
|
|
78
|
+
}) : undefined
|
|
79
|
+
this.onIncomingConnection = config.onIncomingConnection
|
|
80
|
+
this.host = config.host
|
|
81
|
+
this.entrypoints = config.entrypoints
|
|
82
|
+
this.tlsCertificate = config.tlsCertificate
|
|
83
|
+
|
|
84
|
+
this.canConnectFunction = config.canConnect.bind(this)
|
|
85
|
+
|
|
86
|
+
this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnectorRpcLocal.WEBSOCKET_CONNECTOR_SERVICE_ID, config.transport, {
|
|
76
87
|
rpcRequestTimeout: 15000
|
|
77
88
|
})
|
|
78
89
|
|
|
@@ -80,12 +91,12 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
80
91
|
WebSocketConnectionRequest,
|
|
81
92
|
WebSocketConnectionResponse,
|
|
82
93
|
'requestConnection',
|
|
83
|
-
(req: WebSocketConnectionRequest, context) => this.requestConnection(req, context)
|
|
94
|
+
(req: WebSocketConnectionRequest, context: ServerCallContext) => this.requestConnection(req, context)
|
|
84
95
|
)
|
|
85
96
|
}
|
|
86
97
|
|
|
87
98
|
private attachHandshaker(connection: IConnection) {
|
|
88
|
-
const handshaker = new Handshaker(this.ownPeerDescriptor!,
|
|
99
|
+
const handshaker = new Handshaker(this.ownPeerDescriptor!, connection)
|
|
89
100
|
handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
|
|
90
101
|
this.onServerSocketHandshakeRequest(peerDescriptor, connection)
|
|
91
102
|
})
|
|
@@ -100,10 +111,10 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
100
111
|
serverSocket.resourceURL.query) {
|
|
101
112
|
const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
|
|
102
113
|
if (query.connectivityRequest) {
|
|
103
|
-
logger.trace('Received connectivity request connection')
|
|
114
|
+
logger.trace('Received connectivity request connection from ' + serverSocket.getRemoteAddress())
|
|
104
115
|
this.connectivityChecker!.listenToIncomingConnectivityRequests(serverSocket)
|
|
105
116
|
} else if (query.connectivityProbe) {
|
|
106
|
-
logger.trace('Received connectivity probe connection')
|
|
117
|
+
logger.trace('Received connectivity probe connection from ' + serverSocket.getRemoteAddress())
|
|
107
118
|
} else {
|
|
108
119
|
this.attachHandshaker(connection)
|
|
109
120
|
}
|
|
@@ -111,13 +122,13 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
111
122
|
this.attachHandshaker(connection)
|
|
112
123
|
}
|
|
113
124
|
})
|
|
114
|
-
const port = await this.webSocketServer.start(
|
|
125
|
+
const port = await this.webSocketServer.start()
|
|
115
126
|
this.selectedPort = port
|
|
116
127
|
this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.tlsCertificate !== undefined, this.host)
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
|
|
120
|
-
public async checkConnectivity(
|
|
131
|
+
public async checkConnectivity(): Promise<ConnectivityResponse> {
|
|
121
132
|
// TODO: this could throw if the server is not running
|
|
122
133
|
const noServerConnectivityResponse: ConnectivityResponse = {
|
|
123
134
|
openInternet: false,
|
|
@@ -127,35 +138,47 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
127
138
|
if (this.destroyed) {
|
|
128
139
|
return noServerConnectivityResponse
|
|
129
140
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
// return connectivity info given in config
|
|
137
|
-
const preconfiguredConnectivityResponse: ConnectivityResponse = {
|
|
138
|
-
openInternet: true,
|
|
139
|
-
host: this.host!,
|
|
140
|
-
natType: NatType.OPEN_INTERNET,
|
|
141
|
-
websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
|
|
142
|
-
}
|
|
143
|
-
return preconfiguredConnectivityResponse
|
|
141
|
+
for (const reattempt of range(ENTRY_POINT_CONNECTION_ATTEMPTS)) {
|
|
142
|
+
const entryPoint = sample(this.entrypoints)!
|
|
143
|
+
try {
|
|
144
|
+
if (!this.webSocketServer) {
|
|
145
|
+
// If no websocket server, return openInternet: false
|
|
146
|
+
return noServerConnectivityResponse
|
|
144
147
|
} else {
|
|
145
|
-
|
|
146
|
-
|
|
148
|
+
if (!this.entrypoints || this.entrypoints.length < 1) {
|
|
149
|
+
// return connectivity info given in config
|
|
150
|
+
const preconfiguredConnectivityResponse: ConnectivityResponse = {
|
|
151
|
+
openInternet: true,
|
|
152
|
+
host: this.host!,
|
|
153
|
+
natType: NatType.OPEN_INTERNET,
|
|
154
|
+
websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
|
|
155
|
+
}
|
|
156
|
+
return preconfiguredConnectivityResponse
|
|
157
|
+
} else {
|
|
158
|
+
// Do real connectivity checking
|
|
159
|
+
return await this.connectivityChecker!.sendConnectivityRequest(entryPoint)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} catch (err) {
|
|
163
|
+
if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
|
|
164
|
+
const error = `Failed to connect to entrypoint with id ${binaryToHex(entryPoint.kademliaId)} `
|
|
165
|
+
+ `and URL ${connectivityMethodToWebSocketUrl(entryPoint.websocket!)}`
|
|
166
|
+
logger.error(error, { error: err })
|
|
167
|
+
await wait(2000)
|
|
147
168
|
}
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
|
|
151
|
-
logger.error('Failed to connect to the entrypoint', { error: err })
|
|
152
|
-
await wait(2000)
|
|
153
|
-
return this.checkConnectivity(reattempt + 1)
|
|
154
|
-
} else {
|
|
155
|
-
throw err
|
|
156
169
|
}
|
|
157
170
|
}
|
|
171
|
+
throw Error(`Failed to connect to the entrypoints after ${ENTRY_POINT_CONNECTION_ATTEMPTS} attempts`)
|
|
172
|
+
}
|
|
158
173
|
|
|
174
|
+
public isPossibleToFormConnection(targetPeerDescriptor: PeerDescriptor): boolean {
|
|
175
|
+
if (this.ownPeerDescriptor!.websocket !== undefined) {
|
|
176
|
+
return (targetPeerDescriptor.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(this.ownPeerDescriptor!.websocket)
|
|
177
|
+
} else if (targetPeerDescriptor.websocket !== undefined) {
|
|
178
|
+
return (this.ownPeerDescriptor!.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(targetPeerDescriptor.websocket)
|
|
179
|
+
} else {
|
|
180
|
+
return false
|
|
181
|
+
}
|
|
159
182
|
}
|
|
160
183
|
|
|
161
184
|
public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
@@ -172,8 +195,7 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
172
195
|
|
|
173
196
|
const url = connectivityMethodToWebSocketUrl(targetPeerDescriptor.websocket!)
|
|
174
197
|
|
|
175
|
-
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!,
|
|
176
|
-
ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
|
|
198
|
+
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
|
|
177
199
|
managedConnection.setPeerDescriptor(targetPeerDescriptor)
|
|
178
200
|
|
|
179
201
|
this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
|
|
@@ -194,15 +216,16 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
194
216
|
}
|
|
195
217
|
}
|
|
196
218
|
|
|
197
|
-
|
|
219
|
+
private requestConnectionFromPeer(ownPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
|
|
198
220
|
setImmediate(() => {
|
|
199
|
-
const remoteConnector = new
|
|
221
|
+
const remoteConnector = new WebSocketConnectorRpcRemote(
|
|
222
|
+
ownPeerDescriptor,
|
|
200
223
|
targetPeerDescriptor,
|
|
201
|
-
toProtoRpcClient(new
|
|
224
|
+
toProtoRpcClient(new WebSocketConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
|
|
202
225
|
)
|
|
203
|
-
remoteConnector.requestConnection(ownPeerDescriptor
|
|
226
|
+
remoteConnector.requestConnection(ownPeerDescriptor.websocket!.host, ownPeerDescriptor.websocket!.port)
|
|
204
227
|
})
|
|
205
|
-
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!,
|
|
228
|
+
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
|
|
206
229
|
managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
|
|
207
230
|
managedConnection.setPeerDescriptor(targetPeerDescriptor)
|
|
208
231
|
this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
|
|
@@ -215,16 +238,15 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
215
238
|
|
|
216
239
|
if (this.ongoingConnectRequests.has(peerId.toKey())) {
|
|
217
240
|
const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
|
|
218
|
-
ongoingConnectReguest.attachImplementation(serverWebSocket
|
|
241
|
+
ongoingConnectReguest.attachImplementation(serverWebSocket)
|
|
219
242
|
ongoingConnectReguest.acceptHandshake()
|
|
220
243
|
this.ongoingConnectRequests.delete(peerId.toKey())
|
|
221
244
|
} else {
|
|
222
|
-
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!,
|
|
223
|
-
ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
|
|
245
|
+
const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
|
|
224
246
|
|
|
225
247
|
managedConnection.setPeerDescriptor(peerDescriptor)
|
|
226
248
|
|
|
227
|
-
if (this.
|
|
249
|
+
if (this.onIncomingConnection(managedConnection)) {
|
|
228
250
|
managedConnection.acceptHandshake()
|
|
229
251
|
} else {
|
|
230
252
|
managedConnection.rejectHandshake('Duplicate connection')
|
|
@@ -250,15 +272,16 @@ export class WebSocketConnector implements IWebSocketConnectorService {
|
|
|
250
272
|
await this.webSocketServer?.stop()
|
|
251
273
|
}
|
|
252
274
|
|
|
253
|
-
//
|
|
254
|
-
public async requestConnection(request: WebSocketConnectionRequest,
|
|
255
|
-
|
|
275
|
+
// IWebSocketConnectorRpc implementation
|
|
276
|
+
public async requestConnection(request: WebSocketConnectionRequest, context: ServerCallContext): Promise<WebSocketConnectionResponse> {
|
|
277
|
+
const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
|
|
278
|
+
if (!this.destroyed && this.canConnectFunction(senderPeerDescriptor, request.ip, request.port)) {
|
|
256
279
|
setImmediate(() => {
|
|
257
280
|
if (this.destroyed) {
|
|
258
281
|
return
|
|
259
282
|
}
|
|
260
|
-
const connection = this.connect(
|
|
261
|
-
this.
|
|
283
|
+
const connection = this.connect(senderPeerDescriptor)
|
|
284
|
+
this.onIncomingConnection(connection)
|
|
262
285
|
})
|
|
263
286
|
const res: WebSocketConnectionResponse = {
|
|
264
287
|
accepted: true
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PeerDescriptor,
|
|
3
|
+
WebSocketConnectionRequest
|
|
4
|
+
} from '../../proto/packages/dht/protos/DhtRpc'
|
|
5
|
+
import { IWebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
|
|
6
|
+
import { Logger } from '@streamr/utils'
|
|
7
|
+
import * as Err from '../../helpers/errors'
|
|
8
|
+
import { ProtoRpcClient } from '@streamr/proto-rpc'
|
|
9
|
+
import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
|
|
10
|
+
import { Remote } from '../../dht/contact/Remote'
|
|
11
|
+
|
|
12
|
+
const logger = new Logger(module)
|
|
13
|
+
|
|
14
|
+
export class WebSocketConnectorRpcRemote extends Remote<IWebSocketConnectorRpcClient> {
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
localPeerDescriptor: PeerDescriptor,
|
|
18
|
+
remotePeerDescriptor: PeerDescriptor,
|
|
19
|
+
client: ProtoRpcClient<IWebSocketConnectorRpcClient>
|
|
20
|
+
) {
|
|
21
|
+
super(localPeerDescriptor, remotePeerDescriptor, 'DUMMY', client)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async requestConnection(ip: string, port: number): Promise<boolean> {
|
|
25
|
+
logger.trace(`Requesting WebSocket connection from ${keyFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
|
|
26
|
+
const request: WebSocketConnectionRequest = {
|
|
27
|
+
ip,
|
|
28
|
+
port
|
|
29
|
+
}
|
|
30
|
+
const options = this.formDhtRpcOptions()
|
|
31
|
+
try {
|
|
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
|
+
return res.accepted
|
|
40
|
+
} catch (err) {
|
|
41
|
+
logger.debug(new Err.WebSocketConnectionRequestRejected('WebSocketConnectionRequest rejected', err).stack!)
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -22,17 +22,33 @@ const logger = new Logger(module)
|
|
|
22
22
|
|
|
23
23
|
declare class NodeJsWsServer extends WsServer { }
|
|
24
24
|
|
|
25
|
+
interface WebSocketServerConfig {
|
|
26
|
+
portRange: PortRange
|
|
27
|
+
tlsCertificate?: TlsCertificate
|
|
28
|
+
maxMessageSize?: number
|
|
29
|
+
}
|
|
30
|
+
|
|
25
31
|
export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
26
32
|
|
|
27
33
|
private httpServer?: HttpServer | HttpsServer
|
|
28
34
|
private wsServer?: WsServer
|
|
29
35
|
private readonly abortController = new AbortController()
|
|
36
|
+
private readonly portRange: PortRange
|
|
37
|
+
private readonly tlsCertificate?: TlsCertificate
|
|
38
|
+
private readonly maxMessageSize: number
|
|
39
|
+
|
|
40
|
+
constructor(config: WebSocketServerConfig) {
|
|
41
|
+
super()
|
|
42
|
+
this.portRange = config.portRange
|
|
43
|
+
this.tlsCertificate = config.tlsCertificate
|
|
44
|
+
this.maxMessageSize = config.maxMessageSize ?? 1048576
|
|
45
|
+
}
|
|
30
46
|
|
|
31
|
-
public async start(
|
|
32
|
-
const ports = range(portRange.min, portRange.max + 1)
|
|
47
|
+
public async start(): Promise<number> {
|
|
48
|
+
const ports = range(this.portRange.min, this.portRange.max + 1)
|
|
33
49
|
for (const port of ports) {
|
|
34
50
|
try {
|
|
35
|
-
await asAbortable(this.startServer(port, tlsCertificate), this.abortController.signal)
|
|
51
|
+
await asAbortable(this.startServer(port, this.tlsCertificate), this.abortController.signal)
|
|
36
52
|
return port
|
|
37
53
|
} catch (err) {
|
|
38
54
|
if (err.originalError?.code === 'EADDRINUSE') {
|
|
@@ -42,7 +58,7 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
42
58
|
}
|
|
43
59
|
}
|
|
44
60
|
}
|
|
45
|
-
throw new WebSocketServerStartError(`Failed to start WebSocket server on any port in range: ${portRange.min}-${portRange.min}`)
|
|
61
|
+
throw new WebSocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
private startServer(port: number, tlsCertificate?: TlsCertificate): Promise<void> {
|
|
@@ -60,14 +76,14 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
60
76
|
:
|
|
61
77
|
createHttpServer(requestListener)
|
|
62
78
|
|
|
63
|
-
function originIsAllowed(
|
|
79
|
+
function originIsAllowed() {
|
|
64
80
|
return true
|
|
65
81
|
}
|
|
66
82
|
|
|
67
83
|
this.wsServer = this.createWsServer(this.httpServer)
|
|
68
84
|
|
|
69
85
|
this.wsServer.on('request', (request) => {
|
|
70
|
-
if (!originIsAllowed(
|
|
86
|
+
if (!originIsAllowed()) {
|
|
71
87
|
// Make sure we only accept requests from an allowed origin
|
|
72
88
|
request.reject()
|
|
73
89
|
logger.trace('IConnection from origin ' + request.origin + ' rejected.')
|
|
@@ -115,12 +131,14 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
|
|
|
115
131
|
if (typeof NodeJsWsServer !== 'undefined') {
|
|
116
132
|
return new NodeJsWsServer({
|
|
117
133
|
httpServer,
|
|
118
|
-
autoAcceptConnections: false
|
|
134
|
+
autoAcceptConnections: false,
|
|
135
|
+
maxReceivedMessageSize: this.maxMessageSize
|
|
119
136
|
})
|
|
120
137
|
} else {
|
|
121
138
|
return this.wsServer = new WsServer({
|
|
122
139
|
httpServer,
|
|
123
|
-
autoAcceptConnections: false
|
|
140
|
+
autoAcceptConnections: false,
|
|
141
|
+
maxReceivedMessageSize: this.maxMessageSize
|
|
124
142
|
})
|
|
125
143
|
}
|
|
126
144
|
}
|