@streamr/dht 102.0.0-beta.0 → 102.0.0-beta.2

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 (264) hide show
  1. package/dist/generated/packages/dht/protos/DhtRpc.d.ts +16 -8
  2. package/dist/generated/packages/dht/protos/DhtRpc.js +7 -5
  3. package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -1
  4. package/dist/package.json +15 -16
  5. package/dist/src/connection/ConnectionManager.js +18 -8
  6. package/dist/src/connection/ConnectionManager.js.map +1 -1
  7. package/dist/src/connection/Handshaker.d.ts +1 -1
  8. package/dist/src/connection/Handshaker.js +9 -5
  9. package/dist/src/connection/Handshaker.js.map +1 -1
  10. package/dist/src/connection/ManagedConnection.js +17 -7
  11. package/dist/src/connection/ManagedConnection.js.map +1 -1
  12. package/dist/src/connection/connectivityChecker.js +20 -10
  13. package/dist/src/connection/connectivityChecker.js.map +1 -1
  14. package/dist/src/connection/connectivityRequestHandler.js +3 -3
  15. package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
  16. package/dist/src/connection/simulator/Simulator.js +3 -2
  17. package/dist/src/connection/simulator/Simulator.js.map +1 -1
  18. package/dist/src/connection/simulator/pings.d.ts +1 -1
  19. package/dist/src/connection/simulator/pings.js +3 -3
  20. package/dist/src/connection/simulator/pings.js.map +1 -1
  21. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +0 -2
  22. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  23. package/dist/src/connection/webrtc/WebrtcConnector.js +19 -9
  24. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  25. package/dist/src/connection/webrtc/iceServerAsString.js +1 -2
  26. package/dist/src/connection/webrtc/iceServerAsString.js.map +1 -1
  27. package/dist/src/connection/websocket/AbstractWebsocketClientConnection.d.ts +0 -2
  28. package/dist/src/connection/websocket/WebsocketClientConnectorRpcLocal.d.ts +0 -1
  29. package/dist/src/connection/websocket/WebsocketServerConnection.d.ts +0 -1
  30. package/dist/src/connection/websocket/WebsocketServerConnector.js +28 -18
  31. package/dist/src/connection/websocket/WebsocketServerConnector.js.map +1 -1
  32. package/dist/src/dht/DhtNode.d.ts +1 -0
  33. package/dist/src/dht/DhtNode.js +3 -2
  34. package/dist/src/dht/DhtNode.js.map +1 -1
  35. package/dist/src/dht/DhtNodeRpcLocal.d.ts +1 -1
  36. package/dist/src/dht/PeerManager.d.ts +2 -1
  37. package/dist/src/dht/PeerManager.js +2 -1
  38. package/dist/src/dht/PeerManager.js.map +1 -1
  39. package/dist/src/dht/contact/SortedContactList.js +1 -1
  40. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  41. package/dist/src/dht/discovery/DiscoverySession.d.ts +0 -1
  42. package/dist/src/dht/discovery/PeerDiscovery.d.ts +0 -1
  43. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +0 -1
  44. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +2 -2
  45. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  46. package/dist/src/dht/routing/RoutingSession.js +2 -2
  47. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  48. package/dist/src/dht/routing/RoutingTablesCache.d.ts +1 -1
  49. package/dist/src/dht/store/LocalDataStore.js +1 -1
  50. package/dist/src/dht/store/LocalDataStore.js.map +1 -1
  51. package/dist/src/dht/store/StoreManager.d.ts +1 -1
  52. package/dist/src/dht/store/StoreRpcLocal.d.ts +1 -1
  53. package/dist/src/helpers/AddressTools.js +2 -3
  54. package/dist/src/helpers/AddressTools.js.map +1 -1
  55. package/dist/src/helpers/debugHelpers.js +2 -2
  56. package/dist/src/helpers/debugHelpers.js.map +1 -1
  57. package/dist/src/helpers/protoClasses.d.ts +1 -1
  58. package/dist/src/helpers/protoClasses.js.map +1 -1
  59. package/dist/src/helpers/protoToString.js +1 -2
  60. package/dist/src/helpers/protoToString.js.map +1 -1
  61. package/dist/src/helpers/version.d.ts +1 -1
  62. package/dist/src/helpers/version.js +4 -4
  63. package/dist/src/helpers/version.js.map +1 -1
  64. package/eslint.config.mjs +12 -0
  65. package/jest.config.ts +12 -0
  66. package/package.json +15 -16
  67. package/protos/DhtRpc.proto +6 -4
  68. package/.eslintignore +0 -5
  69. package/.eslintrc +0 -3
  70. package/generated/google/protobuf/any.ts +0 -326
  71. package/generated/google/protobuf/empty.ts +0 -81
  72. package/generated/google/protobuf/timestamp.ts +0 -287
  73. package/generated/packages/dht/protos/DhtRpc.client.ts +0 -419
  74. package/generated/packages/dht/protos/DhtRpc.server.ts +0 -165
  75. package/generated/packages/dht/protos/DhtRpc.ts +0 -1266
  76. package/generated/packages/proto-rpc/protos/ProtoRpc.ts +0 -108
  77. package/jest.config.js +0 -5
  78. package/src/connection/Connection.ts +0 -28
  79. package/src/connection/ConnectionLockRpcLocal.ts +0 -78
  80. package/src/connection/ConnectionLockRpcRemote.ts +0 -64
  81. package/src/connection/ConnectionLockStates.ts +0 -131
  82. package/src/connection/ConnectionManager.ts +0 -661
  83. package/src/connection/ConnectionsView.ts +0 -8
  84. package/src/connection/ConnectorFacade.ts +0 -217
  85. package/src/connection/Handshaker.ts +0 -205
  86. package/src/connection/IConnection.ts +0 -40
  87. package/src/connection/ManagedConnection.ts +0 -113
  88. package/src/connection/OutputBuffer.ts +0 -28
  89. package/src/connection/PendingConnection.ts +0 -68
  90. package/src/connection/connectivityChecker.ts +0 -108
  91. package/src/connection/connectivityRequestHandler.ts +0 -116
  92. package/src/connection/simulator/Simulator.ts +0 -368
  93. package/src/connection/simulator/SimulatorConnection.ts +0 -137
  94. package/src/connection/simulator/SimulatorConnector.ts +0 -98
  95. package/src/connection/simulator/SimulatorTransport.ts +0 -15
  96. package/src/connection/simulator/pings.ts +0 -42
  97. package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -242
  98. package/src/connection/webrtc/IWebrtcConnection.ts +0 -24
  99. package/src/connection/webrtc/NodeWebrtcConnection.ts +0 -247
  100. package/src/connection/webrtc/WebrtcConnector.ts +0 -234
  101. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +0 -108
  102. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +0 -60
  103. package/src/connection/webrtc/iceServerAsString.ts +0 -15
  104. package/src/connection/websocket/AbstractWebsocketClientConnection.ts +0 -122
  105. package/src/connection/websocket/AutoCertifierClientFacade.ts +0 -89
  106. package/src/connection/websocket/BrowserWebsocketClientConnection.ts +0 -44
  107. package/src/connection/websocket/NodeWebsocketClientConnection.ts +0 -39
  108. package/src/connection/websocket/WebsocketClientConnector.ts +0 -119
  109. package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +0 -38
  110. package/src/connection/websocket/WebsocketClientConnectorRpcRemote.ts +0 -19
  111. package/src/connection/websocket/WebsocketServer.ts +0 -164
  112. package/src/connection/websocket/WebsocketServerConnection.ts +0 -109
  113. package/src/connection/websocket/WebsocketServerConnector.ts +0 -286
  114. package/src/dht/DhtNode.ts +0 -678
  115. package/src/dht/DhtNodeRpcLocal.ts +0 -84
  116. package/src/dht/DhtNodeRpcRemote.ts +0 -107
  117. package/src/dht/ExternalApiRpcLocal.ts +0 -58
  118. package/src/dht/ExternalApiRpcRemote.ts +0 -41
  119. package/src/dht/PeerManager.ts +0 -303
  120. package/src/dht/contact/Contact.ts +0 -19
  121. package/src/dht/contact/ContactList.ts +0 -43
  122. package/src/dht/contact/RandomContactList.ts +0 -56
  123. package/src/dht/contact/RingContactList.ts +0 -143
  124. package/src/dht/contact/RpcRemote.ts +0 -72
  125. package/src/dht/contact/SortedContactList.ts +0 -173
  126. package/src/dht/contact/getClosestNodes.ts +0 -24
  127. package/src/dht/contact/ringIdentifiers.ts +0 -62
  128. package/src/dht/discovery/DiscoverySession.ts +0 -129
  129. package/src/dht/discovery/PeerDiscovery.ts +0 -244
  130. package/src/dht/discovery/RingDiscoverySession.ts +0 -148
  131. package/src/dht/recursive-operation/RecursiveOperationManager.ts +0 -251
  132. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +0 -34
  133. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +0 -43
  134. package/src/dht/recursive-operation/RecursiveOperationSession.ts +0 -231
  135. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +0 -35
  136. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +0 -30
  137. package/src/dht/routing/DuplicateDetector.ts +0 -34
  138. package/src/dht/routing/Router.ts +0 -246
  139. package/src/dht/routing/RouterRpcLocal.ts +0 -78
  140. package/src/dht/routing/RouterRpcRemote.ts +0 -80
  141. package/src/dht/routing/RoutingSession.ts +0 -243
  142. package/src/dht/routing/RoutingTablesCache.ts +0 -60
  143. package/src/dht/routing/getPreviousPeer.ts +0 -6
  144. package/src/dht/store/LocalDataStore.ts +0 -84
  145. package/src/dht/store/StoreManager.ts +0 -170
  146. package/src/dht/store/StoreRpcLocal.ts +0 -89
  147. package/src/dht/store/StoreRpcRemote.ts +0 -32
  148. package/src/exports.ts +0 -33
  149. package/src/helpers/AddressTools.ts +0 -28
  150. package/src/helpers/Connectivity.ts +0 -19
  151. package/src/helpers/browser/isBrowserEnvironment.ts +0 -1
  152. package/src/helpers/browser/isBrowserEnvironment_override.ts +0 -3
  153. package/src/helpers/createPeerDescriptor.ts +0 -57
  154. package/src/helpers/createPeerDescriptorSignaturePayload.ts +0 -28
  155. package/src/helpers/debugHelpers.ts +0 -9
  156. package/src/helpers/errors.ts +0 -49
  157. package/src/helpers/offering.ts +0 -15
  158. package/src/helpers/protoClasses.ts +0 -57
  159. package/src/helpers/protoToString.ts +0 -21
  160. package/src/helpers/version.ts +0 -32
  161. package/src/identifiers.ts +0 -29
  162. package/src/rpc-protocol/DhtCallContext.ts +0 -14
  163. package/src/rpc-protocol/DhtRpcOptions.ts +0 -10
  164. package/src/transport/ITransport.ts +0 -37
  165. package/src/transport/ListeningRpcCommunicator.ts +0 -32
  166. package/src/transport/RoutingRpcCommunicator.ts +0 -66
  167. package/src/types/ServiceID.ts +0 -1
  168. package/src/types/textencoding.d.ts +0 -6
  169. package/test/benchmark/Find.test.ts +0 -72
  170. package/test/benchmark/KademliaCorrectness.test.ts +0 -114
  171. package/test/benchmark/RingCorrectness.test.ts +0 -157
  172. package/test/benchmark/SortedContactListBenchmark.test.ts +0 -108
  173. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +0 -41
  174. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +0 -71
  175. package/test/end-to-end/GeoIpLayer0.test.ts +0 -55
  176. package/test/end-to-end/Layer0-Layer1.test.ts +0 -93
  177. package/test/end-to-end/Layer0.test.ts +0 -76
  178. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +0 -110
  179. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +0 -137
  180. package/test/end-to-end/Layer0Webrtc.test.ts +0 -85
  181. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +0 -82
  182. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +0 -76
  183. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +0 -52
  184. package/test/end-to-end/WebsocketConnectionRequest.test.ts +0 -69
  185. package/test/end-to-end/memory-leak.test.ts +0 -80
  186. package/test/integration/ConnectionLocking.test.ts +0 -182
  187. package/test/integration/ConnectionManager.test.ts +0 -528
  188. package/test/integration/ConnectivityChecking.test.ts +0 -53
  189. package/test/integration/DhtJoinPeerDiscovery.test.ts +0 -49
  190. package/test/integration/DhtNode.test.ts +0 -66
  191. package/test/integration/DhtNodeExternalAPI.test.ts +0 -48
  192. package/test/integration/DhtNodeRpcRemote.test.ts +0 -66
  193. package/test/integration/DhtRpc.test.ts +0 -121
  194. package/test/integration/Find.test.ts +0 -45
  195. package/test/integration/GeoIpConnectivityChecking.test.ts +0 -72
  196. package/test/integration/Layer1-scale.test.ts +0 -189
  197. package/test/integration/Mock-Layer1-Layer0.test.ts +0 -85
  198. package/test/integration/MultipleEntryPointJoining.test.ts +0 -105
  199. package/test/integration/ReplicateData.test.ts +0 -104
  200. package/test/integration/RouteMessage.test.ts +0 -230
  201. package/test/integration/RouterRpcRemote.test.ts +0 -77
  202. package/test/integration/SimultaneousConnections.test.ts +0 -316
  203. package/test/integration/Store.test.ts +0 -85
  204. package/test/integration/StoreAndDelete.test.ts +0 -77
  205. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +0 -59
  206. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +0 -51
  207. package/test/integration/StoreRpcRemote.test.ts +0 -54
  208. package/test/integration/WebrtcConnectionManagement.test.ts +0 -219
  209. package/test/integration/WebrtcConnectorRpc.test.ts +0 -125
  210. package/test/integration/Websocket.test.ts +0 -65
  211. package/test/integration/WebsocketClientConnectorRpc.test.ts +0 -69
  212. package/test/integration/WebsocketConnectionManagement.test.ts +0 -191
  213. package/test/integration/rpc-connections-over-webrtc.test.ts +0 -158
  214. package/test/kademlia-simulation/data/nodeids.json +0 -13002
  215. package/test/kademlia-simulation/data/orderedneighbors.json +0 -1001
  216. package/test/types/global.d.ts +0 -1
  217. package/test/unit/AddressTools.test.ts +0 -44
  218. package/test/unit/AutoCertifierClientFacade.test.ts +0 -58
  219. package/test/unit/ConnectionManager.test.ts +0 -65
  220. package/test/unit/ConnectivityHelpers.test.ts +0 -61
  221. package/test/unit/DiscoverySession.test.ts +0 -87
  222. package/test/unit/DuplicateDetector.test.ts +0 -31
  223. package/test/unit/Handshaker.test.ts +0 -169
  224. package/test/unit/ListeningRpcCommunicator.test.ts +0 -52
  225. package/test/unit/LocalDataStore.test.ts +0 -108
  226. package/test/unit/ManagedConnection.test.ts +0 -58
  227. package/test/unit/PeerManager.test.ts +0 -93
  228. package/test/unit/PendingConnection.test.ts +0 -57
  229. package/test/unit/ProtobufMessage.test.ts +0 -21
  230. package/test/unit/RandomContactList.test.ts +0 -58
  231. package/test/unit/RecursiveOperationManager.test.ts +0 -161
  232. package/test/unit/RecursiveOperationSession.test.ts +0 -68
  233. package/test/unit/Router.test.ts +0 -137
  234. package/test/unit/RoutingSession.test.ts +0 -79
  235. package/test/unit/SortedContactList.test.ts +0 -115
  236. package/test/unit/StoreManager.test.ts +0 -146
  237. package/test/unit/StoreRpcLocal.test.ts +0 -167
  238. package/test/unit/WebrtcConnection.test.ts +0 -29
  239. package/test/unit/WebrtcConnector.test.ts +0 -56
  240. package/test/unit/WebsocketClientConnector.test.ts +0 -101
  241. package/test/unit/WebsocketServer.test.ts +0 -66
  242. package/test/unit/WebsocketServerConnector.test.ts +0 -102
  243. package/test/unit/connectivityRequestHandler.test.ts +0 -104
  244. package/test/unit/createPeerDescriptor.test.ts +0 -69
  245. package/test/unit/customMatchers.test.ts +0 -16
  246. package/test/unit/getClosestNodes.test.ts +0 -30
  247. package/test/unit/version.test.ts +0 -18
  248. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +0 -18
  249. package/test/utils/FakeConnectorFacade.ts +0 -41
  250. package/test/utils/FakeRpcCommunicator.ts +0 -23
  251. package/test/utils/FakeTransport.ts +0 -79
  252. package/test/utils/customMatchers.ts +0 -71
  253. package/test/utils/mock/MockConnection.ts +0 -26
  254. package/test/utils/mock/MockConnectionsView.ts +0 -18
  255. package/test/utils/mock/MockRouter.ts +0 -62
  256. package/test/utils/mock/MockRpcCommunicator.ts +0 -7
  257. package/test/utils/mock/MockTransport.ts +0 -26
  258. package/test/utils/mock/mockDataEntry.ts +0 -38
  259. package/test/utils/topology.ts +0 -80
  260. package/test/utils/utils.ts +0 -268
  261. package/tsconfig.browser.json +0 -17
  262. package/tsconfig.jest.json +0 -25
  263. package/tsconfig.json +0 -3
  264. package/tsconfig.node.json +0 -24
@@ -1,109 +0,0 @@
1
- import EventEmitter from 'eventemitter3'
2
- import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection'
3
- import WebSocket from 'ws'
4
- import { Logger } from '@streamr/utils'
5
- import { Url } from 'url'
6
- import { CUSTOM_GOING_AWAY, GOING_AWAY } from './AbstractWebsocketClientConnection'
7
- import { createRandomConnectionId } from '../Connection'
8
-
9
- const logger = new Logger(module)
10
-
11
- export class WebsocketServerConnection extends EventEmitter<ConnectionEvents> implements IConnection {
12
-
13
- public readonly connectionId: ConnectionID
14
- public readonly connectionType = ConnectionType.WEBSOCKET_SERVER
15
- public readonly resourceURL: Url
16
- private readonly remoteIpAddress: string
17
- private socket?: WebSocket
18
- private stopped = false
19
-
20
- constructor(socket: WebSocket, resourceURL: Url, remoteAddress: string) {
21
- super()
22
-
23
- this.onMessage = this.onMessage.bind(this)
24
- this.onClose = this.onClose.bind(this)
25
- this.onError = this.onError.bind(this)
26
-
27
- this.resourceURL = resourceURL
28
- this.connectionId = createRandomConnectionId()
29
- this.remoteIpAddress = remoteAddress
30
-
31
- socket.on('message', this.onMessage)
32
- socket.on('close', this.onClose)
33
- socket.on('error', this.onError)
34
-
35
- this.socket = socket
36
- }
37
-
38
- // use a getter to make it possible to mock the value in tests
39
- public getRemoteIpAddress(): string {
40
- return this.remoteIpAddress
41
- }
42
-
43
- private onMessage(message: WebSocket.RawData, isBinary: boolean): void {
44
- if (!isBinary) {
45
- logger.trace('Received string Message')
46
- } else {
47
- logger.trace('Websocket server received Message')
48
- this.emit('data', new Uint8Array(message as Buffer))
49
- }
50
- }
51
-
52
- private onClose(reasonCode: number, description: string): void {
53
- logger.trace('Peer ' + this.remoteIpAddress + ' disconnected.')
54
- this.doDisconnect(reasonCode, description)
55
- }
56
-
57
- private onError(error: Error): void {
58
- this.emit('error', error.name)
59
- }
60
-
61
- private stopListening(): void {
62
- this.socket?.off('message', this.onMessage)
63
- this.socket?.off('close', this.onClose)
64
- this.socket?.off('error', this.onError)
65
- }
66
-
67
- private doDisconnect(reasonCode: number, description: string): void {
68
- this.stopped = true
69
- this.stopListening()
70
- this.socket = undefined
71
- const gracefulLeave = (reasonCode === GOING_AWAY) || (reasonCode === CUSTOM_GOING_AWAY)
72
- this.emit('disconnected', gracefulLeave, reasonCode, description)
73
- }
74
-
75
- public send(data: Uint8Array): void {
76
- // TODO: no need to check this.socket as it is always defined when stopped is false?
77
- if (!this.stopped && this.socket) {
78
- this.socket.send(data, { binary: true })
79
- } else {
80
- logger.debug('Tried to call send() on a stopped socket')
81
- }
82
-
83
- }
84
-
85
- public async close(gracefulLeave: boolean): Promise<void> {
86
- this.emit('disconnected', gracefulLeave, undefined, 'close() called')
87
- this.removeAllListeners()
88
- if (!this.stopped) {
89
- this.socket?.close(gracefulLeave ? GOING_AWAY : undefined)
90
- } else {
91
- logger.debug('Tried to close a stopped connection')
92
- }
93
- }
94
-
95
- // TODO could rename to "closeSilently?"
96
- public destroy(): void {
97
- if (!this.stopped) {
98
- this.removeAllListeners()
99
- if (this.socket) {
100
- this.stopListening()
101
- this.socket.close()
102
- this.socket = undefined
103
- }
104
- this.stopped = true
105
- } else {
106
- logger.debug('Tried to destroy() a stopped connection')
107
- }
108
- }
109
- }
@@ -1,286 +0,0 @@
1
- import { GeoIpLocator } from '@streamr/geoip-location'
2
- import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
3
- import { Action, connectivityMethodToWebsocketUrl } from './WebsocketClientConnector'
4
- import { WebsocketServer } from './WebsocketServer'
5
- import { areEqualPeerDescriptors, DhtAddress, toNodeId } from '../../identifiers'
6
- import { AutoCertifierClientFacade } from './AutoCertifierClientFacade'
7
- import { ConnectivityResponse, HandshakeError, PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc'
8
- import { NatType, PortRange, TlsCertificate } from '../ConnectionManager'
9
- import { ITransport } from '../../transport/ITransport'
10
- import { ipv4ToNumber, Logger, wait } from '@streamr/utils'
11
- import { attachConnectivityRequestHandler, DISABLE_CONNECTIVITY_PROBE } from '../connectivityRequestHandler'
12
- import { WebsocketServerConnection } from './WebsocketServerConnection'
13
- import { ConnectionType, IConnection } from '../IConnection'
14
- import queryString from 'querystring'
15
- import { isMaybeSupportedVersion, LOCAL_PROTOCOL_VERSION } from '../../helpers/version'
16
- import { shuffle } from 'lodash'
17
- import { sendConnectivityRequest } from '../connectivityChecker'
18
- import { acceptHandshake, Handshaker, rejectHandshake } from '../Handshaker'
19
- import { WebsocketClientConnectorRpcRemote } from './WebsocketClientConnectorRpcRemote'
20
- import { WebsocketClientConnectorRpcClient } from '../../../generated/packages/dht/protos/DhtRpc.client'
21
- import { WebsocketServerStartError } from '../../helpers/errors'
22
- import * as Err from '../../helpers/errors'
23
- import { expectedConnectionType } from '../../helpers/Connectivity'
24
- import { PendingConnection } from '../PendingConnection'
25
-
26
- const logger = new Logger(module)
27
-
28
- export interface WebsocketServerConnectorOptions {
29
- onNewConnection: (connection: PendingConnection) => boolean
30
- rpcCommunicator: ListeningRpcCommunicator
31
- hasConnection: (nodeId: DhtAddress) => boolean
32
- portRange?: PortRange
33
- maxMessageSize?: number
34
- host?: string
35
- entrypoints?: PeerDescriptor[]
36
- tlsCertificate?: TlsCertificate
37
- autoCertifierTransport: ITransport
38
- autoCertifierUrl: string
39
- autoCertifierConfigFile: string
40
- serverEnableTls: boolean
41
- geoIpDatabaseFolder?: string
42
- }
43
-
44
- // TODO: Could delFunc be removed here if the Handshaker event based clean up works correctly now?
45
- interface OngoingConnectionRequest {
46
- delFunc: () => void
47
- pendingConnection: PendingConnection
48
- }
49
-
50
- // TODO: Move server starting logic including autocertification and connectivity checking to WebsocketServer.ts?
51
- export class WebsocketServerConnector {
52
-
53
- private readonly websocketServer?: WebsocketServer
54
- private geoIpLocator?: GeoIpLocator
55
- private readonly ongoingConnectRequests: Map<DhtAddress, OngoingConnectionRequest> = new Map()
56
- private host?: string
57
- private autoCertifierClient?: AutoCertifierClientFacade
58
- private selectedPort?: number
59
- private localPeerDescriptor?: PeerDescriptor
60
- private abortController = new AbortController()
61
- private readonly options: WebsocketServerConnectorOptions
62
-
63
- constructor(options: WebsocketServerConnectorOptions) {
64
- this.options = options
65
- this.websocketServer = options.portRange ? new WebsocketServer({
66
- portRange: options.portRange,
67
- tlsCertificate: options.tlsCertificate,
68
- maxMessageSize: options.maxMessageSize,
69
- enableTls: options.serverEnableTls
70
- }) : undefined
71
- this.host = options.host
72
- }
73
-
74
- public async start(): Promise<void> {
75
- if (!this.abortController.signal.aborted && this.websocketServer) {
76
- this.websocketServer.on('connected', (connection: IConnection) => {
77
- const serverSocket = connection as unknown as WebsocketServerConnection
78
- const query = queryString.parse(serverSocket.resourceURL.query as string ?? '')
79
- const action = query.action as (Action | undefined)
80
- logger.trace('WebSocket client connected', { action, remoteAddress: serverSocket.getRemoteIpAddress() })
81
- if (action === 'connectivityRequest') {
82
- attachConnectivityRequestHandler(serverSocket, this.geoIpLocator)
83
- } else if (action === 'connectivityProbe') {
84
- // no-op
85
- } else {
86
- // The localPeerDescriptor can be undefined here as the WS server is used for connectivity checks
87
- // before the localPeerDescriptor is set during start.
88
- // Handshaked connections should be rejected before the localPeerDescriptor is set.
89
- // eslint-disable-next-line no-lonely-if
90
- if (this.localPeerDescriptor !== undefined) {
91
- this.attachHandshaker(connection)
92
- } else {
93
- logger.trace('incoming Websocket connection before localPeerDescriptor was set, closing connection')
94
- connection.close(false).catch(() => {})
95
- }
96
- }
97
- })
98
-
99
- if (this.options.geoIpDatabaseFolder) {
100
- const geoIpLocator = new GeoIpLocator(this.options.geoIpDatabaseFolder)
101
- try {
102
- await geoIpLocator.start()
103
- this.geoIpLocator = geoIpLocator
104
- } catch (err) {
105
- logger.error('Failed to start GeoIpLocator', { err })
106
- }
107
- }
108
-
109
- const port = await this.websocketServer.start()
110
- this.selectedPort = port
111
- }
112
- }
113
-
114
- private attachHandshaker(connection: IConnection) {
115
- // TODO: use createIncomingHandshaker here?
116
- const handshaker = new Handshaker(this.localPeerDescriptor!, connection)
117
- handshaker.once('handshakeRequest', (localPeerDescriptor: PeerDescriptor, sourceVersion: string, remotePeerDescriptor?: PeerDescriptor) => {
118
- this.onServerSocketHandshakeRequest(localPeerDescriptor, connection, handshaker, sourceVersion, remotePeerDescriptor)
119
- })
120
- }
121
-
122
- private onServerSocketHandshakeRequest(
123
- sourcePeerDescriptor: PeerDescriptor,
124
- websocketServerConnection: IConnection,
125
- handshaker: Handshaker,
126
- remoteVersion: string,
127
- targetPeerDescriptor?: PeerDescriptor
128
- ) {
129
- const nodeId = toNodeId(sourcePeerDescriptor)
130
- if (this.ongoingConnectRequests.has(nodeId)) {
131
- const { pendingConnection, delFunc } = this.ongoingConnectRequests.get(nodeId)!
132
- if (!isMaybeSupportedVersion(remoteVersion)) {
133
- rejectHandshake(pendingConnection, websocketServerConnection, handshaker, HandshakeError.UNSUPPORTED_VERSION)
134
- delFunc()
135
- } else if (targetPeerDescriptor && !areEqualPeerDescriptors(this.localPeerDescriptor!, targetPeerDescriptor)) {
136
- rejectHandshake(pendingConnection, websocketServerConnection, handshaker, HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR)
137
- delFunc()
138
- } else {
139
- acceptHandshake(handshaker, pendingConnection, websocketServerConnection)
140
- }
141
- } else {
142
- const pendingConnection = new PendingConnection(sourcePeerDescriptor)
143
-
144
- if (!isMaybeSupportedVersion(remoteVersion)) {
145
- rejectHandshake(pendingConnection, websocketServerConnection, handshaker, HandshakeError.UNSUPPORTED_VERSION)
146
- } else if (targetPeerDescriptor && !areEqualPeerDescriptors(this.localPeerDescriptor!, targetPeerDescriptor)) {
147
- rejectHandshake(pendingConnection, websocketServerConnection, handshaker, HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR)
148
- } else if (this.options.onNewConnection(pendingConnection)) {
149
- acceptHandshake(handshaker, pendingConnection, websocketServerConnection)
150
- } else {
151
- rejectHandshake(pendingConnection, websocketServerConnection, handshaker, HandshakeError.DUPLICATE_CONNECTION)
152
- }
153
- }
154
- }
155
-
156
- public async checkConnectivity(allowSelfSignedCertificate: boolean): Promise<ConnectivityResponse> {
157
- // TODO: this could throw?
158
- if (this.abortController.signal.aborted) {
159
- return {
160
- host: '127.0.0.1',
161
- natType: NatType.UNKNOWN,
162
- ipAddress: ipv4ToNumber('127.0.0.1'),
163
- version: LOCAL_PROTOCOL_VERSION
164
- }
165
- }
166
- if (!this.options.entrypoints || this.options.entrypoints.length === 0) {
167
- // return connectivity info given in options
168
- return {
169
- host: this.host!,
170
- natType: NatType.OPEN_INTERNET,
171
- websocket: {
172
- host: this.host!,
173
- port: this.selectedPort!,
174
- tls: this.options.tlsCertificate !== undefined
175
- },
176
- // TODO: Resolve the given host name or or use as is if IP was given.
177
- ipAddress: ipv4ToNumber('127.0.0.1'),
178
- version: LOCAL_PROTOCOL_VERSION
179
- }
180
- }
181
- const shuffledEntrypoints = shuffle(this.options.entrypoints)
182
- while (shuffledEntrypoints.length > 0 && !this.abortController.signal.aborted) {
183
- const entryPoint = shuffledEntrypoints[0]
184
- try {
185
- // Do real connectivity checking
186
- const connectivityRequest = {
187
- port: this.selectedPort ?? DISABLE_CONNECTIVITY_PROBE,
188
- host: this.host,
189
- tls: this.websocketServer ? this.options.serverEnableTls : false,
190
- allowSelfSignedCertificate
191
- }
192
- if (!this.abortController.signal.aborted) {
193
- return await sendConnectivityRequest(connectivityRequest, entryPoint)
194
- } else {
195
- throw new Err.ConnectionFailed('ConnectivityChecker is destroyed')
196
- }
197
- } catch (err) {
198
- const error = `Failed to connect to entrypoint with id ${toNodeId(entryPoint)} `
199
- + `and URL ${connectivityMethodToWebsocketUrl(entryPoint.websocket!)}`
200
- logger.error(error, { err })
201
- shuffledEntrypoints.shift()
202
- await wait(2000, this.abortController.signal)
203
- }
204
- }
205
- throw new WebsocketServerStartError(
206
- `Failed to connect to the entrypoints after ${this.options.entrypoints.length} attempts\n`
207
- + `Attempted hosts: ${this.options.entrypoints.map((entry) => `${entry.websocket!.host}:${entry.websocket!.port}`).join(', ')}`
208
- )
209
- }
210
-
211
- public async autoCertify(): Promise<void> {
212
- this.autoCertifierClient = new AutoCertifierClientFacade({
213
- configFile: this.options.autoCertifierConfigFile,
214
- transport: this.options.autoCertifierTransport,
215
- url: this.options.autoCertifierUrl,
216
- wsServerPort: this.selectedPort!,
217
- setHost: (hostName: string) => this.setHost(hostName),
218
- updateCertificate: (certificate: string, privateKey: string) => this.websocketServer!.updateCertificate(certificate, privateKey)
219
- })
220
- logger.trace(`AutoCertifying subdomain...`)
221
- await this.autoCertifierClient.start()
222
- }
223
-
224
- private setHost(hostName: string): void {
225
- logger.trace(`Setting host name to ${hostName}`)
226
- this.host = hostName
227
- }
228
-
229
- public connect(targetPeerDescriptor: PeerDescriptor): PendingConnection {
230
- const nodeId = toNodeId(targetPeerDescriptor)
231
- if (this.ongoingConnectRequests.has(nodeId)) {
232
- return this.ongoingConnectRequests.get(nodeId)!.pendingConnection
233
- }
234
- return this.requestConnectionFromPeer(this.localPeerDescriptor!, targetPeerDescriptor)
235
- }
236
-
237
- private requestConnectionFromPeer(localPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): PendingConnection {
238
- setImmediate(() => {
239
- const remoteConnector = new WebsocketClientConnectorRpcRemote(
240
- localPeerDescriptor,
241
- targetPeerDescriptor,
242
- this.options.rpcCommunicator,
243
- WebsocketClientConnectorRpcClient
244
- )
245
- remoteConnector.requestConnection().then(() => {
246
- logger.trace('Sent WebsocketConnectionRequest notification to peer', { targetPeerDescriptor })
247
- }, (err) => {
248
- logger.debug('Failed to send WebsocketConnectionRequest notification to peer ', {
249
- error: err, targetPeerDescriptor
250
- })
251
- })
252
- })
253
- const pendingConnection = new PendingConnection(targetPeerDescriptor)
254
- const nodeId = toNodeId(targetPeerDescriptor)
255
- // TODO: can this leak?
256
- const delFunc = () => {
257
- pendingConnection.off('connected', delFunc)
258
- pendingConnection.off('disconnected', delFunc)
259
- this.ongoingConnectRequests.delete(nodeId)
260
- }
261
- pendingConnection.on('connected', delFunc)
262
- pendingConnection.on('disconnected', delFunc)
263
- this.ongoingConnectRequests.set(nodeId, { pendingConnection, delFunc })
264
- return pendingConnection
265
- }
266
-
267
- public isPossibleToFormConnection(targetPeerDescriptor: PeerDescriptor): boolean {
268
- const connectionType = expectedConnectionType(this.localPeerDescriptor!, targetPeerDescriptor)
269
- return (connectionType === ConnectionType.WEBSOCKET_SERVER)
270
- }
271
-
272
- public setLocalPeerDescriptor(localPeerDescriptor: PeerDescriptor): void {
273
- this.localPeerDescriptor = localPeerDescriptor
274
- }
275
-
276
- public async destroy(): Promise<void> {
277
- this.abortController.abort()
278
-
279
- const requests = Array.from(this.ongoingConnectRequests.values())
280
- await Promise.allSettled(requests.map((ongoingConnectRequest) => ongoingConnectRequest.pendingConnection.close(true)))
281
-
282
- await this.websocketServer?.stop()
283
- this.geoIpLocator?.stop()
284
- }
285
-
286
- }