@streamr/dht 102.0.0-beta.1 → 102.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/google/protobuf/any.d.ts +180 -0
- package/dist/generated/google/protobuf/any.js +155 -0
- package/dist/generated/google/protobuf/any.js.map +1 -0
- package/dist/generated/google/protobuf/empty.d.ts +31 -0
- package/dist/generated/google/protobuf/empty.js +32 -0
- package/dist/generated/google/protobuf/empty.js.map +1 -0
- package/dist/generated/google/protobuf/timestamp.d.ts +155 -0
- package/dist/generated/google/protobuf/timestamp.js +136 -0
- package/dist/generated/google/protobuf/timestamp.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.d.ts +361 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.js +285 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.d.ts +999 -0
- package/dist/generated/packages/dht/protos/DhtRpc.js +677 -0
- package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.d.ts +162 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.js +3 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js +66 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/package.json +7 -7
- package/package.json +7 -7
- package/eslint.config.mjs +0 -12
- package/src/connection/Connection.ts +0 -28
- package/src/connection/ConnectionLockRpcLocal.ts +0 -78
- package/src/connection/ConnectionLockRpcRemote.ts +0 -64
- package/src/connection/ConnectionLockStates.ts +0 -131
- package/src/connection/ConnectionManager.ts +0 -661
- package/src/connection/ConnectionsView.ts +0 -8
- package/src/connection/ConnectorFacade.ts +0 -217
- package/src/connection/Handshaker.ts +0 -209
- package/src/connection/IConnection.ts +0 -40
- package/src/connection/ManagedConnection.ts +0 -113
- package/src/connection/OutputBuffer.ts +0 -28
- package/src/connection/PendingConnection.ts +0 -68
- package/src/connection/connectivityChecker.ts +0 -108
- package/src/connection/connectivityRequestHandler.ts +0 -116
- package/src/connection/simulator/Simulator.ts +0 -369
- package/src/connection/simulator/SimulatorConnection.ts +0 -137
- package/src/connection/simulator/SimulatorConnector.ts +0 -98
- package/src/connection/simulator/SimulatorTransport.ts +0 -15
- package/src/connection/simulator/pings.ts +0 -42
- package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -242
- package/src/connection/webrtc/IWebrtcConnection.ts +0 -24
- package/src/connection/webrtc/NodeWebrtcConnection.ts +0 -245
- package/src/connection/webrtc/WebrtcConnector.ts +0 -234
- package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +0 -108
- package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +0 -60
- package/src/connection/webrtc/iceServerAsString.ts +0 -15
- package/src/connection/websocket/AbstractWebsocketClientConnection.ts +0 -122
- package/src/connection/websocket/AutoCertifierClientFacade.ts +0 -89
- package/src/connection/websocket/BrowserWebsocketClientConnection.ts +0 -44
- package/src/connection/websocket/NodeWebsocketClientConnection.ts +0 -39
- package/src/connection/websocket/WebsocketClientConnector.ts +0 -119
- package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +0 -38
- package/src/connection/websocket/WebsocketClientConnectorRpcRemote.ts +0 -19
- package/src/connection/websocket/WebsocketServer.ts +0 -164
- package/src/connection/websocket/WebsocketServerConnection.ts +0 -109
- package/src/connection/websocket/WebsocketServerConnector.ts +0 -290
- package/src/dht/DhtNode.ts +0 -683
- package/src/dht/DhtNodeRpcLocal.ts +0 -84
- package/src/dht/DhtNodeRpcRemote.ts +0 -107
- package/src/dht/ExternalApiRpcLocal.ts +0 -58
- package/src/dht/ExternalApiRpcRemote.ts +0 -41
- package/src/dht/PeerManager.ts +0 -305
- package/src/dht/contact/Contact.ts +0 -19
- package/src/dht/contact/ContactList.ts +0 -43
- package/src/dht/contact/RandomContactList.ts +0 -56
- package/src/dht/contact/RingContactList.ts +0 -143
- package/src/dht/contact/RpcRemote.ts +0 -72
- package/src/dht/contact/SortedContactList.ts +0 -173
- package/src/dht/contact/getClosestNodes.ts +0 -24
- package/src/dht/contact/ringIdentifiers.ts +0 -62
- package/src/dht/discovery/DiscoverySession.ts +0 -129
- package/src/dht/discovery/PeerDiscovery.ts +0 -244
- package/src/dht/discovery/RingDiscoverySession.ts +0 -148
- package/src/dht/recursive-operation/RecursiveOperationManager.ts +0 -251
- package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +0 -34
- package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +0 -43
- package/src/dht/recursive-operation/RecursiveOperationSession.ts +0 -231
- package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +0 -35
- package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +0 -30
- package/src/dht/routing/DuplicateDetector.ts +0 -34
- package/src/dht/routing/Router.ts +0 -246
- package/src/dht/routing/RouterRpcLocal.ts +0 -78
- package/src/dht/routing/RouterRpcRemote.ts +0 -80
- package/src/dht/routing/RoutingSession.ts +0 -243
- package/src/dht/routing/RoutingTablesCache.ts +0 -60
- package/src/dht/routing/getPreviousPeer.ts +0 -6
- package/src/dht/store/LocalDataStore.ts +0 -84
- package/src/dht/store/StoreManager.ts +0 -170
- package/src/dht/store/StoreRpcLocal.ts +0 -89
- package/src/dht/store/StoreRpcRemote.ts +0 -32
- package/src/exports.ts +0 -33
- package/src/helpers/AddressTools.ts +0 -28
- package/src/helpers/Connectivity.ts +0 -19
- package/src/helpers/browser/isBrowserEnvironment.ts +0 -1
- package/src/helpers/browser/isBrowserEnvironment_override.ts +0 -3
- package/src/helpers/createPeerDescriptor.ts +0 -57
- package/src/helpers/createPeerDescriptorSignaturePayload.ts +0 -28
- package/src/helpers/debugHelpers.ts +0 -9
- package/src/helpers/errors.ts +0 -49
- package/src/helpers/offering.ts +0 -15
- package/src/helpers/protoClasses.ts +0 -57
- package/src/helpers/protoToString.ts +0 -21
- package/src/helpers/version.ts +0 -32
- package/src/identifiers.ts +0 -29
- package/src/rpc-protocol/DhtCallContext.ts +0 -14
- package/src/rpc-protocol/DhtRpcOptions.ts +0 -10
- package/src/transport/ITransport.ts +0 -37
- package/src/transport/ListeningRpcCommunicator.ts +0 -32
- package/src/transport/RoutingRpcCommunicator.ts +0 -66
- package/src/types/ServiceID.ts +0 -1
- package/src/types/textencoding.d.ts +0 -6
- package/test/benchmark/Find.test.ts +0 -72
- package/test/benchmark/KademliaCorrectness.test.ts +0 -114
- package/test/benchmark/RingCorrectness.test.ts +0 -157
- package/test/benchmark/SortedContactListBenchmark.test.ts +0 -108
- package/test/benchmark/WebsocketServerMemoryLeak.test.ts +0 -41
- package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +0 -71
- package/test/end-to-end/GeoIpLayer0.test.ts +0 -55
- package/test/end-to-end/Layer0-Layer1.test.ts +0 -93
- package/test/end-to-end/Layer0.test.ts +0 -76
- package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +0 -110
- package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +0 -137
- package/test/end-to-end/Layer0Webrtc.test.ts +0 -85
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +0 -82
- package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +0 -76
- package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +0 -52
- package/test/end-to-end/WebsocketConnectionRequest.test.ts +0 -69
- package/test/end-to-end/memory-leak.test.ts +0 -80
- package/test/integration/ConnectionLocking.test.ts +0 -192
- package/test/integration/ConnectionManager.test.ts +0 -528
- package/test/integration/ConnectivityChecking.test.ts +0 -53
- package/test/integration/DhtJoinPeerDiscovery.test.ts +0 -49
- package/test/integration/DhtNode.test.ts +0 -66
- package/test/integration/DhtNodeExternalAPI.test.ts +0 -48
- package/test/integration/DhtNodeRpcRemote.test.ts +0 -66
- package/test/integration/DhtRpc.test.ts +0 -121
- package/test/integration/Find.test.ts +0 -45
- package/test/integration/GeoIpConnectivityChecking.test.ts +0 -72
- package/test/integration/Layer1-scale.test.ts +0 -189
- package/test/integration/Mock-Layer1-Layer0.test.ts +0 -85
- package/test/integration/MultipleEntryPointJoining.test.ts +0 -105
- package/test/integration/ReplicateData.test.ts +0 -104
- package/test/integration/RouteMessage.test.ts +0 -230
- package/test/integration/RouterRpcRemote.test.ts +0 -77
- package/test/integration/SimultaneousConnections.test.ts +0 -316
- package/test/integration/Store.test.ts +0 -85
- package/test/integration/StoreAndDelete.test.ts +0 -77
- package/test/integration/StoreOnDhtWithThreeNodes.test.ts +0 -59
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +0 -51
- package/test/integration/StoreRpcRemote.test.ts +0 -54
- package/test/integration/WebrtcConnectionManagement.test.ts +0 -191
- package/test/integration/WebrtcConnectorRpc.test.ts +0 -125
- package/test/integration/Websocket.test.ts +0 -65
- package/test/integration/WebsocketClientConnectorRpc.test.ts +0 -69
- package/test/integration/WebsocketConnectionManagement.test.ts +0 -191
- package/test/integration/rpc-connections-over-webrtc.test.ts +0 -123
- package/test/kademlia-simulation/data/nodeids.json +0 -13002
- package/test/kademlia-simulation/data/orderedneighbors.json +0 -1001
- package/test/types/global.d.ts +0 -1
- package/test/unit/AddressTools.test.ts +0 -44
- package/test/unit/AutoCertifierClientFacade.test.ts +0 -58
- package/test/unit/ConnectionManager.test.ts +0 -65
- package/test/unit/ConnectivityHelpers.test.ts +0 -61
- package/test/unit/DiscoverySession.test.ts +0 -87
- package/test/unit/DuplicateDetector.test.ts +0 -31
- package/test/unit/Handshaker.test.ts +0 -169
- package/test/unit/ListeningRpcCommunicator.test.ts +0 -52
- package/test/unit/LocalDataStore.test.ts +0 -108
- package/test/unit/ManagedConnection.test.ts +0 -58
- package/test/unit/PeerManager.test.ts +0 -93
- package/test/unit/PendingConnection.test.ts +0 -57
- package/test/unit/ProtobufMessage.test.ts +0 -21
- package/test/unit/RandomContactList.test.ts +0 -58
- package/test/unit/RecursiveOperationManager.test.ts +0 -161
- package/test/unit/RecursiveOperationSession.test.ts +0 -68
- package/test/unit/Router.test.ts +0 -137
- package/test/unit/RoutingSession.test.ts +0 -86
- package/test/unit/SortedContactList.test.ts +0 -115
- package/test/unit/StoreManager.test.ts +0 -146
- package/test/unit/StoreRpcLocal.test.ts +0 -167
- package/test/unit/WebrtcConnection.test.ts +0 -29
- package/test/unit/WebrtcConnector.test.ts +0 -56
- package/test/unit/WebsocketClientConnector.test.ts +0 -101
- package/test/unit/WebsocketServer.test.ts +0 -66
- package/test/unit/WebsocketServerConnector.test.ts +0 -102
- package/test/unit/connectivityRequestHandler.test.ts +0 -104
- package/test/unit/createPeerDescriptor.test.ts +0 -69
- package/test/unit/customMatchers.test.ts +0 -34
- package/test/unit/getClosestNodes.test.ts +0 -30
- package/test/unit/version.test.ts +0 -18
- package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +0 -18
- package/test/utils/FakeConnectorFacade.ts +0 -41
- package/test/utils/FakeRpcCommunicator.ts +0 -23
- package/test/utils/FakeTransport.ts +0 -79
- package/test/utils/customMatchers.ts +0 -71
- package/test/utils/mock/MockConnection.ts +0 -26
- package/test/utils/mock/MockConnectionsView.ts +0 -18
- package/test/utils/mock/MockRouter.ts +0 -62
- package/test/utils/mock/MockRpcCommunicator.ts +0 -7
- package/test/utils/mock/MockTransport.ts +0 -26
- package/test/utils/mock/mockDataEntry.ts +0 -38
- package/test/utils/topology.ts +0 -79
- package/test/utils/utils.ts +0 -268
- package/tsconfig.browser.json +0 -17
- package/tsconfig.jest.json +0 -25
- package/tsconfig.json +0 -3
- package/tsconfig.node.json +0 -24
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@streamr/utils'
|
|
2
|
-
import {
|
|
3
|
-
ConnectivityResponse,
|
|
4
|
-
PeerDescriptor
|
|
5
|
-
} from '../../generated/packages/dht/protos/DhtRpc'
|
|
6
|
-
import { ITransport } from '../transport/ITransport'
|
|
7
|
-
import { PortRange, TlsCertificate } from './ConnectionManager'
|
|
8
|
-
import { Simulator } from './simulator/Simulator'
|
|
9
|
-
import { SimulatorConnector } from './simulator/SimulatorConnector'
|
|
10
|
-
import { IceServer, WebrtcConnector } from './webrtc/WebrtcConnector'
|
|
11
|
-
import { WebsocketClientConnector } from './websocket/WebsocketClientConnector'
|
|
12
|
-
import { DhtAddress } from '../identifiers'
|
|
13
|
-
import { WebsocketServerConnector, WebsocketServerConnectorOptions } from './websocket/WebsocketServerConnector'
|
|
14
|
-
import { PendingConnection } from './PendingConnection'
|
|
15
|
-
import { ListeningRpcCommunicator } from '../transport/ListeningRpcCommunicator'
|
|
16
|
-
|
|
17
|
-
export interface ConnectorFacade {
|
|
18
|
-
createConnection: (peerDescriptor: PeerDescriptor) => PendingConnection
|
|
19
|
-
getLocalPeerDescriptor: () => PeerDescriptor | undefined
|
|
20
|
-
start: (
|
|
21
|
-
onNewConnection: (connection: PendingConnection) => boolean,
|
|
22
|
-
hasConnection: (nodeId: DhtAddress) => boolean,
|
|
23
|
-
autoCertifierTransport: ITransport
|
|
24
|
-
) => Promise<void>
|
|
25
|
-
stop: () => Promise<void>
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const logger = new Logger(module)
|
|
29
|
-
|
|
30
|
-
// TODO: Wrap component specific configs to their own objects.
|
|
31
|
-
export interface DefaultConnectorFacadeOptions {
|
|
32
|
-
transport: ITransport
|
|
33
|
-
websocketHost?: string
|
|
34
|
-
websocketPortRange?: PortRange
|
|
35
|
-
entryPoints?: PeerDescriptor[]
|
|
36
|
-
iceServers?: IceServer[]
|
|
37
|
-
webrtcAllowPrivateAddresses?: boolean
|
|
38
|
-
webrtcDatachannelBufferThresholdLow?: number
|
|
39
|
-
webrtcDatachannelBufferThresholdHigh?: number
|
|
40
|
-
externalIp?: string
|
|
41
|
-
webrtcPortRange?: PortRange
|
|
42
|
-
maxMessageSize?: number
|
|
43
|
-
tlsCertificate?: TlsCertificate
|
|
44
|
-
// TODO explicit default value for "websocketServerEnableTls" or make it required
|
|
45
|
-
websocketServerEnableTls?: boolean
|
|
46
|
-
autoCertifierUrl?: string
|
|
47
|
-
autoCertifierConfigFile?: string
|
|
48
|
-
geoIpDatabaseFolder?: string
|
|
49
|
-
createLocalPeerDescriptor: (connectivityResponse: ConnectivityResponse) => Promise<PeerDescriptor>
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export class DefaultConnectorFacade implements ConnectorFacade {
|
|
53
|
-
|
|
54
|
-
private readonly options: DefaultConnectorFacadeOptions
|
|
55
|
-
private localPeerDescriptor?: PeerDescriptor
|
|
56
|
-
private websocketConnectorRpcCommunicator?: ListeningRpcCommunicator
|
|
57
|
-
private websocketClientConnector?: WebsocketClientConnector
|
|
58
|
-
private websocketServerConnector?: WebsocketServerConnector
|
|
59
|
-
private webrtcConnector?: WebrtcConnector
|
|
60
|
-
constructor(options: DefaultConnectorFacadeOptions) {
|
|
61
|
-
this.options = options
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async start(
|
|
65
|
-
onNewConnection: (connection: PendingConnection) => boolean,
|
|
66
|
-
hasConnection: (nodeId: DhtAddress) => boolean,
|
|
67
|
-
autoCertifierTransport: ITransport
|
|
68
|
-
): Promise<void> {
|
|
69
|
-
logger.trace(`Creating WebsocketConnectorRpcLocal`)
|
|
70
|
-
this.websocketConnectorRpcCommunicator = new ListeningRpcCommunicator(
|
|
71
|
-
WebsocketClientConnector.WEBSOCKET_CONNECTOR_SERVICE_ID,
|
|
72
|
-
this.options.transport,
|
|
73
|
-
{ rpcRequestTimeout: 15000 } // TODO use options option or named constant?
|
|
74
|
-
|
|
75
|
-
)
|
|
76
|
-
const webSocketClientConnectorOptions = {
|
|
77
|
-
// TODO should we use canConnect also for WebrtcConnector? (NET-1142)
|
|
78
|
-
onNewConnection,
|
|
79
|
-
hasConnection,
|
|
80
|
-
rpcCommunicator: this.websocketConnectorRpcCommunicator
|
|
81
|
-
}
|
|
82
|
-
this.websocketClientConnector = new WebsocketClientConnector(webSocketClientConnectorOptions)
|
|
83
|
-
|
|
84
|
-
const webSocketServerConnectorOptions = {
|
|
85
|
-
rpcCommunicator: this.websocketConnectorRpcCommunicator,
|
|
86
|
-
// TODO should we use canConnect also for WebrtcConnector? (NET-1142)
|
|
87
|
-
onNewConnection,
|
|
88
|
-
hasConnection,
|
|
89
|
-
portRange: this.options.websocketPortRange,
|
|
90
|
-
host: this.options.websocketHost,
|
|
91
|
-
entrypoints: this.options.entryPoints,
|
|
92
|
-
tlsCertificate: this.options.tlsCertificate,
|
|
93
|
-
serverEnableTls: this.options.websocketServerEnableTls!,
|
|
94
|
-
autoCertifierUrl: this.options.autoCertifierUrl!,
|
|
95
|
-
autoCertifierConfigFile: this.options.autoCertifierConfigFile!,
|
|
96
|
-
autoCertifierTransport,
|
|
97
|
-
maxMessageSize: this.options.maxMessageSize,
|
|
98
|
-
geoIpDatabaseFolder: this.options.geoIpDatabaseFolder
|
|
99
|
-
}
|
|
100
|
-
this.websocketServerConnector = new WebsocketServerConnector(webSocketServerConnectorOptions)
|
|
101
|
-
this.webrtcConnector = new WebrtcConnector({
|
|
102
|
-
onNewConnection,
|
|
103
|
-
transport: this.options.transport,
|
|
104
|
-
iceServers: this.options.iceServers,
|
|
105
|
-
allowPrivateAddresses: this.options.webrtcAllowPrivateAddresses,
|
|
106
|
-
bufferThresholdLow: this.options.webrtcDatachannelBufferThresholdLow,
|
|
107
|
-
bufferThresholdHigh: this.options.webrtcDatachannelBufferThresholdHigh,
|
|
108
|
-
externalIp: this.options.externalIp,
|
|
109
|
-
portRange: this.options.webrtcPortRange,
|
|
110
|
-
maxMessageSize: this.options.maxMessageSize
|
|
111
|
-
})
|
|
112
|
-
await this.websocketServerConnector.start()
|
|
113
|
-
// TODO: generate a PeerDescriptor in a single function. Requires changes to the createOwnPeerDescriptor
|
|
114
|
-
// function in the options. Currently it's given by the DhtNode and it sets the PeerDescriptor for the
|
|
115
|
-
// DhtNode in each call.
|
|
116
|
-
// LocalPeerDescriptor could be stored in one place and passed from there to the connectors
|
|
117
|
-
const temporarilySelfSigned = (!this.options.tlsCertificate && this.options.websocketServerEnableTls === true)
|
|
118
|
-
const connectivityResponse = await this.websocketServerConnector.checkConnectivity(temporarilySelfSigned)
|
|
119
|
-
const localPeerDescriptor = await this.options.createLocalPeerDescriptor(connectivityResponse)
|
|
120
|
-
this.setLocalPeerDescriptor(localPeerDescriptor)
|
|
121
|
-
if (localPeerDescriptor.websocket && !this.options.tlsCertificate && this.options.websocketServerEnableTls) {
|
|
122
|
-
try {
|
|
123
|
-
await this.websocketServerConnector.autoCertify()
|
|
124
|
-
const connectivityResponse = await this.websocketServerConnector.checkConnectivity(false)
|
|
125
|
-
const autocertifiedLocalPeerDescriptor = await this.options.createLocalPeerDescriptor(connectivityResponse)
|
|
126
|
-
if (autocertifiedLocalPeerDescriptor.websocket !== undefined) {
|
|
127
|
-
this.setLocalPeerDescriptor(autocertifiedLocalPeerDescriptor)
|
|
128
|
-
} else {
|
|
129
|
-
logger.warn('Connectivity check failed after auto-certification, disabling WebSocket server TLS')
|
|
130
|
-
await this.restartWebsocketServerConnector({
|
|
131
|
-
...webSocketServerConnectorOptions,
|
|
132
|
-
serverEnableTls: false
|
|
133
|
-
})
|
|
134
|
-
}
|
|
135
|
-
} catch (err) {
|
|
136
|
-
logger.warn('Failed to auto-certify, disabling WebSocket server TLS', { err })
|
|
137
|
-
await this.restartWebsocketServerConnector({
|
|
138
|
-
...webSocketServerConnectorOptions,
|
|
139
|
-
serverEnableTls: false
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private setLocalPeerDescriptor(peerDescriptor: PeerDescriptor) {
|
|
146
|
-
this.localPeerDescriptor = peerDescriptor
|
|
147
|
-
this.websocketServerConnector!.setLocalPeerDescriptor(peerDescriptor)
|
|
148
|
-
this.websocketClientConnector!.setLocalPeerDescriptor(peerDescriptor)
|
|
149
|
-
this.webrtcConnector!.setLocalPeerDescriptor(peerDescriptor)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
async restartWebsocketServerConnector(options: WebsocketServerConnectorOptions): Promise<void> {
|
|
153
|
-
await this.websocketServerConnector!.destroy()
|
|
154
|
-
this.websocketServerConnector = new WebsocketServerConnector(options)
|
|
155
|
-
await this.websocketServerConnector.start()
|
|
156
|
-
const connectivityResponse = await this.websocketServerConnector.checkConnectivity(false)
|
|
157
|
-
const localPeerDescriptor = await this.options.createLocalPeerDescriptor(connectivityResponse)
|
|
158
|
-
this.setLocalPeerDescriptor(localPeerDescriptor)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
createConnection(peerDescriptor: PeerDescriptor): PendingConnection {
|
|
162
|
-
if (this.websocketClientConnector!.isPossibleToFormConnection(peerDescriptor)) {
|
|
163
|
-
return this.websocketClientConnector!.connect(peerDescriptor)
|
|
164
|
-
} else if (this.websocketServerConnector!.isPossibleToFormConnection(peerDescriptor)) {
|
|
165
|
-
return this.websocketServerConnector!.connect(peerDescriptor)
|
|
166
|
-
} else {
|
|
167
|
-
return this.webrtcConnector!.connect(peerDescriptor, false)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
getLocalPeerDescriptor(): PeerDescriptor | undefined {
|
|
172
|
-
return this.localPeerDescriptor
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async stop(): Promise<void> {
|
|
176
|
-
this.websocketConnectorRpcCommunicator!.destroy()
|
|
177
|
-
await this.websocketServerConnector!.destroy()
|
|
178
|
-
await this.websocketClientConnector!.destroy()
|
|
179
|
-
await this.webrtcConnector!.stop()
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
export class SimulatorConnectorFacade implements ConnectorFacade {
|
|
184
|
-
|
|
185
|
-
private readonly localPeerDescriptor: PeerDescriptor
|
|
186
|
-
private simulatorConnector?: SimulatorConnector
|
|
187
|
-
private simulator: Simulator
|
|
188
|
-
|
|
189
|
-
constructor(localPeerDescriptor: PeerDescriptor, simulator: Simulator) {
|
|
190
|
-
this.localPeerDescriptor = localPeerDescriptor
|
|
191
|
-
this.simulator = simulator
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async start(
|
|
195
|
-
onNewConnection: (connection: PendingConnection) => boolean,
|
|
196
|
-
): Promise<void> {
|
|
197
|
-
logger.trace(`Creating SimulatorConnector`)
|
|
198
|
-
this.simulatorConnector = new SimulatorConnector(
|
|
199
|
-
this.localPeerDescriptor,
|
|
200
|
-
this.simulator,
|
|
201
|
-
onNewConnection
|
|
202
|
-
)
|
|
203
|
-
this.simulator.addConnector(this.simulatorConnector)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
createConnection(peerDescriptor: PeerDescriptor): PendingConnection {
|
|
207
|
-
return this.simulatorConnector!.connect(peerDescriptor)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
getLocalPeerDescriptor(): PeerDescriptor {
|
|
211
|
-
return this.localPeerDescriptor
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
async stop(): Promise<void> {
|
|
215
|
-
await this.simulatorConnector!.stop()
|
|
216
|
-
}
|
|
217
|
-
}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@streamr/utils'
|
|
2
|
-
import { EventEmitter } from 'eventemitter3'
|
|
3
|
-
import { v4 } from 'uuid'
|
|
4
|
-
import { Message, HandshakeRequest, HandshakeResponse, PeerDescriptor, HandshakeError } from '../../generated/packages/dht/protos/DhtRpc'
|
|
5
|
-
import { IConnection } from './IConnection'
|
|
6
|
-
import { LOCAL_PROTOCOL_VERSION, isMaybeSupportedProtocolVersion } from '../helpers/version'
|
|
7
|
-
import { toNodeId } from '../identifiers'
|
|
8
|
-
import { PendingConnection } from './PendingConnection'
|
|
9
|
-
import { version as applicationVersion } from '../../package.json'
|
|
10
|
-
|
|
11
|
-
const logger = new Logger(module)
|
|
12
|
-
|
|
13
|
-
interface HandshakerEvents {
|
|
14
|
-
handshakeRequest: (source: PeerDescriptor, protocolVersion: string, target?: PeerDescriptor) => void
|
|
15
|
-
handshakeCompleted: (remote: PeerDescriptor) => void
|
|
16
|
-
handshakeFailed: (error?: HandshakeError) => void
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Optimally the Outgoing and Incoming Handshakers could be their own separate classes
|
|
20
|
-
// However, in cases where the PeerDescriptor of the other end of the connection can be known
|
|
21
|
-
// only after a HandshakeRequest a base Handshaker class is needed as the IncomingHandshaker currently
|
|
22
|
-
// requires knowledge of the other ends PeerDescriptor. (Note PendingConnection requires the remote PeerDescriptor)
|
|
23
|
-
export const createOutgoingHandshaker = (
|
|
24
|
-
localPeerDescriptor: PeerDescriptor,
|
|
25
|
-
pendingConnection: PendingConnection,
|
|
26
|
-
connection: IConnection,
|
|
27
|
-
targetPeerDescriptor?: PeerDescriptor
|
|
28
|
-
): Handshaker => {
|
|
29
|
-
const handshaker = new Handshaker(localPeerDescriptor, connection)
|
|
30
|
-
const stopHandshaker = () => {
|
|
31
|
-
handshaker.stop()
|
|
32
|
-
connection.off('disconnected', disconnectedListener)
|
|
33
|
-
connection.off('connected', connectedListener)
|
|
34
|
-
handshaker.off('handshakeCompleted', handshakeCompletedListener)
|
|
35
|
-
handshaker.off('handshakeFailed', handshakeFailedListener)
|
|
36
|
-
pendingConnection.off('disconnected', managedConnectionDisconnectedListener)
|
|
37
|
-
}
|
|
38
|
-
const handshakeFailedListener = (error?: HandshakeError) => {
|
|
39
|
-
if (error === HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR || error === HandshakeError.UNSUPPORTED_PROTOCOL_VERSION) {
|
|
40
|
-
pendingConnection.close(false)
|
|
41
|
-
stopHandshaker()
|
|
42
|
-
} else {
|
|
43
|
-
// Wait for the other end to close the connection
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const handshakeCompletedListener = (peerDescriptor: PeerDescriptor) => {
|
|
47
|
-
logger.trace('handshake completed for outgoing connection, ' + toNodeId(peerDescriptor))
|
|
48
|
-
pendingConnection.onHandshakeCompleted(connection)
|
|
49
|
-
stopHandshaker()
|
|
50
|
-
}
|
|
51
|
-
const connectedListener = () => handshaker.sendHandshakeRequest(targetPeerDescriptor)
|
|
52
|
-
const disconnectedListener = (graceful: boolean) => {
|
|
53
|
-
pendingConnection.close(graceful)
|
|
54
|
-
stopHandshaker()
|
|
55
|
-
}
|
|
56
|
-
const managedConnectionDisconnectedListener = () => {
|
|
57
|
-
connection.close(false)
|
|
58
|
-
stopHandshaker()
|
|
59
|
-
}
|
|
60
|
-
handshaker.once('handshakeFailed', handshakeFailedListener)
|
|
61
|
-
handshaker.once('handshakeCompleted', handshakeCompletedListener)
|
|
62
|
-
connection.once('connected', connectedListener)
|
|
63
|
-
connection.once('disconnected', disconnectedListener)
|
|
64
|
-
pendingConnection.once('disconnected', managedConnectionDisconnectedListener)
|
|
65
|
-
return handshaker
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export const createIncomingHandshaker = (
|
|
69
|
-
localPeerDescriptor: PeerDescriptor,
|
|
70
|
-
pendingConnection: PendingConnection,
|
|
71
|
-
connection: IConnection
|
|
72
|
-
): Handshaker => {
|
|
73
|
-
const handshaker = new Handshaker(localPeerDescriptor, connection)
|
|
74
|
-
const stopHandshaker = () => {
|
|
75
|
-
handshaker.stop()
|
|
76
|
-
pendingConnection.off('disconnected', connectionDisconnected)
|
|
77
|
-
connection.off('disconnected', connectionDisconnected)
|
|
78
|
-
}
|
|
79
|
-
const onHandshakeRequest = (): void => {
|
|
80
|
-
stopHandshaker()
|
|
81
|
-
}
|
|
82
|
-
const connectionDisconnected = (graceful: boolean) => {
|
|
83
|
-
pendingConnection.close(graceful)
|
|
84
|
-
stopHandshaker()
|
|
85
|
-
}
|
|
86
|
-
const managedConnectionDisconnected = () => {
|
|
87
|
-
connection.close(false)
|
|
88
|
-
stopHandshaker()
|
|
89
|
-
}
|
|
90
|
-
handshaker.on('handshakeRequest', onHandshakeRequest)
|
|
91
|
-
connection.once('disconnected', connectionDisconnected)
|
|
92
|
-
pendingConnection.once('disconnected', managedConnectionDisconnected)
|
|
93
|
-
return handshaker
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export const rejectHandshake = (
|
|
97
|
-
pendingConnection: PendingConnection,
|
|
98
|
-
connection: IConnection,
|
|
99
|
-
handshaker: Handshaker,
|
|
100
|
-
error: HandshakeError
|
|
101
|
-
): void => {
|
|
102
|
-
handshaker.sendHandshakeResponse(error)
|
|
103
|
-
connection.destroy()
|
|
104
|
-
pendingConnection.destroy()
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export const acceptHandshake = (handshaker: Handshaker, pendingConnection: PendingConnection, connection: IConnection): void => {
|
|
108
|
-
handshaker.sendHandshakeResponse()
|
|
109
|
-
pendingConnection.onHandshakeCompleted(connection)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export const createHandshakeRequest = (localPeerDescriptor: PeerDescriptor, remotePeerDescriptor: PeerDescriptor): Message => {
|
|
113
|
-
const outgoingHandshake: HandshakeRequest = {
|
|
114
|
-
sourcePeerDescriptor: localPeerDescriptor,
|
|
115
|
-
targetPeerDescriptor: remotePeerDescriptor,
|
|
116
|
-
protocolVersion: LOCAL_PROTOCOL_VERSION,
|
|
117
|
-
applicationVersion
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
serviceId: Handshaker.HANDSHAKER_SERVICE_ID,
|
|
121
|
-
messageId: v4(),
|
|
122
|
-
body: {
|
|
123
|
-
oneofKind: 'handshakeRequest',
|
|
124
|
-
handshakeRequest: outgoingHandshake
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export const createHandshakeResponse = (localPeerDescriptor: PeerDescriptor, error?: HandshakeError): Message => {
|
|
130
|
-
const outgoingHandshakeResponse: HandshakeResponse = {
|
|
131
|
-
sourcePeerDescriptor: localPeerDescriptor,
|
|
132
|
-
error,
|
|
133
|
-
protocolVersion: LOCAL_PROTOCOL_VERSION,
|
|
134
|
-
applicationVersion
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
serviceId: Handshaker.HANDSHAKER_SERVICE_ID,
|
|
138
|
-
messageId: v4(),
|
|
139
|
-
body: {
|
|
140
|
-
oneofKind: 'handshakeResponse',
|
|
141
|
-
handshakeResponse: outgoingHandshakeResponse
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export class Handshaker extends EventEmitter<HandshakerEvents> {
|
|
147
|
-
|
|
148
|
-
public static readonly HANDSHAKER_SERVICE_ID = 'system/handshaker'
|
|
149
|
-
private localPeerDescriptor: PeerDescriptor
|
|
150
|
-
private connection: IConnection
|
|
151
|
-
private readonly onDataListener: (data: Uint8Array) => void
|
|
152
|
-
constructor(
|
|
153
|
-
localPeerDescriptor: PeerDescriptor,
|
|
154
|
-
connection: IConnection
|
|
155
|
-
) {
|
|
156
|
-
super()
|
|
157
|
-
this.localPeerDescriptor = localPeerDescriptor
|
|
158
|
-
this.connection = connection
|
|
159
|
-
this.onDataListener = (data: Uint8Array) => this.onData(data)
|
|
160
|
-
this.connection.on('data', this.onDataListener)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
private onData(data: Uint8Array) {
|
|
164
|
-
try {
|
|
165
|
-
const message = Message.fromBinary(data)
|
|
166
|
-
if (message.body.oneofKind === 'handshakeRequest') {
|
|
167
|
-
logger.trace('handshake request received')
|
|
168
|
-
const handshake = message.body.handshakeRequest
|
|
169
|
-
this.emit(
|
|
170
|
-
'handshakeRequest',
|
|
171
|
-
handshake.sourcePeerDescriptor!,
|
|
172
|
-
handshake.protocolVersion,
|
|
173
|
-
handshake.targetPeerDescriptor
|
|
174
|
-
)
|
|
175
|
-
}
|
|
176
|
-
if (message.body.oneofKind === 'handshakeResponse') {
|
|
177
|
-
logger.trace('handshake response received')
|
|
178
|
-
const handshake = message.body.handshakeResponse
|
|
179
|
-
const error = !isMaybeSupportedProtocolVersion(handshake.protocolVersion)
|
|
180
|
-
? HandshakeError.UNSUPPORTED_PROTOCOL_VERSION : handshake.error
|
|
181
|
-
if (error !== undefined) {
|
|
182
|
-
this.emit('handshakeFailed', error)
|
|
183
|
-
} else {
|
|
184
|
-
this.emit('handshakeCompleted', handshake.sourcePeerDescriptor!)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
} catch (err) {
|
|
188
|
-
logger.debug('error while parsing handshake message', err)
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
public sendHandshakeRequest(remotePeerDescriptor?: PeerDescriptor): void {
|
|
194
|
-
const msg = createHandshakeRequest(this.localPeerDescriptor, remotePeerDescriptor!)
|
|
195
|
-
this.connection.send(Message.toBinary(msg))
|
|
196
|
-
logger.trace('handshake request sent')
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
public sendHandshakeResponse(error?: HandshakeError): void {
|
|
200
|
-
const msg = createHandshakeResponse(this.localPeerDescriptor, error)
|
|
201
|
-
this.connection.send(Message.toBinary(msg))
|
|
202
|
-
logger.trace('handshake response sent')
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
public stop(): void {
|
|
206
|
-
this.connection.off('data', this.onDataListener)
|
|
207
|
-
this.removeAllListeners()
|
|
208
|
-
}
|
|
209
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { BrandedString } from '@streamr/utils'
|
|
2
|
-
|
|
3
|
-
export interface ConnectionEvents {
|
|
4
|
-
data: (bytes: Uint8Array) => void
|
|
5
|
-
connected: () => void
|
|
6
|
-
disconnected: (gracefulLeave: boolean, code?: number, reason?: string) => void
|
|
7
|
-
error: (name: string) => void
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export enum ConnectionType {
|
|
11
|
-
WEBSOCKET_SERVER = 'websocket-server',
|
|
12
|
-
WEBSOCKET_CLIENT = 'websocket-client',
|
|
13
|
-
WEBRTC = 'webrtc',
|
|
14
|
-
SIMULATOR_SERVER = 'simulator-server',
|
|
15
|
-
SIMULATOR_CLIENT = 'simulator-client',
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type ConnectionID = BrandedString<'ConnectionID'>
|
|
19
|
-
|
|
20
|
-
export interface IConnection {
|
|
21
|
-
|
|
22
|
-
on(event: 'data', listener: (bytes: Uint8Array) => void): this
|
|
23
|
-
on(event: 'error', listener: (name: string) => void): this
|
|
24
|
-
on(event: 'connected', listener: () => void): this
|
|
25
|
-
on(event: 'disconnected', listener: (gracefulLeave: boolean, code?: number, reason?: string) => void): this
|
|
26
|
-
|
|
27
|
-
once(event: 'data', listener: (bytes: Uint8Array) => void): this
|
|
28
|
-
once(event: 'error', listener: (name: string) => void): this
|
|
29
|
-
once(event: 'connected', listener: () => void): this
|
|
30
|
-
once(event: 'disconnected', listener: (gracefulLeave: boolean, code?: number, reason?: string) => void): this
|
|
31
|
-
|
|
32
|
-
off(event: 'data', listener: (bytes: Uint8Array) => void): void
|
|
33
|
-
off(event: 'error', listener: (name: string) => void): void
|
|
34
|
-
off(event: 'connected', listener: () => void): void
|
|
35
|
-
off(event: 'disconnected', listener: (gracefulLeave: boolean, code?: number, reason?: string) => void): void
|
|
36
|
-
|
|
37
|
-
send(data: Uint8Array): void
|
|
38
|
-
close(gracefulLeave: boolean): Promise<void>
|
|
39
|
-
destroy(): void
|
|
40
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { ConnectionID, IConnection } from './IConnection'
|
|
2
|
-
import * as Err from '../helpers/errors'
|
|
3
|
-
import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc'
|
|
4
|
-
import { Logger } from '@streamr/utils'
|
|
5
|
-
import EventEmitter from 'eventemitter3'
|
|
6
|
-
import { getNodeIdOrUnknownFromPeerDescriptor } from './ConnectionManager'
|
|
7
|
-
import { DhtAddress, toNodeId } from '../identifiers'
|
|
8
|
-
import { createRandomConnectionId } from './Connection'
|
|
9
|
-
|
|
10
|
-
export interface ManagedConnectionEvents {
|
|
11
|
-
managedData: (bytes: Uint8Array, remotePeerDescriptor: PeerDescriptor) => void
|
|
12
|
-
disconnected: (gracefulLeave: boolean) => void
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const logger = new Logger(module)
|
|
16
|
-
|
|
17
|
-
export type Events = ManagedConnectionEvents
|
|
18
|
-
|
|
19
|
-
// ManagedConnection is a component used as a wrapper for IConnection after they have been successfully handshaked.
|
|
20
|
-
// Should only be used in the ConnectionManager.
|
|
21
|
-
export class ManagedConnection extends EventEmitter<ManagedConnectionEvents> {
|
|
22
|
-
|
|
23
|
-
private connection: IConnection
|
|
24
|
-
public connectionId: ConnectionID
|
|
25
|
-
private remotePeerDescriptor: PeerDescriptor
|
|
26
|
-
private lastUsedTimestamp: number = Date.now()
|
|
27
|
-
private replacedAsDuplicate = false
|
|
28
|
-
private stopped = false
|
|
29
|
-
private openedAt = Date.now()
|
|
30
|
-
private bytesSent = 0
|
|
31
|
-
private bytesReceived = 0
|
|
32
|
-
private messagesSent = 0
|
|
33
|
-
private messagesReceived = 0
|
|
34
|
-
|
|
35
|
-
constructor(peerDescriptor: PeerDescriptor, connection: IConnection) {
|
|
36
|
-
super()
|
|
37
|
-
this.connectionId = createRandomConnectionId()
|
|
38
|
-
this.connection = connection
|
|
39
|
-
|
|
40
|
-
connection.on('data', (bytes: Uint8Array) => {
|
|
41
|
-
this.lastUsedTimestamp = Date.now()
|
|
42
|
-
this.messagesReceived += 1
|
|
43
|
-
this.bytesReceived += bytes.length
|
|
44
|
-
this.emit('managedData', bytes, this.getPeerDescriptor()!)
|
|
45
|
-
})
|
|
46
|
-
connection.on('disconnected', (gracefulLeave) => this.onDisconnected(gracefulLeave))
|
|
47
|
-
|
|
48
|
-
this.lastUsedTimestamp = Date.now()
|
|
49
|
-
this.remotePeerDescriptor = peerDescriptor
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private onDisconnected(gracefulLeave: boolean): void {
|
|
53
|
-
logger.trace(getNodeIdOrUnknownFromPeerDescriptor(this.remotePeerDescriptor) + ' onDisconnected() ' + gracefulLeave)
|
|
54
|
-
if (!this.replacedAsDuplicate) {
|
|
55
|
-
this.emit('disconnected', gracefulLeave)
|
|
56
|
-
}
|
|
57
|
-
this.removeAllListeners()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// TODO: Can this be removed if ManagedConnections can never be duplicates?
|
|
61
|
-
// Handle duplicates in the ConncetorFacade and no longer have PendingConnections in ConnectionManager
|
|
62
|
-
replaceAsDuplicate(): void {
|
|
63
|
-
logger.trace(getNodeIdOrUnknownFromPeerDescriptor(this.remotePeerDescriptor) + ' replaceAsDuplicate')
|
|
64
|
-
this.replacedAsDuplicate = true
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
send(data: Uint8Array): void {
|
|
68
|
-
if (this.stopped) {
|
|
69
|
-
throw new Err.SendFailed('ManagedConnection is stopped')
|
|
70
|
-
}
|
|
71
|
-
this.lastUsedTimestamp = Date.now()
|
|
72
|
-
this.messagesSent += 1
|
|
73
|
-
this.bytesSent += data.length
|
|
74
|
-
this.connection.send(data)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async close(gracefulLeave: boolean): Promise<void> {
|
|
78
|
-
if (this.stopped) {
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
-
await this.connection.close(gracefulLeave)
|
|
82
|
-
this.removeAllListeners()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
getNodeId(): DhtAddress {
|
|
86
|
-
return toNodeId(this.remotePeerDescriptor)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
getLastUsedTimestamp(): number {
|
|
90
|
-
return this.lastUsedTimestamp
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
getPeerDescriptor(): PeerDescriptor | undefined {
|
|
94
|
-
return this.remotePeerDescriptor
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
getDiagnosticInfo(): Record<string, unknown> {
|
|
98
|
-
return {
|
|
99
|
-
remotePeerDescriptor: this.remotePeerDescriptor,
|
|
100
|
-
lastUsedTimestamp: this.lastUsedTimestamp,
|
|
101
|
-
replacedAsDuplicate: this.replacedAsDuplicate,
|
|
102
|
-
stopped: this.stopped,
|
|
103
|
-
openedAt: this.openedAt,
|
|
104
|
-
bytesSent: this.bytesSent,
|
|
105
|
-
bytesReceived: this.bytesReceived,
|
|
106
|
-
messagesSent: this.messagesSent,
|
|
107
|
-
messagesReceived: this.messagesReceived
|
|
108
|
-
// Add connection type?
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Defer } from '@streamr/utils'
|
|
2
|
-
import { SendFailed } from '../helpers/errors'
|
|
3
|
-
|
|
4
|
-
export class OutputBuffer {
|
|
5
|
-
|
|
6
|
-
private readonly buffer: Uint8Array[] = []
|
|
7
|
-
private readonly deferredPromise: Defer<void> = new Defer<void>()
|
|
8
|
-
|
|
9
|
-
push(message: Uint8Array): Defer<void> {
|
|
10
|
-
this.buffer.push(message)
|
|
11
|
-
return this.deferredPromise
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
getBuffer(): Uint8Array[] {
|
|
15
|
-
return this.buffer
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
resolve(): void {
|
|
19
|
-
this.buffer.length = 0
|
|
20
|
-
this.deferredPromise.resolve()
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
reject(): void {
|
|
24
|
-
this.buffer.length = 0
|
|
25
|
-
this.deferredPromise.reject(new SendFailed('Could not send buffered messages'))
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import EventEmitter from 'eventemitter3'
|
|
2
|
-
import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc'
|
|
3
|
-
import { Logger, setAbortableTimeout } from '@streamr/utils'
|
|
4
|
-
import { getNodeIdOrUnknownFromPeerDescriptor } from './ConnectionManager'
|
|
5
|
-
import { IConnection } from './IConnection'
|
|
6
|
-
|
|
7
|
-
export interface PendingConnectionEvents {
|
|
8
|
-
connected: (peerDescriptor: PeerDescriptor, connection: IConnection) => void
|
|
9
|
-
disconnected: (gracefulLeave: boolean) => void
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const logger = new Logger(module)
|
|
13
|
-
|
|
14
|
-
// PendingConnection is used as a reference to a connection that should be opened and handshaked to a given PeerDescriptor
|
|
15
|
-
// It does not hold a connection internally. The public method onHandshakedCompleted should be called once a connection for the
|
|
16
|
-
// remotePeerDescriptor is opened and handshaked successfully.
|
|
17
|
-
// PendingConnections are created by the Connectors.
|
|
18
|
-
export class PendingConnection extends EventEmitter<PendingConnectionEvents> {
|
|
19
|
-
|
|
20
|
-
private readonly connectingAbortController: AbortController = new AbortController()
|
|
21
|
-
private remotePeerDescriptor: PeerDescriptor
|
|
22
|
-
private replacedAsDuplicate: boolean = false
|
|
23
|
-
private stopped: boolean = false
|
|
24
|
-
|
|
25
|
-
constructor(remotePeerDescriptor: PeerDescriptor, timeout = 15 * 1000) {
|
|
26
|
-
super()
|
|
27
|
-
this.remotePeerDescriptor = remotePeerDescriptor
|
|
28
|
-
setAbortableTimeout(() => {
|
|
29
|
-
this.close(false)
|
|
30
|
-
}, timeout, this.connectingAbortController.signal)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
replaceAsDuplicate(): void {
|
|
34
|
-
logger.trace(getNodeIdOrUnknownFromPeerDescriptor(this.remotePeerDescriptor) + ' replaceAsDuplicate')
|
|
35
|
-
this.replacedAsDuplicate = true
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
onHandshakeCompleted(connection: IConnection): void {
|
|
39
|
-
if (!this.replacedAsDuplicate) {
|
|
40
|
-
this.emit('connected', this.remotePeerDescriptor, connection)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
close(graceful: boolean): void {
|
|
45
|
-
if (this.stopped) {
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
this.stopped = true
|
|
49
|
-
this.connectingAbortController.abort()
|
|
50
|
-
if (!this.replacedAsDuplicate) {
|
|
51
|
-
this.emit('disconnected', graceful)
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
destroy(): void {
|
|
56
|
-
if (this.stopped) {
|
|
57
|
-
return
|
|
58
|
-
}
|
|
59
|
-
this.stopped = true
|
|
60
|
-
this.connectingAbortController.abort()
|
|
61
|
-
this.removeAllListeners()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
getPeerDescriptor(): PeerDescriptor {
|
|
65
|
-
return this.remotePeerDescriptor
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
}
|