@streamr/dht 100.0.0-pretestnet.3 → 100.0.0-pretestnet.4

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 (126) hide show
  1. package/dist/src/connection/ConnectionLockRpcLocal.js +1 -1
  2. package/dist/src/connection/ConnectionLockRpcLocal.js.map +1 -1
  3. package/dist/src/connection/ConnectionLockRpcRemote.js +3 -3
  4. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  5. package/dist/src/connection/ConnectionManager.d.ts +4 -8
  6. package/dist/src/connection/ConnectionManager.js +30 -31
  7. package/dist/src/connection/ConnectionManager.js.map +1 -1
  8. package/dist/src/connection/ConnectivityChecker.d.ts +0 -4
  9. package/dist/src/connection/ConnectivityChecker.js +13 -18
  10. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  11. package/dist/src/connection/ConnectorFacade.d.ts +6 -3
  12. package/dist/src/connection/ConnectorFacade.js +33 -23
  13. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  14. package/dist/src/connection/Handshaker.d.ts +6 -6
  15. package/dist/src/connection/Handshaker.js +10 -13
  16. package/dist/src/connection/Handshaker.js.map +1 -1
  17. package/dist/src/connection/ManagedConnection.d.ts +7 -10
  18. package/dist/src/connection/ManagedConnection.js +43 -79
  19. package/dist/src/connection/ManagedConnection.js.map +1 -1
  20. package/dist/src/connection/ManagedWebrtcConnection.js.map +1 -1
  21. package/dist/src/connection/simulator/SimulatorConnection.js +16 -15
  22. package/dist/src/connection/simulator/SimulatorConnection.js.map +1 -1
  23. package/dist/src/connection/simulator/SimulatorConnector.d.ts +2 -2
  24. package/dist/src/connection/simulator/SimulatorConnector.js +10 -11
  25. package/dist/src/connection/simulator/SimulatorConnector.js.map +1 -1
  26. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +8 -9
  27. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  28. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +1 -1
  29. package/dist/src/connection/webrtc/WebrtcConnector.js +6 -6
  30. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  31. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +1 -1
  32. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +4 -4
  33. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  34. package/dist/src/connection/websocket/ClientWebsocket.js +3 -0
  35. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -1
  36. package/dist/src/connection/websocket/ServerWebsocket.js +2 -0
  37. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -1
  38. package/dist/src/connection/websocket/WebsocketConnector.d.ts +5 -5
  39. package/dist/src/connection/websocket/WebsocketConnector.js +37 -35
  40. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  41. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +1 -1
  42. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +1 -1
  43. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -1
  44. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js +1 -1
  45. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -1
  46. package/dist/src/dht/DhtNode.js +18 -15
  47. package/dist/src/dht/DhtNode.js.map +1 -1
  48. package/dist/src/dht/DhtNodeRpcLocal.js +2 -2
  49. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  50. package/dist/src/dht/DhtNodeRpcRemote.js +4 -4
  51. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -1
  52. package/dist/src/dht/discovery/DiscoverySession.js +1 -1
  53. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  54. package/dist/src/dht/discovery/PeerDiscovery.js +1 -1
  55. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  56. package/dist/src/dht/find/FindRpcLocal.js +2 -2
  57. package/dist/src/dht/find/FindRpcLocal.js.map +1 -1
  58. package/dist/src/dht/routing/FindRpcRemote.js +3 -3
  59. package/dist/src/dht/routing/FindRpcRemote.js.map +1 -1
  60. package/dist/src/dht/routing/Router.js +3 -3
  61. package/dist/src/dht/routing/Router.js.map +1 -1
  62. package/dist/src/dht/routing/RouterRpcLocal.js +4 -4
  63. package/dist/src/dht/routing/RouterRpcLocal.js.map +1 -1
  64. package/dist/src/dht/routing/RouterRpcRemote.js +6 -6
  65. package/dist/src/dht/routing/RouterRpcRemote.js.map +1 -1
  66. package/dist/src/dht/routing/RoutingSession.js +1 -1
  67. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  68. package/dist/src/dht/store/StoreRpcLocal.js +1 -1
  69. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  70. package/dist/src/dht/store/StoreRpcRemote.js +3 -3
  71. package/dist/src/dht/store/StoreRpcRemote.js.map +1 -1
  72. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -0
  73. package/dist/src/helpers/peerIdFromPeerDescriptor.js +7 -1
  74. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  75. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +21 -12
  76. package/dist/src/proto/packages/dht/protos/DhtRpc.js +20 -7
  77. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  78. package/package.json +5 -5
  79. package/protos/DhtRpc.proto +9 -5
  80. package/src/connection/ConnectionLockRpcLocal.ts +2 -2
  81. package/src/connection/ConnectionLockRpcRemote.ts +4 -5
  82. package/src/connection/ConnectionManager.ts +30 -36
  83. package/src/connection/ConnectivityChecker.ts +13 -15
  84. package/src/connection/ConnectorFacade.ts +36 -25
  85. package/src/connection/Handshaker.ts +15 -18
  86. package/src/connection/ManagedConnection.ts +63 -87
  87. package/src/connection/ManagedWebrtcConnection.ts +4 -2
  88. package/src/connection/simulator/SimulatorConnection.ts +17 -16
  89. package/src/connection/simulator/SimulatorConnector.ts +12 -13
  90. package/src/connection/webrtc/BrowserWebrtcConnection.ts +2 -2
  91. package/src/connection/webrtc/NodeWebrtcConnection.ts +9 -10
  92. package/src/connection/webrtc/WebrtcConnector.ts +7 -6
  93. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +5 -5
  94. package/src/connection/websocket/ClientWebsocket.ts +3 -0
  95. package/src/connection/websocket/ServerWebsocket.ts +2 -0
  96. package/src/connection/websocket/WebsocketConnector.ts +63 -39
  97. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +2 -2
  98. package/src/connection/websocket/WebsocketConnectorRpcRemote.ts +2 -2
  99. package/src/dht/DhtNode.ts +24 -16
  100. package/src/dht/DhtNodeRpcLocal.ts +3 -3
  101. package/src/dht/DhtNodeRpcRemote.ts +5 -5
  102. package/src/dht/discovery/DiscoverySession.ts +2 -2
  103. package/src/dht/discovery/PeerDiscovery.ts +2 -2
  104. package/src/dht/find/FindRpcLocal.ts +3 -3
  105. package/src/dht/routing/FindRpcRemote.ts +4 -4
  106. package/src/dht/routing/Router.ts +10 -5
  107. package/src/dht/routing/RouterRpcLocal.ts +5 -5
  108. package/src/dht/routing/RouterRpcRemote.ts +7 -8
  109. package/src/dht/routing/RoutingSession.ts +2 -2
  110. package/src/dht/store/StoreRpcLocal.ts +2 -2
  111. package/src/dht/store/StoreRpcRemote.ts +4 -4
  112. package/src/helpers/peerIdFromPeerDescriptor.ts +6 -0
  113. package/src/proto/packages/dht/protos/DhtRpc.ts +25 -17
  114. package/test/benchmark/Find.test.ts +2 -2
  115. package/test/benchmark/KademliaCorrectness.test.ts +2 -2
  116. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +4 -3
  117. package/test/integration/ConnectionLocking.test.ts +7 -4
  118. package/test/integration/ConnectionManager.test.ts +72 -4
  119. package/test/integration/Find.test.ts +3 -6
  120. package/test/integration/MigrateData.test.ts +4 -4
  121. package/test/integration/MultipleEntryPointJoining.test.ts +2 -2
  122. package/test/integration/ScaleDownDht.test.ts +4 -4
  123. package/test/integration/Store.test.ts +3 -6
  124. package/test/integration/StoreAndDelete.test.ts +3 -6
  125. package/test/integration/WebrtcConnectionManagement.test.ts +1 -1
  126. package/test/utils/utils.ts +8 -2
@@ -17,6 +17,7 @@ import { ManagedConnection } from '../ManagedConnection'
17
17
  import { toProtoRpcClient } from '@streamr/proto-rpc'
18
18
  import {
19
19
  areEqualPeerDescriptors,
20
+ getNodeIdFromPeerDescriptor,
20
21
  keyFromPeerDescriptor,
21
22
  peerIdFromPeerDescriptor
22
23
  } from '../../helpers/peerIdFromPeerDescriptor'
@@ -67,23 +68,23 @@ export class WebrtcConnector {
67
68
 
68
69
  constructor(
69
70
  config: WebrtcConnectorConfig,
70
- onIncomingConnection: (connection: ManagedConnection) => boolean
71
+ onNewConnection: (connection: ManagedConnection) => boolean
71
72
  ) {
72
73
  this.config = config
73
74
  this.iceServers = config.iceServers ?? []
74
75
  this.rpcCommunicator = new ListeningRpcCommunicator(WebrtcConnector.WEBRTC_CONNECTOR_SERVICE_ID, config.transport, {
75
76
  rpcRequestTimeout: 15000
76
77
  })
77
- this.registerLocalRpcMethods(config, onIncomingConnection)
78
+ this.registerLocalRpcMethods(config, onNewConnection)
78
79
  }
79
80
 
80
81
  private registerLocalRpcMethods(
81
82
  config: WebrtcConnectorConfig,
82
- onIncomingConnection: (connection: ManagedConnection) => boolean
83
+ onNewConnection: (connection: ManagedConnection) => boolean
83
84
  ) {
84
85
  const localRpc = new WebrtcConnectorRpcLocal({
85
86
  connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
86
- onIncomingConnection,
87
+ onNewConnection,
87
88
  ongoingConnectAttempts: this.ongoingConnectAttempts,
88
89
  rpcCommunicator: this.rpcCommunicator,
89
90
  getLocalPeerDescriptor: () => this.localPeerDescriptor!,
@@ -132,7 +133,7 @@ export class WebrtcConnector {
132
133
  throw new Err.CannotConnectToSelf('Cannot open WebRTC Connection to self')
133
134
  }
134
135
 
135
- logger.trace(`Opening WebRTC connection to ${keyFromPeerDescriptor(targetPeerDescriptor)}`)
136
+ logger.trace(`Opening WebRTC connection to ${getNodeIdFromPeerDescriptor(targetPeerDescriptor)}`)
136
137
 
137
138
  const peerKey = keyFromPeerDescriptor(targetPeerDescriptor)
138
139
  const existingConnection = this.ongoingConnectAttempts.get(peerKey)
@@ -158,7 +159,7 @@ export class WebrtcConnector {
158
159
  managedConnection = new ManagedWebrtcConnection(this.localPeerDescriptor!, undefined, connection)
159
160
  }
160
161
 
161
- managedConnection.setPeerDescriptor(targetPeerDescriptor)
162
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
162
163
 
163
164
  this.ongoingConnectAttempts.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
164
165
 
@@ -24,7 +24,7 @@ const logger = new Logger(module)
24
24
 
25
25
  interface WebrtcConnectorRpcLocalConfig {
26
26
  connect: (targetPeerDescriptor: PeerDescriptor) => ManagedConnection
27
- onIncomingConnection: (connection: ManagedConnection) => boolean
27
+ onNewConnection: (connection: ManagedConnection) => boolean
28
28
  // TODO pass accessor methods instead of passing a mutable entity
29
29
  ongoingConnectAttempts: Map<PeerIDKey, ManagedWebrtcConnection>
30
30
  rpcCommunicator: ListeningRpcCommunicator
@@ -46,8 +46,8 @@ export class WebrtcConnectorRpcLocal implements IWebrtcConnectorRpc {
46
46
  return {}
47
47
  }
48
48
  const managedConnection = this.config.connect(targetPeerDescriptor)
49
- managedConnection.setPeerDescriptor(targetPeerDescriptor)
50
- this.config.onIncomingConnection(managedConnection)
49
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
50
+ this.config.onNewConnection(managedConnection)
51
51
  return {}
52
52
  }
53
53
 
@@ -60,9 +60,9 @@ export class WebrtcConnectorRpcLocal implements IWebrtcConnectorRpc {
60
60
  if (!managedConnection) {
61
61
  connection = new NodeWebrtcConnection({ remotePeerDescriptor: remotePeer })
62
62
  managedConnection = new ManagedWebrtcConnection(this.config.getLocalPeerDescriptor(), undefined, connection)
63
- managedConnection.setPeerDescriptor(remotePeer)
63
+ managedConnection.setRemotePeerDescriptor(remotePeer)
64
64
  this.config.ongoingConnectAttempts.set(peerKey, managedConnection)
65
- this.config.onIncomingConnection(managedConnection)
65
+ this.config.onNewConnection(managedConnection)
66
66
  const remoteConnector = new WebrtcConnectorRpcRemote(
67
67
  this.config.getLocalPeerDescriptor(),
68
68
  remotePeer,
@@ -87,6 +87,8 @@ export class ClientWebsocket extends EventEmitter<ConnectionEvents> implements I
87
87
  }
88
88
 
89
89
  public async close(gracefulLeave: boolean): Promise<void> {
90
+ this.emit('disconnected', gracefulLeave, undefined, 'close() called')
91
+ this.removeAllListeners()
90
92
  if (!this.destroyed) {
91
93
  logger.trace(`Closing socket for connection ${this.connectionId.toString()}`)
92
94
  this.socket?.close(gracefulLeave === true ? GOING_AWAY : undefined)
@@ -105,6 +107,7 @@ export class ClientWebsocket extends EventEmitter<ConnectionEvents> implements I
105
107
  }
106
108
 
107
109
  public destroy(): void {
110
+ logger.trace('destroy() a connection')
108
111
  if (!this.destroyed) {
109
112
  this.removeAllListeners()
110
113
  if (this.socket) {
@@ -80,6 +80,8 @@ export class ServerWebsocket extends EventEmitter<ConnectionEvents> implements I
80
80
  }
81
81
 
82
82
  public async close(gracefulLeave: boolean): Promise<void> {
83
+ this.emit('disconnected', gracefulLeave, undefined, 'close() called')
84
+ this.removeAllListeners()
83
85
  if (!this.stopped) {
84
86
  this.socket?.close(gracefulLeave === true ? GOING_AWAY : undefined)
85
87
  } else {
@@ -7,6 +7,7 @@ import { WebsocketConnectorRpcRemote } from './WebsocketConnectorRpcRemote'
7
7
  import {
8
8
  ConnectivityMethod,
9
9
  ConnectivityResponse,
10
+ HandshakeError,
10
11
  PeerDescriptor,
11
12
  WebsocketConnectionRequest,
12
13
  WebsocketConnectionResponse
@@ -21,7 +22,7 @@ import { PeerIDKey } from '../../helpers/PeerID'
21
22
  import { ServerWebsocket } from './ServerWebsocket'
22
23
  import { toProtoRpcClient } from '@streamr/proto-rpc'
23
24
  import { Handshaker } from '../Handshaker'
24
- import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
25
+ import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
25
26
  import { ParsedUrlQuery } from 'querystring'
26
27
  import { range, sample } from 'lodash'
27
28
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
@@ -30,16 +31,18 @@ import { WebsocketServerStartError } from '../../helpers/errors'
30
31
  import { AutoCertifierClientFacade } from './AutoCertifierClientFacade'
31
32
  const logger = new Logger(module)
32
33
 
33
- export const connectivityMethodToWebsocketUrl = (ws: ConnectivityMethod): string => {
34
- return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port
34
+ export type Action = 'connectivityRequest' | 'connectivityProbe'
35
+
36
+ export const connectivityMethodToWebsocketUrl = (ws: ConnectivityMethod, action?: Action): string => {
37
+ return (ws.tls ? 'wss://' : 'ws://') + ws.host + ':' + ws.port + ((action !== undefined) ? '?action=' + action : '')
35
38
  }
36
39
 
37
40
  const ENTRY_POINT_CONNECTION_ATTEMPTS = 5
38
41
 
39
- interface WebsocketConnectorConfig {
42
+ export interface WebsocketConnectorConfig {
40
43
  transport: ITransport
41
44
  canConnect: (peerDescriptor: PeerDescriptor) => boolean
42
- onIncomingConnection: (connection: ManagedConnection) => boolean
45
+ onNewConnection: (connection: ManagedConnection) => boolean
43
46
  portRange?: PortRange
44
47
  maxMessageSize?: number
45
48
  host?: string
@@ -58,7 +61,7 @@ export class WebsocketConnector {
58
61
  private readonly websocketServer?: WebsocketServer
59
62
  private connectivityChecker?: ConnectivityChecker
60
63
  private readonly ongoingConnectRequests: Map<PeerIDKey, ManagedConnection> = new Map()
61
- private onIncomingConnection: (connection: ManagedConnection) => boolean
64
+ private onNewConnection: (connection: ManagedConnection) => boolean
62
65
  private host?: string
63
66
  private readonly entrypoints?: PeerDescriptor[]
64
67
  private readonly tlsCertificate?: TlsCertificate
@@ -79,7 +82,7 @@ export class WebsocketConnector {
79
82
  maxMessageSize: config.maxMessageSize,
80
83
  enableTls: config.serverEnableTls
81
84
  }) : undefined
82
- this.onIncomingConnection = config.onIncomingConnection
85
+ this.onNewConnection = config.onNewConnection
83
86
  this.host = config.host
84
87
  this.entrypoints = config.entrypoints
85
88
  this.tlsCertificate = config.tlsCertificate
@@ -97,7 +100,7 @@ export class WebsocketConnector {
97
100
  const rpcLocal = new WebsocketConnectorRpcLocal({
98
101
  canConnect: (peerDescriptor: PeerDescriptor) => config.canConnect(peerDescriptor),
99
102
  connect: (targetPeerDescriptor: PeerDescriptor) => this.connect(targetPeerDescriptor),
100
- onIncomingConnection: (connection: ManagedConnection) => config.onIncomingConnection(connection),
103
+ onNewConnection: (connection: ManagedConnection) => config.onNewConnection(connection),
101
104
  abortSignal: this.abortController.signal
102
105
  })
103
106
  this.rpcCommunicator.registerRpcMethod(
@@ -116,8 +119,8 @@ export class WebsocketConnector {
116
119
 
117
120
  private attachHandshaker(connection: IConnection) {
118
121
  const handshaker = new Handshaker(this.localPeerDescriptor!, connection)
119
- handshaker.once('handshakeRequest', (peerDescriptor: PeerDescriptor) => {
120
- this.onServerSocketHandshakeRequest(peerDescriptor, connection)
122
+ handshaker.once('handshakeRequest', (localPeerDescriptor: PeerDescriptor, remotePeerDescriptor?: PeerDescriptor) => {
123
+ this.onServerSocketHandshakeRequest(localPeerDescriptor, connection, remotePeerDescriptor)
121
124
  })
122
125
  }
123
126
 
@@ -143,19 +146,14 @@ export class WebsocketConnector {
143
146
  public async start(): Promise<void> {
144
147
  if (!this.abortController.signal.aborted && this.websocketServer) {
145
148
  this.websocketServer.on('connected', (connection: IConnection) => {
146
-
147
149
  const serverSocket = connection as unknown as ServerWebsocket
148
- if (serverSocket.resourceURL &&
149
- serverSocket.resourceURL.query) {
150
- const query = serverSocket.resourceURL.query as unknown as ParsedUrlQuery
151
- if (query.connectivityRequest) {
152
- logger.trace('Received connectivity request connection from ' + serverSocket.getRemoteAddress())
153
- this.connectivityChecker!.listenToIncomingConnectivityRequests(serverSocket)
154
- } else if (query.connectivityProbe) {
155
- logger.trace('Received connectivity probe connection from ' + serverSocket.getRemoteAddress())
156
- } else {
157
- this.attachHandshaker(connection)
158
- }
150
+ const query = serverSocket.resourceURL.query as unknown as (ParsedUrlQuery | null)
151
+ const action = query?.action as (Action | undefined)
152
+ logger.trace('WebSocket client connected', { action, remoteAddress: serverSocket.getRemoteAddress() })
153
+ if (action === 'connectivityRequest') {
154
+ this.connectivityChecker!.listenToIncomingConnectivityRequests(serverSocket)
155
+ } else if (action === 'connectivityProbe') {
156
+ // no-op
159
157
  } else {
160
158
  this.attachHandshaker(connection)
161
159
  }
@@ -190,7 +188,7 @@ export class WebsocketConnector {
190
188
  }
191
189
  return preconfiguredConnectivityResponse
192
190
  } else {
193
- // Do real connectivity checking
191
+ // Do real connectivity checking
194
192
  return await this.connectivityChecker!.sendConnectivityRequest(entryPoint, selfSigned)
195
193
  }
196
194
  }
@@ -225,8 +223,14 @@ export class WebsocketConnector {
225
223
 
226
224
  const url = connectivityMethodToWebsocketUrl(targetPeerDescriptor.websocket!)
227
225
 
228
- const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_CLIENT, socket, undefined)
229
- managedConnection.setPeerDescriptor(targetPeerDescriptor)
226
+ const managedConnection = new ManagedConnection(
227
+ this.localPeerDescriptor!,
228
+ ConnectionType.WEBSOCKET_CLIENT,
229
+ socket,
230
+ undefined,
231
+ targetPeerDescriptor
232
+ )
233
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
230
234
 
231
235
  this.connectingConnections.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
232
236
 
@@ -255,32 +259,52 @@ export class WebsocketConnector {
255
259
  )
256
260
  remoteConnector.requestConnection(localPeerDescriptor.websocket!.host, localPeerDescriptor.websocket!.port)
257
261
  })
258
- const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER)
262
+ const managedConnection = new ManagedConnection(
263
+ this.localPeerDescriptor!,
264
+ ConnectionType.WEBSOCKET_SERVER,
265
+ undefined,
266
+ undefined,
267
+ targetPeerDescriptor
268
+ )
259
269
  managedConnection.on('disconnected', () => this.ongoingConnectRequests.delete(keyFromPeerDescriptor(targetPeerDescriptor)))
260
- managedConnection.setPeerDescriptor(targetPeerDescriptor)
270
+ managedConnection.setRemotePeerDescriptor(targetPeerDescriptor)
261
271
  this.ongoingConnectRequests.set(keyFromPeerDescriptor(targetPeerDescriptor), managedConnection)
262
272
  return managedConnection
263
273
  }
264
274
 
265
- private onServerSocketHandshakeRequest(peerDescriptor: PeerDescriptor, serverWebsocket: IConnection) {
266
-
267
- const peerId = peerIdFromPeerDescriptor(peerDescriptor)
275
+ private onServerSocketHandshakeRequest(
276
+ sourcePeerDescriptor: PeerDescriptor,
277
+ serverWebsocket: IConnection,
278
+ targetPeerDescriptor?: PeerDescriptor
279
+ ) {
280
+ const peerId = peerIdFromPeerDescriptor(sourcePeerDescriptor)
268
281
 
269
282
  if (this.ongoingConnectRequests.has(peerId.toKey())) {
270
- const ongoingConnectReguest = this.ongoingConnectRequests.get(peerId.toKey())!
271
- ongoingConnectReguest.attachImplementation(serverWebsocket)
272
- ongoingConnectReguest.acceptHandshake()
273
- this.ongoingConnectRequests.delete(peerId.toKey())
283
+ const ongoingConnectRequest = this.ongoingConnectRequests.get(peerId.toKey())!
284
+ ongoingConnectRequest.attachImplementation(serverWebsocket)
285
+ if (targetPeerDescriptor && !areEqualPeerDescriptors(this.localPeerDescriptor!, targetPeerDescriptor)) {
286
+ ongoingConnectRequest.rejectHandshake(HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR)
287
+ } else {
288
+ ongoingConnectRequest.acceptHandshake()
289
+ this.ongoingConnectRequests.delete(peerId.toKey())
290
+ }
274
291
  } else {
275
- const managedConnection = new ManagedConnection(this.localPeerDescriptor!, ConnectionType.WEBSOCKET_SERVER, undefined, serverWebsocket)
292
+ const managedConnection = new ManagedConnection(
293
+ this.localPeerDescriptor!,
294
+ ConnectionType.WEBSOCKET_SERVER,
295
+ undefined,
296
+ serverWebsocket,
297
+ targetPeerDescriptor
298
+ )
276
299
 
277
- managedConnection.setPeerDescriptor(peerDescriptor)
300
+ managedConnection.setRemotePeerDescriptor(sourcePeerDescriptor)
278
301
 
279
- if (this.onIncomingConnection(managedConnection)) {
302
+ if (targetPeerDescriptor && !areEqualPeerDescriptors(this.localPeerDescriptor!, targetPeerDescriptor)) {
303
+ managedConnection.rejectHandshake(HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR)
304
+ } else if (this.onNewConnection(managedConnection)) {
280
305
  managedConnection.acceptHandshake()
281
306
  } else {
282
- managedConnection.rejectHandshake('Duplicate connection')
283
- managedConnection.destroy()
307
+ managedConnection.rejectHandshake(HandshakeError.DUPLICATE_CONNECTION)
284
308
  }
285
309
  }
286
310
  }
@@ -11,7 +11,7 @@ import { ManagedConnection } from '../ManagedConnection'
11
11
  interface WebsocketConnectorRpcLocalConfig {
12
12
  canConnect: (peerDescriptor: PeerDescriptor) => boolean
13
13
  connect: (targetPeerDescriptor: PeerDescriptor) => ManagedConnection
14
- onIncomingConnection: (connection: ManagedConnection) => boolean
14
+ onNewConnection: (connection: ManagedConnection) => boolean
15
15
  abortSignal: AbortSignal
16
16
  }
17
17
 
@@ -31,7 +31,7 @@ export class WebsocketConnectorRpcLocal implements IWebsocketConnectorRpc {
31
31
  return
32
32
  }
33
33
  const connection = this.config.connect(senderPeerDescriptor)
34
- this.config.onIncomingConnection(connection)
34
+ this.config.onNewConnection(connection)
35
35
  })
36
36
  return { accepted: true }
37
37
  } else {
@@ -6,7 +6,7 @@ import { IWebsocketConnectorRpcClient } from '../../proto/packages/dht/protos/Dh
6
6
  import { Logger } from '@streamr/utils'
7
7
  import * as Err from '../../helpers/errors'
8
8
  import { ProtoRpcClient } from '@streamr/proto-rpc'
9
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
9
+ import { getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
10
10
  import { Remote } from '../../dht/contact/Remote'
11
11
 
12
12
  const logger = new Logger(module)
@@ -22,7 +22,7 @@ export class WebsocketConnectorRpcRemote extends Remote<IWebsocketConnectorRpcCl
22
22
  }
23
23
 
24
24
  async requestConnection(ip: string, port: number): Promise<boolean> {
25
- logger.trace(`Requesting WebSocket connection from ${keyFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
25
+ logger.trace(`Requesting WebSocket connection from ${getNodeIdFromPeerDescriptor(this.getLocalPeerDescriptor())}`)
26
26
  const request: WebsocketConnectionRequest = {
27
27
  ip,
28
28
  port
@@ -33,7 +33,12 @@ import {
33
33
  import { toProtoRpcClient } from '@streamr/proto-rpc'
34
34
  import { RandomContactList } from './contact/RandomContactList'
35
35
  import { Any } from '../proto/google/protobuf/any'
36
- import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
36
+ import {
37
+ areEqualPeerDescriptors,
38
+ getNodeIdFromPeerDescriptor,
39
+ keyFromPeerDescriptor,
40
+ peerIdFromPeerDescriptor
41
+ } from '../helpers/peerIdFromPeerDescriptor'
37
42
  import { Router } from './routing/Router'
38
43
  import { Finder, FindResult } from './find/Finder'
39
44
  import { StoreRpcLocal } from './store/StoreRpcLocal'
@@ -375,22 +380,22 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
375
380
  } else {
376
381
  logger.trace('new connection not set to connections, there is already a connection with the peer ID')
377
382
  }
378
- logger.trace('connected: ' + keyFromPeerDescriptor(peerDescriptor) + ' ' + this.connections.size)
383
+ logger.trace('connected: ' + getNodeIdFromPeerDescriptor(peerDescriptor) + ' ' + this.connections.size)
379
384
  this.emit('connected', peerDescriptor)
380
385
  }
381
386
 
382
387
  private onTransportDisconnected(peerDescriptor: PeerDescriptor, gracefulLeave: boolean): void {
383
- logger.trace('disconnected: ' + keyFromPeerDescriptor(peerDescriptor))
388
+ logger.trace('disconnected: ' + getNodeIdFromPeerDescriptor(peerDescriptor))
384
389
  this.connections.delete(keyFromPeerDescriptor(peerDescriptor))
385
390
  // only remove from bucket if we are on layer 0
386
391
  if (this.connectionManager) {
387
392
  this.bucket!.remove(peerDescriptor.kademliaId)
388
393
 
389
394
  if (gracefulLeave === true) {
390
- logger.trace(keyFromPeerDescriptor(peerDescriptor) + ' ' + 'onTransportDisconnected with gracefulLeave ' + gracefulLeave)
395
+ logger.trace(getNodeIdFromPeerDescriptor(peerDescriptor) + ' ' + 'onTransportDisconnected with gracefulLeave ' + gracefulLeave)
391
396
  this.removeContact(peerDescriptor)
392
397
  } else {
393
- logger.trace(keyFromPeerDescriptor(peerDescriptor) + ' ' + 'onTransportDisconnected with gracefulLeave ' + gracefulLeave)
398
+ logger.trace(getNodeIdFromPeerDescriptor(peerDescriptor) + ' ' + 'onTransportDisconnected with gracefulLeave ' + gracefulLeave)
394
399
  }
395
400
  }
396
401
 
@@ -444,11 +449,12 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
444
449
 
445
450
  private handleMessage(message: Message): void {
446
451
  if (message.serviceId === this.config.serviceId) {
447
- logger.trace('callig this.handleMessageFromPeer ' + keyFromPeerDescriptor(message.sourceDescriptor!)
452
+ logger.trace('callig this.handleMessageFromPeer ' + getNodeIdFromPeerDescriptor(message.sourceDescriptor!)
448
453
  + ' ' + message.serviceId + ' ' + message.messageId)
449
454
  this.rpcCommunicator?.handleMessageFromPeer(message)
450
455
  } else {
451
- logger.trace('emit "message" ' + keyFromPeerDescriptor(message.sourceDescriptor!) + ' ' + message.serviceId + ' ' + message.messageId)
456
+ logger.trace('emit "message" ' + getNodeIdFromPeerDescriptor(message.sourceDescriptor!)
457
+ + ' ' + message.serviceId + ' ' + message.messageId)
452
458
  this.emit('message', message)
453
459
  }
454
460
  }
@@ -479,7 +485,7 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
479
485
  return
480
486
  }
481
487
  this.connectionManager?.weakUnlockConnection(contact.getPeerDescriptor())
482
- logger.trace(`Removed contact ${keyFromPeerDescriptor(contact.getPeerDescriptor())}`)
488
+ logger.trace(`Removed contact ${getNodeIdFromPeerDescriptor(contact.getPeerDescriptor())}`)
483
489
  if (this.bucket!.count() === 0
484
490
  && !this.peerDiscovery!.isJoinOngoing()
485
491
  && this.config.entryPoints
@@ -501,14 +507,14 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
501
507
  // Important to lock here, before the ping result is known
502
508
  this.connectionManager?.weakLockConnection(contact.getPeerDescriptor())
503
509
  if (this.connections.has(contact.getPeerId().toKey())) {
504
- logger.trace(`Added new contact ${keyFromPeerDescriptor(contact.getPeerDescriptor())}`)
510
+ logger.trace(`Added new contact ${getNodeIdFromPeerDescriptor(contact.getPeerDescriptor())}`)
505
511
  } else { // open connection by pinging
506
- logger.trace('starting ping ' + keyFromPeerDescriptor(contact.getPeerDescriptor()))
512
+ logger.trace('starting ping ' + getNodeIdFromPeerDescriptor(contact.getPeerDescriptor()))
507
513
  contact.ping().then((result) => {
508
514
  if (result) {
509
- logger.trace(`Added new contact ${keyFromPeerDescriptor(contact.getPeerDescriptor())}`)
515
+ logger.trace(`Added new contact ${getNodeIdFromPeerDescriptor(contact.getPeerDescriptor())}`)
510
516
  } else {
511
- logger.trace('ping failed ' + keyFromPeerDescriptor(contact.getPeerDescriptor()))
517
+ logger.trace('ping failed ' + getNodeIdFromPeerDescriptor(contact.getPeerDescriptor()))
512
518
  this.connectionManager?.weakUnlockConnection(contact.getPeerDescriptor())
513
519
  this.removeContact(contact.getPeerDescriptor())
514
520
  this.addClosestContactToBucket()
@@ -559,7 +565,7 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
559
565
  return
560
566
  }
561
567
  if (!areEqualPeerDescriptors(contact, this.localPeerDescriptor!)) {
562
- logger.trace(`Adding new contact ${keyFromPeerDescriptor(contact)}`)
568
+ logger.trace(`Adding new contact ${getNodeIdFromPeerDescriptor(contact)}`)
563
569
  const rpcRemote = new DhtNodeRpcRemote(
564
570
  this.localPeerDescriptor!,
565
571
  contact,
@@ -591,7 +597,7 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
591
597
  if (!this.started || this.stopped) {
592
598
  return
593
599
  }
594
- logger.trace(`Removing contact ${keyFromPeerDescriptor(contact)}`)
600
+ logger.trace(`Removing contact ${getNodeIdFromPeerDescriptor(contact)}`)
595
601
  const peerId = peerIdFromPeerDescriptor(contact)
596
602
  this.bucket!.remove(peerId.value)
597
603
  this.neighborList!.removeContact(peerId)
@@ -722,8 +728,10 @@ export class DhtNode extends EventEmitter<Events> implements ITransport {
722
728
  this.router!.stop()
723
729
  this.finder!.stop()
724
730
  this.peerDiscovery!.stop()
725
- if (this.connectionManager) {
726
- await this.connectionManager.stop()
731
+ if (this.config.transport === undefined) {
732
+ // if the transport was not given in config, the instance was created in start() and
733
+ // this component is responsible for stopping it
734
+ await this.transport!.stop()
727
735
  }
728
736
  this.transport = undefined
729
737
  this.connectionManager = undefined
@@ -1,7 +1,7 @@
1
1
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
2
  import { Logger } from '@streamr/utils'
3
3
  import KBucket from 'k-bucket'
4
- import { keyFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
4
+ import { getNodeIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
5
5
  import { Empty } from '../proto/google/protobuf/empty'
6
6
  import {
7
7
  ClosestPeersRequest,
@@ -48,7 +48,7 @@ export class DhtNodeRpcLocal implements IDhtNodeRpc {
48
48
  }
49
49
 
50
50
  async ping(request: PingRequest, context: ServerCallContext): Promise<PingResponse> {
51
- logger.trace('received ping request: ' + keyFromPeerDescriptor((context as DhtCallContext).incomingSourceDescriptor!))
51
+ logger.trace('received ping request: ' + getNodeIdFromPeerDescriptor((context as DhtCallContext).incomingSourceDescriptor!))
52
52
  setImmediate(() => {
53
53
  this.config.addNewContact((context as DhtCallContext).incomingSourceDescriptor!)
54
54
  })
@@ -61,7 +61,7 @@ export class DhtNodeRpcLocal implements IDhtNodeRpc {
61
61
  async leaveNotice(_request: LeaveNotice, context: ServerCallContext): Promise<Empty> {
62
62
  // TODO check signature??
63
63
  const sender = (context as DhtCallContext).incomingSourceDescriptor!
64
- logger.trace('received leave notice: ' + keyFromPeerDescriptor(sender))
64
+ logger.trace('received leave notice: ' + getNodeIdFromPeerDescriptor(sender))
65
65
  this.config.removeContact(sender)
66
66
  return {}
67
67
  }
@@ -10,7 +10,7 @@ import { Logger } from '@streamr/utils'
10
10
  import { ProtoRpcClient } from '@streamr/proto-rpc'
11
11
  import { Remote } from './contact/Remote'
12
12
  import { PeerID } from '../helpers/PeerID'
13
- import { keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
13
+ import { getNodeIdFromPeerDescriptor, peerIdFromPeerDescriptor } from '../helpers/peerIdFromPeerDescriptor'
14
14
  import { ServiceID } from '../types/ServiceID'
15
15
 
16
16
  const logger = new Logger(module)
@@ -40,7 +40,7 @@ export class DhtNodeRpcRemote extends Remote<IDhtNodeRpcClient> implements KBuck
40
40
  }
41
41
 
42
42
  async getClosestPeers(kademliaId: Uint8Array): Promise<PeerDescriptor[]> {
43
- logger.trace(`Requesting getClosestPeers on ${this.getServiceId()} from ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
43
+ logger.trace(`Requesting getClosestPeers on ${this.getServiceId()} from ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())}`)
44
44
  const request: ClosestPeersRequest = {
45
45
  kademliaId,
46
46
  requestId: v4()
@@ -55,7 +55,7 @@ export class DhtNodeRpcRemote extends Remote<IDhtNodeRpcClient> implements KBuck
55
55
  }
56
56
 
57
57
  async ping(): Promise<boolean> {
58
- logger.trace(`Requesting ping on ${this.getServiceId()} from ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
58
+ logger.trace(`Requesting ping on ${this.getServiceId()} from ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())}`)
59
59
  const request: PingRequest = {
60
60
  requestId: v4()
61
61
  }
@@ -66,13 +66,13 @@ export class DhtNodeRpcRemote extends Remote<IDhtNodeRpcClient> implements KBuck
66
66
  return true
67
67
  }
68
68
  } catch (err) {
69
- logger.trace(`ping failed on ${this.getServiceId()} to ${keyFromPeerDescriptor(this.getPeerDescriptor())}: ${err}`)
69
+ logger.trace(`ping failed on ${this.getServiceId()} to ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())}: ${err}`)
70
70
  }
71
71
  return false
72
72
  }
73
73
 
74
74
  leaveNotice(): void {
75
- logger.trace(`Sending leaveNotice on ${this.getServiceId()} from ${keyFromPeerDescriptor(this.getPeerDescriptor())}`)
75
+ logger.trace(`Sending leaveNotice on ${this.getServiceId()} from ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())}`)
76
76
  const request: LeaveNotice = {
77
77
  serviceId: this.getServiceId()
78
78
  }
@@ -8,7 +8,7 @@ import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
8
8
  import { DhtNodeRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
9
9
  import { SortedContactList } from '../contact/SortedContactList'
10
10
  import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote'
11
- import { areEqualPeerDescriptors, keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
11
+ import { areEqualPeerDescriptors, getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
12
12
  import { ServiceID } from '../../types/ServiceID'
13
13
 
14
14
  const logger = new Logger(module)
@@ -71,7 +71,7 @@ export class DiscoverySession {
71
71
  if (this.stopped) {
72
72
  return []
73
73
  }
74
- logger.trace(`Getting closest peers from contact: ${keyFromPeerDescriptor(contact.getPeerDescriptor())}`)
74
+ logger.trace(`Getting closest peers from contact: ${getNodeIdFromPeerDescriptor(contact.getPeerDescriptor())}`)
75
75
  this.outgoingClosestPeersRequestsCounter++
76
76
  this.config.neighborList.setContacted(contact.getPeerId())
77
77
  const returnedContacts = await contact.getClosestPeers(this.config.targetId)
@@ -1,6 +1,6 @@
1
1
  import { DiscoverySession } from './DiscoverySession'
2
2
  import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote'
3
- import { areEqualPeerDescriptors, keyFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
3
+ import { areEqualPeerDescriptors, getNodeIdFromPeerDescriptor, peerIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
4
4
  import { PeerDescriptor } from '../../proto/packages/dht/protos/DhtRpc'
5
5
  import { Logger, scheduleAtInterval, setAbortableTimeout } from '@streamr/utils'
6
6
  import KBucket from 'k-bucket'
@@ -49,7 +49,7 @@ export class PeerDiscovery {
49
49
  this.joinCalled = true
50
50
  logger.debug(
51
51
  `Joining ${this.config.serviceId === 'layer0' ? 'The Streamr Network' : `Control Layer for ${this.config.serviceId}`}`
52
- + ` via entrypoint ${keyFromPeerDescriptor(entryPointDescriptor)}`
52
+ + ` via entrypoint ${getNodeIdFromPeerDescriptor(entryPointDescriptor)}`
53
53
  )
54
54
  if (areEqualPeerDescriptors(entryPointDescriptor, this.config.localPeerDescriptor)) {
55
55
  return
@@ -1,7 +1,7 @@
1
1
  import { Logger } from '@streamr/utils'
2
2
  import { PeerDescriptor, RouteMessageAck, RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
3
3
  import { IFindRpc } from '../../proto/packages/dht/protos/DhtRpc.server'
4
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
4
+ import { getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
5
5
  import { createRouteMessageAck } from '../routing/RouterRpcLocal'
6
6
  import { getPreviousPeer } from '../routing/getPreviousPeer'
7
7
 
@@ -26,8 +26,8 @@ export class FindRpcLocal implements IFindRpc {
26
26
  if (this.config.isMostLikelyDuplicate(routedMessage.requestId)) {
27
27
  return createRouteMessageAck(routedMessage, 'message given to routeFindRequest() service is likely a duplicate')
28
28
  }
29
- const senderKey = keyFromPeerDescriptor(getPreviousPeer(routedMessage) ?? routedMessage.sourcePeer!)
30
- logger.trace(`Received routeFindRequest call from ${senderKey}`)
29
+ const senderId = getNodeIdFromPeerDescriptor(getPreviousPeer(routedMessage) ?? routedMessage.sourcePeer!)
30
+ logger.trace(`Received routeFindRequest call from ${senderId}`)
31
31
  this.config.addContact(routedMessage.sourcePeer!, true)
32
32
  this.config.addToDuplicateDetector(routedMessage.requestId)
33
33
  return this.config.doRouteFindRequest(routedMessage)
@@ -1,6 +1,6 @@
1
1
  import { RouteMessageWrapper } from '../../proto/packages/dht/protos/DhtRpc'
2
2
  import { v4 } from 'uuid'
3
- import { keyFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
3
+ import { getNodeIdFromPeerDescriptor } from '../../helpers/peerIdFromPeerDescriptor'
4
4
  import { Remote } from '../contact/Remote'
5
5
  import { Logger } from '@streamr/utils'
6
6
  import { IFindRpcClient } from '../../proto/packages/dht/protos/DhtRpc.client'
@@ -29,10 +29,10 @@ export class FindRpcRemote extends Remote<IFindRpcClient> {
29
29
  } catch (err) {
30
30
  const previousPeer = getPreviousPeer(params)
31
31
  const fromNode = previousPeer
32
- ? keyFromPeerDescriptor(previousPeer)
33
- : keyFromPeerDescriptor(params.sourcePeer!)
32
+ ? getNodeIdFromPeerDescriptor(previousPeer)
33
+ : getNodeIdFromPeerDescriptor(params.sourcePeer!)
34
34
  // eslint-disable-next-line max-len
35
- logger.debug(`Failed to send routeFindRequest message from ${fromNode} to ${keyFromPeerDescriptor(this.getPeerDescriptor())} with: ${err}`)
35
+ logger.debug(`Failed to send routeFindRequest message from ${fromNode} to ${getNodeIdFromPeerDescriptor(this.getPeerDescriptor())} with: ${err}`)
36
36
  return false
37
37
  }
38
38
  return true