@streamr/trackerless-network 100.0.0-testnet-three.6 → 100.1.0

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 (182) hide show
  1. package/dist/package.json +7 -7
  2. package/dist/src/NetworkNode.js +11 -11
  3. package/dist/src/NetworkNode.js.map +1 -1
  4. package/dist/src/NetworkStack.d.ts +6 -6
  5. package/dist/src/NetworkStack.js +22 -20
  6. package/dist/src/NetworkStack.js.map +1 -1
  7. package/dist/src/exports.d.ts +3 -3
  8. package/dist/src/exports.js +7 -1
  9. package/dist/src/exports.js.map +1 -1
  10. package/dist/src/logic/{StreamrNode.d.ts → ContentDeliveryManager.d.ts} +6 -6
  11. package/dist/src/logic/{StreamrNode.js → ContentDeliveryManager.js} +16 -13
  12. package/dist/src/logic/ContentDeliveryManager.js.map +1 -0
  13. package/dist/src/logic/{DeliveryRpcLocal.d.ts → ContentDeliveryRpcLocal.d.ts} +4 -4
  14. package/dist/src/logic/{DeliveryRpcLocal.js → ContentDeliveryRpcLocal.js} +4 -4
  15. package/dist/src/logic/ContentDeliveryRpcLocal.js.map +1 -0
  16. package/dist/src/logic/{DeliveryRpcRemote.d.ts → ContentDeliveryRpcRemote.d.ts} +2 -2
  17. package/dist/src/logic/{DeliveryRpcRemote.js → ContentDeliveryRpcRemote.js} +4 -4
  18. package/dist/src/logic/ContentDeliveryRpcRemote.js.map +1 -0
  19. package/dist/src/logic/EntryPointDiscovery.d.ts +1 -1
  20. package/dist/src/logic/EntryPointDiscovery.js +3 -3
  21. package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
  22. package/dist/src/logic/Layer0Node.d.ts +1 -1
  23. package/dist/src/logic/Layer1Node.d.ts +7 -1
  24. package/dist/src/logic/NodeList.d.ts +11 -10
  25. package/dist/src/logic/NodeList.js +7 -2
  26. package/dist/src/logic/NodeList.js.map +1 -1
  27. package/dist/src/logic/RandomGraphNode.d.ts +4 -1
  28. package/dist/src/logic/RandomGraphNode.js +36 -14
  29. package/dist/src/logic/RandomGraphNode.js.map +1 -1
  30. package/dist/src/logic/createRandomGraphNode.d.ts +1 -1
  31. package/dist/src/logic/createRandomGraphNode.js +16 -7
  32. package/dist/src/logic/createRandomGraphNode.js.map +1 -1
  33. package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +1 -1
  34. package/dist/src/logic/formStreamPartDeliveryServiceId.js +4 -3
  35. package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -1
  36. package/dist/src/logic/inspect/Inspector.js +2 -2
  37. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  38. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +3 -4
  39. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +6 -11
  40. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
  41. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +2 -2
  42. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
  43. package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +4 -3
  44. package/dist/src/logic/neighbor-discovery/Handshaker.js +35 -16
  45. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  46. package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +3 -0
  47. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +7 -1
  48. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
  49. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +1 -2
  50. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +0 -1
  51. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  52. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +1 -2
  53. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +2 -3
  54. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  55. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +1 -1
  56. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
  57. package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
  58. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +64 -52
  59. package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
  60. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +5 -1
  61. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +19 -1
  62. package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -1
  63. package/dist/src/logic/proxy/ProxyClient.d.ts +1 -1
  64. package/dist/src/logic/proxy/ProxyClient.js +8 -8
  65. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  66. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +2 -2
  67. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +5 -5
  68. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  69. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js +1 -1
  70. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
  71. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +5 -1
  72. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +7 -2
  73. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  74. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +2 -2
  75. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
  76. package/dist/src/proto/google/protobuf/any.d.ts +11 -4
  77. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  78. package/dist/src/proto/google/protobuf/empty.d.ts +0 -1
  79. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  80. package/dist/src/proto/google/protobuf/timestamp.d.ts +9 -3
  81. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  82. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +16 -6
  83. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +11 -4
  84. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  85. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +98 -87
  86. package/dist/src/proto/packages/dht/protos/DhtRpc.js +45 -49
  87. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  88. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +10 -4
  89. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +4 -4
  90. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +7 -7
  91. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
  92. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +62 -26
  93. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +31 -14
  94. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
  95. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +2 -2
  96. package/dist/test/benchmark/first-message.js +5 -5
  97. package/dist/test/benchmark/first-message.js.map +1 -1
  98. package/dist/test/utils/utils.d.ts +2 -2
  99. package/dist/test/utils/utils.js +18 -11
  100. package/dist/test/utils/utils.js.map +1 -1
  101. package/karma.config.js +2 -0
  102. package/package.json +7 -7
  103. package/protos/NetworkRpc.proto +19 -11
  104. package/src/NetworkNode.ts +11 -11
  105. package/src/NetworkStack.ts +30 -25
  106. package/src/exports.ts +7 -3
  107. package/src/logic/{StreamrNode.ts → ContentDeliveryManager.ts} +21 -17
  108. package/src/logic/{DeliveryRpcLocal.ts → ContentDeliveryRpcLocal.ts} +5 -5
  109. package/src/logic/{DeliveryRpcRemote.ts → ContentDeliveryRpcRemote.ts} +2 -2
  110. package/src/logic/EntryPointDiscovery.ts +4 -4
  111. package/src/logic/Layer0Node.ts +1 -1
  112. package/src/logic/Layer1Node.ts +16 -1
  113. package/src/logic/NodeList.ts +20 -14
  114. package/src/logic/RandomGraphNode.ts +89 -27
  115. package/src/logic/createRandomGraphNode.ts +18 -9
  116. package/src/logic/formStreamPartDeliveryServiceId.ts +2 -1
  117. package/src/logic/inspect/Inspector.ts +2 -2
  118. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +10 -15
  119. package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +2 -2
  120. package/src/logic/neighbor-discovery/Handshaker.ts +41 -22
  121. package/src/logic/neighbor-discovery/NeighborFinder.ts +10 -1
  122. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +1 -3
  123. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +5 -7
  124. package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +1 -1
  125. package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +0 -1
  126. package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +74 -71
  127. package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +28 -2
  128. package/src/logic/proxy/ProxyClient.ts +11 -11
  129. package/src/logic/proxy/ProxyConnectionRpcLocal.ts +9 -11
  130. package/src/logic/proxy/ProxyConnectionRpcRemote.ts +1 -1
  131. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +14 -6
  132. package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +2 -2
  133. package/src/proto/google/protobuf/any.ts +11 -4
  134. package/src/proto/google/protobuf/empty.ts +0 -1
  135. package/src/proto/google/protobuf/timestamp.ts +9 -3
  136. package/src/proto/packages/dht/protos/DhtRpc.client.ts +22 -9
  137. package/src/proto/packages/dht/protos/DhtRpc.server.ts +10 -4
  138. package/src/proto/packages/dht/protos/DhtRpc.ts +122 -100
  139. package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +8 -8
  140. package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +2 -2
  141. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +79 -37
  142. package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +60 -0
  143. package/test/benchmark/first-message.ts +5 -5
  144. package/test/end-to-end/inspect.test.ts +6 -6
  145. package/test/end-to-end/proxy-and-full-node.test.ts +19 -19
  146. package/test/end-to-end/proxy-connections.test.ts +7 -7
  147. package/test/end-to-end/proxy-key-exchange.test.ts +16 -13
  148. package/test/end-to-end/webrtc-full-node-network.test.ts +8 -8
  149. package/test/end-to-end/websocket-full-node-network.test.ts +9 -9
  150. package/test/integration/ContentDeliveryManager.test.ts +135 -0
  151. package/test/integration/{DeliveryRpcRemote.test.ts → ContentDeliveryRpcRemote.test.ts} +6 -6
  152. package/test/integration/Handshakes.test.ts +7 -3
  153. package/test/integration/Inspect.test.ts +2 -2
  154. package/test/integration/NetworkRpc.test.ts +3 -3
  155. package/test/integration/NetworkStack.test.ts +7 -7
  156. package/test/integration/NodeInfoRpc.test.ts +10 -10
  157. package/test/integration/joining-streams-on-offline-peers.test.ts +3 -3
  158. package/test/integration/stream-without-default-entrypoints.test.ts +1 -1
  159. package/test/integration/streamEntryPointReplacing.test.ts +10 -8
  160. package/test/unit/ContentDeliveryManager.test.ts +96 -0
  161. package/test/unit/{DeliveryRpcLocal.test.ts → ContentDeliveryRpcLocal.test.ts} +4 -4
  162. package/test/unit/EntrypointDiscovery.test.ts +4 -4
  163. package/test/unit/HandshakeRpcLocal.test.ts +31 -15
  164. package/test/unit/Handshaker.test.ts +8 -3
  165. package/test/unit/NeighborFinder.test.ts +5 -2
  166. package/test/unit/NeighborUpdateRpcLocal.test.ts +8 -12
  167. package/test/unit/NetworkNode.test.ts +6 -6
  168. package/test/unit/NodeList.test.ts +6 -6
  169. package/test/unit/Propagation.test.ts +10 -7
  170. package/test/unit/RandomGraphNode.test.ts +3 -3
  171. package/test/unit/StreamMessageTranslator.test.ts +3 -4
  172. package/test/unit/StreamPartIDDataKey.test.ts +12 -0
  173. package/test/unit/TemporaryConnectionRpcLocal.test.ts +7 -1
  174. package/test/utils/mock/MockLayer0Node.ts +1 -1
  175. package/test/utils/mock/MockLayer1Node.ts +3 -0
  176. package/test/utils/utils.ts +19 -13
  177. package/dist/src/logic/DeliveryRpcLocal.js.map +0 -1
  178. package/dist/src/logic/DeliveryRpcRemote.js.map +0 -1
  179. package/dist/src/logic/StreamrNode.js.map +0 -1
  180. package/test/integration/StreamrNode.test.ts +0 -131
  181. package/test/unit/GroupKeyRequestTranslator.test.ts +0 -36
  182. package/test/unit/StreamrNode.test.ts +0 -98
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  ConnectionLocker,
3
+ DhtAddress,
3
4
  DhtNode,
5
+ EXISTING_CONNECTION_TIMEOUT,
4
6
  ITransport,
5
7
  PeerDescriptor,
6
- EXISTING_CONNECTION_TIMEOUT,
7
- DhtAddress,
8
8
  getNodeIdFromPeerDescriptor
9
9
  } from '@streamr/dht'
10
10
  import { StreamID, StreamPartID, StreamPartIDUtils, toStreamPartID } from '@streamr/protocol'
@@ -18,11 +18,11 @@ import {
18
18
  } from '@streamr/utils'
19
19
  import { EventEmitter } from 'eventemitter3'
20
20
  import { sampleSize } from 'lodash'
21
- import { ProxyDirection, StreamPartitionInfo, StreamMessage } from '../proto/packages/trackerless-network/protos/NetworkRpc'
21
+ import { ProxyDirection, StreamMessage, StreamPartitionInfo } from '../proto/packages/trackerless-network/protos/NetworkRpc'
22
+ import { EntryPointDiscovery, NETWORK_SPLIT_AVOIDANCE_LIMIT } from './EntryPointDiscovery'
22
23
  import { Layer0Node } from './Layer0Node'
23
24
  import { Layer1Node } from './Layer1Node'
24
25
  import { RandomGraphNode } from './RandomGraphNode'
25
- import { NETWORK_SPLIT_AVOIDANCE_LIMIT, EntryPointDiscovery } from './EntryPointDiscovery'
26
26
  import { createRandomGraphNode } from './createRandomGraphNode'
27
27
  import { ProxyClient } from './proxy/ProxyClient'
28
28
 
@@ -50,7 +50,7 @@ interface Metrics extends MetricsDefinition {
50
50
  broadcastBytesPerSecond: Metric
51
51
  }
52
52
 
53
- export interface StreamrNodeConfig {
53
+ export interface ContentDeliveryManagerConfig {
54
54
  metricsContext?: MetricsContext
55
55
  streamPartitionNeighborTargetCount?: number
56
56
  streamPartitionMinPropagationTargets?: number
@@ -58,20 +58,20 @@ export interface StreamrNodeConfig {
58
58
  rpcRequestTimeout?: number
59
59
  }
60
60
 
61
- // TODO rename class?
62
- export class StreamrNode extends EventEmitter<Events> {
61
+ export class ContentDeliveryManager extends EventEmitter<Events> {
62
+
63
63
  private transport?: ITransport
64
64
  private connectionLocker?: ConnectionLocker
65
65
  private layer0Node?: Layer0Node
66
66
  private readonly metricsContext: MetricsContext
67
67
  private readonly metrics: Metrics
68
- private readonly config: StreamrNodeConfig
68
+ private readonly config: ContentDeliveryManagerConfig
69
69
  private readonly streamParts: Map<StreamPartID, StreamPartDelivery>
70
70
  private readonly knownStreamPartEntryPoints: Map<StreamPartID, PeerDescriptor[]> = new Map()
71
71
  private started = false
72
72
  private destroyed = false
73
73
 
74
- constructor(config: StreamrNodeConfig) {
74
+ constructor(config: ContentDeliveryManagerConfig) {
75
75
  super()
76
76
  this.config = config
77
77
  this.streamParts = new Map()
@@ -87,7 +87,6 @@ export class StreamrNode extends EventEmitter<Events> {
87
87
  if (this.started || this.destroyed) {
88
88
  return
89
89
  }
90
- logger.info(`Starting new StreamrNode with id ${getNodeIdFromPeerDescriptor(startedAndJoinedLayer0Node.getLocalPeerDescriptor())}`)
91
90
  this.started = true
92
91
  this.layer0Node = startedAndJoinedLayer0Node
93
92
  this.transport = transport
@@ -98,7 +97,7 @@ export class StreamrNode extends EventEmitter<Events> {
98
97
  if (!this.started || this.destroyed) {
99
98
  return
100
99
  }
101
- logger.trace('Destroying StreamrNode...')
100
+ logger.trace('Destroying ContentDeliveryManager')
102
101
  this.destroyed = true
103
102
  await Promise.all(Array.from(this.streamParts.values()).map((streamPart) => streamPart.stop()))
104
103
  this.streamParts.clear()
@@ -113,8 +112,10 @@ export class StreamrNode extends EventEmitter<Events> {
113
112
  logger.debug(`Broadcasting to stream part ${streamPartId}`)
114
113
  this.joinStreamPart(streamPartId)
115
114
  this.streamParts.get(streamPartId)!.broadcast(msg)
116
- this.metrics.broadcastMessagesPerSecond.record(1)
117
- this.metrics.broadcastBytesPerSecond.record(msg.content.length)
115
+ if (msg.body.oneofKind === 'contentMessage') {
116
+ this.metrics.broadcastMessagesPerSecond.record(1)
117
+ this.metrics.broadcastBytesPerSecond.record(msg.body.contentMessage.content.length)
118
+ }
118
119
  }
119
120
 
120
121
  async leaveStreamPart(streamPartId: StreamPartID): Promise<void> {
@@ -136,7 +137,7 @@ export class StreamrNode extends EventEmitter<Events> {
136
137
  streamPartId,
137
138
  localPeerDescriptor: this.getPeerDescriptor(),
138
139
  layer1Node,
139
- getEntryPointData: (key) => this.layer0Node!.getDataFromDht(key),
140
+ fetchEntryPointData: (key) => this.layer0Node!.fetchDataFromDht(key),
140
141
  storeEntryPointData: (key, data) => this.layer0Node!.storeDataToDht(key, data),
141
142
  deleteEntryPointData: async (key) => this.layer0Node!.deleteDataFromDht(key, false)
142
143
  })
@@ -173,7 +174,7 @@ export class StreamrNode extends EventEmitter<Events> {
173
174
  try {
174
175
  await this.startLayersAndJoinDht(streamPartId, entryPointDiscovery)
175
176
  } catch (err) {
176
- logger.warn(`Failed to join to stream part ${streamPartId} with error: ${err}`)
177
+ logger.warn(`Failed to join to stream part ${streamPartId}`, { err })
177
178
  }
178
179
  })
179
180
  }
@@ -192,7 +193,10 @@ export class StreamrNode extends EventEmitter<Events> {
192
193
  entryPoints.length
193
194
  )
194
195
  entryPoints = entryPoints.concat(discoveryResult.discoveredEntryPoints)
195
- await streamPart.layer1Node.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT))
196
+ await Promise.all([
197
+ streamPart.layer1Node.joinDht(sampleSize(entryPoints, NETWORK_SPLIT_AVOIDANCE_LIMIT)),
198
+ streamPart.layer1Node.joinRing()
199
+ ])
196
200
  if (discoveryResult.entryPointsFromDht) {
197
201
  await entryPointDiscovery.storeSelfAsEntryPointIfNecessary(entryPoints.length)
198
202
  }
@@ -292,7 +296,7 @@ export class StreamrNode extends EventEmitter<Events> {
292
296
  return {
293
297
  id: streamPartId,
294
298
  controlLayerNeighbors: stream.layer1Node.getNeighbors(),
295
- deliveryLayerNeighbors: stream.node.getNeighbors()
299
+ contentDeliveryLayerNeighbors: stream.node.getNeighbors()
296
300
  }
297
301
  })
298
302
 
@@ -6,11 +6,11 @@ import {
6
6
  MessageRef,
7
7
  StreamMessage
8
8
  } from '../proto/packages/trackerless-network/protos/NetworkRpc'
9
- import { IDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
9
+ import { IContentDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
10
10
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
11
11
  import { StreamPartID } from '@streamr/protocol'
12
12
 
13
- export interface DeliveryRpcLocalConfig {
13
+ export interface ContentDeliveryRpcLocalConfig {
14
14
  localPeerDescriptor: PeerDescriptor
15
15
  streamPartId: StreamPartID
16
16
  markAndCheckDuplicate: (messageId: MessageID, previousMessageRef?: MessageRef) => boolean
@@ -20,11 +20,11 @@ export interface DeliveryRpcLocalConfig {
20
20
  rpcCommunicator: ListeningRpcCommunicator
21
21
  }
22
22
 
23
- export class DeliveryRpcLocal implements IDeliveryRpc {
23
+ export class ContentDeliveryRpcLocal implements IContentDeliveryRpc {
24
24
 
25
- private readonly config: DeliveryRpcLocalConfig
25
+ private readonly config: ContentDeliveryRpcLocalConfig
26
26
 
27
- constructor(config: DeliveryRpcLocalConfig) {
27
+ constructor(config: ContentDeliveryRpcLocalConfig) {
28
28
  this.config = config
29
29
  }
30
30
 
@@ -4,12 +4,12 @@ import {
4
4
  LeaveStreamPartNotice,
5
5
  StreamMessage
6
6
  } from '../proto/packages/trackerless-network/protos/NetworkRpc'
7
- import { DeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
7
+ import { ContentDeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
8
8
  import { StreamPartID } from '@streamr/protocol'
9
9
 
10
10
  const logger = new Logger(module)
11
11
 
12
- export class DeliveryRpcRemote extends RpcRemote<DeliveryRpcClient> {
12
+ export class ContentDeliveryRpcRemote extends RpcRemote<ContentDeliveryRpcClient> {
13
13
 
14
14
  async sendStreamMessage(msg: StreamMessage): Promise<void> {
15
15
  const options = this.formDhtRpcOptions({
@@ -13,7 +13,7 @@ import { Any } from '../proto/google/protobuf/any'
13
13
  import { Layer1Node } from './Layer1Node'
14
14
 
15
15
  export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => {
16
- return getDhtAddressFromRaw(new Uint8Array(createHash('md5').update(streamPartId).digest()))
16
+ return getDhtAddressFromRaw(new Uint8Array((createHash('sha1').update(streamPartId).digest())))
17
17
  }
18
18
 
19
19
  const parseEntryPointData = (dataEntries: DataEntry[]): PeerDescriptor[] => {
@@ -46,7 +46,7 @@ const exponentialRunOff = async (
46
46
  try { // Abort controller throws unexpected errors in destroy?
47
47
  await wait(delay, abortSignal)
48
48
  } catch (err) {
49
- logger.trace(`${err}`)
49
+ logger.trace(`${err}`) // TODO Do we need logging?
50
50
  }
51
51
  }
52
52
  }
@@ -60,7 +60,7 @@ interface EntryPointDiscoveryConfig {
60
60
  streamPartId: StreamPartID
61
61
  localPeerDescriptor: PeerDescriptor
62
62
  layer1Node: Layer1Node
63
- getEntryPointData: (key: DhtAddress) => Promise<DataEntry[]>
63
+ fetchEntryPointData: (key: DhtAddress) => Promise<DataEntry[]>
64
64
  storeEntryPointData: (key: DhtAddress, data: Any) => Promise<PeerDescriptor[]>
65
65
  deleteEntryPointData: (key: DhtAddress) => Promise<void>
66
66
  storeInterval?: number
@@ -111,7 +111,7 @@ export class EntryPointDiscovery {
111
111
  private async queryEntrypoints(key: DhtAddress): Promise<PeerDescriptor[]> {
112
112
  logger.trace(`Finding data from dht node ${getNodeIdFromPeerDescriptor(this.config.localPeerDescriptor)}`)
113
113
  try {
114
- const result = await this.config.getEntryPointData(key)
114
+ const result = await this.config.fetchEntryPointData(key)
115
115
  return parseEntryPointData(result)
116
116
  } catch (err) {
117
117
  return []
@@ -5,7 +5,7 @@ export interface Layer0Node extends ITransport {
5
5
  joinDht(entryPointDescriptors: PeerDescriptor[]): Promise<void>
6
6
  hasJoined(): boolean
7
7
  getLocalPeerDescriptor(): PeerDescriptor
8
- getDataFromDht(key: DhtAddress): Promise<DataEntry[]>
8
+ fetchDataFromDht(key: DhtAddress): Promise<DataEntry[]>
9
9
  storeDataToDht(key: DhtAddress, data: Any): Promise<PeerDescriptor[]>
10
10
  deleteDataFromDht(key: DhtAddress, waitForCompletion: boolean): Promise<void>
11
11
  waitForNetworkConnectivity(): Promise<void>
@@ -1,21 +1,36 @@
1
- import { DhtAddress, PeerDescriptor } from '@streamr/dht'
1
+ import { DhtAddress, PeerDescriptor, RingContacts } from '@streamr/dht'
2
2
 
3
3
  export interface Layer1NodeEvents {
4
4
  contactAdded: (peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => void
5
5
  contactRemoved: (peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => void
6
6
  randomContactAdded: (peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => void
7
7
  randomContactRemoved: (peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => void
8
+ ringContactAdded: (peerDescriptor: PeerDescriptor, closestPeers: RingContacts) => void
9
+ ringContactRemoved: (peerDescriptor: PeerDescriptor, closestPeers: RingContacts) => void
8
10
  }
9
11
 
10
12
  export interface Layer1Node {
11
13
  on<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
12
14
  once<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
13
15
  off<T extends keyof Layer1NodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor, peers: PeerDescriptor[]) => void): void
16
+ on<T extends keyof Layer1NodeEvents>(
17
+ eventName: T,
18
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts) => void
19
+ ): void
20
+ once<T extends keyof Layer1NodeEvents>(
21
+ eventName: T,
22
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts) => void
23
+ ): void
24
+ off<T extends keyof Layer1NodeEvents>(
25
+ eventName: T,
26
+ listener: (peerDescriptor: PeerDescriptor, peers: RingContacts
27
+ ) => void): void
14
28
  removeContact: (nodeId: DhtAddress) => void
15
29
  getClosestContacts: (maxCount?: number) => PeerDescriptor[]
16
30
  getNeighbors: () => PeerDescriptor[]
17
31
  getNeighborCount(): number
18
32
  joinDht: (entryPoints: PeerDescriptor[], doRandomJoin?: boolean, retry?: boolean) => Promise<void>
33
+ joinRing: () => Promise<void>
19
34
  start: () => Promise<void>
20
35
  stop: () => Promise<void>
21
36
  }
@@ -1,13 +1,14 @@
1
1
  import { DhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
2
  import { sample } from 'lodash'
3
- import { DeliveryRpcRemote } from './DeliveryRpcRemote'
3
+ import { ContentDeliveryRpcRemote } from './ContentDeliveryRpcRemote'
4
4
  import { EventEmitter } from 'eventemitter3'
5
5
 
6
6
  export interface Events {
7
- nodeAdded: (id: DhtAddress, remote: DeliveryRpcRemote) => any
7
+ nodeAdded: (id: DhtAddress, remote: ContentDeliveryRpcRemote) => void
8
+ nodeRemoved: (id: DhtAddress, remote: ContentDeliveryRpcRemote) => void
8
9
  }
9
10
 
10
- const getValuesOfIncludedKeys = (nodes: Map<DhtAddress, DeliveryRpcRemote>, exclude: DhtAddress[]): DeliveryRpcRemote[] => {
11
+ const getValuesOfIncludedKeys = (nodes: Map<DhtAddress, ContentDeliveryRpcRemote>, exclude: DhtAddress[]): ContentDeliveryRpcRemote[] => {
11
12
  return Array.from(nodes.entries())
12
13
  .filter(([id, _node]) => !exclude.includes(id))
13
14
  .map(([_id, node]) => node)
@@ -16,7 +17,7 @@ const getValuesOfIncludedKeys = (nodes: Map<DhtAddress, DeliveryRpcRemote>, excl
16
17
  // The items in the list are in the insertion order
17
18
 
18
19
  export class NodeList extends EventEmitter<Events> {
19
- private readonly nodes: Map<DhtAddress, DeliveryRpcRemote>
20
+ private readonly nodes: Map<DhtAddress, ContentDeliveryRpcRemote>
20
21
  private readonly limit: number
21
22
  private ownId: DhtAddress
22
23
 
@@ -27,7 +28,7 @@ export class NodeList extends EventEmitter<Events> {
27
28
  this.ownId = ownId
28
29
  }
29
30
 
30
- add(remote: DeliveryRpcRemote): void {
31
+ add(remote: ContentDeliveryRpcRemote): void {
31
32
  const nodeId = getNodeIdFromPeerDescriptor(remote.getPeerDescriptor())
32
33
  if ((this.ownId !== nodeId) && (this.nodes.size < this.limit)) {
33
34
  const isExistingNode = this.nodes.has(nodeId)
@@ -40,14 +41,19 @@ export class NodeList extends EventEmitter<Events> {
40
41
  }
41
42
 
42
43
  remove(nodeId: DhtAddress): void {
43
- this.nodes.delete(nodeId)
44
+ if (this.nodes.has(nodeId)) {
45
+ const remote = this.nodes.get(nodeId)!
46
+ this.nodes.delete(nodeId)
47
+ this.emit('nodeRemoved', nodeId, remote)
48
+ }
44
49
  }
45
50
 
46
51
  has(nodeId: DhtAddress): boolean {
47
52
  return this.nodes.has(nodeId)
48
53
  }
49
54
 
50
- replaceAll(neighbors: DeliveryRpcRemote[]): void {
55
+ // Replace nodes does not emit nodeRemoved events, use with caution
56
+ replaceAll(neighbors: ContentDeliveryRpcRemote[]): void {
51
57
  this.nodes.clear()
52
58
  const limited = neighbors.splice(0, this.limit)
53
59
  limited.forEach((remote) => {
@@ -59,7 +65,7 @@ export class NodeList extends EventEmitter<Events> {
59
65
  return Array.from(this.nodes.keys())
60
66
  }
61
67
 
62
- get(id: DhtAddress): DeliveryRpcRemote | undefined {
68
+ get(id: DhtAddress): ContentDeliveryRpcRemote | undefined {
63
69
  return this.nodes.get(id)
64
70
  }
65
71
 
@@ -67,16 +73,16 @@ export class NodeList extends EventEmitter<Events> {
67
73
  return Array.from(this.nodes.keys()).filter((node) => !exclude.includes(node)).length
68
74
  }
69
75
 
70
- getRandom(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
76
+ getRandom(exclude: DhtAddress[]): ContentDeliveryRpcRemote | undefined {
71
77
  return sample(getValuesOfIncludedKeys(this.nodes, exclude))
72
78
  }
73
79
 
74
- getFirst(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
80
+ getFirst(exclude: DhtAddress[]): ContentDeliveryRpcRemote | undefined {
75
81
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
76
82
  return included[0]
77
83
  }
78
84
 
79
- getFirstAndLast(exclude: DhtAddress[]): DeliveryRpcRemote[] {
85
+ getFirstAndLast(exclude: DhtAddress[]): ContentDeliveryRpcRemote[] {
80
86
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
81
87
  if (included.length === 0) {
82
88
  return []
@@ -84,17 +90,17 @@ export class NodeList extends EventEmitter<Events> {
84
90
  return included.length > 1 ? [this.getFirst(exclude)!, this.getLast(exclude)!] : [this.getFirst(exclude)!]
85
91
  }
86
92
 
87
- getLast(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
93
+ getLast(exclude: DhtAddress[]): ContentDeliveryRpcRemote | undefined {
88
94
  const included = getValuesOfIncludedKeys(this.nodes, exclude)
89
95
  return included[included.length - 1]
90
96
  }
91
97
 
92
- getAll(): DeliveryRpcRemote[] {
98
+ getAll(): ContentDeliveryRpcRemote[] {
93
99
  return Array.from(this.nodes.values())
94
100
  }
95
101
 
96
102
  stop(): void {
97
- this.nodes.clear()
103
+ this.nodes.forEach((node) => this.remove(getNodeIdFromPeerDescriptor(node.getPeerDescriptor())))
98
104
  this.removeAllListeners()
99
105
  }
100
106
  }
@@ -5,7 +5,8 @@ import {
5
5
  ITransport,
6
6
  ConnectionLocker,
7
7
  DhtAddress,
8
- getNodeIdFromPeerDescriptor
8
+ getNodeIdFromPeerDescriptor,
9
+ RingContacts
9
10
  } from '@streamr/dht'
10
11
  import {
11
12
  StreamMessage,
@@ -17,16 +18,15 @@ import {
17
18
  CloseTemporaryConnection,
18
19
  } from '../proto/packages/trackerless-network/protos/NetworkRpc'
19
20
  import { NodeList } from './NodeList'
20
- import { DeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
21
- import { DeliveryRpcRemote } from './DeliveryRpcRemote'
22
- import { IDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
21
+ import { ContentDeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
22
+ import { ContentDeliveryRpcRemote } from './ContentDeliveryRpcRemote'
23
23
  import { DuplicateMessageDetector } from './DuplicateMessageDetector'
24
24
  import { Logger, addManagedEventListener } from '@streamr/utils'
25
25
  import { Handshaker } from './neighbor-discovery/Handshaker'
26
26
  import { Propagation } from './propagation/Propagation'
27
27
  import { NeighborFinder } from './neighbor-discovery/NeighborFinder'
28
28
  import { NeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
29
- import { DeliveryRpcLocal } from './DeliveryRpcLocal'
29
+ import { ContentDeliveryRpcLocal } from './ContentDeliveryRpcLocal'
30
30
  import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
31
31
  import { Inspector } from './inspect/Inspector'
32
32
  import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
@@ -50,6 +50,8 @@ export interface StrictRandomGraphNodeConfig {
50
50
  nodeViewSize: number
51
51
  nearbyNodeView: NodeList
52
52
  randomNodeView: NodeList
53
+ leftNodeView: NodeList
54
+ rightNodeView: NodeList
53
55
  neighbors: NodeList
54
56
  handshaker: Handshaker
55
57
  neighborFinder: NeighborFinder
@@ -72,14 +74,14 @@ export class RandomGraphNode extends EventEmitter<Events> {
72
74
  private started = false
73
75
  private readonly duplicateDetectors: Map<string, DuplicateMessageDetector>
74
76
  private config: StrictRandomGraphNodeConfig
75
- private readonly deliveryRpcLocal: IDeliveryRpc
77
+ private readonly contentDeliveryRpcLocal: ContentDeliveryRpcLocal
76
78
  private abortController: AbortController = new AbortController()
77
79
 
78
80
  constructor(config: StrictRandomGraphNodeConfig) {
79
81
  super()
80
82
  this.config = config
81
83
  this.duplicateDetectors = new Map()
82
- this.deliveryRpcLocal = new DeliveryRpcLocal({
84
+ this.contentDeliveryRpcLocal = new ContentDeliveryRpcLocal({
83
85
  localPeerDescriptor: this.config.localPeerDescriptor,
84
86
  streamPartId: this.config.streamPartId,
85
87
  rpcCommunicator: this.config.rpcCommunicator,
@@ -92,13 +94,15 @@ export class RandomGraphNode extends EventEmitter<Events> {
92
94
  const contact = this.config.nearbyNodeView.get(sourceId)
93
95
  || this.config.randomNodeView.get(sourceId)
94
96
  || this.config.neighbors.get(sourceId)
95
- || this.config.proxyConnectionRpcLocal?.getConnection(sourceId )?.remote
97
+ || this.config.proxyConnectionRpcLocal?.getConnection(sourceId)?.remote
96
98
  // TODO: check integrity of notifier?
97
99
  if (contact) {
98
100
  this.config.layer1Node.removeContact(sourceId)
99
101
  this.config.neighbors.remove(sourceId)
100
102
  this.config.nearbyNodeView.remove(sourceId)
101
- this.config.connectionLocker.unlockConnection(contact.getPeerDescriptor(), this.config.streamPartId)
103
+ this.config.randomNodeView.remove(sourceId)
104
+ this.config.leftNodeView.remove(sourceId)
105
+ this.config.rightNodeView.remove(sourceId)
102
106
  this.config.neighborFinder.start([sourceId])
103
107
  this.config.proxyConnectionRpcLocal?.removeConnection(sourceId)
104
108
  }
@@ -130,13 +134,29 @@ export class RandomGraphNode extends EventEmitter<Events> {
130
134
  'randomContactAdded',
131
135
  (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactAdded(randomPeers),
132
136
  this.abortController.signal
133
- )
137
+ )
134
138
  addManagedEventListener<any, any>(
135
139
  this.config.layer1Node as any,
136
140
  'randomContactRemoved',
137
141
  (_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactRemoved(randomPeers),
138
142
  this.abortController.signal
139
- )
143
+ )
144
+ addManagedEventListener<any, any>(
145
+ this.config.layer1Node as any,
146
+ 'ringContactAdded',
147
+ (_: PeerDescriptor, peers: RingContacts) => {
148
+ this.onRingContactEvent(peers)
149
+ },
150
+ this.abortController.signal
151
+ )
152
+ addManagedEventListener<any, any>(
153
+ this.config.layer1Node as any,
154
+ 'ringContactRemoved',
155
+ (_: PeerDescriptor, peers: RingContacts) => {
156
+ this.onRingContactEvent(peers)
157
+ },
158
+ this.abortController.signal
159
+ )
140
160
  addManagedEventListener<any, any>(
141
161
  this.config.transport as any,
142
162
  'disconnected',
@@ -146,12 +166,27 @@ export class RandomGraphNode extends EventEmitter<Events> {
146
166
  addManagedEventListener(
147
167
  this.config.neighbors,
148
168
  'nodeAdded',
149
- (id, _remote) => {
169
+ (id, remote) => {
150
170
  this.config.propagation.onNeighborJoined(id)
171
+ this.config.connectionLocker.weakLockConnection(
172
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
173
+ this.config.streamPartId
174
+ )
151
175
  this.emit('neighborConnected', id)
152
176
  },
153
177
  this.abortController.signal
154
178
  )
179
+ addManagedEventListener(
180
+ this.config.neighbors,
181
+ 'nodeRemoved',
182
+ (_id, remote) => {
183
+ this.config.connectionLocker.weakUnlockConnection(
184
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
185
+ this.config.streamPartId
186
+ )
187
+ },
188
+ this.abortController.signal
189
+ )
155
190
  if (this.config.proxyConnectionRpcLocal !== undefined) {
156
191
  addManagedEventListener(
157
192
  this.config.proxyConnectionRpcLocal,
@@ -170,15 +205,40 @@ export class RandomGraphNode extends EventEmitter<Events> {
170
205
 
171
206
  private registerDefaultServerMethods(): void {
172
207
  this.config.rpcCommunicator.registerRpcNotification(StreamMessage, 'sendStreamMessage',
173
- (msg: StreamMessage, context) => this.deliveryRpcLocal.sendStreamMessage(msg, context))
208
+ (msg: StreamMessage, context) => this.contentDeliveryRpcLocal.sendStreamMessage(msg, context))
174
209
  this.config.rpcCommunicator.registerRpcNotification(LeaveStreamPartNotice, 'leaveStreamPartNotice',
175
- (req: LeaveStreamPartNotice, context) => this.deliveryRpcLocal.leaveStreamPartNotice(req, context))
210
+ (req: LeaveStreamPartNotice, context) => this.contentDeliveryRpcLocal.leaveStreamPartNotice(req, context))
176
211
  this.config.rpcCommunicator.registerRpcMethod(TemporaryConnectionRequest, TemporaryConnectionResponse, 'openConnection',
177
212
  (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.openConnection(req, context))
178
213
  this.config.rpcCommunicator.registerRpcNotification(CloseTemporaryConnection, 'closeConnection',
179
214
  (req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.closeConnection(req, context))
180
215
  }
181
216
 
217
+ private onRingContactEvent(ringPeers: RingContacts): void {
218
+ logger.trace(`onRingContactAdded`)
219
+ if (this.isStopped()) {
220
+ return
221
+ }
222
+ this.config.leftNodeView.replaceAll(ringPeers.left.map((peer) =>
223
+ new ContentDeliveryRpcRemote(
224
+ this.config.localPeerDescriptor,
225
+ peer,
226
+ this.config.rpcCommunicator,
227
+ ContentDeliveryRpcClient,
228
+ this.config.rpcRequestTimeout
229
+ )
230
+ ))
231
+ this.config.rightNodeView.replaceAll(ringPeers.right.map((peer) =>
232
+ new ContentDeliveryRpcRemote(
233
+ this.config.localPeerDescriptor,
234
+ peer,
235
+ this.config.rpcCommunicator,
236
+ ContentDeliveryRpcClient,
237
+ this.config.rpcRequestTimeout
238
+ )
239
+ ))
240
+ }
241
+
182
242
  private onContactAdded(closestNodes: PeerDescriptor[]): void {
183
243
  logger.trace(`New nearby contact found`)
184
244
  if (this.isStopped()) {
@@ -200,11 +260,11 @@ export class RandomGraphNode extends EventEmitter<Events> {
200
260
 
201
261
  private updateNearbyNodeView(nodes: PeerDescriptor[]) {
202
262
  this.config.nearbyNodeView.replaceAll(Array.from(nodes).map((descriptor) =>
203
- new DeliveryRpcRemote(
263
+ new ContentDeliveryRpcRemote(
204
264
  this.config.localPeerDescriptor,
205
265
  descriptor,
206
266
  this.config.rpcCommunicator,
207
- DeliveryRpcClient,
267
+ ContentDeliveryRpcClient,
208
268
  this.config.rpcRequestTimeout
209
269
  )
210
270
  ))
@@ -213,13 +273,12 @@ export class RandomGraphNode extends EventEmitter<Events> {
213
273
  break
214
274
  }
215
275
  this.config.nearbyNodeView.add(
216
- new DeliveryRpcRemote(
276
+ new ContentDeliveryRpcRemote(
217
277
  this.config.localPeerDescriptor,
218
278
  descriptor,
219
279
  this.config.rpcCommunicator,
220
- DeliveryRpcClient,
280
+ ContentDeliveryRpcClient,
221
281
  this.config.rpcRequestTimeout
222
-
223
282
  )
224
283
  )
225
284
  }
@@ -230,11 +289,11 @@ export class RandomGraphNode extends EventEmitter<Events> {
230
289
  return
231
290
  }
232
291
  this.config.randomNodeView.replaceAll(randomNodes.map((descriptor) =>
233
- new DeliveryRpcRemote(
292
+ new ContentDeliveryRpcRemote(
234
293
  this.config.localPeerDescriptor,
235
294
  descriptor,
236
295
  this.config.rpcCommunicator,
237
- DeliveryRpcClient,
296
+ ContentDeliveryRpcClient,
238
297
  this.config.rpcRequestTimeout
239
298
  )
240
299
  ))
@@ -249,11 +308,11 @@ export class RandomGraphNode extends EventEmitter<Events> {
249
308
  return
250
309
  }
251
310
  this.config.randomNodeView.replaceAll(randomNodes.map((descriptor) =>
252
- new DeliveryRpcRemote(
311
+ new ContentDeliveryRpcRemote(
253
312
  this.config.localPeerDescriptor,
254
313
  descriptor,
255
314
  this.config.rpcCommunicator,
256
- DeliveryRpcClient,
315
+ ContentDeliveryRpcClient,
257
316
  this.config.rpcRequestTimeout
258
317
  )
259
318
  ))
@@ -263,7 +322,6 @@ export class RandomGraphNode extends EventEmitter<Events> {
263
322
  const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
264
323
  if (this.config.neighbors.has(nodeId)) {
265
324
  this.config.neighbors.remove(nodeId)
266
- this.config.connectionLocker.unlockConnection(peerDescriptor, this.config.streamPartId)
267
325
  this.config.neighborFinder.start([nodeId])
268
326
  this.config.temporaryConnectionRpcLocal.removeNode(nodeId)
269
327
  }
@@ -293,9 +351,13 @@ export class RandomGraphNode extends EventEmitter<Events> {
293
351
  }
294
352
  this.abortController.abort()
295
353
  this.config.proxyConnectionRpcLocal?.stop()
296
- this.config.neighbors.getAll().map(
297
- (remote) => remote.leaveStreamPartNotice(this.config.streamPartId, this.config.isLocalNodeEntryPoint())
298
- )
354
+ this.config.neighbors.getAll().map((remote) => {
355
+ remote.leaveStreamPartNotice(this.config.streamPartId, this.config.isLocalNodeEntryPoint())
356
+ this.config.connectionLocker.weakUnlockConnection(
357
+ getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
358
+ this.config.streamPartId
359
+ )
360
+ })
299
361
  this.config.rpcCommunicator.destroy()
300
362
  this.removeAllListeners()
301
363
  this.config.nearbyNodeView.stop()