@streamr/dht 102.0.0-beta.1 → 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 (210) 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/src/connection/Connection.ts +0 -28
  25. package/src/connection/ConnectionLockRpcLocal.ts +0 -78
  26. package/src/connection/ConnectionLockRpcRemote.ts +0 -64
  27. package/src/connection/ConnectionLockStates.ts +0 -131
  28. package/src/connection/ConnectionManager.ts +0 -661
  29. package/src/connection/ConnectionsView.ts +0 -8
  30. package/src/connection/ConnectorFacade.ts +0 -217
  31. package/src/connection/Handshaker.ts +0 -209
  32. package/src/connection/IConnection.ts +0 -40
  33. package/src/connection/ManagedConnection.ts +0 -113
  34. package/src/connection/OutputBuffer.ts +0 -28
  35. package/src/connection/PendingConnection.ts +0 -68
  36. package/src/connection/connectivityChecker.ts +0 -108
  37. package/src/connection/connectivityRequestHandler.ts +0 -116
  38. package/src/connection/simulator/Simulator.ts +0 -369
  39. package/src/connection/simulator/SimulatorConnection.ts +0 -137
  40. package/src/connection/simulator/SimulatorConnector.ts +0 -98
  41. package/src/connection/simulator/SimulatorTransport.ts +0 -15
  42. package/src/connection/simulator/pings.ts +0 -42
  43. package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -242
  44. package/src/connection/webrtc/IWebrtcConnection.ts +0 -24
  45. package/src/connection/webrtc/NodeWebrtcConnection.ts +0 -245
  46. package/src/connection/webrtc/WebrtcConnector.ts +0 -234
  47. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +0 -108
  48. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +0 -60
  49. package/src/connection/webrtc/iceServerAsString.ts +0 -15
  50. package/src/connection/websocket/AbstractWebsocketClientConnection.ts +0 -122
  51. package/src/connection/websocket/AutoCertifierClientFacade.ts +0 -89
  52. package/src/connection/websocket/BrowserWebsocketClientConnection.ts +0 -44
  53. package/src/connection/websocket/NodeWebsocketClientConnection.ts +0 -39
  54. package/src/connection/websocket/WebsocketClientConnector.ts +0 -119
  55. package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +0 -38
  56. package/src/connection/websocket/WebsocketClientConnectorRpcRemote.ts +0 -19
  57. package/src/connection/websocket/WebsocketServer.ts +0 -164
  58. package/src/connection/websocket/WebsocketServerConnection.ts +0 -109
  59. package/src/connection/websocket/WebsocketServerConnector.ts +0 -290
  60. package/src/dht/DhtNode.ts +0 -683
  61. package/src/dht/DhtNodeRpcLocal.ts +0 -84
  62. package/src/dht/DhtNodeRpcRemote.ts +0 -107
  63. package/src/dht/ExternalApiRpcLocal.ts +0 -58
  64. package/src/dht/ExternalApiRpcRemote.ts +0 -41
  65. package/src/dht/PeerManager.ts +0 -305
  66. package/src/dht/contact/Contact.ts +0 -19
  67. package/src/dht/contact/ContactList.ts +0 -43
  68. package/src/dht/contact/RandomContactList.ts +0 -56
  69. package/src/dht/contact/RingContactList.ts +0 -143
  70. package/src/dht/contact/RpcRemote.ts +0 -72
  71. package/src/dht/contact/SortedContactList.ts +0 -173
  72. package/src/dht/contact/getClosestNodes.ts +0 -24
  73. package/src/dht/contact/ringIdentifiers.ts +0 -62
  74. package/src/dht/discovery/DiscoverySession.ts +0 -129
  75. package/src/dht/discovery/PeerDiscovery.ts +0 -244
  76. package/src/dht/discovery/RingDiscoverySession.ts +0 -148
  77. package/src/dht/recursive-operation/RecursiveOperationManager.ts +0 -251
  78. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +0 -34
  79. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +0 -43
  80. package/src/dht/recursive-operation/RecursiveOperationSession.ts +0 -231
  81. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +0 -35
  82. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +0 -30
  83. package/src/dht/routing/DuplicateDetector.ts +0 -34
  84. package/src/dht/routing/Router.ts +0 -246
  85. package/src/dht/routing/RouterRpcLocal.ts +0 -78
  86. package/src/dht/routing/RouterRpcRemote.ts +0 -80
  87. package/src/dht/routing/RoutingSession.ts +0 -243
  88. package/src/dht/routing/RoutingTablesCache.ts +0 -60
  89. package/src/dht/routing/getPreviousPeer.ts +0 -6
  90. package/src/dht/store/LocalDataStore.ts +0 -84
  91. package/src/dht/store/StoreManager.ts +0 -170
  92. package/src/dht/store/StoreRpcLocal.ts +0 -89
  93. package/src/dht/store/StoreRpcRemote.ts +0 -32
  94. package/src/exports.ts +0 -33
  95. package/src/helpers/AddressTools.ts +0 -28
  96. package/src/helpers/Connectivity.ts +0 -19
  97. package/src/helpers/browser/isBrowserEnvironment.ts +0 -1
  98. package/src/helpers/browser/isBrowserEnvironment_override.ts +0 -3
  99. package/src/helpers/createPeerDescriptor.ts +0 -57
  100. package/src/helpers/createPeerDescriptorSignaturePayload.ts +0 -28
  101. package/src/helpers/debugHelpers.ts +0 -9
  102. package/src/helpers/errors.ts +0 -49
  103. package/src/helpers/offering.ts +0 -15
  104. package/src/helpers/protoClasses.ts +0 -57
  105. package/src/helpers/protoToString.ts +0 -21
  106. package/src/helpers/version.ts +0 -32
  107. package/src/identifiers.ts +0 -29
  108. package/src/rpc-protocol/DhtCallContext.ts +0 -14
  109. package/src/rpc-protocol/DhtRpcOptions.ts +0 -10
  110. package/src/transport/ITransport.ts +0 -37
  111. package/src/transport/ListeningRpcCommunicator.ts +0 -32
  112. package/src/transport/RoutingRpcCommunicator.ts +0 -66
  113. package/src/types/ServiceID.ts +0 -1
  114. package/src/types/textencoding.d.ts +0 -6
  115. package/test/benchmark/Find.test.ts +0 -72
  116. package/test/benchmark/KademliaCorrectness.test.ts +0 -114
  117. package/test/benchmark/RingCorrectness.test.ts +0 -157
  118. package/test/benchmark/SortedContactListBenchmark.test.ts +0 -108
  119. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +0 -41
  120. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +0 -71
  121. package/test/end-to-end/GeoIpLayer0.test.ts +0 -55
  122. package/test/end-to-end/Layer0-Layer1.test.ts +0 -93
  123. package/test/end-to-end/Layer0.test.ts +0 -76
  124. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +0 -110
  125. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +0 -137
  126. package/test/end-to-end/Layer0Webrtc.test.ts +0 -85
  127. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +0 -82
  128. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +0 -76
  129. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +0 -52
  130. package/test/end-to-end/WebsocketConnectionRequest.test.ts +0 -69
  131. package/test/end-to-end/memory-leak.test.ts +0 -80
  132. package/test/integration/ConnectionLocking.test.ts +0 -192
  133. package/test/integration/ConnectionManager.test.ts +0 -528
  134. package/test/integration/ConnectivityChecking.test.ts +0 -53
  135. package/test/integration/DhtJoinPeerDiscovery.test.ts +0 -49
  136. package/test/integration/DhtNode.test.ts +0 -66
  137. package/test/integration/DhtNodeExternalAPI.test.ts +0 -48
  138. package/test/integration/DhtNodeRpcRemote.test.ts +0 -66
  139. package/test/integration/DhtRpc.test.ts +0 -121
  140. package/test/integration/Find.test.ts +0 -45
  141. package/test/integration/GeoIpConnectivityChecking.test.ts +0 -72
  142. package/test/integration/Layer1-scale.test.ts +0 -189
  143. package/test/integration/Mock-Layer1-Layer0.test.ts +0 -85
  144. package/test/integration/MultipleEntryPointJoining.test.ts +0 -105
  145. package/test/integration/ReplicateData.test.ts +0 -104
  146. package/test/integration/RouteMessage.test.ts +0 -230
  147. package/test/integration/RouterRpcRemote.test.ts +0 -77
  148. package/test/integration/SimultaneousConnections.test.ts +0 -316
  149. package/test/integration/Store.test.ts +0 -85
  150. package/test/integration/StoreAndDelete.test.ts +0 -77
  151. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +0 -59
  152. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +0 -51
  153. package/test/integration/StoreRpcRemote.test.ts +0 -54
  154. package/test/integration/WebrtcConnectionManagement.test.ts +0 -191
  155. package/test/integration/WebrtcConnectorRpc.test.ts +0 -125
  156. package/test/integration/Websocket.test.ts +0 -65
  157. package/test/integration/WebsocketClientConnectorRpc.test.ts +0 -69
  158. package/test/integration/WebsocketConnectionManagement.test.ts +0 -191
  159. package/test/integration/rpc-connections-over-webrtc.test.ts +0 -123
  160. package/test/kademlia-simulation/data/nodeids.json +0 -13002
  161. package/test/kademlia-simulation/data/orderedneighbors.json +0 -1001
  162. package/test/types/global.d.ts +0 -1
  163. package/test/unit/AddressTools.test.ts +0 -44
  164. package/test/unit/AutoCertifierClientFacade.test.ts +0 -58
  165. package/test/unit/ConnectionManager.test.ts +0 -65
  166. package/test/unit/ConnectivityHelpers.test.ts +0 -61
  167. package/test/unit/DiscoverySession.test.ts +0 -87
  168. package/test/unit/DuplicateDetector.test.ts +0 -31
  169. package/test/unit/Handshaker.test.ts +0 -169
  170. package/test/unit/ListeningRpcCommunicator.test.ts +0 -52
  171. package/test/unit/LocalDataStore.test.ts +0 -108
  172. package/test/unit/ManagedConnection.test.ts +0 -58
  173. package/test/unit/PeerManager.test.ts +0 -93
  174. package/test/unit/PendingConnection.test.ts +0 -57
  175. package/test/unit/ProtobufMessage.test.ts +0 -21
  176. package/test/unit/RandomContactList.test.ts +0 -58
  177. package/test/unit/RecursiveOperationManager.test.ts +0 -161
  178. package/test/unit/RecursiveOperationSession.test.ts +0 -68
  179. package/test/unit/Router.test.ts +0 -137
  180. package/test/unit/RoutingSession.test.ts +0 -86
  181. package/test/unit/SortedContactList.test.ts +0 -115
  182. package/test/unit/StoreManager.test.ts +0 -146
  183. package/test/unit/StoreRpcLocal.test.ts +0 -167
  184. package/test/unit/WebrtcConnection.test.ts +0 -29
  185. package/test/unit/WebrtcConnector.test.ts +0 -56
  186. package/test/unit/WebsocketClientConnector.test.ts +0 -101
  187. package/test/unit/WebsocketServer.test.ts +0 -66
  188. package/test/unit/WebsocketServerConnector.test.ts +0 -102
  189. package/test/unit/connectivityRequestHandler.test.ts +0 -104
  190. package/test/unit/createPeerDescriptor.test.ts +0 -69
  191. package/test/unit/customMatchers.test.ts +0 -34
  192. package/test/unit/getClosestNodes.test.ts +0 -30
  193. package/test/unit/version.test.ts +0 -18
  194. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +0 -18
  195. package/test/utils/FakeConnectorFacade.ts +0 -41
  196. package/test/utils/FakeRpcCommunicator.ts +0 -23
  197. package/test/utils/FakeTransport.ts +0 -79
  198. package/test/utils/customMatchers.ts +0 -71
  199. package/test/utils/mock/MockConnection.ts +0 -26
  200. package/test/utils/mock/MockConnectionsView.ts +0 -18
  201. package/test/utils/mock/MockRouter.ts +0 -62
  202. package/test/utils/mock/MockRpcCommunicator.ts +0 -7
  203. package/test/utils/mock/MockTransport.ts +0 -26
  204. package/test/utils/mock/mockDataEntry.ts +0 -38
  205. package/test/utils/topology.ts +0 -79
  206. package/test/utils/utils.ts +0 -268
  207. package/tsconfig.browser.json +0 -17
  208. package/tsconfig.jest.json +0 -25
  209. package/tsconfig.json +0 -3
  210. 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
- }