@streamr/trackerless-network 101.1.1 → 102.0.0-beta.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 (150) hide show
  1. package/dist/package.json +7 -7
  2. package/dist/src/NetworkNode.d.ts +6 -6
  3. package/dist/src/NetworkNode.js +5 -3
  4. package/dist/src/NetworkNode.js.map +1 -1
  5. package/dist/src/NetworkStack.js +3 -2
  6. package/dist/src/NetworkStack.js.map +1 -1
  7. package/dist/src/logic/ContentDeliveryLayerNode.d.ts +4 -1
  8. package/dist/src/logic/ContentDeliveryLayerNode.js +25 -5
  9. package/dist/src/logic/ContentDeliveryLayerNode.js.map +1 -1
  10. package/dist/src/logic/ContentDeliveryManager.d.ts +6 -2
  11. package/dist/src/logic/ContentDeliveryManager.js +26 -6
  12. package/dist/src/logic/ContentDeliveryManager.js.map +1 -1
  13. package/dist/src/logic/ContentDeliveryRpcLocal.js +2 -2
  14. package/dist/src/logic/ContentDeliveryRpcLocal.js.map +1 -1
  15. package/dist/src/logic/ContentDeliveryRpcRemote.d.ts +3 -0
  16. package/dist/src/logic/ContentDeliveryRpcRemote.js +7 -0
  17. package/dist/src/logic/ContentDeliveryRpcRemote.js.map +1 -1
  18. package/dist/src/logic/DuplicateMessageDetector.js +2 -2
  19. package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
  20. package/dist/src/logic/ExternalNetworkRpc.js.map +1 -1
  21. package/dist/src/logic/NodeList.js +2 -2
  22. package/dist/src/logic/NodeList.js.map +1 -1
  23. package/dist/src/logic/PeerDescriptorStoreManager.js +0 -1
  24. package/dist/src/logic/PeerDescriptorStoreManager.js.map +1 -1
  25. package/dist/src/logic/StreamPartNetworkSplitAvoidance.js +4 -3
  26. package/dist/src/logic/StreamPartNetworkSplitAvoidance.js.map +1 -1
  27. package/dist/src/logic/createContentDeliveryLayerNode.js +1 -1
  28. package/dist/src/logic/createContentDeliveryLayerNode.js.map +1 -1
  29. package/dist/src/logic/inspect/Inspector.js +3 -3
  30. package/dist/src/logic/inspect/Inspector.js.map +1 -1
  31. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +9 -9
  32. package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
  33. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +5 -5
  34. package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
  35. package/dist/src/logic/neighbor-discovery/Handshaker.js +12 -12
  36. package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
  37. package/dist/src/logic/neighbor-discovery/NeighborFinder.js +5 -0
  38. package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
  39. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +3 -1
  40. package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
  41. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +3 -3
  42. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
  43. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +1 -1
  44. package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
  45. package/dist/src/logic/propagation/Propagation.js +0 -1
  46. package/dist/src/logic/propagation/Propagation.js.map +1 -1
  47. package/dist/src/logic/proxy/ProxyClient.d.ts +3 -2
  48. package/dist/src/logic/proxy/ProxyClient.js +9 -4
  49. package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
  50. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +2 -2
  51. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +1 -1
  52. package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
  53. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +2 -2
  54. package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
  55. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +3 -3
  56. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
  57. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +2 -2
  58. package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
  59. package/dist/src/proto/google/protobuf/any.d.ts +11 -4
  60. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  61. package/dist/src/proto/google/protobuf/empty.d.ts +0 -1
  62. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  63. package/dist/src/proto/google/protobuf/timestamp.d.ts +9 -3
  64. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  65. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +26 -2
  66. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +16 -2
  67. package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
  68. package/dist/test/benchmark/first-message.js +1 -2
  69. package/dist/test/benchmark/first-message.js.map +1 -1
  70. package/dist/test/utils/utils.d.ts +2 -2
  71. package/dist/test/utils/utils.js +1 -1
  72. package/dist/test/utils/utils.js.map +1 -1
  73. package/jest.config.js +3 -0
  74. package/karma-setup.js +7 -0
  75. package/karma.config.js +1 -1
  76. package/package.json +7 -7
  77. package/protos/NetworkRpc.proto +7 -1
  78. package/src/NetworkNode.ts +10 -8
  79. package/src/NetworkStack.ts +4 -3
  80. package/src/logic/ContentDeliveryLayerNode.ts +30 -6
  81. package/src/logic/ContentDeliveryManager.ts +37 -11
  82. package/src/logic/ContentDeliveryRpcLocal.ts +3 -3
  83. package/src/logic/ContentDeliveryRpcRemote.ts +10 -0
  84. package/src/logic/DuplicateMessageDetector.ts +2 -2
  85. package/src/logic/ExternalNetworkRpc.ts +0 -1
  86. package/src/logic/NodeList.ts +4 -3
  87. package/src/logic/PeerDescriptorStoreManager.ts +0 -1
  88. package/src/logic/StreamPartNetworkSplitAvoidance.ts +5 -4
  89. package/src/logic/createContentDeliveryLayerNode.ts +2 -2
  90. package/src/logic/inspect/Inspector.ts +4 -4
  91. package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +11 -11
  92. package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +6 -6
  93. package/src/logic/neighbor-discovery/Handshaker.ts +13 -13
  94. package/src/logic/neighbor-discovery/NeighborFinder.ts +6 -1
  95. package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +4 -2
  96. package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +4 -4
  97. package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +2 -2
  98. package/src/logic/propagation/Propagation.ts +0 -1
  99. package/src/logic/proxy/ProxyClient.ts +15 -9
  100. package/src/logic/proxy/ProxyConnectionRpcLocal.ts +5 -5
  101. package/src/logic/proxy/ProxyConnectionRpcRemote.ts +2 -2
  102. package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +4 -4
  103. package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +3 -3
  104. package/src/proto/google/protobuf/any.ts +11 -4
  105. package/src/proto/google/protobuf/empty.ts +0 -1
  106. package/src/proto/google/protobuf/timestamp.ts +9 -3
  107. package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +34 -3
  108. package/test/benchmark/first-message.ts +2 -3
  109. package/test/end-to-end/content-delivery-layer-node-with-real-connections.test.ts +2 -2
  110. package/test/end-to-end/inspect.test.ts +2 -2
  111. package/test/end-to-end/proxy-and-full-node.test.ts +4 -4
  112. package/test/end-to-end/proxy-connections.test.ts +3 -3
  113. package/test/end-to-end/proxy-key-exchange.test.ts +5 -3
  114. package/test/end-to-end/webrtc-full-node-network.test.ts +4 -4
  115. package/test/end-to-end/websocket-full-node-network.test.ts +4 -4
  116. package/test/integration/ContentDeliveryLayerNode-Layer1Node-Latencies.test.ts +4 -4
  117. package/test/integration/ContentDeliveryLayerNode-Layer1Node.test.ts +4 -4
  118. package/test/integration/ContentDeliveryManager.test.ts +35 -14
  119. package/test/integration/ContentDeliveryRpcRemote.test.ts +2 -2
  120. package/test/integration/Handshakes.test.ts +7 -7
  121. package/test/integration/Inspect.test.ts +2 -2
  122. package/test/integration/NetworkNode.test.ts +2 -1
  123. package/test/integration/NetworkRpc.test.ts +4 -4
  124. package/test/integration/NetworkStack.test.ts +2 -2
  125. package/test/integration/NodeInfoRpc.test.ts +6 -2
  126. package/test/integration/Propagation.test.ts +2 -2
  127. package/test/integration/joining-streams-on-offline-peers.test.ts +2 -2
  128. package/test/integration/stream-without-default-entrypoints.test.ts +2 -1
  129. package/test/integration/streamEntryPointReplacing.test.ts +2 -2
  130. package/test/types/global.d.ts +2 -0
  131. package/test/unit/ContentDeliveryLayerNode.test.ts +22 -10
  132. package/test/unit/ContentDeliveryManager.test.ts +5 -5
  133. package/test/unit/ContentDeliveryRpcLocal.test.ts +2 -2
  134. package/test/unit/HandshakeRpcLocal.test.ts +8 -8
  135. package/test/unit/Handshaker.test.ts +2 -2
  136. package/test/unit/InspectSession.test.ts +3 -3
  137. package/test/unit/Inspector.test.ts +4 -4
  138. package/test/unit/NeighborFinder.test.ts +3 -3
  139. package/test/unit/NeighborUpdateRpcLocal.test.ts +5 -5
  140. package/test/unit/NetworkNode.test.ts +2 -2
  141. package/test/unit/NodeList.test.ts +22 -22
  142. package/test/unit/PeerDescriptorStoreManager.test.ts +2 -2
  143. package/test/unit/Propagation.test.ts +6 -5
  144. package/test/unit/ProxyConnectionRpcRemote.test.ts +3 -3
  145. package/test/unit/TemporaryConnectionRpcLocal.test.ts +3 -3
  146. package/test/utils/mock/MockControlLayerNode.ts +5 -0
  147. package/test/utils/mock/MockTransport.ts +11 -0
  148. package/test/utils/utils.ts +5 -5
  149. package/tsconfig.jest.json +1 -1
  150. package/tsconfig.json +3 -0
@@ -1,5 +1,5 @@
1
1
  import { ConnectionLocker, PeerDescriptor, Simulator } from '@streamr/dht';
2
- import { EthereumAddress, StreamPartID } from '@streamr/utils';
2
+ import { StreamPartID, UserID } from '@streamr/utils';
3
3
  import { NetworkNode } from '../../src/NetworkNode';
4
4
  import { ContentDeliveryLayerNode } from '../../src/logic/ContentDeliveryLayerNode';
5
5
  import { ContentDeliveryRpcRemote } from '../../src/logic/ContentDeliveryRpcRemote';
@@ -8,7 +8,7 @@ import { HandshakeRpcRemote } from '../../src/logic/neighbor-discovery/Handshake
8
8
  import { StreamMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc';
9
9
  export declare const mockConnectionLocker: ConnectionLocker;
10
10
  export declare const createMockContentDeliveryLayerNodeAndDhtNode: (localPeerDescriptor: PeerDescriptor, entryPointDescriptor: PeerDescriptor, streamPartId: StreamPartID, simulator: Simulator) => Promise<[DiscoveryLayerNode, ContentDeliveryLayerNode]>;
11
- export declare const createStreamMessage: (content: string, streamPartId: StreamPartID, publisherId: EthereumAddress, timestamp?: number, sequenceNumber?: number) => StreamMessage;
11
+ export declare const createStreamMessage: (content: string, streamPartId: StreamPartID, publisherId: UserID, timestamp?: number, sequenceNumber?: number) => StreamMessage;
12
12
  export declare const createMockPeerDescriptor: (opts?: Omit<Partial<PeerDescriptor>, 'nodeId' | 'type'>) => PeerDescriptor;
13
13
  export declare const createMockContentDeliveryRpcRemote: (remotePeerDescriptor?: PeerDescriptor) => ContentDeliveryRpcRemote;
14
14
  export declare const createMockHandshakeRpcRemote: () => HandshakeRpcRemote;
@@ -70,7 +70,7 @@ exports.createStreamMessage = createStreamMessage;
70
70
  const createMockPeerDescriptor = (opts) => {
71
71
  return {
72
72
  ...opts,
73
- nodeId: (0, dht_1.getRawFromDhtAddress)((0, dht_1.createRandomDhtAddress)()),
73
+ nodeId: (0, dht_1.toDhtAddressRaw)((0, dht_1.randomDhtAddress)()),
74
74
  type: dht_1.NodeType.NODEJS,
75
75
  region: (0, dht_1.getRandomRegion)()
76
76
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../test/utils/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../test/utils/utils.ts"],"names":[],"mappings":"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"}
package/jest.config.js CHANGED
@@ -1,5 +1,8 @@
1
1
  const rootConfig = require('../../jest.config')
2
2
  module.exports = {
3
3
  ...rootConfig,
4
+ setupFilesAfterEnv: rootConfig.setupFilesAfterEnv.concat(
5
+ '@streamr/test-utils/setupCustomMatchers'
6
+ ),
4
7
  testTimeout: 15000
5
8
  }
package/karma-setup.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * This setup script is executed indirectly by Karma via the `browser-test-runner`
3
+ * package. See karma-config.js in that package for more details.
4
+ */
5
+
6
+ const { customMatchers } = require('@streamr/test-utils')
7
+ expect.extend(customMatchers)
package/karma.config.js CHANGED
@@ -19,4 +19,4 @@ module.exports = createKarmaConfig(TEST_PATHS, createWebpackConfig({
19
19
  '@streamr/dht': path.resolve('../dht/src/exports.ts'),
20
20
  '@streamr/proto-rpc': path.resolve('../proto-rpc/src/exports.ts'),
21
21
  }
22
- }))
22
+ }), __dirname)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamr/trackerless-network",
3
- "version": "101.1.1",
3
+ "version": "102.0.0-beta.0",
4
4
  "description": "Minimal and extendable implementation of the Streamr Network node.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  "build": "tsc -b tsconfig.node.json",
16
16
  "build-browser": "webpack --mode=development --progress",
17
17
  "generate-protoc-code": "./proto.sh",
18
- "check": "tsc -p ./tsconfig.jest.json --noEmit",
18
+ "check": "tsc -p ./tsconfig.jest.json",
19
19
  "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true",
20
20
  "coverage": "jest --coverage",
21
21
  "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'",
@@ -30,10 +30,10 @@
30
30
  "dependencies": {
31
31
  "@protobuf-ts/runtime": "^2.8.2",
32
32
  "@protobuf-ts/runtime-rpc": "^2.8.2",
33
- "@streamr/dht": "101.1.1",
34
- "@streamr/proto-rpc": "101.1.1",
35
- "@streamr/test-utils": "101.1.1",
36
- "@streamr/utils": "101.1.1",
33
+ "@streamr/dht": "102.0.0-beta.0",
34
+ "@streamr/proto-rpc": "102.0.0-beta.0",
35
+ "@streamr/test-utils": "102.0.0-beta.0",
36
+ "@streamr/utils": "102.0.0-beta.0",
37
37
  "eventemitter3": "^5.0.0",
38
38
  "lodash": "^4.17.21",
39
39
  "uuid": "^10.0.0",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "devDependencies": {
43
43
  "@streamr/browser-test-runner": "^0.0.1",
44
- "@types/lodash": "^4.17.7",
44
+ "@types/lodash": "^4.17.10",
45
45
  "@types/uuid": "^10.0.0",
46
46
  "@types/yallist": "^4.0.1",
47
47
  "expect": "^29.6.2",
@@ -163,7 +163,13 @@ enum ProxyDirection {
163
163
  message StreamPartitionInfo {
164
164
  string id = 1;
165
165
  repeated dht.PeerDescriptor controlLayerNeighbors = 2;
166
- repeated dht.PeerDescriptor contentDeliveryLayerNeighbors = 3;
166
+ repeated dht.PeerDescriptor deprecatedContentDeliveryLayerNeighbors = 3;
167
+ repeated ContentDeliveryLayerNeighborInfo contentDeliveryLayerNeighbors = 4;
168
+ }
169
+
170
+ message ContentDeliveryLayerNeighborInfo {
171
+ dht.PeerDescriptor peerDescriptor = 1;
172
+ optional int32 rtt = 2;
167
173
  }
168
174
 
169
175
  message ControlLayerInfo {
@@ -1,11 +1,11 @@
1
- import { DhtAddress, PeerDescriptor } from '@streamr/dht'
2
- import { EthereumAddress, MetricsContext, StreamPartID } from '@streamr/utils'
3
- import { NetworkOptions, NetworkStack, NodeInfo } from './NetworkStack'
4
- import { ProxyDirection, StreamMessage } from './proto/packages/trackerless-network/protos/NetworkRpc'
5
- import { ExternalNetworkRpc, ExternalRpcClient, ExternalRpcClientClass } from './logic/ExternalNetworkRpc'
6
1
  import { IMessageType } from '@protobuf-ts/runtime'
7
2
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
3
+ import { DhtAddress, PeerDescriptor } from '@streamr/dht'
8
4
  import { ProtoRpcClient } from '@streamr/proto-rpc'
5
+ import { MetricsContext, StreamPartID, UserID } from '@streamr/utils'
6
+ import { ExternalNetworkRpc, ExternalRpcClient, ExternalRpcClientClass } from './logic/ExternalNetworkRpc'
7
+ import { NetworkOptions, NetworkStack, NodeInfo } from './NetworkStack'
8
+ import { ProxyDirection, StreamMessage } from './proto/packages/trackerless-network/protos/NetworkRpc'
9
9
 
10
10
  export const createNetworkNode = (opts: NetworkOptions): NetworkNode => {
11
11
  return new NetworkNode(new NetworkStack(opts))
@@ -46,7 +46,7 @@ export class NetworkNode {
46
46
  streamPartId: StreamPartID,
47
47
  nodes: PeerDescriptor[],
48
48
  direction: ProxyDirection,
49
- userId: EthereumAddress,
49
+ userId: UserID,
50
50
  connectionCount?: number
51
51
  ): Promise<void> {
52
52
  await this.stack.getContentDeliveryManager().setProxies(streamPartId, nodes, direction, userId, connectionCount)
@@ -113,9 +113,11 @@ export class NetworkNode {
113
113
  return this.stack.fetchNodeInfo(node)
114
114
  }
115
115
 
116
- // eslint-disable-next-line class-methods-use-this
117
116
  getDiagnosticInfo(): Record<string, unknown> {
118
- return {}
117
+ return {
118
+ controlLayer: this.stack.getControlLayerNode().getDiagnosticInfo(),
119
+ contentLayer: this.stack.getContentDeliveryManager().getDiagnosticInfo()
120
+ }
119
121
  }
120
122
 
121
123
  registerExternalNetworkRpcMethod<
@@ -5,7 +5,7 @@ import {
5
5
  ListeningRpcCommunicator,
6
6
  PeerDescriptor,
7
7
  areEqualPeerDescriptors,
8
- getNodeIdFromPeerDescriptor
8
+ toNodeId
9
9
  } from '@streamr/dht'
10
10
  import { Logger, MetricsContext, StreamID, StreamPartID, toStreamPartID, waitForCondition } from '@streamr/utils'
11
11
  import { pull } from 'lodash'
@@ -66,7 +66,8 @@ export class NetworkStack {
66
66
  this.metricsContext = options.metricsContext ?? new MetricsContext()
67
67
  this.controlLayerNode = new DhtNode({
68
68
  ...options.layer0,
69
- metricsContext: this.metricsContext
69
+ metricsContext: this.metricsContext,
70
+ allowIncomingPrivateConnections: options.networkNode?.acceptProxyConnections
70
71
  })
71
72
  this.contentDeliveryManager = new ContentDeliveryManager({
72
73
  ...options.networkNode,
@@ -106,7 +107,7 @@ export class NetworkStack {
106
107
  async start(doJoin = true): Promise<void> {
107
108
  logger.info('Starting a Streamr Network Node')
108
109
  await this.controlLayerNode!.start()
109
- logger.info(`Node id is ${getNodeIdFromPeerDescriptor(this.controlLayerNode!.getLocalPeerDescriptor())}`)
110
+ logger.info(`Node id is ${toNodeId(this.controlLayerNode!.getLocalPeerDescriptor())}`)
110
111
  const connectionManager = this.controlLayerNode!.getTransport() as ConnectionManager
111
112
  if ((this.options.layer0?.entryPoints !== undefined) && (this.options.layer0.entryPoints.some((entryPoint) =>
112
113
  areEqualPeerDescriptors(entryPoint, this.controlLayerNode!.getLocalPeerDescriptor())
@@ -4,12 +4,13 @@ import {
4
4
  ITransport,
5
5
  ListeningRpcCommunicator,
6
6
  PeerDescriptor,
7
- getNodeIdFromPeerDescriptor,
7
+ toNodeId,
8
8
  } from '@streamr/dht'
9
9
  import { Logger, StreamPartID, addManagedEventListener } from '@streamr/utils'
10
10
  import { EventEmitter } from 'eventemitter3'
11
11
  import {
12
12
  CloseTemporaryConnection,
13
+ ContentDeliveryLayerNeighborInfo,
13
14
  LeaveStreamPartNotice,
14
15
  MessageID,
15
16
  MessageRef,
@@ -75,6 +76,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
75
76
  private options: StrictContentDeliveryLayerNodeOptions
76
77
  private readonly contentDeliveryRpcLocal: ContentDeliveryRpcLocal
77
78
  private abortController: AbortController = new AbortController()
79
+ private messagesPropagated = 0
78
80
 
79
81
  constructor(options: StrictContentDeliveryLayerNodeOptions) {
80
82
  super()
@@ -164,7 +166,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
164
166
  (id, remote) => {
165
167
  this.options.propagation.onNeighborJoined(id)
166
168
  this.options.connectionLocker.weakLockConnection(
167
- getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
169
+ toNodeId(remote.getPeerDescriptor()),
168
170
  this.options.streamPartId
169
171
  )
170
172
  this.emit('neighborConnected', id)
@@ -176,7 +178,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
176
178
  'nodeRemoved',
177
179
  (_id, remote) => {
178
180
  this.options.connectionLocker.weakUnlockConnection(
179
- getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
181
+ toNodeId(remote.getPeerDescriptor()),
180
182
  this.options.streamPartId
181
183
  )
182
184
  },
@@ -315,7 +317,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
315
317
  }
316
318
 
317
319
  private onNodeDisconnected(peerDescriptor: PeerDescriptor): void {
318
- const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
320
+ const nodeId = toNodeId(peerDescriptor)
319
321
  if (this.options.neighbors.has(nodeId)) {
320
322
  this.options.neighbors.remove(nodeId)
321
323
  this.options.neighborFinder.start([nodeId])
@@ -339,7 +341,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
339
341
  this.options.neighbors.getAll().map((remote) => {
340
342
  remote.leaveStreamPartNotice(this.options.streamPartId, this.options.isLocalNodeEntryPoint())
341
343
  this.options.connectionLocker.weakUnlockConnection(
342
- getNodeIdFromPeerDescriptor(remote.getPeerDescriptor()),
344
+ toNodeId(remote.getPeerDescriptor()),
343
345
  this.options.streamPartId
344
346
  )
345
347
  })
@@ -360,6 +362,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
360
362
  this.emit('message', msg)
361
363
  const skipBackPropagation = previousNode !== undefined && !this.options.temporaryConnectionRpcLocal.hasNode(previousNode)
362
364
  this.options.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), skipBackPropagation ? previousNode : null)
365
+ this.messagesPropagated += 1
363
366
  }
364
367
 
365
368
  inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
@@ -376,7 +379,7 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
376
379
  }
377
380
 
378
381
  getOwnNodeId(): DhtAddress {
379
- return getNodeIdFromPeerDescriptor(this.options.localPeerDescriptor)
382
+ return toNodeId(this.options.localPeerDescriptor)
380
383
  }
381
384
 
382
385
  getOutgoingHandshakeCount(): number {
@@ -390,11 +393,32 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
390
393
  return this.options.neighbors.getAll().map((n) => n.getPeerDescriptor())
391
394
  }
392
395
 
396
+ getInfos(): ContentDeliveryLayerNeighborInfo[] {
397
+ return this.options.neighbors.getAll().map((n) => {
398
+ return {
399
+ peerDescriptor: n.getPeerDescriptor(),
400
+ rtt: n.getRtt()
401
+ }
402
+ })
403
+ }
404
+
393
405
  getNearbyNodeView(): NodeList {
394
406
  return this.options.nearbyNodeView
395
407
  }
396
408
 
409
+ public getDiagnosticInfo(): Record<string, unknown> {
410
+ return {
411
+ neighborCount: this.options.neighbors.size(),
412
+ nearbyNodeViewCount: this.options.nearbyNodeView.size(),
413
+ randomNodeViewCount: this.options.randomNodeView.size(),
414
+ leftNodeViewCount: this.options.leftNodeView.size(),
415
+ rightNodeViewCount: this.options.rightNodeView.size(),
416
+ messagesPropagated: this.messagesPropagated
417
+ }
418
+ }
419
+
397
420
  private isStopped() {
398
421
  return this.abortController.signal.aborted
399
422
  }
423
+
400
424
  }
@@ -5,16 +5,17 @@ import {
5
5
  EXISTING_CONNECTION_TIMEOUT,
6
6
  ITransport,
7
7
  PeerDescriptor,
8
- getDhtAddressFromRaw,
9
- getNodeIdFromPeerDescriptor
8
+ toDhtAddress,
9
+ toNodeId
10
10
  } from '@streamr/dht'
11
11
  import {
12
- EthereumAddress,
13
12
  Logger,
14
13
  Metric,
15
14
  MetricsContext,
16
15
  MetricsDefinition,
17
- RateMetric, StreamID, StreamPartID, StreamPartIDUtils, toStreamPartID
16
+ RateMetric, StreamID, StreamPartID, StreamPartIDUtils,
17
+ UserID,
18
+ toStreamPartID
18
19
  } from '@streamr/utils'
19
20
  import { createHash } from 'crypto'
20
21
  import { EventEmitter } from 'eventemitter3'
@@ -28,6 +29,7 @@ import { MIN_NEIGHBOR_COUNT as NETWORK_SPLIT_AVOIDANCE_MIN_NEIGHBOR_COUNT, Strea
28
29
  import { StreamPartReconnect } from './StreamPartReconnect'
29
30
  import { createContentDeliveryLayerNode } from './createContentDeliveryLayerNode'
30
31
  import { ProxyClient } from './proxy/ProxyClient'
32
+ import { ConnectionManager } from '@streamr/dht/src/exports'
31
33
 
32
34
  export type StreamPartDelivery = {
33
35
  broadcast: (msg: StreamMessage) => void
@@ -37,9 +39,11 @@ export type StreamPartDelivery = {
37
39
  discoveryLayerNode: DiscoveryLayerNode
38
40
  node: ContentDeliveryLayerNode
39
41
  networkSplitAvoidance: StreamPartNetworkSplitAvoidance
42
+ getDiagnosticInfo: () => Record<string, unknown>
40
43
  } | {
41
44
  proxied: true
42
45
  client: ProxyClient
46
+ getDiagnosticInfo: () => Record<string, unknown>
43
47
  })
44
48
 
45
49
  export interface Events {
@@ -59,10 +63,11 @@ export interface ContentDeliveryManagerOptions {
59
63
  streamPartitionMinPropagationTargets?: number
60
64
  acceptProxyConnections?: boolean
61
65
  rpcRequestTimeout?: number
66
+ neighborUpdateInterval?: number
62
67
  }
63
68
 
64
69
  export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => {
65
- return getDhtAddressFromRaw(new Uint8Array((createHash('sha1').update(streamPartId).digest())))
70
+ return toDhtAddress(new Uint8Array((createHash('sha1').update(streamPartId).digest())))
66
71
  }
67
72
 
68
73
  export class ContentDeliveryManager extends EventEmitter<Events> {
@@ -169,7 +174,8 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
169
174
  await peerDescriptorStoreManager.destroy()
170
175
  node.stop()
171
176
  await discoveryLayerNode.stop()
172
- }
177
+ },
178
+ getDiagnosticInfo: () => node.getDiagnosticInfo()
173
179
  }
174
180
  this.streamParts.set(streamPartId, streamPart)
175
181
  node.on('message', (message: StreamMessage) => {
@@ -207,6 +213,9 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
207
213
  // leaveStreamPart has been called (or leaveStreamPart called, and then setProxies called)
208
214
  return
209
215
  }
216
+ if ((this.transport! as ConnectionManager).isPrivateClientMode()) {
217
+ await (this.transport! as ConnectionManager).disablePrivateClientMode()
218
+ }
210
219
  await streamPart.discoveryLayerNode.start()
211
220
  await streamPart.node.start()
212
221
  const knownEntryPoints = this.knownStreamPartEntryPoints.get(streamPartId)
@@ -260,6 +269,7 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
260
269
  neighborTargetCount: this.options.streamPartitionNeighborTargetCount,
261
270
  acceptProxyConnections: this.options.acceptProxyConnections,
262
271
  rpcRequestTimeout: this.options.rpcRequestTimeout,
272
+ neighborUpdateInterval: this.options.neighborUpdateInterval,
263
273
  isLocalNodeEntryPoint
264
274
  })
265
275
  }
@@ -268,7 +278,7 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
268
278
  streamPartId: StreamPartID,
269
279
  nodes: PeerDescriptor[],
270
280
  direction: ProxyDirection,
271
- userId: EthereumAddress,
281
+ userId: UserID,
272
282
  connectionCount?: number
273
283
  ): Promise<void> {
274
284
  // TODO explicit default value for "acceptProxyConnections" or make it required
@@ -287,11 +297,15 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
287
297
  proxied: true,
288
298
  client,
289
299
  broadcast: (msg: StreamMessage) => client.broadcast(msg),
290
- stop: async () => client.stop()
300
+ stop: async () => client.stop(),
301
+ getDiagnosticInfo: () => client.getDiagnosticInfo()
291
302
  })
292
303
  client.on('message', (message: StreamMessage) => {
293
304
  this.emit('newMessage', message)
294
305
  })
306
+ if (Array.from(this.streamParts.values()).every((streamPart) => streamPart.proxied)) {
307
+ await (this.transport! as ConnectionManager).enablePrivateClientMode()
308
+ }
295
309
  await client.start()
296
310
  }
297
311
  await client.setProxies(nodes, direction, userId, connectionCount)
@@ -327,7 +341,8 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
327
341
  return {
328
342
  id: streamPartId,
329
343
  controlLayerNeighbors: stream.discoveryLayerNode.getNeighbors(),
330
- contentDeliveryLayerNeighbors: stream.node.getNeighbors()
344
+ deprecatedContentDeliveryLayerNeighbors: [],
345
+ contentDeliveryLayerNeighbors: stream.node.getInfos()
331
346
  }
332
347
  })
333
348
 
@@ -357,17 +372,28 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
357
372
  }
358
373
 
359
374
  getNodeId(): DhtAddress {
360
- return getNodeIdFromPeerDescriptor(this.controlLayerNode!.getLocalPeerDescriptor())
375
+ return toNodeId(this.controlLayerNode!.getLocalPeerDescriptor())
361
376
  }
362
377
 
363
378
  getNeighbors(streamPartId: StreamPartID): DhtAddress[] {
364
379
  const streamPart = this.streamParts.get(streamPartId)
365
380
  return (streamPart !== undefined) && (streamPart.proxied === false)
366
- ? streamPart.node.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
381
+ ? streamPart.node.getNeighbors().map((n) => toNodeId(n))
367
382
  : []
368
383
  }
369
384
 
370
385
  getStreamParts(): StreamPartID[] {
371
386
  return Array.from(this.streamParts.keys()).map((id) => StreamPartIDUtils.parse(id))
372
387
  }
388
+
389
+ getDiagnosticInfo(): Record<string, unknown> {
390
+ return {
391
+ streamParts: this.getStreamParts().map((id) => {
392
+ return {
393
+ id,
394
+ info: this.getStreamPartDelivery(id)!.getDiagnosticInfo()
395
+ }
396
+ })
397
+ }
398
+ }
373
399
  }
@@ -1,5 +1,5 @@
1
1
  import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
- import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor, getNodeIdFromPeerDescriptor } from '@streamr/dht'
2
+ import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor, toNodeId } from '@streamr/dht'
3
3
  import { StreamPartID } from '@streamr/utils'
4
4
  import { Empty } from '../proto/google/protobuf/empty'
5
5
  import {
@@ -29,7 +29,7 @@ export class ContentDeliveryRpcLocal implements IContentDeliveryRpc {
29
29
  }
30
30
 
31
31
  async sendStreamMessage(message: StreamMessage, context: ServerCallContext): Promise<Empty> {
32
- const previousNode = getNodeIdFromPeerDescriptor((context as DhtCallContext).incomingSourceDescriptor!)
32
+ const previousNode = toNodeId((context as DhtCallContext).incomingSourceDescriptor!)
33
33
  this.options.markForInspection(previousNode, message.messageId!)
34
34
  if (this.options.markAndCheckDuplicate(message.messageId!, message.previousMessageRef)) {
35
35
  this.options.broadcast(message, previousNode)
@@ -40,7 +40,7 @@ export class ContentDeliveryRpcLocal implements IContentDeliveryRpc {
40
40
  async leaveStreamPartNotice(message: LeaveStreamPartNotice, context: ServerCallContext): Promise<Empty> {
41
41
  if (message.streamPartId === this.options.streamPartId) {
42
42
  const sourcePeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor!
43
- const remoteNodeId = getNodeIdFromPeerDescriptor(sourcePeerDescriptor)
43
+ const remoteNodeId = toNodeId(sourcePeerDescriptor)
44
44
  this.options.onLeaveNotice(remoteNodeId, message.isEntryPoint)
45
45
  }
46
46
  return Empty
@@ -10,6 +10,8 @@ const logger = new Logger(module)
10
10
 
11
11
  export class ContentDeliveryRpcRemote extends RpcRemote<ContentDeliveryRpcClient> {
12
12
 
13
+ private rtt?: number
14
+
13
15
  async sendStreamMessage(msg: StreamMessage): Promise<void> {
14
16
  const options = this.formDhtRpcOptions({
15
17
  notification: true
@@ -31,4 +33,12 @@ export class ContentDeliveryRpcRemote extends RpcRemote<ContentDeliveryRpcClient
31
33
  logger.debug('Failed to send leaveStreamPartNotice')
32
34
  })
33
35
  }
36
+
37
+ setRtt(rtt: number): void {
38
+ this.rtt = rtt
39
+ }
40
+
41
+ getRtt(): number | undefined {
42
+ return this.rtt
43
+ }
34
44
  }
@@ -54,7 +54,7 @@ export class InvalidNumberingError extends Error {
54
54
  export class GapMisMatchError extends Error {
55
55
  constructor(state: string, previousNumber: NumberPair, number: NumberPair) {
56
56
  super('pre-condition: gap overlap in given numbers:'
57
- + ` previousNumber=${previousNumber}, number=${number}, state=${state}`)
57
+ + ` previousNumber=${previousNumber.toString()}, number=${number.toString()}, state=${state}`)
58
58
  }
59
59
  }
60
60
 
@@ -162,6 +162,6 @@ export class DuplicateMessageDetector {
162
162
  }
163
163
 
164
164
  toString(): string {
165
- return this.gaps.map(([lower, upper]) => `(${lower}, ${upper}]`).join(', ')
165
+ return this.gaps.map(([lower, upper]) => `(${lower.toString()}, ${upper.toString()}]`).join(', ')
166
166
  }
167
167
  }
@@ -5,7 +5,6 @@ import { ClassType, ClientTransport, ProtoRpcClient, toProtoRpcClient } from '@s
5
5
 
6
6
  export const SERVICE_ID = 'external-network-service'
7
7
 
8
- // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
9
8
  export type ExternalRpcClient = ServiceInfo & ClassType
10
9
  // eslint-disable-next-line @typescript-eslint/prefer-function-type, @typescript-eslint/consistent-type-definitions
11
10
  export type ExternalRpcClientClass<T extends ExternalRpcClient> = { new (clientTransport: ClientTransport): T }
@@ -1,4 +1,4 @@
1
- import { DhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
1
+ import { DhtAddress, toNodeId } from '@streamr/dht'
2
2
  import { sample } from 'lodash'
3
3
  import { ContentDeliveryRpcRemote } from './ContentDeliveryRpcRemote'
4
4
  import { EventEmitter } from 'eventemitter3'
@@ -36,7 +36,7 @@ export class NodeList extends EventEmitter<Events> {
36
36
  }
37
37
 
38
38
  add(remote: ContentDeliveryRpcRemote): void {
39
- const nodeId = getNodeIdFromPeerDescriptor(remote.getPeerDescriptor())
39
+ const nodeId = toNodeId(remote.getPeerDescriptor())
40
40
  if ((this.ownId !== nodeId) && (this.nodes.size < this.limit)) {
41
41
  const isExistingNode = this.nodes.has(nodeId)
42
42
  this.nodes.set(nodeId, remote)
@@ -107,7 +107,8 @@ export class NodeList extends EventEmitter<Events> {
107
107
  }
108
108
 
109
109
  stop(): void {
110
- this.nodes.forEach((node) => this.remove(getNodeIdFromPeerDescriptor(node.getPeerDescriptor())))
110
+ this.nodes.forEach((node) => this.remove(toNodeId(node.getPeerDescriptor())))
111
111
  this.removeAllListeners()
112
112
  }
113
+
113
114
  }
@@ -32,7 +32,6 @@ export class PeerDescriptorStoreManager {
32
32
 
33
33
  private readonly abortController: AbortController
34
34
  private readonly options: PeerDescriptorStoreManagerOptions
35
- // eslint-disable-next-line no-underscore-dangle
36
35
  private isLocalNodeStored_ = false
37
36
 
38
37
  constructor(options: PeerDescriptorStoreManagerOptions) {
@@ -1,4 +1,4 @@
1
- import { areEqualPeerDescriptors, DhtAddress, getNodeIdFromPeerDescriptor, PeerDescriptor } from '@streamr/dht'
1
+ import { areEqualPeerDescriptors, DhtAddress, toNodeId, PeerDescriptor } from '@streamr/dht'
2
2
  import { Logger, wait } from '@streamr/utils'
3
3
  import { DiscoveryLayerNode } from './DiscoveryLayerNode'
4
4
 
@@ -28,11 +28,12 @@ const exponentialRunOff = async (
28
28
  try {
29
29
  await task()
30
30
  } catch {
31
- logger.debug(`${description} failed, retrying in ${delay} ms`)
31
+ logger.trace(`${description} failed, retrying in ${delay} ms`)
32
32
  }
33
33
  try { // Abort controller throws unexpected errors in destroy?
34
34
  await wait(delay, abortSignal)
35
35
  } catch (err) {
36
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
36
37
  logger.trace(`${err}`) // TODO Do we need logging?
37
38
  }
38
39
  }
@@ -62,14 +63,14 @@ export class StreamPartNetworkSplitAvoidance {
62
63
  this.running = true
63
64
  await exponentialRunOff(async () => {
64
65
  const discoveredEntrypoints = await this.options.discoverEntryPoints()
65
- const filteredEntryPoints = discoveredEntrypoints.filter((peer) => !this.excludedNodes.has(getNodeIdFromPeerDescriptor(peer)))
66
+ const filteredEntryPoints = discoveredEntrypoints.filter((peer) => !this.excludedNodes.has(toNodeId(peer)))
66
67
  await this.options.discoveryLayerNode.joinDht(filteredEntryPoints, false, false)
67
68
  if (this.options.discoveryLayerNode.getNeighborCount() < MIN_NEIGHBOR_COUNT) {
68
69
  // Filter out nodes that are not neighbors as those nodes are assumed to be offline
69
70
  const newExcludes = filteredEntryPoints
70
71
  .filter((peer) => !this.options.discoveryLayerNode.getNeighbors()
71
72
  .some((neighbor) => areEqualPeerDescriptors(neighbor, peer)))
72
- .map((peer) => getNodeIdFromPeerDescriptor(peer))
73
+ .map((peer) => toNodeId(peer))
73
74
  newExcludes.forEach((node) => this.excludedNodes.add(node))
74
75
  throw new Error(`Network split is still possible`)
75
76
  }
@@ -1,4 +1,4 @@
1
- import { DhtAddress, ListeningRpcCommunicator, getNodeIdFromPeerDescriptor } from '@streamr/dht'
1
+ import { DhtAddress, ListeningRpcCommunicator, toNodeId } from '@streamr/dht'
2
2
  import { Handshaker } from './neighbor-discovery/Handshaker'
3
3
  import { NeighborFinder } from './neighbor-discovery/NeighborFinder'
4
4
  import { NeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
@@ -24,7 +24,7 @@ type ContentDeliveryLayerNodeOptions = MarkOptional<StrictContentDeliveryLayerNo
24
24
  }
25
25
 
26
26
  const createConfigWithDefaults = (options: ContentDeliveryLayerNodeOptions): StrictContentDeliveryLayerNodeOptions => {
27
- const ownNodeId = getNodeIdFromPeerDescriptor(options.localPeerDescriptor)
27
+ const ownNodeId = toNodeId(options.localPeerDescriptor)
28
28
  const rpcCommunicator = options.rpcCommunicator ?? new ListeningRpcCommunicator(
29
29
  formStreamPartContentDeliveryServiceId(options.streamPartId),
30
30
  options.transport
@@ -1,4 +1,4 @@
1
- import { ConnectionLocker, DhtAddress, ListeningRpcCommunicator, LockID, PeerDescriptor, getNodeIdFromPeerDescriptor } from '@streamr/dht'
1
+ import { ConnectionLocker, DhtAddress, ListeningRpcCommunicator, LockID, PeerDescriptor, toNodeId } from '@streamr/dht'
2
2
  import { Logger, StreamPartID, waitForEvent3 } from '@streamr/utils'
3
3
  import { MessageID } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
4
4
  import { TemporaryConnectionRpcClient } from '../../proto/packages/trackerless-network/protos/NetworkRpc.client'
@@ -47,7 +47,7 @@ export class Inspector {
47
47
  TemporaryConnectionRpcClient
48
48
  )
49
49
  await rpcRemote.openConnection()
50
- this.connectionLocker.weakLockConnection(getNodeIdFromPeerDescriptor(peerDescriptor), lockId)
50
+ this.connectionLocker.weakLockConnection(toNodeId(peerDescriptor), lockId)
51
51
  }
52
52
 
53
53
  async defaultCloseInspectConnection(peerDescriptor: PeerDescriptor, lockId: LockID): Promise<void> {
@@ -58,11 +58,11 @@ export class Inspector {
58
58
  TemporaryConnectionRpcClient
59
59
  )
60
60
  await rpcRemote.closeConnection()
61
- this.connectionLocker.weakUnlockConnection(getNodeIdFromPeerDescriptor(peerDescriptor), lockId)
61
+ this.connectionLocker.weakUnlockConnection(toNodeId(peerDescriptor), lockId)
62
62
  }
63
63
 
64
64
  async inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
65
- const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
65
+ const nodeId = toNodeId(peerDescriptor)
66
66
  const session = new InspectSession({
67
67
  inspectedNode: nodeId
68
68
  })