@streamr/dht 102.0.0-beta.1 → 102.0.0-beta.3

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