@streamr/dht 100.2.5-beta.0 → 101.0.0-beta.0
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/package.json +7 -7
- package/dist/src/connection/ConnectionLockRpcLocal.d.ts +3 -3
- package/dist/src/connection/ConnectionLockRpcLocal.js +8 -8
- package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
- package/dist/src/connection/ConnectionLockRpcRemote.js +1 -1
- package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
- package/dist/src/connection/ConnectionManager.d.ts +4 -6
- package/dist/src/connection/ConnectionManager.js +128 -103
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectorFacade.d.ts +15 -14
- package/dist/src/connection/ConnectorFacade.js +70 -52
- package/dist/src/connection/ConnectorFacade.js.map +1 -1
- package/dist/src/connection/Handshaker.d.ts +9 -2
- package/dist/src/connection/Handshaker.js +117 -27
- package/dist/src/connection/Handshaker.js.map +1 -1
- package/dist/src/connection/ManagedConnection.d.ts +13 -38
- package/dist/src/connection/ManagedConnection.js +31 -252
- package/dist/src/connection/ManagedConnection.js.map +1 -1
- package/dist/src/connection/OutputBuffer.d.ts +9 -0
- package/dist/src/connection/OutputBuffer.js +26 -0
- package/dist/src/connection/OutputBuffer.js.map +1 -0
- package/dist/src/connection/PendingConnection.d.ts +19 -0
- package/dist/src/connection/PendingConnection.js +59 -0
- package/dist/src/connection/PendingConnection.js.map +1 -0
- package/dist/src/connection/connectivityChecker.js +3 -3
- package/dist/src/connection/connectivityChecker.js.map +1 -1
- package/dist/src/connection/connectivityRequestHandler.js +2 -2
- package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
- package/dist/src/connection/simulator/Simulator.d.ts +1 -3
- package/dist/src/connection/simulator/Simulator.js +1 -4
- package/dist/src/connection/simulator/Simulator.js.map +1 -1
- package/dist/src/connection/simulator/SimulatorConnection.js +1 -2
- package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
- package/dist/src/connection/simulator/SimulatorConnector.d.ts +3 -3
- package/dist/src/connection/simulator/SimulatorConnector.js +28 -21
- package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
- package/dist/src/connection/webrtc/NodeWebrtcConnection.d.ts +1 -6
- package/dist/src/connection/webrtc/NodeWebrtcConnection.js +3 -20
- package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
- package/dist/src/connection/webrtc/WebrtcConnector.d.ts +11 -6
- package/dist/src/connection/webrtc/WebrtcConnector.js +57 -42
- package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +8 -10
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +21 -44
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
- package/dist/src/connection/websocket/AbstractWebsocketClientConnection.js +8 -2
- package/dist/src/connection/websocket/AbstractWebsocketClientConnection.js.map +1 -1
- package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +3 -3
- package/dist/src/connection/websocket/AutoCertifierClientFacade.js +8 -8
- package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -1
- package/dist/src/connection/websocket/NodeWebsocketClientConnection.js +1 -1
- package/dist/src/connection/websocket/NodeWebsocketClientConnection.js.map +1 -1
- package/dist/src/connection/websocket/WebsocketClientConnector.d.ts +26 -0
- package/dist/src/connection/websocket/WebsocketClientConnector.js +86 -0
- package/dist/src/connection/websocket/WebsocketClientConnector.js.map +1 -0
- package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.d.ts +19 -0
- package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.js +23 -0
- package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.js.map +1 -0
- package/dist/src/connection/websocket/WebsocketClientConnectorRpcRemote.d.ts +5 -0
- package/dist/src/connection/websocket/{WebsocketConnectorRpcRemote.js → WebsocketClientConnectorRpcRemote.js} +4 -4
- package/dist/src/connection/websocket/WebsocketClientConnectorRpcRemote.js.map +1 -0
- package/dist/src/connection/websocket/WebsocketServer.d.ts +8 -5
- package/dist/src/connection/websocket/WebsocketServer.js +11 -11
- package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
- package/dist/src/connection/websocket/{WebsocketConnector.d.ts → WebsocketServerConnector.d.ts} +16 -21
- package/dist/src/connection/websocket/{WebsocketConnector.js → WebsocketServerConnector.js} +112 -160
- package/dist/src/connection/websocket/WebsocketServerConnector.js.map +1 -0
- package/dist/src/dht/DhtNode.d.ts +4 -4
- package/dist/src/dht/DhtNode.js +85 -84
- package/dist/src/dht/DhtNode.js.map +1 -1
- package/dist/src/dht/DhtNodeRpcLocal.d.ts +3 -3
- package/dist/src/dht/DhtNodeRpcLocal.js +9 -9
- package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
- package/dist/src/dht/ExternalApiRpcLocal.d.ts +3 -3
- package/dist/src/dht/ExternalApiRpcLocal.js +5 -5
- package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
- package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
- package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
- package/dist/src/dht/PeerManager.d.ts +4 -4
- package/dist/src/dht/PeerManager.js +22 -22
- package/dist/src/dht/PeerManager.js.map +1 -1
- package/dist/src/dht/contact/SortedContactList.d.ts +3 -3
- package/dist/src/dht/contact/SortedContactList.js +9 -9
- package/dist/src/dht/contact/SortedContactList.js.map +1 -1
- package/dist/src/dht/discovery/DiscoverySession.d.ts +3 -3
- package/dist/src/dht/discovery/DiscoverySession.js +21 -21
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +3 -3
- package/dist/src/dht/discovery/PeerDiscovery.js +46 -44
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/discovery/RingDiscoverySession.d.ts +3 -3
- package/dist/src/dht/discovery/RingDiscoverySession.js +19 -19
- package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -1
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +3 -3
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +33 -33
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -1
- package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.d.ts +3 -3
- package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js +8 -8
- package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js.map +1 -1
- package/dist/src/dht/recursive-operation/RecursiveOperationSession.d.ts +4 -4
- package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +24 -24
- package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -1
- package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.d.ts +4 -4
- package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js +5 -5
- package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js.map +1 -1
- package/dist/src/dht/routing/Router.d.ts +3 -3
- package/dist/src/dht/routing/Router.js +20 -20
- package/dist/src/dht/routing/Router.js.map +1 -1
- package/dist/src/dht/routing/RouterRpcLocal.d.ts +3 -3
- package/dist/src/dht/routing/RouterRpcLocal.js +16 -16
- package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
- package/dist/src/dht/routing/RoutingSession.d.ts +3 -3
- package/dist/src/dht/routing/RoutingSession.js +24 -24
- package/dist/src/dht/routing/RoutingSession.js.map +1 -1
- package/dist/src/dht/store/StoreManager.d.ts +3 -3
- package/dist/src/dht/store/StoreManager.js +25 -25
- package/dist/src/dht/store/StoreManager.js.map +1 -1
- package/dist/src/dht/store/StoreRpcLocal.d.ts +3 -3
- package/dist/src/dht/store/StoreRpcLocal.js +12 -12
- package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
- package/dist/src/exports.d.ts +3 -0
- package/dist/src/exports.js +5 -1
- package/dist/src/exports.js.map +1 -1
- package/dist/src/proto/google/protobuf/any.d.ts +5 -8
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/empty.d.ts +1 -0
- package/dist/src/proto/google/protobuf/empty.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts +1 -10
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +4 -4
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +8 -8
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +3 -3
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +4 -4
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +2 -2
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
- package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -2
- package/dist/src/transport/ListeningRpcCommunicator.js +2 -2
- package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
- package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -2
- package/dist/src/transport/RoutingRpcCommunicator.js +2 -2
- package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
- package/package.json +7 -7
- package/protos/DhtRpc.proto +1 -1
- package/src/connection/ConnectionLockRpcLocal.ts +9 -9
- package/src/connection/ConnectionLockRpcRemote.ts +1 -1
- package/src/connection/ConnectionManager.ts +153 -111
- package/src/connection/ConnectorFacade.ts +84 -61
- package/src/connection/Handshaker.ts +131 -27
- package/src/connection/ManagedConnection.ts +41 -304
- package/src/connection/OutputBuffer.ts +28 -0
- package/src/connection/PendingConnection.ts +68 -0
- package/src/connection/connectivityChecker.ts +2 -2
- package/src/connection/connectivityRequestHandler.ts +1 -1
- package/src/connection/simulator/Simulator.ts +1 -5
- package/src/connection/simulator/SimulatorConnection.ts +1 -2
- package/src/connection/simulator/SimulatorConnector.ts +34 -33
- package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -6
- package/src/connection/webrtc/NodeWebrtcConnection.ts +3 -24
- package/src/connection/webrtc/WebrtcConnector.ts +73 -62
- package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +26 -56
- package/src/connection/websocket/AbstractWebsocketClientConnection.ts +8 -2
- package/src/connection/websocket/AutoCertifierClientFacade.ts +11 -11
- package/src/connection/websocket/NodeWebsocketClientConnection.ts +1 -1
- package/src/connection/websocket/WebsocketClientConnector.ts +119 -0
- package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +39 -0
- package/src/connection/websocket/{WebsocketConnectorRpcRemote.ts → WebsocketClientConnectorRpcRemote.ts} +2 -2
- package/src/connection/websocket/WebsocketServer.ts +18 -14
- package/src/connection/websocket/{WebsocketConnector.ts → WebsocketServerConnector.ts} +128 -205
- package/src/dht/DhtNode.ts +90 -89
- package/src/dht/DhtNodeRpcLocal.ts +11 -11
- package/src/dht/ExternalApiRpcLocal.ts +6 -6
- package/src/dht/ExternalApiRpcRemote.ts +2 -2
- package/src/dht/PeerManager.ts +24 -24
- package/src/dht/contact/SortedContactList.ts +10 -10
- package/src/dht/discovery/DiscoverySession.ts +24 -24
- package/src/dht/discovery/PeerDiscovery.ts +47 -45
- package/src/dht/discovery/RingDiscoverySession.ts +23 -23
- package/src/dht/recursive-operation/RecursiveOperationManager.ts +36 -36
- package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +9 -9
- package/src/dht/recursive-operation/RecursiveOperationSession.ts +25 -25
- package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +7 -7
- package/src/dht/routing/Router.ts +21 -21
- package/src/dht/routing/RouterRpcLocal.ts +17 -17
- package/src/dht/routing/RoutingSession.ts +26 -26
- package/src/dht/store/StoreManager.ts +27 -27
- package/src/dht/store/StoreRpcLocal.ts +13 -13
- package/src/exports.ts +3 -0
- package/src/proto/google/protobuf/any.ts +6 -9
- package/src/proto/google/protobuf/empty.ts +2 -1
- package/src/proto/google/protobuf/timestamp.ts +2 -11
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +9 -9
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +3 -3
- package/src/proto/packages/dht/protos/DhtRpc.ts +4 -4
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
- package/src/transport/ListeningRpcCommunicator.ts +3 -3
- package/src/transport/RoutingRpcCommunicator.ts +3 -3
- package/test/end-to-end/Layer0Webrtc.test.ts +0 -10
- package/test/integration/ConnectionManager.test.ts +3 -2
- package/test/integration/GeoIpConnectivityChecking.test.ts +1 -1
- package/test/integration/SimultaneousConnections.test.ts +2 -2
- package/test/integration/WebrtcConnectionManagement.test.ts +2 -10
- package/test/integration/{WebsocketConnectorRpc.test.ts → WebsocketClientConnectorRpc.test.ts} +9 -9
- package/test/integration/WebsocketConnectionManagement.test.ts +11 -29
- package/test/unit/ConnectionManager.test.ts +64 -0
- package/test/unit/DiscoverySession.test.ts +1 -1
- package/test/unit/Handshaker.test.ts +169 -0
- package/test/unit/ManagedConnection.test.ts +58 -0
- package/test/unit/PendingConnection.test.ts +57 -0
- package/test/unit/WebrtcConnector.test.ts +56 -0
- package/test/unit/{WebsocketConnector.test.ts → WebsocketClientConnector.test.ts} +56 -11
- package/test/unit/WebsocketServerConnector.test.ts +102 -0
- package/test/utils/FakeConnectorFacade.ts +41 -0
- package/test/utils/mock/MockConnection.ts +26 -0
- package/test/utils/utils.ts +2 -2
- package/dist/src/connection/IConnectionSource.d.ts +0 -4
- package/dist/src/connection/IConnectionSource.js +0 -3
- package/dist/src/connection/IConnectionSource.js.map +0 -1
- package/dist/src/connection/webrtc/ManagedWebrtcConnection.d.ts +0 -7
- package/dist/src/connection/webrtc/ManagedWebrtcConnection.js +0 -20
- package/dist/src/connection/webrtc/ManagedWebrtcConnection.js.map +0 -1
- package/dist/src/connection/websocket/WebsocketConnector.js.map +0 -1
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +0 -19
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +0 -23
- package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +0 -1
- package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +0 -5
- package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +0 -1
- package/src/connection/IConnectionSource.ts +0 -6
- package/src/connection/webrtc/ManagedWebrtcConnection.ts +0 -27
- package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +0 -39
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@streamr/dht",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "101.0.0-beta.0",
|
|
4
4
|
"description": "Streamr Network DHT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"@js-sdsl/ordered-map": "^4.4.2",
|
|
30
30
|
"@protobuf-ts/runtime": "^2.8.2",
|
|
31
31
|
"@protobuf-ts/runtime-rpc": "^2.8.2",
|
|
32
|
-
"@streamr/autocertifier-client": "
|
|
33
|
-
"@streamr/cdn-location": "
|
|
34
|
-
"@streamr/geoip-location": "
|
|
35
|
-
"@streamr/proto-rpc": "
|
|
36
|
-
"@streamr/utils": "
|
|
32
|
+
"@streamr/autocertifier-client": "101.0.0-beta.0",
|
|
33
|
+
"@streamr/cdn-location": "101.0.0-beta.0",
|
|
34
|
+
"@streamr/geoip-location": "101.0.0-beta.0",
|
|
35
|
+
"@streamr/proto-rpc": "101.0.0-beta.0",
|
|
36
|
+
"@streamr/utils": "101.0.0-beta.0",
|
|
37
37
|
"eventemitter3": "^5.0.0",
|
|
38
38
|
"heap": "^0.2.6",
|
|
39
39
|
"ipaddr.js": "^2.0.1",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@streamr/browser-test-runner": "^0.0.1",
|
|
51
|
-
"@streamr/test-utils": "
|
|
51
|
+
"@streamr/test-utils": "101.0.0-beta.0",
|
|
52
52
|
"@types/heap": "^0.2.34",
|
|
53
53
|
"@types/k-bucket": "^5.0.1",
|
|
54
54
|
"@types/lodash": "^4.14.202",
|
|
@@ -4,15 +4,15 @@ import { DisconnectNotice, LockRequest, LockResponse, PeerDescriptor, UnlockRequ
|
|
|
4
4
|
import { IConnectionLockRpc } from '../proto/packages/dht/protos/DhtRpc.server';
|
|
5
5
|
import { LockID } from './ConnectionLockStates';
|
|
6
6
|
import { DhtAddress } from '../identifiers';
|
|
7
|
-
interface
|
|
7
|
+
interface ConnectionLockRpcLocalOptions {
|
|
8
8
|
addRemoteLocked: (id: DhtAddress, lockId: LockID) => void;
|
|
9
9
|
removeRemoteLocked: (id: DhtAddress, lockId: LockID) => void;
|
|
10
10
|
closeConnection: (peerDescriptor: PeerDescriptor, gracefulLeave: boolean, reason?: string) => void;
|
|
11
11
|
getLocalPeerDescriptor: () => PeerDescriptor;
|
|
12
12
|
}
|
|
13
13
|
export declare class ConnectionLockRpcLocal implements IConnectionLockRpc {
|
|
14
|
-
private readonly
|
|
15
|
-
constructor(
|
|
14
|
+
private readonly options;
|
|
15
|
+
constructor(options: ConnectionLockRpcLocalOptions);
|
|
16
16
|
lockRequest(lockRequest: LockRequest, context: ServerCallContext): Promise<LockResponse>;
|
|
17
17
|
unlockRequest(unlockRequest: UnlockRequest, context: ServerCallContext): Promise<Empty>;
|
|
18
18
|
gracefulDisconnect(disconnectNotice: DisconnectNotice, context: ServerCallContext): Promise<Empty>;
|
|
@@ -7,20 +7,20 @@ const ConnectionManager_1 = require("./ConnectionManager");
|
|
|
7
7
|
const identifiers_1 = require("../identifiers");
|
|
8
8
|
const logger = new utils_1.Logger(module);
|
|
9
9
|
class ConnectionLockRpcLocal {
|
|
10
|
-
|
|
11
|
-
constructor(
|
|
12
|
-
this.
|
|
10
|
+
options;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
13
|
}
|
|
14
14
|
async lockRequest(lockRequest, context) {
|
|
15
15
|
const senderPeerDescriptor = context.incomingSourceDescriptor;
|
|
16
|
-
if ((0, identifiers_1.areEqualPeerDescriptors)(senderPeerDescriptor, this.
|
|
16
|
+
if ((0, identifiers_1.areEqualPeerDescriptors)(senderPeerDescriptor, this.options.getLocalPeerDescriptor())) {
|
|
17
17
|
const response = {
|
|
18
18
|
accepted: false
|
|
19
19
|
};
|
|
20
20
|
return response;
|
|
21
21
|
}
|
|
22
22
|
const remoteNodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(senderPeerDescriptor);
|
|
23
|
-
this.
|
|
23
|
+
this.options.addRemoteLocked(remoteNodeId, lockRequest.lockId);
|
|
24
24
|
const response = {
|
|
25
25
|
accepted: true
|
|
26
26
|
};
|
|
@@ -29,17 +29,17 @@ class ConnectionLockRpcLocal {
|
|
|
29
29
|
async unlockRequest(unlockRequest, context) {
|
|
30
30
|
const senderPeerDescriptor = context.incomingSourceDescriptor;
|
|
31
31
|
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(senderPeerDescriptor);
|
|
32
|
-
this.
|
|
32
|
+
this.options.removeRemoteLocked(nodeId, unlockRequest.lockId);
|
|
33
33
|
return {};
|
|
34
34
|
}
|
|
35
35
|
async gracefulDisconnect(disconnectNotice, context) {
|
|
36
36
|
const senderPeerDescriptor = context.incomingSourceDescriptor;
|
|
37
37
|
logger.trace((0, ConnectionManager_1.getNodeIdOrUnknownFromPeerDescriptor)(senderPeerDescriptor) + ' received gracefulDisconnect notice');
|
|
38
38
|
if (disconnectNotice.disconnectMode === DhtRpc_1.DisconnectMode.LEAVING) {
|
|
39
|
-
this.
|
|
39
|
+
this.options.closeConnection(senderPeerDescriptor, true, 'graceful leave notified');
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
-
this.
|
|
42
|
+
this.options.closeConnection(senderPeerDescriptor, false, 'graceful disconnect notified');
|
|
43
43
|
}
|
|
44
44
|
return {};
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionLockRpcLocal.js","sourceRoot":"","sources":["../../../src/connection/ConnectionLockRpcLocal.ts"],"names":[],"mappings":";;;AACA,0CAAuC;AAEvC,gEAO4C;AAG5C,2DAA0E;AAE1E,gDAAiG;AASjG,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAEjC,MAAa,sBAAsB;IAEd,
|
|
1
|
+
{"version":3,"file":"ConnectionLockRpcLocal.js","sourceRoot":"","sources":["../../../src/connection/ConnectionLockRpcLocal.ts"],"names":[],"mappings":";;;AACA,0CAAuC;AAEvC,gEAO4C;AAG5C,2DAA0E;AAE1E,gDAAiG;AASjG,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAEjC,MAAa,sBAAsB;IAEd,OAAO,CAA+B;IAEvD,YAAY,OAAsC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAwB,EAAE,OAA0B;QAClE,MAAM,oBAAoB,GAAI,OAA0B,CAAC,wBAAyB,CAAA;QAClF,IAAI,IAAA,qCAAuB,EAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC;YACvF,MAAM,QAAQ,GAAiB;gBAC3B,QAAQ,EAAE,KAAK;aAClB,CAAA;YACD,OAAO,QAAQ,CAAA;QACnB,CAAC;QACD,MAAM,YAAY,GAAG,IAAA,yCAA2B,EAAC,oBAAoB,CAAC,CAAA;QACtE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAiB;YAC3B,QAAQ,EAAE,IAAI;SACjB,CAAA;QACD,OAAO,QAAQ,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,aAA4B,EAAE,OAA0B;QACxE,MAAM,oBAAoB,GAAI,OAA0B,CAAC,wBAAyB,CAAA;QAClF,MAAM,MAAM,GAAG,IAAA,yCAA2B,EAAC,oBAAoB,CAAC,CAAA;QAChE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;QAC7D,OAAO,EAAE,CAAA;IACb,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,gBAAkC,EAAE,OAA0B;QACnF,MAAM,oBAAoB,GAAI,OAA0B,CAAC,wBAAyB,CAAA;QAClF,MAAM,CAAC,KAAK,CAAC,IAAA,wDAAoC,EAAC,oBAAoB,CAAC,GAAG,qCAAqC,CAAC,CAAA;QAEhH,IAAI,gBAAgB,CAAC,cAAc,KAAK,uBAAc,CAAC,OAAO,EAAE,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAA;QACvF,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,oBAAoB,EAAE,KAAK,EAAE,8BAA8B,CAAC,CAAA;QAC7F,CAAC;QACD,OAAO,EAAE,CAAA;IACb,CAAC;CACJ;AA1CD,wDA0CC"}
|
|
@@ -41,7 +41,7 @@ class ConnectionLockRpcRemote extends RpcRemote_1.RpcRemote {
|
|
|
41
41
|
const options = this.formDhtRpcOptions({
|
|
42
42
|
connect: false,
|
|
43
43
|
sendIfStopped: true,
|
|
44
|
-
timeout: 2000 // TODO use
|
|
44
|
+
timeout: 2000 // TODO use options option or named constant?
|
|
45
45
|
});
|
|
46
46
|
await this.getClient().gracefulDisconnect(request, options);
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionLockRpcRemote.js","sourceRoot":"","sources":["../../../src/connection/ConnectionLockRpcRemote.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AACvC,wDAAoD;AAIpD,gDAA4D;AAE5D,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAEjC,MAAa,uBAAwB,SAAQ,qBAAkC;IAEpE,KAAK,CAAC,WAAW,CAAC,MAAc;QACnC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QACxG,MAAM,OAAO,GAAgB;YACzB,MAAM;SACT,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChE,OAAO,GAAG,CAAC,QAAQ,CAAA;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACjD,OAAO,KAAK,CAAA;QAChB,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,MAAc;QAC/B,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QAClH,MAAM,OAAO,GAAkB;YAC3B,MAAM;SACT,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,IAAI;SACrB,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1D,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,cAA8B;QAC1D,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3G,MAAM,OAAO,GAAqB;YAC9B,cAAc;SACjB,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,IAAI,CAAE,
|
|
1
|
+
{"version":3,"file":"ConnectionLockRpcRemote.js","sourceRoot":"","sources":["../../../src/connection/ConnectionLockRpcRemote.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AACvC,wDAAoD;AAIpD,gDAA4D;AAE5D,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC,MAAM,CAAC,CAAA;AAEjC,MAAa,uBAAwB,SAAQ,qBAAkC;IAEpE,KAAK,CAAC,WAAW,CAAC,MAAc;QACnC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QACxG,MAAM,OAAO,GAAgB;YACzB,MAAM;SACT,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChE,OAAO,GAAG,CAAC,QAAQ,CAAA;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACjD,OAAO,KAAK,CAAA;QAChB,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,MAAc;QAC/B,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QAClH,MAAM,OAAO,GAAkB;YAC3B,MAAM;SACT,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,IAAI;SACrB,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1D,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,cAA8B;QAC1D,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAA,yCAA2B,EAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3G,MAAM,OAAO,GAAqB;YAC9B,cAAc;SACjB,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACnC,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,IAAI,CAAE,6CAA6C;SAC/D,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/D,CAAC;CACJ;AA1CD,0DA0CC"}
|
|
@@ -4,10 +4,9 @@ import { Message, PeerDescriptor } from '../proto/packages/dht/protos/DhtRpc';
|
|
|
4
4
|
import { ITransport, SendOptions, TransportEvents } from '../transport/ITransport';
|
|
5
5
|
import { LockID } from './ConnectionLockStates';
|
|
6
6
|
import { ConnectorFacade } from './ConnectorFacade';
|
|
7
|
-
import { ManagedConnection } from './ManagedConnection';
|
|
8
7
|
import { DhtAddress } from '../identifiers';
|
|
9
8
|
import { ConnectionsView } from './ConnectionsView';
|
|
10
|
-
export interface
|
|
9
|
+
export interface ConnectionManagerOptions {
|
|
11
10
|
maxConnections?: number;
|
|
12
11
|
metricsContext: MetricsContext;
|
|
13
12
|
createConnectorFacade: () => ConnectorFacade;
|
|
@@ -35,17 +34,17 @@ export interface TlsCertificate {
|
|
|
35
34
|
}
|
|
36
35
|
export declare const getNodeIdOrUnknownFromPeerDescriptor: (peerDescriptor: PeerDescriptor | undefined) => string;
|
|
37
36
|
export declare class ConnectionManager extends EventEmitter<TransportEvents> implements ITransport, ConnectionsView, ConnectionLocker {
|
|
38
|
-
private
|
|
37
|
+
private options;
|
|
39
38
|
private readonly metricsContext;
|
|
40
39
|
private readonly duplicateMessageDetector;
|
|
41
40
|
private readonly metrics;
|
|
42
41
|
private locks;
|
|
43
|
-
private
|
|
42
|
+
private endpoints;
|
|
44
43
|
private readonly connectorFacade;
|
|
45
44
|
private rpcCommunicator?;
|
|
46
45
|
private disconnectorIntervalRef?;
|
|
47
46
|
private state;
|
|
48
|
-
constructor(
|
|
47
|
+
constructor(options: ConnectionManagerOptions);
|
|
49
48
|
garbageCollectConnections(maxConnections: number, maxIdleTime: number): void;
|
|
50
49
|
start(): Promise<void>;
|
|
51
50
|
stop(): Promise<void>;
|
|
@@ -55,7 +54,6 @@ export declare class ConnectionManager extends EventEmitter<TransportEvents> imp
|
|
|
55
54
|
send(message: Message, opts?: SendOptions): Promise<void>;
|
|
56
55
|
private isConnectionToSelf;
|
|
57
56
|
private isOwnWebsocketServer;
|
|
58
|
-
getConnection(nodeId: DhtAddress): ManagedConnection | undefined;
|
|
59
57
|
getLocalPeerDescriptor(): PeerDescriptor;
|
|
60
58
|
hasConnection(nodeId: DhtAddress): boolean;
|
|
61
59
|
getConnectionCount(): number;
|
|
@@ -34,11 +34,12 @@ const DhtRpc_client_1 = require("../proto/packages/dht/protos/DhtRpc.client");
|
|
|
34
34
|
const ITransport_1 = require("../transport/ITransport");
|
|
35
35
|
const RoutingRpcCommunicator_1 = require("../transport/RoutingRpcCommunicator");
|
|
36
36
|
const ConnectionLockStates_1 = require("./ConnectionLockStates");
|
|
37
|
+
const ManagedConnection_1 = require("./ManagedConnection");
|
|
37
38
|
const ConnectionLockRpcRemote_1 = require("./ConnectionLockRpcRemote");
|
|
38
|
-
const NodeWebrtcConnection_1 = require("./webrtc/NodeWebrtcConnection");
|
|
39
39
|
const ConnectionLockRpcLocal_1 = require("./ConnectionLockRpcLocal");
|
|
40
40
|
const identifiers_1 = require("../identifiers");
|
|
41
41
|
const offering_1 = require("../helpers/offering");
|
|
42
|
+
const OutputBuffer_1 = require("./OutputBuffer");
|
|
42
43
|
var NatType;
|
|
43
44
|
(function (NatType) {
|
|
44
45
|
NatType["OPEN_INTERNET"] = "open_internet";
|
|
@@ -72,24 +73,24 @@ const getNodeIdOrUnknownFromPeerDescriptor = (peerDescriptor) => {
|
|
|
72
73
|
};
|
|
73
74
|
exports.getNodeIdOrUnknownFromPeerDescriptor = getNodeIdOrUnknownFromPeerDescriptor;
|
|
74
75
|
class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
75
|
-
|
|
76
|
+
options;
|
|
76
77
|
metricsContext;
|
|
77
|
-
// TODO use
|
|
78
|
+
// TODO use options option or named constant?
|
|
78
79
|
duplicateMessageDetector = new DuplicateDetector_1.DuplicateDetector(10000);
|
|
79
80
|
metrics;
|
|
80
81
|
locks = new ConnectionLockStates_1.ConnectionLockStates();
|
|
81
|
-
|
|
82
|
+
endpoints = new Map();
|
|
82
83
|
connectorFacade;
|
|
83
84
|
rpcCommunicator;
|
|
84
85
|
disconnectorIntervalRef;
|
|
85
86
|
state = ConnectionManagerState.IDLE;
|
|
86
|
-
constructor(
|
|
87
|
+
constructor(options) {
|
|
87
88
|
super();
|
|
88
|
-
this.
|
|
89
|
+
this.options = options;
|
|
89
90
|
this.onData = this.onData.bind(this);
|
|
90
91
|
this.send = this.send.bind(this);
|
|
91
92
|
this.onNewConnection = this.onNewConnection.bind(this);
|
|
92
|
-
this.metricsContext = this.
|
|
93
|
+
this.metricsContext = this.options.metricsContext ?? new utils_1.MetricsContext();
|
|
93
94
|
this.metrics = {
|
|
94
95
|
sendMessagesPerSecond: new utils_1.RateMetric(),
|
|
95
96
|
sendBytesPerSecond: new utils_1.RateMetric(),
|
|
@@ -99,10 +100,10 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
99
100
|
connectionTotalFailureCount: new utils_1.CountMetric()
|
|
100
101
|
};
|
|
101
102
|
this.metricsContext.addMetrics('node', this.metrics);
|
|
102
|
-
this.connectorFacade = this.
|
|
103
|
+
this.connectorFacade = this.options.createConnectorFacade();
|
|
103
104
|
this.send = this.send.bind(this);
|
|
104
105
|
this.rpcCommunicator = new RoutingRpcCommunicator_1.RoutingRpcCommunicator(INTERNAL_SERVICE_ID, this.send, {
|
|
105
|
-
rpcRequestTimeout: 10000 // TODO use
|
|
106
|
+
rpcRequestTimeout: 10000 // TODO use options option or named constant?
|
|
106
107
|
});
|
|
107
108
|
const lockRpcLocal = new ConnectionLockRpcLocal_1.ConnectionLockRpcLocal({
|
|
108
109
|
addRemoteLocked: (id, lockId) => this.locks.addRemoteLocked(id, lockId),
|
|
@@ -122,21 +123,24 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
122
123
|
* which hasn't been used within maxIdleTime.
|
|
123
124
|
*/
|
|
124
125
|
garbageCollectConnections(maxConnections, maxIdleTime) {
|
|
125
|
-
if (this.
|
|
126
|
+
if (this.endpoints.size <= maxConnections) {
|
|
126
127
|
return;
|
|
127
128
|
}
|
|
128
129
|
const disconnectionCandidates = new SortedContactList_1.SortedContactList({
|
|
129
130
|
referenceId: (0, identifiers_1.getNodeIdFromPeerDescriptor)(this.getLocalPeerDescriptor()),
|
|
130
|
-
maxSize: 100000, // TODO use
|
|
131
|
+
maxSize: 100000, // TODO use options option or named constant?
|
|
131
132
|
allowToContainReferenceId: false
|
|
132
133
|
});
|
|
133
|
-
this.
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
this.endpoints.forEach((endpoint) => {
|
|
135
|
+
if (endpoint.connected) {
|
|
136
|
+
const connection = endpoint.connection;
|
|
137
|
+
if (!this.locks.isLocked(connection.getNodeId()) && Date.now() - connection.getLastUsedTimestamp() > maxIdleTime) {
|
|
138
|
+
logger.trace('disconnecting in timeout interval: ' + (0, exports.getNodeIdOrUnknownFromPeerDescriptor)(connection.getPeerDescriptor()));
|
|
139
|
+
disconnectionCandidates.addContact(connection);
|
|
140
|
+
}
|
|
137
141
|
}
|
|
138
142
|
});
|
|
139
|
-
const disconnectables = disconnectionCandidates.getFurthestContacts(this.
|
|
143
|
+
const disconnectables = disconnectionCandidates.getFurthestContacts(this.endpoints.size - maxConnections);
|
|
140
144
|
for (const disconnectable of disconnectables) {
|
|
141
145
|
const peerDescriptor = disconnectable.getPeerDescriptor();
|
|
142
146
|
logger.trace('garbageCollecting ' + (0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor));
|
|
@@ -154,8 +158,8 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
154
158
|
this.disconnectorIntervalRef = setInterval(() => {
|
|
155
159
|
logger.trace('disconnectorInterval');
|
|
156
160
|
const LAST_USED_LIMIT = 20000;
|
|
157
|
-
this.garbageCollectConnections(this.
|
|
158
|
-
}, 5000); // TODO use
|
|
161
|
+
this.garbageCollectConnections(this.options.maxConnections ?? 80, LAST_USED_LIMIT);
|
|
162
|
+
}, 5000); // TODO use options option or named constant?
|
|
159
163
|
}
|
|
160
164
|
async stop() {
|
|
161
165
|
if (this.state === ConnectionManagerState.STOPPED || this.state === ConnectionManagerState.STOPPING) {
|
|
@@ -167,26 +171,28 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
167
171
|
clearInterval(this.disconnectorIntervalRef);
|
|
168
172
|
}
|
|
169
173
|
await this.connectorFacade.stop();
|
|
170
|
-
await Promise.all(Array.from(this.
|
|
171
|
-
if (
|
|
174
|
+
await Promise.all(Array.from(this.endpoints.values()).map(async (endpoint) => {
|
|
175
|
+
if (endpoint.connected) {
|
|
172
176
|
try {
|
|
173
|
-
await this.gracefullyDisconnectAsync(
|
|
177
|
+
await this.gracefullyDisconnectAsync(endpoint.connection.getPeerDescriptor(), DhtRpc_1.DisconnectMode.LEAVING);
|
|
174
178
|
}
|
|
175
179
|
catch (e) {
|
|
176
180
|
logger.error(e);
|
|
177
181
|
}
|
|
178
182
|
}
|
|
179
183
|
else {
|
|
184
|
+
const connection = endpoint.connection;
|
|
180
185
|
logger.trace('handshake of connection not completed, force-closing');
|
|
181
|
-
// TODO use
|
|
182
|
-
const eventReceived = (0, utils_1.waitForEvent3)(
|
|
186
|
+
// TODO use options option or named constant?
|
|
187
|
+
const eventReceived = (0, utils_1.waitForEvent3)(connection, 'disconnected', 2000);
|
|
183
188
|
// TODO should we have some handling for this floating promise?
|
|
184
|
-
|
|
189
|
+
connection.close(true);
|
|
185
190
|
try {
|
|
186
191
|
await eventReceived;
|
|
187
192
|
logger.trace('resolving after receiving disconnected event from non-handshaked connection');
|
|
188
193
|
}
|
|
189
194
|
catch (e) {
|
|
195
|
+
endpoint.buffer.reject();
|
|
190
196
|
logger.trace('force-closing non-handshaked connection timed out ' + e);
|
|
191
197
|
}
|
|
192
198
|
}
|
|
@@ -196,10 +202,6 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
196
202
|
this.duplicateMessageDetector.clear();
|
|
197
203
|
this.locks.clear();
|
|
198
204
|
this.removeAllListeners();
|
|
199
|
-
// TODO would it make sense to move this call to WebrtcConnector#stop()?
|
|
200
|
-
// - but note that we should call this only after connections have been closed
|
|
201
|
-
// (i.e the this.gracefullyDisconnectAsync() calls above)
|
|
202
|
-
NodeWebrtcConnection_1.WEBRTC_CLEANUP.cleanUp();
|
|
203
205
|
}
|
|
204
206
|
getLocalLockedConnectionCount() {
|
|
205
207
|
return this.locks.getLocalLockedConnectionCount();
|
|
@@ -224,7 +226,7 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
224
226
|
...message,
|
|
225
227
|
sourceDescriptor: this.getLocalPeerDescriptor()
|
|
226
228
|
};
|
|
227
|
-
let connection = this.
|
|
229
|
+
let connection = this.endpoints.get(nodeId)?.connection;
|
|
228
230
|
if (!connection && opts.connect) {
|
|
229
231
|
connection = this.connectorFacade.createConnection(peerDescriptor);
|
|
230
232
|
this.onNewConnection(connection);
|
|
@@ -235,7 +237,12 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
235
237
|
const binary = DhtRpc_1.Message.toBinary(message);
|
|
236
238
|
this.metrics.sendBytesPerSecond.record(binary.byteLength);
|
|
237
239
|
this.metrics.sendMessagesPerSecond.record(1);
|
|
238
|
-
|
|
240
|
+
if (this.endpoints.get(nodeId).connected) {
|
|
241
|
+
return connection.send(binary);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
return this.endpoints.get(nodeId).buffer.push(binary);
|
|
245
|
+
}
|
|
239
246
|
}
|
|
240
247
|
isConnectionToSelf(peerDescriptor) {
|
|
241
248
|
return (0, identifiers_1.areEqualPeerDescriptors)(peerDescriptor, this.getLocalPeerDescriptor()) || this.isOwnWebsocketServer(peerDescriptor);
|
|
@@ -250,9 +257,6 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
250
257
|
return false;
|
|
251
258
|
}
|
|
252
259
|
}
|
|
253
|
-
getConnection(nodeId) {
|
|
254
|
-
return this.connections.get(nodeId);
|
|
255
|
-
}
|
|
256
260
|
getLocalPeerDescriptor() {
|
|
257
261
|
return this.connectorFacade.getLocalPeerDescriptor();
|
|
258
262
|
}
|
|
@@ -314,29 +318,42 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
314
318
|
logger.debug(`Handling incoming data failed: ${e}`);
|
|
315
319
|
}
|
|
316
320
|
}
|
|
317
|
-
onConnected(connection) {
|
|
318
|
-
const
|
|
321
|
+
onConnected(peerDescriptor, connection) {
|
|
322
|
+
const managedConnection = new ManagedConnection_1.ManagedConnection(peerDescriptor, connection);
|
|
323
|
+
managedConnection.on('managedData', this.onData);
|
|
324
|
+
managedConnection.once('disconnected', (gracefulLeave) => this.onDisconnected(peerDescriptor, gracefulLeave));
|
|
325
|
+
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor);
|
|
326
|
+
const endpoint = this.endpoints.get(nodeId);
|
|
327
|
+
const outputBuffer = endpoint.buffer;
|
|
328
|
+
const pendingConnection = endpoint.connection;
|
|
329
|
+
const buffer = outputBuffer.getBuffer();
|
|
330
|
+
while (buffer.length > 0) {
|
|
331
|
+
logger.trace('emptying buffer');
|
|
332
|
+
managedConnection.send(buffer.shift());
|
|
333
|
+
}
|
|
334
|
+
outputBuffer.resolve();
|
|
335
|
+
pendingConnection.destroy();
|
|
336
|
+
this.endpoints.set(nodeId, {
|
|
337
|
+
connected: true,
|
|
338
|
+
connection: managedConnection
|
|
339
|
+
});
|
|
319
340
|
this.emit('connected', peerDescriptor);
|
|
320
|
-
logger.trace((0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor) + ' onConnected() ' + connection.connectionType);
|
|
321
341
|
this.onConnectionCountChange();
|
|
322
342
|
}
|
|
323
|
-
onDisconnected(
|
|
324
|
-
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(
|
|
343
|
+
onDisconnected(peerDescriptor, gracefulLeave) {
|
|
344
|
+
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor);
|
|
325
345
|
logger.trace(nodeId + ' onDisconnected() gracefulLeave: ' + gracefulLeave);
|
|
326
|
-
const
|
|
327
|
-
if (
|
|
346
|
+
const endpoint = this.endpoints.get(nodeId);
|
|
347
|
+
if (endpoint) {
|
|
328
348
|
this.locks.clearAllLocks(nodeId);
|
|
329
|
-
|
|
349
|
+
if (endpoint.connected === false) {
|
|
350
|
+
endpoint.buffer.reject();
|
|
351
|
+
}
|
|
352
|
+
this.endpoints.delete(nodeId);
|
|
330
353
|
logger.trace(nodeId + ' deleted connection in onDisconnected() gracefulLeave: ' + gracefulLeave);
|
|
331
|
-
this.emit('disconnected',
|
|
354
|
+
this.emit('disconnected', peerDescriptor, gracefulLeave);
|
|
332
355
|
this.onConnectionCountChange();
|
|
333
356
|
}
|
|
334
|
-
else {
|
|
335
|
-
logger.trace(nodeId + ' onDisconnected() did nothing, no such connection in connectionManager');
|
|
336
|
-
if (storedConnection) {
|
|
337
|
-
logger.trace(nodeId + ' connectionIds do not match ' + storedConnection.connectionId + ' ' + connection.connectionId.toString());
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
357
|
}
|
|
341
358
|
onNewConnection(connection) {
|
|
342
359
|
if (this.state === ConnectionManagerState.STOPPED) {
|
|
@@ -346,54 +363,55 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
346
363
|
if (!this.acceptNewConnection(connection)) {
|
|
347
364
|
return false;
|
|
348
365
|
}
|
|
349
|
-
connection.
|
|
350
|
-
connection.
|
|
351
|
-
this.onDisconnected(connection, gracefulLeave);
|
|
352
|
-
});
|
|
353
|
-
if (connection.isHandshakeCompleted()) {
|
|
354
|
-
this.onConnected(connection);
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
connection.once('handshakeCompleted', () => {
|
|
358
|
-
this.onConnected(connection);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
366
|
+
connection.once('connected', (peerDescriptor, connection) => this.onConnected(peerDescriptor, connection));
|
|
367
|
+
connection.once('disconnected', (gracefulLeave) => this.onDisconnected(connection.getPeerDescriptor(), gracefulLeave));
|
|
361
368
|
return true;
|
|
362
369
|
}
|
|
363
370
|
acceptNewConnection(newConnection) {
|
|
364
371
|
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(newConnection.getPeerDescriptor());
|
|
365
|
-
logger.trace(nodeId + '
|
|
366
|
-
if (this.
|
|
372
|
+
logger.trace(nodeId + ' acceptNewConnection()');
|
|
373
|
+
if (this.endpoints.has(nodeId)) {
|
|
367
374
|
if ((0, offering_1.getOfferer)((0, identifiers_1.getNodeIdFromPeerDescriptor)(this.getLocalPeerDescriptor()), nodeId) === 'remote') {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
+
let buffer;
|
|
376
|
+
const endpoint = this.endpoints.get(nodeId);
|
|
377
|
+
// This is a rare occurance but it does happen from time to time.
|
|
378
|
+
// Could be related to WS client connections not realizing that they have been disconnected.
|
|
379
|
+
// Makes refactoring duplicate connection handling to the connectors very difficult.
|
|
380
|
+
if (this.endpoints.get(nodeId).connected) {
|
|
381
|
+
logger.debug('replacing connected connection', { nodeId });
|
|
382
|
+
buffer = new OutputBuffer_1.OutputBuffer();
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
buffer = endpoint.buffer;
|
|
375
386
|
}
|
|
376
|
-
oldConnection.
|
|
377
|
-
|
|
387
|
+
const oldConnection = endpoint.connection;
|
|
388
|
+
logger.trace('replaced: ' + nodeId);
|
|
389
|
+
oldConnection.replaceAsDuplicate();
|
|
390
|
+
this.endpoints.set(nodeId, { connected: false, connection: newConnection, buffer: buffer });
|
|
391
|
+
return true;
|
|
378
392
|
}
|
|
379
393
|
else {
|
|
380
394
|
return false;
|
|
381
395
|
}
|
|
382
396
|
}
|
|
383
|
-
logger.trace(nodeId + ' added to connections at
|
|
384
|
-
this.
|
|
397
|
+
logger.trace(nodeId + ' added to connections at acceptNewConnection');
|
|
398
|
+
this.endpoints.set(nodeId, {
|
|
399
|
+
connected: false,
|
|
400
|
+
buffer: new OutputBuffer_1.OutputBuffer(),
|
|
401
|
+
connection: newConnection
|
|
402
|
+
});
|
|
385
403
|
return true;
|
|
386
404
|
}
|
|
387
405
|
async closeConnection(peerDescriptor, gracefulLeave, reason) {
|
|
388
406
|
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor);
|
|
389
407
|
logger.trace(nodeId + ' ' + 'closeConnection() ' + reason);
|
|
390
408
|
this.locks.clearAllLocks(nodeId);
|
|
391
|
-
if (this.
|
|
392
|
-
const connectionToClose = this.
|
|
409
|
+
if (this.endpoints.has(nodeId)) {
|
|
410
|
+
const connectionToClose = this.endpoints.get(nodeId).connection;
|
|
393
411
|
await connectionToClose.close(gracefulLeave);
|
|
394
412
|
}
|
|
395
413
|
else {
|
|
396
|
-
logger.trace(nodeId + ' ' + 'closeConnection() this.
|
|
414
|
+
logger.trace(nodeId + ' ' + 'closeConnection() this.endpoints did not have the id');
|
|
397
415
|
this.emit('disconnected', peerDescriptor, false);
|
|
398
416
|
}
|
|
399
417
|
}
|
|
@@ -415,7 +433,7 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
415
433
|
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(targetDescriptor);
|
|
416
434
|
this.locks.removeLocalLocked(nodeId, lockId);
|
|
417
435
|
const rpcRemote = new ConnectionLockRpcRemote_1.ConnectionLockRpcRemote(this.getLocalPeerDescriptor(), targetDescriptor, this.rpcCommunicator, DhtRpc_client_1.ConnectionLockRpcClient);
|
|
418
|
-
if (this.
|
|
436
|
+
if (this.endpoints.has(nodeId)) {
|
|
419
437
|
rpcRemote.unlockRequest(lockId);
|
|
420
438
|
}
|
|
421
439
|
}
|
|
@@ -432,31 +450,37 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
432
450
|
this.locks.removeWeakLocked(nodeId, lockId);
|
|
433
451
|
}
|
|
434
452
|
async gracefullyDisconnectAsync(targetDescriptor, disconnectMode) {
|
|
435
|
-
const
|
|
436
|
-
if (!
|
|
453
|
+
const endpoint = this.endpoints.get((0, identifiers_1.getNodeIdFromPeerDescriptor)(targetDescriptor));
|
|
454
|
+
if (!endpoint) {
|
|
437
455
|
logger.debug('gracefullyDisconnectedAsync() tried on a non-existing connection');
|
|
438
456
|
return;
|
|
439
457
|
}
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
458
|
+
if (endpoint.connected) {
|
|
459
|
+
const connection = endpoint.connection;
|
|
460
|
+
const promise = new Promise((resolve, _reject) => {
|
|
461
|
+
// TODO use options option or named constant?
|
|
462
|
+
// eslint-disable-next-line promise/catch-or-return
|
|
463
|
+
(0, utils_1.waitForEvent3)(connection, 'disconnected', 2000).then(() => {
|
|
464
|
+
logger.trace('disconnected event received in gracefullyDisconnectAsync()');
|
|
465
|
+
})
|
|
466
|
+
.catch((e) => {
|
|
467
|
+
logger.trace('force-closing connection after timeout ' + e);
|
|
468
|
+
// TODO should we have some handling for this floating promise?
|
|
469
|
+
connection.close(true);
|
|
470
|
+
})
|
|
471
|
+
.finally(() => {
|
|
472
|
+
logger.trace('resolving after receiving disconnected event');
|
|
473
|
+
resolve();
|
|
474
|
+
});
|
|
454
475
|
});
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
476
|
+
await Promise.all([
|
|
477
|
+
promise,
|
|
478
|
+
this.doGracefullyDisconnectAsync(targetDescriptor, disconnectMode)
|
|
479
|
+
]);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
endpoint.connection.close(true);
|
|
483
|
+
}
|
|
460
484
|
}
|
|
461
485
|
async doGracefullyDisconnectAsync(targetDescriptor, disconnectMode) {
|
|
462
486
|
const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(targetDescriptor);
|
|
@@ -470,14 +494,15 @@ class ConnectionManager extends eventemitter3_1.EventEmitter {
|
|
|
470
494
|
}
|
|
471
495
|
}
|
|
472
496
|
getConnections() {
|
|
473
|
-
return Array.from(this.
|
|
497
|
+
return Array.from(this.endpoints.values())
|
|
498
|
+
.map((endpoint) => endpoint)
|
|
474
499
|
// TODO is this filtering needed? (if it is, should we do the same filtering e.g.
|
|
475
|
-
// in getConnection() or in other methods which access this.
|
|
476
|
-
.filter((
|
|
477
|
-
.map((
|
|
500
|
+
// in getConnection() or in other methods which access this.endpoints directly?)
|
|
501
|
+
.filter((endpoint) => endpoint.connected)
|
|
502
|
+
.map((endpoint) => endpoint.connection.getPeerDescriptor());
|
|
478
503
|
}
|
|
479
504
|
onConnectionCountChange() {
|
|
480
|
-
this.metrics.connectionAverageCount.record(this.
|
|
505
|
+
this.metrics.connectionAverageCount.record(this.endpoints.size);
|
|
481
506
|
}
|
|
482
507
|
}
|
|
483
508
|
exports.ConnectionManager = ConnectionManager;
|