@streamr/dht 0.0.1-tatum.6 → 0.0.1-tatum.8

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 (255) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +1 -1
  2. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  3. package/dist/src/connection/ConnectionLockRpcRemote.d.ts +10 -0
  4. package/dist/src/connection/{RemoteConnectionLocker.js → ConnectionLockRpcRemote.js} +21 -35
  5. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -0
  6. package/dist/src/connection/ConnectionManager.d.ts +17 -41
  7. package/dist/src/connection/ConnectionManager.js +148 -212
  8. package/dist/src/connection/ConnectionManager.js.map +1 -1
  9. package/dist/src/connection/ConnectivityChecker.js +16 -13
  10. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  11. package/dist/src/connection/ConnectorFacade.d.ts +49 -0
  12. package/dist/src/connection/ConnectorFacade.js +83 -0
  13. package/dist/src/connection/ConnectorFacade.js.map +1 -0
  14. package/dist/src/connection/Handshaker.d.ts +1 -2
  15. package/dist/src/connection/Handshaker.js +1 -4
  16. package/dist/src/connection/Handshaker.js.map +1 -1
  17. package/dist/src/connection/ManagedConnection.d.ts +2 -6
  18. package/dist/src/connection/ManagedConnection.js +27 -36
  19. package/dist/src/connection/ManagedConnection.js.map +1 -1
  20. package/dist/src/connection/ManagedWebRtcConnection.d.ts +1 -1
  21. package/dist/src/connection/ManagedWebRtcConnection.js +2 -2
  22. package/dist/src/connection/ManagedWebRtcConnection.js.map +1 -1
  23. package/dist/src/connection/Simulator/Simulator.d.ts +0 -2
  24. package/dist/src/connection/Simulator/Simulator.js +0 -5
  25. package/dist/src/connection/Simulator/Simulator.js.map +1 -1
  26. package/dist/src/connection/Simulator/SimulatorConnection.js +16 -13
  27. package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -1
  28. package/dist/src/connection/Simulator/SimulatorConnector.d.ts +2 -3
  29. package/dist/src/connection/Simulator/SimulatorConnector.js +12 -14
  30. package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -1
  31. package/dist/src/connection/Simulator/SimulatorTransport.js +6 -1
  32. package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -1
  33. package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +3 -1
  34. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +12 -12
  35. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -1
  36. package/dist/src/connection/WebRTC/{WebRtcConnector.d.ts → WebRtcConnectorRpcLocal.d.ts} +13 -13
  37. package/dist/src/connection/WebRTC/{WebRtcConnector.js → WebRtcConnectorRpcLocal.js} +46 -38
  38. package/dist/src/connection/WebRTC/WebRtcConnectorRpcLocal.js.map +1 -0
  39. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.d.ts +11 -0
  40. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js +55 -0
  41. package/dist/src/connection/WebRTC/WebRtcConnectorRpcRemote.js.map +1 -0
  42. package/dist/src/connection/WebRTC/iceServerAsString.d.ts +1 -1
  43. package/dist/src/connection/WebSocket/{WebSocketConnector.d.ts → WebSocketConnectorRpcLocal.d.ts} +21 -11
  44. package/dist/src/connection/WebSocket/{WebSocketConnector.js → WebSocketConnectorRpcLocal.js} +80 -59
  45. package/dist/src/connection/WebSocket/WebSocketConnectorRpcLocal.js.map +1 -0
  46. package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.d.ts +8 -0
  47. package/dist/src/connection/WebSocket/{RemoteWebSocketConnector.js → WebSocketConnectorRpcRemote.js} +12 -16
  48. package/dist/src/connection/WebSocket/WebSocketConnectorRpcRemote.js.map +1 -0
  49. package/dist/src/connection/WebSocket/WebSocketServer.d.ts +11 -1
  50. package/dist/src/connection/WebSocket/WebSocketServer.js +15 -10
  51. package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -1
  52. package/dist/src/dht/DhtNode.d.ts +18 -55
  53. package/dist/src/dht/DhtNode.js +122 -145
  54. package/dist/src/dht/DhtNode.js.map +1 -1
  55. package/dist/src/dht/{RemoteExternalApi.d.ts → ExternalApiRpcRemote.d.ts} +2 -2
  56. package/dist/src/dht/{RemoteExternalApi.js → ExternalApiRpcRemote.js} +5 -6
  57. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -0
  58. package/dist/src/dht/{DhtPeer.d.ts → RemoteDhtNode.d.ts} +2 -3
  59. package/dist/src/dht/{DhtPeer.js → RemoteDhtNode.js} +21 -19
  60. package/dist/src/dht/RemoteDhtNode.js.map +1 -0
  61. package/dist/src/dht/contact/ContactList.d.ts +0 -1
  62. package/dist/src/dht/contact/ContactList.js +0 -3
  63. package/dist/src/dht/contact/ContactList.js.map +1 -1
  64. package/dist/src/dht/contact/RandomContactList.d.ts +0 -1
  65. package/dist/src/dht/contact/RandomContactList.js +0 -3
  66. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  67. package/dist/src/dht/contact/SortedContactList.d.ts +0 -3
  68. package/dist/src/dht/contact/SortedContactList.js +0 -9
  69. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  70. package/dist/src/dht/discovery/DiscoverySession.d.ts +5 -7
  71. package/dist/src/dht/discovery/DiscoverySession.js +9 -10
  72. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  73. package/dist/src/dht/discovery/PeerDiscovery.d.ts +12 -11
  74. package/dist/src/dht/discovery/PeerDiscovery.js +33 -37
  75. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  76. package/dist/src/dht/find/RecursiveFindSession.d.ts +9 -10
  77. package/dist/src/dht/find/RecursiveFindSession.js +13 -13
  78. package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
  79. package/dist/src/dht/find/RecursiveFinder.d.ts +9 -11
  80. package/dist/src/dht/find/RecursiveFinder.js +35 -36
  81. package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
  82. package/dist/src/dht/find/RemoteRecursiveFindSession.d.ts +1 -1
  83. package/dist/src/dht/find/RemoteRecursiveFindSession.js +4 -4
  84. package/dist/src/dht/find/RemoteRecursiveFindSession.js.map +1 -1
  85. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +1 -1
  86. package/dist/src/dht/registerExternalApiRpcMethods.js +4 -3
  87. package/dist/src/dht/registerExternalApiRpcMethods.js.map +1 -1
  88. package/dist/src/dht/routing/DuplicateDetector.d.ts +1 -2
  89. package/dist/src/dht/routing/DuplicateDetector.js +2 -7
  90. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  91. package/dist/src/dht/routing/Router.d.ts +12 -15
  92. package/dist/src/dht/routing/Router.js +30 -33
  93. package/dist/src/dht/routing/Router.js.map +1 -1
  94. package/dist/src/dht/routing/{RemoteRouter.d.ts → RouterRpcRemote.d.ts} +2 -2
  95. package/dist/src/dht/routing/{RemoteRouter.js → RouterRpcRemote.js} +5 -5
  96. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -0
  97. package/dist/src/dht/routing/RoutingSession.d.ts +3 -4
  98. package/dist/src/dht/routing/RoutingSession.js +6 -5
  99. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  100. package/dist/src/dht/store/{DataStore.d.ts → StoreRpcLocal.d.ts} +6 -6
  101. package/dist/src/dht/store/{DataStore.js → StoreRpcLocal.js} +34 -34
  102. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -0
  103. package/dist/src/dht/store/{RemoteStore.d.ts → StoreRpcRemote.d.ts} +2 -2
  104. package/dist/src/dht/store/{RemoteStore.js → StoreRpcRemote.js} +4 -4
  105. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -0
  106. package/dist/src/exports.d.ts +2 -8
  107. package/dist/src/exports.js +2 -14
  108. package/dist/src/exports.js.map +1 -1
  109. package/dist/src/helpers/PeerID.d.ts +0 -1
  110. package/dist/src/helpers/PeerID.js +0 -6
  111. package/dist/src/helpers/PeerID.js.map +1 -1
  112. package/dist/src/helpers/browser/isBrowserEnvironment.d.ts +1 -0
  113. package/dist/src/helpers/browser/isBrowserEnvironment.js +6 -0
  114. package/dist/src/helpers/browser/isBrowserEnvironment.js.map +1 -0
  115. package/dist/src/helpers/browser/isBrowserEnvironment_override.d.ts +1 -0
  116. package/dist/src/helpers/browser/isBrowserEnvironment_override.js +7 -0
  117. package/dist/src/helpers/browser/isBrowserEnvironment_override.js.map +1 -0
  118. package/dist/src/helpers/kademliaId.d.ts +1 -0
  119. package/dist/src/helpers/kademliaId.js +14 -0
  120. package/dist/src/helpers/kademliaId.js.map +1 -0
  121. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -1
  122. package/dist/src/helpers/peerIdFromPeerDescriptor.js +3 -3
  123. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  124. package/dist/src/helpers/protoClasses.js +2 -2
  125. package/dist/src/helpers/protoClasses.js.map +1 -1
  126. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +29 -29
  127. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +39 -39
  128. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  129. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +49 -162
  130. package/dist/src/proto/packages/dht/protos/DhtRpc.js +47 -88
  131. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  132. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +15 -15
  133. package/dist/src/transport/RoutingRpcCommunicator.js +1 -0
  134. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  135. package/package.json +10 -9
  136. package/protos/DhtRpc.proto +30 -60
  137. package/src/connection/ConnectionLockHandler.ts +1 -1
  138. package/src/connection/ConnectionLockRpcRemote.ts +62 -0
  139. package/src/connection/ConnectionManager.ts +178 -274
  140. package/src/connection/ConnectivityChecker.ts +15 -12
  141. package/src/connection/ConnectorFacade.ts +140 -0
  142. package/src/connection/Handshaker.ts +0 -5
  143. package/src/connection/ManagedConnection.ts +26 -40
  144. package/src/connection/ManagedWebRtcConnection.ts +0 -2
  145. package/src/connection/Simulator/Simulator.ts +0 -7
  146. package/src/connection/Simulator/SimulatorConnection.ts +16 -13
  147. package/src/connection/Simulator/SimulatorConnector.ts +13 -19
  148. package/src/connection/Simulator/SimulatorTransport.ts +6 -1
  149. package/src/connection/WebRTC/NodeWebRtcConnection.ts +15 -14
  150. package/src/connection/WebRTC/{WebRtcConnector.ts → WebRtcConnectorRpcLocal.ts} +68 -56
  151. package/src/connection/WebRTC/WebRtcConnectorRpcRemote.ts +71 -0
  152. package/src/connection/WebRTC/iceServerAsString.ts +1 -1
  153. package/src/connection/WebSocket/{WebSocketConnector.ts → WebSocketConnectorRpcLocal.ts} +102 -79
  154. package/src/connection/WebSocket/WebSocketConnectorRpcRemote.ts +45 -0
  155. package/src/connection/WebSocket/WebSocketServer.ts +26 -8
  156. package/src/dht/DhtNode.ts +176 -203
  157. package/src/dht/{RemoteExternalApi.ts → ExternalApiRpcRemote.ts} +3 -4
  158. package/src/dht/{DhtPeer.ts → RemoteDhtNode.ts} +11 -9
  159. package/src/dht/contact/ContactList.ts +0 -4
  160. package/src/dht/contact/RandomContactList.ts +0 -4
  161. package/src/dht/contact/SortedContactList.ts +0 -12
  162. package/src/dht/discovery/DiscoverySession.ts +20 -23
  163. package/src/dht/discovery/PeerDiscovery.ts +47 -45
  164. package/src/dht/find/RecursiveFindSession.ts +21 -22
  165. package/src/dht/find/RecursiveFinder.ts +45 -49
  166. package/src/dht/find/RemoteRecursiveFindSession.ts +6 -6
  167. package/src/dht/registerExternalApiRpcMethods.ts +8 -5
  168. package/src/dht/routing/DuplicateDetector.ts +3 -10
  169. package/src/dht/routing/Router.ts +39 -45
  170. package/src/dht/routing/{RemoteRouter.ts → RouterRpcRemote.ts} +4 -4
  171. package/src/dht/routing/RoutingSession.ts +15 -15
  172. package/src/dht/store/{DataStore.ts → StoreRpcLocal.ts} +42 -42
  173. package/src/dht/store/{RemoteStore.ts → StoreRpcRemote.ts} +2 -2
  174. package/src/exports.ts +2 -8
  175. package/src/helpers/PeerID.ts +0 -7
  176. package/src/helpers/browser/isBrowserEnvironment.ts +1 -0
  177. package/src/helpers/browser/isBrowserEnvironment_override.ts +3 -0
  178. package/src/helpers/kademliaId.ts +8 -0
  179. package/src/helpers/peerIdFromPeerDescriptor.ts +1 -1
  180. package/src/helpers/protoClasses.ts +4 -4
  181. package/src/proto/packages/dht/protos/DhtRpc.client.ts +54 -54
  182. package/src/proto/packages/dht/protos/DhtRpc.server.ts +15 -15
  183. package/src/proto/packages/dht/protos/DhtRpc.ts +77 -216
  184. package/src/transport/RoutingRpcCommunicator.ts +1 -0
  185. package/test/benchmark/KademliaCorrectness.test.ts +4 -2
  186. package/test/benchmark/RecursiveFind.test.ts +6 -6
  187. package/test/end-to-end/Layer0-Layer1.test.ts +9 -9
  188. package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +5 -5
  189. package/test/end-to-end/Layer0WebRTC.test.ts +5 -6
  190. package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +13 -8
  191. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +15 -10
  192. package/test/end-to-end/WebSocketConnectionRequest.test.ts +5 -5
  193. package/test/integration/ConnectionLocking.test.ts +32 -26
  194. package/test/integration/ConnectionManager.test.ts +90 -93
  195. package/test/integration/DhtJoinPeerDiscovery.test.ts +53 -0
  196. package/test/integration/DhtRpc.test.ts +4 -6
  197. package/test/integration/Layer1-scale.test.ts +8 -8
  198. package/test/integration/MigrateData.test.ts +9 -9
  199. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -2
  200. package/test/integration/RecursiveFind.test.ts +5 -5
  201. package/test/integration/{DhtPeer.test.ts → RemoteDhtNode.test.ts} +11 -12
  202. package/test/integration/RouteMessage.test.ts +7 -9
  203. package/test/integration/{RemoteRouter.test.ts → RouterRpcRemote.test.ts} +13 -14
  204. package/test/integration/RpcErrors.test.ts +25 -10
  205. package/test/integration/ScaleDownDht.test.ts +8 -8
  206. package/test/integration/SimultaneousConnections.test.ts +35 -36
  207. package/test/integration/Store.test.ts +8 -9
  208. package/test/integration/StoreAndDelete.test.ts +11 -11
  209. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +7 -7
  210. package/test/integration/{RemoteStore.test.ts → StoreRpcRemote.test.ts} +17 -18
  211. package/test/integration/WebRtcConnectionManagement.test.ts +26 -19
  212. package/test/integration/WebRtcConnectorRpc.test.ts +17 -32
  213. package/test/integration/WebSocket.test.ts +4 -2
  214. package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
  215. package/test/integration/WebSocketConnectorRpc.test.ts +10 -15
  216. package/test/unit/DuplicateDetector.test.ts +3 -4
  217. package/test/unit/LocalDataStore.test.ts +6 -8
  218. package/test/unit/RandomContactList.test.ts +1 -1
  219. package/test/unit/RecursiveFinder.test.ts +13 -18
  220. package/test/unit/Router.test.ts +18 -21
  221. package/test/unit/WebSocketConnectorRpcLocal.test.ts +64 -0
  222. package/test/unit/WebSocketServer.test.ts +24 -12
  223. package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +1 -1
  224. package/test/utils/mock/RecursiveFinder.ts +2 -2
  225. package/test/utils/mock/Router.ts +9 -11
  226. package/test/utils/mock/Transport.ts +2 -2
  227. package/test/utils/utils.ts +55 -74
  228. package/dist/src/connection/RemoteConnectionLocker.d.ts +0 -13
  229. package/dist/src/connection/RemoteConnectionLocker.js.map +0 -1
  230. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.d.ts +0 -12
  231. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js +0 -74
  232. package/dist/src/connection/WebRTC/RemoteWebrtcConnector.js.map +0 -1
  233. package/dist/src/connection/WebRTC/WebRtcConnector.js.map +0 -1
  234. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.d.ts +0 -9
  235. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +0 -1
  236. package/dist/src/connection/WebSocket/WebSocketConnector.js.map +0 -1
  237. package/dist/src/dht/DhtPeer.js.map +0 -1
  238. package/dist/src/dht/RemoteExternalApi.js.map +0 -1
  239. package/dist/src/dht/routing/RemoteRouter.js.map +0 -1
  240. package/dist/src/dht/store/DataStore.js.map +0 -1
  241. package/dist/src/dht/store/RemoteStore.js.map +0 -1
  242. package/dist/src/helpers/browser/isBrowser.d.ts +0 -1
  243. package/dist/src/helpers/browser/isBrowser.js +0 -6
  244. package/dist/src/helpers/browser/isBrowser.js.map +0 -1
  245. package/dist/src/helpers/browser/isNodeJS.d.ts +0 -1
  246. package/dist/src/helpers/browser/isNodeJS.js +0 -6
  247. package/dist/src/helpers/browser/isNodeJS.js.map +0 -1
  248. package/src/connection/RemoteConnectionLocker.ts +0 -84
  249. package/src/connection/WebRTC/RemoteWebrtcConnector.ts +0 -93
  250. package/src/connection/WebSocket/RemoteWebSocketConnector.ts +0 -49
  251. package/src/helpers/browser/isBrowser.ts +0 -1
  252. package/src/helpers/browser/isNodeJS.ts +0 -1
  253. package/test/integration/DhtWithMockConnectionLatencies.test.ts +0 -46
  254. package/test/integration/DhtWithMockConnections.test.ts +0 -46
  255. package/test/integration/DhtWithRealConnectionLatencies.test.ts +0 -47
@@ -2,18 +2,18 @@ import { ClientWebSocket } from './ClientWebSocket'
2
2
  import { IConnection, ConnectionType } from '../IConnection'
3
3
  import { ITransport } from '../../transport/ITransport'
4
4
  import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator'
5
- import { RemoteWebSocketConnector } from './RemoteWebSocketConnector'
5
+ import { WebSocketConnectorRpcRemote } from './WebSocketConnectorRpcRemote'
6
6
  import {
7
7
  ConnectivityMethod,
8
8
  ConnectivityResponse,
9
+ NodeType,
9
10
  PeerDescriptor,
10
11
  WebSocketConnectionRequest,
11
12
  WebSocketConnectionResponse
12
13
  } from '../../proto/packages/dht/protos/DhtRpc'
13
- import { WebSocketConnectorServiceClient } from '../../proto/packages/dht/protos/DhtRpc.client'
14
- import { Logger, wait } from '@streamr/utils'
15
- import { IWebSocketConnectorService } from '../../proto/packages/dht/protos/DhtRpc.server'
16
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
14
+ import { WebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
15
+ import { Logger, binaryToHex, wait } from '@streamr/utils'
16
+ import { IWebSocketConnectorRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
17
17
  import { ManagedConnection } from '../ManagedConnection'
18
18
  import { WebSocketServer } from './WebSocketServer'
19
19
  import { ConnectivityChecker } from '../ConnectivityChecker'
@@ -24,7 +24,10 @@ import { toProtoRpcClient } from '@streamr/proto-rpc'
24
24
  import { Handshaker } from '../Handshaker'
25
25
  import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
26
26
  import { ParsedUrlQuery } from 'querystring'
27
- import { sample } from 'lodash'
27
+ import { range, sample } from 'lodash'
28
+ import { isPrivateIPv4 } from '../../helpers/AddressTools'
29
+ import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
30
+ import { DhtCallContext } from '../../rpc-protocol/DhtCallContext'
28
31
 
29
32
  const logger = new Logger(module)
30
33
 
@@ -32,47 +35,55 @@ export const connectivityMethodToWebSocketUrl = (ws: ConnectivityMethod): string
32
35
  return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port
33
36
  }
34
37
 
38
+ const canOpenConnectionFromBrowser = (websocketServer: ConnectivityMethod) => {
39
+ const hasPrivateAddress = ((websocketServer.host === 'localhost') || isPrivateIPv4(websocketServer.host))
40
+ return websocketServer.tls || hasPrivateAddress
41
+ }
42
+
35
43
  const ENTRY_POINT_CONNECTION_ATTEMPTS = 5
36
44
 
37
- export class WebSocketConnector implements IWebSocketConnectorService {
38
- private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocketconnector'
45
+ interface WebSocketConnectorRpcLocalConfig {
46
+ transport: ITransport
47
+ canConnect: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
48
+ onIncomingConnection: (connection: ManagedConnection) => boolean
49
+ portRange?: PortRange
50
+ maxMessageSize?: number
51
+ host?: string
52
+ entrypoints?: PeerDescriptor[]
53
+ tlsCertificate?: TlsCertificate
54
+ }
55
+
56
+ export class WebSocketConnectorRpcLocal implements IWebSocketConnectorRpc {
57
+
58
+ private static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocket-connector'
39
59
  private readonly rpcCommunicator: ListeningRpcCommunicator
40
60
  private readonly canConnectFunction: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean
41
61
  private readonly webSocketServer?: WebSocketServer
42
62
  private connectivityChecker?: ConnectivityChecker
43
63
  private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
44
- private incomingConnectionCallback: (connection: ManagedConnection) => boolean
45
- private portRange?: PortRange
64
+ private onIncomingConnection: (connection: ManagedConnection) => boolean
46
65
  private host?: string
47
- private entrypoints?: PeerDescriptor[]
66
+ private readonly entrypoints?: PeerDescriptor[]
48
67
  private readonly tlsCertificate?: TlsCertificate
49
68
  private selectedPort?: number
50
- private readonly protocolVersion: string
51
69
  private ownPeerDescriptor?: PeerDescriptor
52
70
  private connectingConnections: Map<PeerIDKey, ManagedConnection> = new Map()
53
71
  private destroyed = false
54
72
 
55
- constructor(
56
- protocolVersion: string,
57
- rpcTransport: ITransport,
58
- fnCanConnect: (peerDescriptor: PeerDescriptor, _ip: string, port: number) => boolean,
59
- incomingConnectionCallback: (connection: ManagedConnection) => boolean,
60
- portRange?: PortRange,
61
- host?: string,
62
- entrypoints?: PeerDescriptor[],
63
- tlsCertificate?: TlsCertificate
64
- ) {
65
- this.protocolVersion = protocolVersion
66
- this.webSocketServer = portRange ? new WebSocketServer() : undefined
67
- this.incomingConnectionCallback = incomingConnectionCallback
68
- this.portRange = portRange
69
- this.host = host
70
- this.entrypoints = entrypoints
71
- this.tlsCertificate = tlsCertificate
72
-
73
- this.canConnectFunction = fnCanConnect.bind(this)
74
-
75
- this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnector.WEBSOCKET_CONNECTOR_SERVICE_ID, rpcTransport, {
73
+ constructor(config: WebSocketConnectorRpcLocalConfig) {
74
+ this.webSocketServer = config.portRange ? new WebSocketServer({
75
+ portRange: config.portRange!,
76
+ tlsCertificate: config.tlsCertificate,
77
+ maxMessageSize: config.maxMessageSize
78
+ }) : undefined
79
+ this.onIncomingConnection = config.onIncomingConnection
80
+ this.host = config.host
81
+ this.entrypoints = config.entrypoints
82
+ this.tlsCertificate = config.tlsCertificate
83
+
84
+ this.canConnectFunction = config.canConnect.bind(this)
85
+
86
+ this.rpcCommunicator = new ListeningRpcCommunicator(WebSocketConnectorRpcLocal.WEBSOCKET_CONNECTOR_SERVICE_ID, config.transport, {
76
87
  rpcRequestTimeout: 15000
77
88
  })
78
89
 
@@ -80,12 +91,12 @@ export class WebSocketConnector implements IWebSocketConnectorService {
80
91
  WebSocketConnectionRequest,
81
92
  WebSocketConnectionResponse,
82
93
  'requestConnection',
83
- (req: WebSocketConnectionRequest, context) => this.requestConnection(req, context)
94
+ (req: WebSocketConnectionRequest, context: ServerCallContext) => this.requestConnection(req, context)
84
95
  )
85
96
  }
86
97
 
87
98
  private attachHandshaker(connection: IConnection) {
88
- const handshaker = new Handshaker(this.ownPeerDescriptor!, this.protocolVersion, connection)
99
+ const handshaker = new Handshaker(this.ownPeerDescriptor!, connection)
89
100
  handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
90
101
  this.onServerSocketHandshakeRequest(peerDescriptor, connection)
91
102
  })
@@ -100,10 +111,10 @@ export class WebSocketConnector implements IWebSocketConnectorService {
100
111
  serverSocket.resourceURL.query) {
101
112
  const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
102
113
  if (query.connectivityRequest) {
103
- logger.trace('Received connectivity request connection')
114
+ logger.trace('Received connectivity request connection from ' + serverSocket.getRemoteAddress())
104
115
  this.connectivityChecker!.listenToIncomingConnectivityRequests(serverSocket)
105
116
  } else if (query.connectivityProbe) {
106
- logger.trace('Received connectivity probe connection')
117
+ logger.trace('Received connectivity probe connection from ' + serverSocket.getRemoteAddress())
107
118
  } else {
108
119
  this.attachHandshaker(connection)
109
120
  }
@@ -111,13 +122,13 @@ export class WebSocketConnector implements IWebSocketConnectorService {
111
122
  this.attachHandshaker(connection)
112
123
  }
113
124
  })
114
- const port = await this.webSocketServer.start(this.portRange!, this.tlsCertificate)
125
+ const port = await this.webSocketServer.start()
115
126
  this.selectedPort = port
116
127
  this.connectivityChecker = new ConnectivityChecker(this.selectedPort, this.tlsCertificate !== undefined, this.host)
117
128
  }
118
129
  }
119
130
 
120
- public async checkConnectivity(reattempt = 0): Promise<ConnectivityResponse> {
131
+ public async checkConnectivity(): Promise<ConnectivityResponse> {
121
132
  // TODO: this could throw if the server is not running
122
133
  const noServerConnectivityResponse: ConnectivityResponse = {
123
134
  openInternet: false,
@@ -127,35 +138,47 @@ export class WebSocketConnector implements IWebSocketConnectorService {
127
138
  if (this.destroyed) {
128
139
  return noServerConnectivityResponse
129
140
  }
130
- try {
131
- if (!this.webSocketServer) {
132
- // If no websocket server, return openInternet: false
133
- return noServerConnectivityResponse
134
- } else {
135
- if (!this.entrypoints || this.entrypoints.length < 1) {
136
- // return connectivity info given in config
137
- const preconfiguredConnectivityResponse: ConnectivityResponse = {
138
- openInternet: true,
139
- host: this.host!,
140
- natType: NatType.OPEN_INTERNET,
141
- websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
142
- }
143
- return preconfiguredConnectivityResponse
141
+ for (const reattempt of range(ENTRY_POINT_CONNECTION_ATTEMPTS)) {
142
+ const entryPoint = sample(this.entrypoints)!
143
+ try {
144
+ if (!this.webSocketServer) {
145
+ // If no websocket server, return openInternet: false
146
+ return noServerConnectivityResponse
144
147
  } else {
145
- // Do real connectivity checking
146
- return await this.connectivityChecker!.sendConnectivityRequest(sample(this.entrypoints)!)
148
+ if (!this.entrypoints || this.entrypoints.length < 1) {
149
+ // return connectivity info given in config
150
+ const preconfiguredConnectivityResponse: ConnectivityResponse = {
151
+ openInternet: true,
152
+ host: this.host!,
153
+ natType: NatType.OPEN_INTERNET,
154
+ websocket: { host: this.host!, port: this.selectedPort!, tls: this.tlsCertificate !== undefined }
155
+ }
156
+ return preconfiguredConnectivityResponse
157
+ } else {
158
+ // Do real connectivity checking
159
+ return await this.connectivityChecker!.sendConnectivityRequest(entryPoint)
160
+ }
161
+ }
162
+ } catch (err) {
163
+ if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
164
+ const error = `Failed to connect to entrypoint with id ${binaryToHex(entryPoint.kademliaId)} `
165
+ + `and URL ${connectivityMethodToWebSocketUrl(entryPoint.websocket!)}`
166
+ logger.error(error, { error: err })
167
+ await wait(2000)
147
168
  }
148
- }
149
- } catch (err) {
150
- if (reattempt < ENTRY_POINT_CONNECTION_ATTEMPTS) {
151
- logger.error('Failed to connect to the entrypoint', { error: err })
152
- await wait(2000)
153
- return this.checkConnectivity(reattempt + 1)
154
- } else {
155
- throw err
156
169
  }
157
170
  }
171
+ throw Error(`Failed to connect to the entrypoints after ${ENTRY_POINT_CONNECTION_ATTEMPTS} attempts`)
172
+ }
158
173
 
174
+ public isPossibleToFormConnection(targetPeerDescriptor: PeerDescriptor): boolean {
175
+ if (this.ownPeerDescriptor!.websocket !== undefined) {
176
+ return (targetPeerDescriptor.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(this.ownPeerDescriptor!.websocket)
177
+ } else if (targetPeerDescriptor.websocket !== undefined) {
178
+ return (this.ownPeerDescriptor!.type !== NodeType.BROWSER) || canOpenConnectionFromBrowser(targetPeerDescriptor.websocket)
179
+ } else {
180
+ return false
181
+ }
159
182
  }
160
183
 
161
184
  public connect(targetPeerDescriptor: PeerDescriptor): ManagedConnection {
@@ -172,8 +195,7 @@ export class WebSocketConnector implements IWebSocketConnectorService {
172
195
 
173
196
  const url = connectivityMethodToWebSocketUrl(targetPeerDescriptor.websocket!)
174
197
 
175
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion,
176
- ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
198
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
177
199
  managedConnection.setPeerDescriptor(targetPeerDescriptor)
178
200
 
179
201
  this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
@@ -194,15 +216,16 @@ export class WebSocketConnector implements IWebSocketConnectorService {
194
216
  }
195
217
  }
196
218
 
197
- public requestConnectionFromPeer(ownPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
219
+ private requestConnectionFromPeer(ownPeerDescriptor: PeerDescriptor, targetPeerDescriptor: PeerDescriptor): ManagedConnection {
198
220
  setImmediate(() => {
199
- const remoteConnector = new RemoteWebSocketConnector(
221
+ const remoteConnector = new WebSocketConnectorRpcRemote(
222
+ ownPeerDescriptor,
200
223
  targetPeerDescriptor,
201
- toProtoRpcClient(new WebSocketConnectorServiceClient(this.rpcCommunicator.getRpcClientTransport()))
224
+ toProtoRpcClient(new WebSocketConnectorRpcClient(this.rpcCommunicator.getRpcClientTransport()))
202
225
  )
203
- remoteConnector.requestConnection(ownPeerDescriptor, ownPeerDescriptor.websocket!.host, ownPeerDescriptor.websocket!.port)
226
+ remoteConnector.requestConnection(ownPeerDescriptor.websocket!.host, ownPeerDescriptor.websocket!.port)
204
227
  })
205
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion, ConnectionType.WEBSOCKET_SERVER)
228
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
206
229
  managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
207
230
  managedConnection.setPeerDescriptor(targetPeerDescriptor)
208
231
  this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
@@ -215,16 +238,15 @@ export class WebSocketConnector implements IWebSocketConnectorService {
215
238
 
216
239
  if (this.ongoingConnectRequests.has(peerId.toKey())) {
217
240
  const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
218
- ongoingConnectReguest.attachImplementation(serverWebSocket, peerDescriptor)
241
+ ongoingConnectReguest.attachImplementation(serverWebSocket)
219
242
  ongoingConnectReguest.acceptHandshake()
220
243
  this.ongoingConnectRequests.delete(peerId.toKey())
221
244
  } else {
222
- const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, this.protocolVersion,
223
- ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
245
+ const managedConnection = new ManagedConnection(this.ownPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebSocket)
224
246
 
225
247
  managedConnection.setPeerDescriptor(peerDescriptor)
226
248
 
227
- if (this.incomingConnectionCallback(managedConnection)) {
249
+ if (this.onIncomingConnection(managedConnection)) {
228
250
  managedConnection.acceptHandshake()
229
251
  } else {
230
252
  managedConnection.rejectHandshake('Duplicate connection')
@@ -250,15 +272,16 @@ export class WebSocketConnector implements IWebSocketConnectorService {
250
272
  await this.webSocketServer?.stop()
251
273
  }
252
274
 
253
- // IWebSocketConnectorService implementation
254
- public async requestConnection(request: WebSocketConnectionRequest, _context: ServerCallContext): Promise<WebSocketConnectionResponse> {
255
- if (!this.destroyed && this.canConnectFunction(request.requester!, request.ip, request.port)) {
275
+ // IWebSocketConnectorRpc implementation
276
+ public async requestConnection(request: WebSocketConnectionRequest, context: ServerCallContext): Promise<WebSocketConnectionResponse> {
277
+ const senderPeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
278
+ if (!this.destroyed && this.canConnectFunction(senderPeerDescriptor, request.ip, request.port)) {
256
279
  setImmediate(() => {
257
280
  if (this.destroyed) {
258
281
  return
259
282
  }
260
- const connection = this.connect(request.requester!)
261
- this.incomingConnectionCallback(connection)
283
+ const connection = this.connect(senderPeerDescriptor)
284
+ this.onIncomingConnection(connection)
262
285
  })
263
286
  const res: WebSocketConnectionResponse = {
264
287
  accepted: true
@@ -0,0 +1,45 @@
1
+ import {
2
+ PeerDescriptor,
3
+ WebSocketConnectionRequest
4
+ } from '../../proto/packages/dht/protos/DhtRpc'
5
+ import { IWebSocketConnectorRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
6
+ import { Logger } from '@streamr/utils'
7
+ import * as Err from '../../helpers/errors'
8
+ import { ProtoRpcClient } from '@streamr/proto-rpc'
9
+ import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
+ import { Remote } from '../../dht/contact/Remote'
11
+
12
+ const logger = new Logger(module)
13
+
14
+ export class WebSocketConnectorRpcRemote extends Remote<IWebSocketConnectorRpcClient> {
15
+
16
+ constructor(
17
+ localPeerDescriptor: PeerDescriptor,
18
+ remotePeerDescriptor: PeerDescriptor,
19
+ client: ProtoRpcClient<IWebSocketConnectorRpcClient>
20
+ ) {
21
+ super(localPeerDescriptor, remotePeerDescriptor, 'DUMMY', client)
22
+ }
23
+
24
+ async requestConnection(ip: string, port: number): Promise<boolean> {
25
+ logger.trace(`Requesting WebSocket connection from ${keyFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
26
+ const request: WebSocketConnectionRequest = {
27
+ ip,
28
+ port
29
+ }
30
+ const options = this.formDhtRpcOptions()
31
+ try {
32
+ const res = await this.getClient().requestConnection(request, options)
33
+
34
+ if (res.reason) {
35
+ logger.debug('WebSocketConnectionRequest Rejected', {
36
+ stack: new Err.WebSocketConnectionRequestRejected(res.reason).stack
37
+ })
38
+ }
39
+ return res.accepted
40
+ } catch (err) {
41
+ logger.debug(new Err.WebSocketConnectionRequestRejected('WebSocketConnectionRequest rejected', err).stack!)
42
+ return false
43
+ }
44
+ }
45
+ }
@@ -22,17 +22,33 @@ const logger = new Logger(module)
22
22
 
23
23
  declare class NodeJsWsServer extends WsServer { }
24
24
 
25
+ interface WebSocketServerConfig {
26
+ portRange: PortRange
27
+ tlsCertificate?: TlsCertificate
28
+ maxMessageSize?: number
29
+ }
30
+
25
31
  export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
26
32
 
27
33
  private httpServer?: HttpServer | HttpsServer
28
34
  private wsServer?: WsServer
29
35
  private readonly abortController = new AbortController()
36
+ private readonly portRange: PortRange
37
+ private readonly tlsCertificate?: TlsCertificate
38
+ private readonly maxMessageSize: number
39
+
40
+ constructor(config: WebSocketServerConfig) {
41
+ super()
42
+ this.portRange = config.portRange
43
+ this.tlsCertificate = config.tlsCertificate
44
+ this.maxMessageSize = config.maxMessageSize ?? 1048576
45
+ }
30
46
 
31
- public async start(portRange: PortRange, tlsCertificate?: TlsCertificate): Promise<number> {
32
- const ports = range(portRange.min, portRange.max + 1)
47
+ public async start(): Promise<number> {
48
+ const ports = range(this.portRange.min, this.portRange.max + 1)
33
49
  for (const port of ports) {
34
50
  try {
35
- await asAbortable(this.startServer(port, tlsCertificate), this.abortController.signal)
51
+ await asAbortable(this.startServer(port, this.tlsCertificate), this.abortController.signal)
36
52
  return port
37
53
  } catch (err) {
38
54
  if (err.originalError?.code === 'EADDRINUSE') {
@@ -42,7 +58,7 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
42
58
  }
43
59
  }
44
60
  }
45
- throw new WebSocketServerStartError(`Failed to start WebSocket server on any port in range: ${portRange.min}-${portRange.min}`)
61
+ throw new WebSocketServerStartError(`Failed to start WebSocket server on any port in range: ${this.portRange.min}-${this.portRange.min}`)
46
62
  }
47
63
 
48
64
  private startServer(port: number, tlsCertificate?: TlsCertificate): Promise<void> {
@@ -60,14 +76,14 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
60
76
  :
61
77
  createHttpServer(requestListener)
62
78
 
63
- function originIsAllowed(_uorigin: string) {
79
+ function originIsAllowed() {
64
80
  return true
65
81
  }
66
82
 
67
83
  this.wsServer = this.createWsServer(this.httpServer)
68
84
 
69
85
  this.wsServer.on('request', (request) => {
70
- if (!originIsAllowed(request.origin)) {
86
+ if (!originIsAllowed()) {
71
87
  // Make sure we only accept requests from an allowed origin
72
88
  request.reject()
73
89
  logger.trace('IConnection from origin ' + request.origin + ' rejected.')
@@ -115,12 +131,14 @@ export class WebSocketServer extends EventEmitter<ConnectionSourceEvents> {
115
131
  if (typeof NodeJsWsServer !== 'undefined') {
116
132
  return new NodeJsWsServer({
117
133
  httpServer,
118
- autoAcceptConnections: false
134
+ autoAcceptConnections: false,
135
+ maxReceivedMessageSize: this.maxMessageSize
119
136
  })
120
137
  } else {
121
138
  return this.wsServer = new WsServer({
122
139
  httpServer,
123
- autoAcceptConnections: false
140
+ autoAcceptConnections: false,
141
+ maxReceivedMessageSize: this.maxMessageSize
124
142
  })
125
143
  }
126
144
  }