@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.
Files changed (231) hide show
  1. package/dist/package.json +7 -7
  2. package/dist/src/connection/ConnectionLockRpcLocal.d.ts +3 -3
  3. package/dist/src/connection/ConnectionLockRpcLocal.js +8 -8
  4. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
  5. package/dist/src/connection/ConnectionLockRpcRemote.js +1 -1
  6. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  7. package/dist/src/connection/ConnectionManager.d.ts +4 -6
  8. package/dist/src/connection/ConnectionManager.js +128 -103
  9. package/dist/src/connection/ConnectionManager.js.map +1 -1
  10. package/dist/src/connection/ConnectorFacade.d.ts +15 -14
  11. package/dist/src/connection/ConnectorFacade.js +70 -52
  12. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  13. package/dist/src/connection/Handshaker.d.ts +9 -2
  14. package/dist/src/connection/Handshaker.js +117 -27
  15. package/dist/src/connection/Handshaker.js.map +1 -1
  16. package/dist/src/connection/ManagedConnection.d.ts +13 -38
  17. package/dist/src/connection/ManagedConnection.js +31 -252
  18. package/dist/src/connection/ManagedConnection.js.map +1 -1
  19. package/dist/src/connection/OutputBuffer.d.ts +9 -0
  20. package/dist/src/connection/OutputBuffer.js +26 -0
  21. package/dist/src/connection/OutputBuffer.js.map +1 -0
  22. package/dist/src/connection/PendingConnection.d.ts +19 -0
  23. package/dist/src/connection/PendingConnection.js +59 -0
  24. package/dist/src/connection/PendingConnection.js.map +1 -0
  25. package/dist/src/connection/connectivityChecker.js +3 -3
  26. package/dist/src/connection/connectivityChecker.js.map +1 -1
  27. package/dist/src/connection/connectivityRequestHandler.js +2 -2
  28. package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
  29. package/dist/src/connection/simulator/Simulator.d.ts +1 -3
  30. package/dist/src/connection/simulator/Simulator.js +1 -4
  31. package/dist/src/connection/simulator/Simulator.js.map +1 -1
  32. package/dist/src/connection/simulator/SimulatorConnection.js +1 -2
  33. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
  34. package/dist/src/connection/simulator/SimulatorConnector.d.ts +3 -3
  35. package/dist/src/connection/simulator/SimulatorConnector.js +28 -21
  36. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
  37. package/dist/src/connection/webrtc/NodeWebrtcConnection.d.ts +1 -6
  38. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +3 -20
  39. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  40. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +11 -6
  41. package/dist/src/connection/webrtc/WebrtcConnector.js +57 -42
  42. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  43. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +8 -10
  44. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +21 -44
  45. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  46. package/dist/src/connection/websocket/AbstractWebsocketClientConnection.js +8 -2
  47. package/dist/src/connection/websocket/AbstractWebsocketClientConnection.js.map +1 -1
  48. package/dist/src/connection/websocket/AutoCertifierClientFacade.d.ts +3 -3
  49. package/dist/src/connection/websocket/AutoCertifierClientFacade.js +8 -8
  50. package/dist/src/connection/websocket/AutoCertifierClientFacade.js.map +1 -1
  51. package/dist/src/connection/websocket/NodeWebsocketClientConnection.js +1 -1
  52. package/dist/src/connection/websocket/NodeWebsocketClientConnection.js.map +1 -1
  53. package/dist/src/connection/websocket/WebsocketClientConnector.d.ts +26 -0
  54. package/dist/src/connection/websocket/WebsocketClientConnector.js +86 -0
  55. package/dist/src/connection/websocket/WebsocketClientConnector.js.map +1 -0
  56. package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.d.ts +19 -0
  57. package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.js +23 -0
  58. package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.js.map +1 -0
  59. package/dist/src/connection/websocket/WebsocketClientConnectorRpcRemote.d.ts +5 -0
  60. package/dist/src/connection/websocket/{WebsocketConnectorRpcRemote.js → WebsocketClientConnectorRpcRemote.js} +4 -4
  61. package/dist/src/connection/websocket/WebsocketClientConnectorRpcRemote.js.map +1 -0
  62. package/dist/src/connection/websocket/WebsocketServer.d.ts +8 -5
  63. package/dist/src/connection/websocket/WebsocketServer.js +11 -11
  64. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  65. package/dist/src/connection/websocket/{WebsocketConnector.d.ts → WebsocketServerConnector.d.ts} +16 -21
  66. package/dist/src/connection/websocket/{WebsocketConnector.js → WebsocketServerConnector.js} +112 -160
  67. package/dist/src/connection/websocket/WebsocketServerConnector.js.map +1 -0
  68. package/dist/src/dht/DhtNode.d.ts +4 -4
  69. package/dist/src/dht/DhtNode.js +85 -84
  70. package/dist/src/dht/DhtNode.js.map +1 -1
  71. package/dist/src/dht/DhtNodeRpcLocal.d.ts +3 -3
  72. package/dist/src/dht/DhtNodeRpcLocal.js +9 -9
  73. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  74. package/dist/src/dht/ExternalApiRpcLocal.d.ts +3 -3
  75. package/dist/src/dht/ExternalApiRpcLocal.js +5 -5
  76. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
  77. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  78. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  79. package/dist/src/dht/PeerManager.d.ts +4 -4
  80. package/dist/src/dht/PeerManager.js +22 -22
  81. package/dist/src/dht/PeerManager.js.map +1 -1
  82. package/dist/src/dht/contact/SortedContactList.d.ts +3 -3
  83. package/dist/src/dht/contact/SortedContactList.js +9 -9
  84. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  85. package/dist/src/dht/discovery/DiscoverySession.d.ts +3 -3
  86. package/dist/src/dht/discovery/DiscoverySession.js +21 -21
  87. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  88. package/dist/src/dht/discovery/PeerDiscovery.d.ts +3 -3
  89. package/dist/src/dht/discovery/PeerDiscovery.js +46 -44
  90. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  91. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +3 -3
  92. package/dist/src/dht/discovery/RingDiscoverySession.js +19 -19
  93. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -1
  94. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +3 -3
  95. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +33 -33
  96. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -1
  97. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.d.ts +3 -3
  98. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js +8 -8
  99. package/dist/src/dht/recursive-operation/RecursiveOperationRpcLocal.js.map +1 -1
  100. package/dist/src/dht/recursive-operation/RecursiveOperationSession.d.ts +4 -4
  101. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +24 -24
  102. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -1
  103. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.d.ts +4 -4
  104. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js +5 -5
  105. package/dist/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.js.map +1 -1
  106. package/dist/src/dht/routing/Router.d.ts +3 -3
  107. package/dist/src/dht/routing/Router.js +20 -20
  108. package/dist/src/dht/routing/Router.js.map +1 -1
  109. package/dist/src/dht/routing/RouterRpcLocal.d.ts +3 -3
  110. package/dist/src/dht/routing/RouterRpcLocal.js +16 -16
  111. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
  112. package/dist/src/dht/routing/RoutingSession.d.ts +3 -3
  113. package/dist/src/dht/routing/RoutingSession.js +24 -24
  114. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  115. package/dist/src/dht/store/StoreManager.d.ts +3 -3
  116. package/dist/src/dht/store/StoreManager.js +25 -25
  117. package/dist/src/dht/store/StoreManager.js.map +1 -1
  118. package/dist/src/dht/store/StoreRpcLocal.d.ts +3 -3
  119. package/dist/src/dht/store/StoreRpcLocal.js +12 -12
  120. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  121. package/dist/src/exports.d.ts +3 -0
  122. package/dist/src/exports.js +5 -1
  123. package/dist/src/exports.js.map +1 -1
  124. package/dist/src/proto/google/protobuf/any.d.ts +5 -8
  125. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  126. package/dist/src/proto/google/protobuf/empty.d.ts +1 -0
  127. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  128. package/dist/src/proto/google/protobuf/timestamp.d.ts +1 -10
  129. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  130. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +4 -4
  131. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +8 -8
  132. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  133. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +3 -3
  134. package/dist/src/proto/packages/dht/protos/DhtRpc.js +4 -4
  135. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  136. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +2 -2
  137. package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
  138. package/dist/src/transport/ListeningRpcCommunicator.d.ts +2 -2
  139. package/dist/src/transport/ListeningRpcCommunicator.js +2 -2
  140. package/dist/src/transport/ListeningRpcCommunicator.js.map +1 -1
  141. package/dist/src/transport/RoutingRpcCommunicator.d.ts +2 -2
  142. package/dist/src/transport/RoutingRpcCommunicator.js +2 -2
  143. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  144. package/package.json +7 -7
  145. package/protos/DhtRpc.proto +1 -1
  146. package/src/connection/ConnectionLockRpcLocal.ts +9 -9
  147. package/src/connection/ConnectionLockRpcRemote.ts +1 -1
  148. package/src/connection/ConnectionManager.ts +153 -111
  149. package/src/connection/ConnectorFacade.ts +84 -61
  150. package/src/connection/Handshaker.ts +131 -27
  151. package/src/connection/ManagedConnection.ts +41 -304
  152. package/src/connection/OutputBuffer.ts +28 -0
  153. package/src/connection/PendingConnection.ts +68 -0
  154. package/src/connection/connectivityChecker.ts +2 -2
  155. package/src/connection/connectivityRequestHandler.ts +1 -1
  156. package/src/connection/simulator/Simulator.ts +1 -5
  157. package/src/connection/simulator/SimulatorConnection.ts +1 -2
  158. package/src/connection/simulator/SimulatorConnector.ts +34 -33
  159. package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -6
  160. package/src/connection/webrtc/NodeWebrtcConnection.ts +3 -24
  161. package/src/connection/webrtc/WebrtcConnector.ts +73 -62
  162. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +26 -56
  163. package/src/connection/websocket/AbstractWebsocketClientConnection.ts +8 -2
  164. package/src/connection/websocket/AutoCertifierClientFacade.ts +11 -11
  165. package/src/connection/websocket/NodeWebsocketClientConnection.ts +1 -1
  166. package/src/connection/websocket/WebsocketClientConnector.ts +119 -0
  167. package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +39 -0
  168. package/src/connection/websocket/{WebsocketConnectorRpcRemote.ts → WebsocketClientConnectorRpcRemote.ts} +2 -2
  169. package/src/connection/websocket/WebsocketServer.ts +18 -14
  170. package/src/connection/websocket/{WebsocketConnector.ts → WebsocketServerConnector.ts} +128 -205
  171. package/src/dht/DhtNode.ts +90 -89
  172. package/src/dht/DhtNodeRpcLocal.ts +11 -11
  173. package/src/dht/ExternalApiRpcLocal.ts +6 -6
  174. package/src/dht/ExternalApiRpcRemote.ts +2 -2
  175. package/src/dht/PeerManager.ts +24 -24
  176. package/src/dht/contact/SortedContactList.ts +10 -10
  177. package/src/dht/discovery/DiscoverySession.ts +24 -24
  178. package/src/dht/discovery/PeerDiscovery.ts +47 -45
  179. package/src/dht/discovery/RingDiscoverySession.ts +23 -23
  180. package/src/dht/recursive-operation/RecursiveOperationManager.ts +36 -36
  181. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +9 -9
  182. package/src/dht/recursive-operation/RecursiveOperationSession.ts +25 -25
  183. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +7 -7
  184. package/src/dht/routing/Router.ts +21 -21
  185. package/src/dht/routing/RouterRpcLocal.ts +17 -17
  186. package/src/dht/routing/RoutingSession.ts +26 -26
  187. package/src/dht/store/StoreManager.ts +27 -27
  188. package/src/dht/store/StoreRpcLocal.ts +13 -13
  189. package/src/exports.ts +3 -0
  190. package/src/proto/google/protobuf/any.ts +6 -9
  191. package/src/proto/google/protobuf/empty.ts +2 -1
  192. package/src/proto/google/protobuf/timestamp.ts +2 -11
  193. package/src/proto/packages/dht/protos/DhtRpc.client.ts +9 -9
  194. package/src/proto/packages/dht/protos/DhtRpc.server.ts +3 -3
  195. package/src/proto/packages/dht/protos/DhtRpc.ts +4 -4
  196. package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
  197. package/src/transport/ListeningRpcCommunicator.ts +3 -3
  198. package/src/transport/RoutingRpcCommunicator.ts +3 -3
  199. package/test/end-to-end/Layer0Webrtc.test.ts +0 -10
  200. package/test/integration/ConnectionManager.test.ts +3 -2
  201. package/test/integration/GeoIpConnectivityChecking.test.ts +1 -1
  202. package/test/integration/SimultaneousConnections.test.ts +2 -2
  203. package/test/integration/WebrtcConnectionManagement.test.ts +2 -10
  204. package/test/integration/{WebsocketConnectorRpc.test.ts → WebsocketClientConnectorRpc.test.ts} +9 -9
  205. package/test/integration/WebsocketConnectionManagement.test.ts +11 -29
  206. package/test/unit/ConnectionManager.test.ts +64 -0
  207. package/test/unit/DiscoverySession.test.ts +1 -1
  208. package/test/unit/Handshaker.test.ts +169 -0
  209. package/test/unit/ManagedConnection.test.ts +58 -0
  210. package/test/unit/PendingConnection.test.ts +57 -0
  211. package/test/unit/WebrtcConnector.test.ts +56 -0
  212. package/test/unit/{WebsocketConnector.test.ts → WebsocketClientConnector.test.ts} +56 -11
  213. package/test/unit/WebsocketServerConnector.test.ts +102 -0
  214. package/test/utils/FakeConnectorFacade.ts +41 -0
  215. package/test/utils/mock/MockConnection.ts +26 -0
  216. package/test/utils/utils.ts +2 -2
  217. package/dist/src/connection/IConnectionSource.d.ts +0 -4
  218. package/dist/src/connection/IConnectionSource.js +0 -3
  219. package/dist/src/connection/IConnectionSource.js.map +0 -1
  220. package/dist/src/connection/webrtc/ManagedWebrtcConnection.d.ts +0 -7
  221. package/dist/src/connection/webrtc/ManagedWebrtcConnection.js +0 -20
  222. package/dist/src/connection/webrtc/ManagedWebrtcConnection.js.map +0 -1
  223. package/dist/src/connection/websocket/WebsocketConnector.js.map +0 -1
  224. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +0 -19
  225. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +0 -23
  226. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +0 -1
  227. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +0 -5
  228. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +0 -1
  229. package/src/connection/IConnectionSource.ts +0 -6
  230. package/src/connection/webrtc/ManagedWebrtcConnection.ts +0 -27
  231. 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": "100.2.5-beta.0",
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": "100.2.5-beta.0",
33
- "@streamr/cdn-location": "100.2.5-beta.0",
34
- "@streamr/geoip-location": "100.2.5-beta.0",
35
- "@streamr/proto-rpc": "100.2.5-beta.0",
36
- "@streamr/utils": "100.2.5-beta.0",
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": "100.2.5-beta.0",
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 ConnectionLockRpcLocalConfig {
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 config;
15
- constructor(config: ConnectionLockRpcLocalConfig);
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
- config;
11
- constructor(config) {
12
- this.config = config;
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.config.getLocalPeerDescriptor())) {
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.config.addRemoteLocked(remoteNodeId, lockRequest.lockId);
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.config.removeRemoteLocked(nodeId, unlockRequest.lockId);
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.config.closeConnection(senderPeerDescriptor, true, 'graceful leave notified');
39
+ this.options.closeConnection(senderPeerDescriptor, true, 'graceful leave notified');
40
40
  }
41
41
  else {
42
- this.config.closeConnection(senderPeerDescriptor, false, 'graceful disconnect notified');
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,MAAM,CAA8B;IAErD,YAAY,MAAoC;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,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,MAAM,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC;YACtF,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,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QAC7D,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,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;QAC5D,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,MAAM,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAA;QACtF,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,oBAAoB,EAAE,KAAK,EAAE,8BAA8B,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,EAAE,CAAA;IACb,CAAC;CACJ;AA1CD,wDA0CC"}
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 config option or named constant?
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,4CAA4C;SAC9D,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/D,CAAC;CACJ;AA1CD,0DA0CC"}
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 ConnectionManagerConfig {
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 config;
37
+ private options;
39
38
  private readonly metricsContext;
40
39
  private readonly duplicateMessageDetector;
41
40
  private readonly metrics;
42
41
  private locks;
43
- private connections;
42
+ private endpoints;
44
43
  private readonly connectorFacade;
45
44
  private rpcCommunicator?;
46
45
  private disconnectorIntervalRef?;
47
46
  private state;
48
- constructor(config: ConnectionManagerConfig);
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
- config;
76
+ options;
76
77
  metricsContext;
77
- // TODO use config option or named constant?
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
- connections = new Map();
82
+ endpoints = new Map();
82
83
  connectorFacade;
83
84
  rpcCommunicator;
84
85
  disconnectorIntervalRef;
85
86
  state = ConnectionManagerState.IDLE;
86
- constructor(config) {
87
+ constructor(options) {
87
88
  super();
88
- this.config = config;
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.config.metricsContext ?? new utils_1.MetricsContext();
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.config.createConnectorFacade();
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 config option or named constant?
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.connections.size <= maxConnections) {
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 config option or named constant?
131
+ maxSize: 100000, // TODO use options option or named constant?
131
132
  allowToContainReferenceId: false
132
133
  });
133
- this.connections.forEach((connection) => {
134
- if (!this.locks.isLocked(connection.getNodeId()) && Date.now() - connection.getLastUsedTimestamp() > maxIdleTime) {
135
- logger.trace('disconnecting in timeout interval: ' + (0, exports.getNodeIdOrUnknownFromPeerDescriptor)(connection.getPeerDescriptor()));
136
- disconnectionCandidates.addContact(connection);
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.connections.size - maxConnections);
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.config.maxConnections ?? 80, LAST_USED_LIMIT);
158
- }, 5000); // TODO use config option or named constant?
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.connections.values()).map(async (peer) => {
171
- if (peer.isHandshakeCompleted()) {
174
+ await Promise.all(Array.from(this.endpoints.values()).map(async (endpoint) => {
175
+ if (endpoint.connected) {
172
176
  try {
173
- await this.gracefullyDisconnectAsync(peer.getPeerDescriptor(), DhtRpc_1.DisconnectMode.LEAVING);
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 config option or named constant?
182
- const eventReceived = (0, utils_1.waitForEvent3)(peer, 'disconnected', 2000);
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
- peer.close(true);
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.connections.get(nodeId);
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
- return connection.send(binary, opts.connect);
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 peerDescriptor = connection.getPeerDescriptor();
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(connection, gracefulLeave) {
324
- const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(connection.getPeerDescriptor());
343
+ onDisconnected(peerDescriptor, gracefulLeave) {
344
+ const nodeId = (0, identifiers_1.getNodeIdFromPeerDescriptor)(peerDescriptor);
325
345
  logger.trace(nodeId + ' onDisconnected() gracefulLeave: ' + gracefulLeave);
326
- const storedConnection = this.connections.get(nodeId);
327
- if (storedConnection && (storedConnection.connectionId === connection.connectionId)) {
346
+ const endpoint = this.endpoints.get(nodeId);
347
+ if (endpoint) {
328
348
  this.locks.clearAllLocks(nodeId);
329
- this.connections.delete(nodeId);
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', connection.getPeerDescriptor(), gracefulLeave);
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.on('managedData', this.onData);
350
- connection.on('disconnected', (gracefulLeave) => {
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 + ' acceptIncomingConnection()');
366
- if (this.connections.has(nodeId)) {
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
- logger.trace(nodeId + ' acceptIncomingConnection() replace current connection');
369
- // replace the current connection
370
- const oldConnection = this.connections.get(nodeId);
371
- logger.trace('replaced: ' + nodeId);
372
- const buffer = oldConnection.stealOutputBuffer();
373
- for (const data of buffer) {
374
- newConnection.sendNoWait(data);
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.reportBufferSentByOtherConnection();
377
- oldConnection.replacedByOtherConnection = true;
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 acceptIncomingConnection');
384
- this.connections.set(nodeId, newConnection);
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.connections.has(nodeId)) {
392
- const connectionToClose = this.connections.get(nodeId);
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.connections did not have the id');
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.connections.has(nodeId)) {
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 connection = this.connections.get((0, identifiers_1.getNodeIdFromPeerDescriptor)(targetDescriptor));
436
- if (!connection) {
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
- const promise = new Promise((resolve, _reject) => {
441
- // TODO use config option or named constant?
442
- // eslint-disable-next-line promise/catch-or-return
443
- (0, utils_1.waitForEvent3)(connection, 'disconnected', 2000).then(() => {
444
- logger.trace('disconnected event received in gracefullyDisconnectAsync()');
445
- })
446
- .catch((e) => {
447
- logger.trace('force-closing connection after timeout ' + e);
448
- // TODO should we have some handling for this floating promise?
449
- connection.close(true);
450
- })
451
- .finally(() => {
452
- logger.trace('resolving after receiving disconnected event');
453
- resolve();
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
- await Promise.all([
457
- promise,
458
- this.doGracefullyDisconnectAsync(targetDescriptor, disconnectMode)
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.connections.values())
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.connections directly?)
476
- .filter((managedConnection) => managedConnection.isHandshakeCompleted())
477
- .map((managedConnection) => managedConnection.getPeerDescriptor());
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.connections.size);
505
+ this.metrics.connectionAverageCount.record(this.endpoints.size);
481
506
  }
482
507
  }
483
508
  exports.ConnectionManager = ConnectionManager;