@streamr/trackerless-network 101.1.2 → 102.0.0-beta.1
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.
- package/dist/{src/proto → generated}/google/protobuf/any.d.ts +11 -4
- package/dist/generated/google/protobuf/any.js.map +1 -0
- package/dist/{src/proto → generated}/google/protobuf/empty.d.ts +0 -1
- package/dist/generated/google/protobuf/empty.js.map +1 -0
- package/dist/{src/proto → generated}/google/protobuf/timestamp.d.ts +9 -3
- package/dist/generated/google/protobuf/timestamp.js.map +1 -0
- package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.client.d.ts +9 -0
- package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.client.js +7 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.d.ts +32 -8
- package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.js +23 -7
- package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.server.d.ts +5 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
- package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.d.ts +29 -5
- package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.js +17 -3
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
- package/dist/generated/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
- package/dist/package.json +10 -11
- package/dist/src/NetworkNode.d.ts +8 -7
- package/dist/src/NetworkNode.js +5 -3
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +2 -2
- package/dist/src/NetworkStack.js +7 -6
- package/dist/src/NetworkStack.js.map +1 -1
- package/dist/src/exports.d.ts +3 -2
- package/dist/src/exports.js +3 -2
- package/dist/src/exports.js.map +1 -1
- package/dist/src/logic/ContentDeliveryLayerNode.d.ts +5 -1
- package/dist/src/logic/ContentDeliveryLayerNode.js +30 -10
- package/dist/src/logic/ContentDeliveryLayerNode.js.map +1 -1
- package/dist/src/logic/ContentDeliveryManager.d.ts +8 -3
- package/dist/src/logic/ContentDeliveryManager.js +28 -7
- package/dist/src/logic/ContentDeliveryManager.js.map +1 -1
- package/dist/src/logic/ContentDeliveryRpcLocal.d.ts +3 -3
- package/dist/src/logic/ContentDeliveryRpcLocal.js +3 -3
- package/dist/src/logic/ContentDeliveryRpcLocal.js.map +1 -1
- package/dist/src/logic/ContentDeliveryRpcRemote.d.ts +5 -2
- package/dist/src/logic/ContentDeliveryRpcRemote.js +7 -0
- package/dist/src/logic/ContentDeliveryRpcRemote.js.map +1 -1
- package/dist/src/logic/ControlLayerNode.d.ts +1 -1
- package/dist/src/logic/DiscoveryLayerNode.d.ts +3 -3
- package/dist/src/logic/DuplicateMessageDetector.js +3 -3
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
- package/dist/src/logic/ExternalNetworkRpc.js.map +1 -1
- package/dist/src/logic/NodeList.js +2 -2
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/PeerDescriptorStoreManager.d.ts +1 -1
- package/dist/src/logic/PeerDescriptorStoreManager.js +1 -2
- package/dist/src/logic/PeerDescriptorStoreManager.js.map +1 -1
- package/dist/src/logic/StreamPartNetworkSplitAvoidance.js +4 -3
- package/dist/src/logic/StreamPartNetworkSplitAvoidance.js.map +1 -1
- package/dist/src/logic/createContentDeliveryLayerNode.js +1 -1
- package/dist/src/logic/createContentDeliveryLayerNode.js.map +1 -1
- package/dist/src/logic/inspect/InspectSession.d.ts +2 -2
- package/dist/src/logic/inspect/InspectSession.js +2 -2
- package/dist/src/logic/inspect/InspectSession.js.map +1 -1
- package/dist/src/logic/inspect/Inspector.d.ts +1 -1
- package/dist/src/logic/inspect/Inspector.js +4 -4
- package/dist/src/logic/inspect/Inspector.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +2 -2
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +9 -9
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +2 -2
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +5 -5
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/Handshaker.js +14 -14
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +5 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +5 -3
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +2 -2
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +4 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.d.ts +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.js +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +2 -2
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js +1 -1
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +2 -2
- package/dist/src/logic/propagation/Propagation.d.ts +1 -1
- package/dist/src/logic/propagation/Propagation.js +0 -1
- package/dist/src/logic/propagation/Propagation.js.map +1 -1
- package/dist/src/logic/propagation/PropagationTaskStore.d.ts +1 -1
- package/dist/src/logic/proxy/ProxyClient.d.ts +4 -4
- package/dist/src/logic/proxy/ProxyClient.js +11 -7
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +4 -4
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +5 -5
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +4 -4
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +4 -4
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +4 -4
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +2 -2
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/utils.d.ts +1 -1
- package/dist/src/logic/utils.js +2 -2
- package/dist/src/logic/utils.js.map +1 -1
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/benchmark/first-message.js +3 -4
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.d.ts +4 -4
- package/dist/test/utils/utils.js +6 -5
- package/dist/test/utils/utils.js.map +1 -1
- package/jest.config.ts +13 -0
- package/karma-setup.js +7 -0
- package/karma.config.js +1 -1
- package/package.json +10 -11
- package/proto.sh +2 -2
- package/protos/NetworkRpc.proto +9 -4
- package/src/NetworkNode.ts +12 -9
- package/src/NetworkStack.ts +10 -10
- package/src/exports.ts +5 -3
- package/src/logic/ContentDeliveryLayerNode.ts +35 -11
- package/src/logic/ContentDeliveryManager.ts +41 -13
- package/src/logic/ContentDeliveryRpcLocal.ts +6 -6
- package/src/logic/ContentDeliveryRpcRemote.ts +12 -2
- package/src/logic/ControlLayerNode.ts +1 -1
- package/src/logic/DiscoveryLayerNode.ts +3 -3
- package/src/logic/DuplicateMessageDetector.ts +4 -4
- package/src/logic/ExternalNetworkRpc.ts +0 -1
- package/src/logic/NodeList.ts +4 -3
- package/src/logic/PeerDescriptorStoreManager.ts +1 -2
- package/src/logic/StreamPartNetworkSplitAvoidance.ts +5 -4
- package/src/logic/createContentDeliveryLayerNode.ts +3 -3
- package/src/logic/inspect/InspectSession.ts +5 -4
- package/src/logic/inspect/Inspector.ts +6 -6
- package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +13 -13
- package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +8 -8
- package/src/logic/neighbor-discovery/Handshaker.ts +15 -15
- package/src/logic/neighbor-discovery/NeighborFinder.ts +6 -1
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +6 -4
- package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +7 -7
- package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +4 -4
- package/src/logic/node-info/NodeInfoClient.ts +2 -2
- package/src/logic/node-info/NodeInfoRpcLocal.ts +2 -2
- package/src/logic/node-info/NodeInfoRpcRemote.ts +2 -2
- package/src/logic/propagation/Propagation.ts +1 -2
- package/src/logic/propagation/PropagationTaskStore.ts +1 -1
- package/src/logic/proxy/ProxyClient.ts +17 -12
- package/src/logic/proxy/ProxyConnectionRpcLocal.ts +10 -10
- package/src/logic/proxy/ProxyConnectionRpcRemote.ts +5 -5
- package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +9 -9
- package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +4 -4
- package/src/logic/utils.ts +4 -4
- package/src/types.ts +13 -0
- package/test/benchmark/first-message.ts +6 -5
- package/test/end-to-end/content-delivery-layer-node-with-real-connections.test.ts +11 -6
- package/test/end-to-end/external-network-rpc.test.ts +2 -2
- package/test/end-to-end/inspect.test.ts +5 -5
- package/test/end-to-end/proxy-and-full-node.test.ts +6 -6
- package/test/end-to-end/proxy-connections.test.ts +12 -14
- package/test/end-to-end/proxy-key-exchange.test.ts +11 -9
- package/test/end-to-end/webrtc-full-node-network.test.ts +7 -9
- package/test/end-to-end/websocket-full-node-network.test.ts +8 -10
- package/test/integration/ContentDeliveryLayerNode-Layer1Node-Latencies.test.ts +11 -11
- package/test/integration/ContentDeliveryLayerNode-Layer1Node.test.ts +10 -10
- package/test/integration/ContentDeliveryManager.test.ts +49 -25
- package/test/integration/ContentDeliveryRpcRemote.test.ts +8 -8
- package/test/integration/HandshakeRpcRemote.test.ts +2 -2
- package/test/integration/Handshakes.test.ts +21 -56
- package/test/integration/Inspect.test.ts +2 -2
- package/test/integration/NeighborUpdateRpcRemote.test.ts +2 -2
- package/test/integration/NetworkNode.test.ts +5 -4
- package/test/integration/NetworkRpc.test.ts +10 -10
- package/test/integration/NetworkStack.test.ts +4 -4
- package/test/integration/NodeInfoRpc.test.ts +9 -5
- package/test/integration/Propagation.test.ts +6 -6
- package/test/integration/joining-streams-on-offline-peers.test.ts +5 -5
- package/test/integration/stream-without-default-entrypoints.test.ts +8 -7
- package/test/integration/streamEntryPointReplacing.test.ts +5 -5
- package/test/types/global.d.ts +1 -0
- package/test/unit/ContentDeliveryLayerNode.test.ts +26 -14
- package/test/unit/ContentDeliveryManager.test.ts +10 -9
- package/test/unit/ContentDeliveryRpcLocal.test.ts +3 -3
- package/test/unit/DuplicateMessageDetector.test.ts +10 -10
- package/test/unit/ExternalNetworkRpc.test.ts +3 -3
- package/test/unit/HandshakeRpcLocal.test.ts +8 -21
- package/test/unit/Handshaker.test.ts +2 -2
- package/test/unit/InspectSession.test.ts +7 -4
- package/test/unit/Inspector.test.ts +5 -5
- package/test/unit/NeighborFinder.test.ts +5 -5
- package/test/unit/NeighborUpdateRpcLocal.test.ts +6 -6
- package/test/unit/NetworkNode.test.ts +5 -5
- package/test/unit/NodeList.test.ts +23 -23
- package/test/unit/PeerDescriptorStoreManager.test.ts +4 -4
- package/test/unit/Propagation.test.ts +8 -7
- package/test/unit/ProxyConnectionRpcRemote.test.ts +5 -5
- package/test/unit/StreamPartReconnect.test.ts +2 -2
- package/test/unit/TemporaryConnectionRpcLocal.test.ts +3 -3
- package/test/utils/mock/MockControlLayerNode.ts +5 -0
- package/test/utils/mock/MockNeighborUpdateManager.ts +1 -1
- package/test/utils/mock/MockTransport.ts +11 -0
- package/test/utils/utils.ts +10 -9
- package/tsconfig.browser.json +1 -0
- package/tsconfig.jest.json +2 -1
- package/tsconfig.json +3 -0
- package/tsconfig.node.json +1 -0
- package/.eslintignore +0 -7
- package/.eslintrc +0 -3
- package/dist/src/proto/google/protobuf/any.js.map +0 -1
- package/dist/src/proto/google/protobuf/empty.js.map +0 -1
- package/dist/src/proto/google/protobuf/timestamp.js.map +0 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +0 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +0 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +0 -1
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +0 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +0 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +0 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +0 -1
- package/jest.config.js +0 -5
- package/src/proto/google/protobuf/any.ts +0 -319
- package/src/proto/google/protobuf/empty.ts +0 -82
- package/src/proto/google/protobuf/timestamp.ts +0 -281
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +0 -407
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +0 -160
- package/src/proto/packages/dht/protos/DhtRpc.ts +0 -1244
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +0 -108
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +0 -218
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +0 -85
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +0 -752
- /package/dist/{src/proto → generated}/google/protobuf/any.js +0 -0
- /package/dist/{src/proto → generated}/google/protobuf/empty.js +0 -0
- /package/dist/{src/proto → generated}/google/protobuf/timestamp.js +0 -0
- /package/dist/{src/proto → generated}/packages/dht/protos/DhtRpc.server.js +0 -0
- /package/dist/{src/proto → generated}/packages/proto-rpc/protos/ProtoRpc.d.ts +0 -0
- /package/dist/{src/proto → generated}/packages/proto-rpc/protos/ProtoRpc.js +0 -0
- /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.client.d.ts +0 -0
- /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.client.js +0 -0
- /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.server.d.ts +0 -0
- /package/dist/{src/proto → generated}/packages/trackerless-network/protos/NetworkRpc.server.js +0 -0
package/src/exports.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { NetworkNode, createNetworkNode } from './NetworkNode'
|
|
2
|
-
export { NetworkOptions, NetworkStack
|
|
2
|
+
export { NetworkOptions, NetworkStack } from './NetworkStack'
|
|
3
3
|
export { ContentDeliveryManagerOptions, streamPartIdToDataKey } from './logic/ContentDeliveryManager'
|
|
4
4
|
export {
|
|
5
5
|
ContentType,
|
|
@@ -11,6 +11,8 @@ export {
|
|
|
11
11
|
MessageRef,
|
|
12
12
|
ProxyDirection,
|
|
13
13
|
SignatureType,
|
|
14
|
-
StreamMessage
|
|
15
|
-
|
|
14
|
+
StreamMessage,
|
|
15
|
+
ControlLayerInfo
|
|
16
|
+
} from '../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
16
17
|
export { ExternalRpcClient, ExternalRpcClientClass } from './logic/ExternalNetworkRpc'
|
|
18
|
+
export { NodeInfo, StreamPartitionInfo, ContentDeliveryLayerNeighborInfo } from './types'
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ITransport,
|
|
5
5
|
ListeningRpcCommunicator,
|
|
6
6
|
PeerDescriptor,
|
|
7
|
-
|
|
7
|
+
toNodeId,
|
|
8
8
|
} from '@streamr/dht'
|
|
9
9
|
import { Logger, StreamPartID, addManagedEventListener } from '@streamr/utils'
|
|
10
10
|
import { EventEmitter } from 'eventemitter3'
|
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
StreamMessage,
|
|
17
17
|
TemporaryConnectionRequest,
|
|
18
18
|
TemporaryConnectionResponse,
|
|
19
|
-
} from '
|
|
20
|
-
import { ContentDeliveryRpcClient } from '
|
|
19
|
+
} from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
20
|
+
import { ContentDeliveryRpcClient } from '../../generated/packages/trackerless-network/protos/NetworkRpc.client'
|
|
21
21
|
import { ContentDeliveryRpcLocal } from './ContentDeliveryRpcLocal'
|
|
22
22
|
import { ContentDeliveryRpcRemote } from './ContentDeliveryRpcRemote'
|
|
23
23
|
import { DiscoveryLayerNode } from './DiscoveryLayerNode'
|
|
@@ -31,6 +31,7 @@ import { Propagation } from './propagation/Propagation'
|
|
|
31
31
|
import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
|
|
32
32
|
import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
|
|
33
33
|
import { markAndCheckDuplicate } from './utils'
|
|
34
|
+
import { ContentDeliveryLayerNeighborInfo } from '../types'
|
|
34
35
|
|
|
35
36
|
export interface Events {
|
|
36
37
|
message: (message: StreamMessage) => void
|
|
@@ -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()
|
|
@@ -91,9 +93,9 @@ export class ContentDeliveryLayerNode extends EventEmitter<Events> {
|
|
|
91
93
|
return
|
|
92
94
|
}
|
|
93
95
|
const contact = this.options.nearbyNodeView.get(remoteNodeId)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
?? this.options.randomNodeView.get(remoteNodeId)
|
|
97
|
+
?? this.options.neighbors.get(remoteNodeId)
|
|
98
|
+
?? this.options.proxyConnectionRpcLocal?.getConnection(remoteNodeId)?.remote
|
|
97
99
|
// TODO: check integrity of notifier?
|
|
98
100
|
if (contact) {
|
|
99
101
|
this.options.discoveryLayerNode.removeContact(remoteNodeId)
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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,21 +5,22 @@ import {
|
|
|
5
5
|
EXISTING_CONNECTION_TIMEOUT,
|
|
6
6
|
ITransport,
|
|
7
7
|
PeerDescriptor,
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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'
|
|
21
22
|
import { sampleSize } from 'lodash'
|
|
22
|
-
import { ProxyDirection, StreamMessage
|
|
23
|
+
import { ProxyDirection, StreamMessage } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
23
24
|
import { ContentDeliveryLayerNode } from './ContentDeliveryLayerNode'
|
|
24
25
|
import { ControlLayerNode } from './ControlLayerNode'
|
|
25
26
|
import { DiscoveryLayerNode } from './DiscoveryLayerNode'
|
|
@@ -28,6 +29,8 @@ 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'
|
|
33
|
+
import { StreamPartitionInfo } from '../types'
|
|
31
34
|
|
|
32
35
|
export type StreamPartDelivery = {
|
|
33
36
|
broadcast: (msg: StreamMessage) => void
|
|
@@ -37,9 +40,11 @@ export type StreamPartDelivery = {
|
|
|
37
40
|
discoveryLayerNode: DiscoveryLayerNode
|
|
38
41
|
node: ContentDeliveryLayerNode
|
|
39
42
|
networkSplitAvoidance: StreamPartNetworkSplitAvoidance
|
|
43
|
+
getDiagnosticInfo: () => Record<string, unknown>
|
|
40
44
|
} | {
|
|
41
45
|
proxied: true
|
|
42
46
|
client: ProxyClient
|
|
47
|
+
getDiagnosticInfo: () => Record<string, unknown>
|
|
43
48
|
})
|
|
44
49
|
|
|
45
50
|
export interface Events {
|
|
@@ -59,10 +64,11 @@ export interface ContentDeliveryManagerOptions {
|
|
|
59
64
|
streamPartitionMinPropagationTargets?: number
|
|
60
65
|
acceptProxyConnections?: boolean
|
|
61
66
|
rpcRequestTimeout?: number
|
|
67
|
+
neighborUpdateInterval?: number
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => {
|
|
65
|
-
return
|
|
71
|
+
return toDhtAddress(new Uint8Array((createHash('sha1').update(streamPartId).digest())))
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
@@ -169,7 +175,8 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
169
175
|
await peerDescriptorStoreManager.destroy()
|
|
170
176
|
node.stop()
|
|
171
177
|
await discoveryLayerNode.stop()
|
|
172
|
-
}
|
|
178
|
+
},
|
|
179
|
+
getDiagnosticInfo: () => node.getDiagnosticInfo()
|
|
173
180
|
}
|
|
174
181
|
this.streamParts.set(streamPartId, streamPart)
|
|
175
182
|
node.on('message', (message: StreamMessage) => {
|
|
@@ -207,6 +214,9 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
207
214
|
// leaveStreamPart has been called (or leaveStreamPart called, and then setProxies called)
|
|
208
215
|
return
|
|
209
216
|
}
|
|
217
|
+
if ((this.transport! as ConnectionManager).isPrivateClientMode()) {
|
|
218
|
+
await (this.transport! as ConnectionManager).disablePrivateClientMode()
|
|
219
|
+
}
|
|
210
220
|
await streamPart.discoveryLayerNode.start()
|
|
211
221
|
await streamPart.node.start()
|
|
212
222
|
const knownEntryPoints = this.knownStreamPartEntryPoints.get(streamPartId)
|
|
@@ -241,7 +251,8 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
241
251
|
rpcRequestTimeout: EXISTING_CONNECTION_TIMEOUT,
|
|
242
252
|
dhtJoinTimeout: 20000, // TODO use options option or named constant?
|
|
243
253
|
periodicallyPingNeighbors: true,
|
|
244
|
-
periodicallyPingRingContacts: true
|
|
254
|
+
periodicallyPingRingContacts: true,
|
|
255
|
+
neighborPingLimit: 16
|
|
245
256
|
})
|
|
246
257
|
}
|
|
247
258
|
|
|
@@ -260,6 +271,7 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
260
271
|
neighborTargetCount: this.options.streamPartitionNeighborTargetCount,
|
|
261
272
|
acceptProxyConnections: this.options.acceptProxyConnections,
|
|
262
273
|
rpcRequestTimeout: this.options.rpcRequestTimeout,
|
|
274
|
+
neighborUpdateInterval: this.options.neighborUpdateInterval,
|
|
263
275
|
isLocalNodeEntryPoint
|
|
264
276
|
})
|
|
265
277
|
}
|
|
@@ -268,7 +280,7 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
268
280
|
streamPartId: StreamPartID,
|
|
269
281
|
nodes: PeerDescriptor[],
|
|
270
282
|
direction: ProxyDirection,
|
|
271
|
-
userId:
|
|
283
|
+
userId: UserID,
|
|
272
284
|
connectionCount?: number
|
|
273
285
|
): Promise<void> {
|
|
274
286
|
// TODO explicit default value for "acceptProxyConnections" or make it required
|
|
@@ -287,11 +299,15 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
287
299
|
proxied: true,
|
|
288
300
|
client,
|
|
289
301
|
broadcast: (msg: StreamMessage) => client.broadcast(msg),
|
|
290
|
-
stop: async () => client.stop()
|
|
302
|
+
stop: async () => client.stop(),
|
|
303
|
+
getDiagnosticInfo: () => client.getDiagnosticInfo()
|
|
291
304
|
})
|
|
292
305
|
client.on('message', (message: StreamMessage) => {
|
|
293
306
|
this.emit('newMessage', message)
|
|
294
307
|
})
|
|
308
|
+
if (Array.from(this.streamParts.values()).every((streamPart) => streamPart.proxied)) {
|
|
309
|
+
await (this.transport! as ConnectionManager).enablePrivateClientMode()
|
|
310
|
+
}
|
|
295
311
|
await client.start()
|
|
296
312
|
}
|
|
297
313
|
await client.setProxies(nodes, direction, userId, connectionCount)
|
|
@@ -327,7 +343,8 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
327
343
|
return {
|
|
328
344
|
id: streamPartId,
|
|
329
345
|
controlLayerNeighbors: stream.discoveryLayerNode.getNeighbors(),
|
|
330
|
-
|
|
346
|
+
deprecatedContentDeliveryLayerNeighbors: [],
|
|
347
|
+
contentDeliveryLayerNeighbors: stream.node.getInfos()
|
|
331
348
|
}
|
|
332
349
|
})
|
|
333
350
|
|
|
@@ -357,17 +374,28 @@ export class ContentDeliveryManager extends EventEmitter<Events> {
|
|
|
357
374
|
}
|
|
358
375
|
|
|
359
376
|
getNodeId(): DhtAddress {
|
|
360
|
-
return
|
|
377
|
+
return toNodeId(this.controlLayerNode!.getLocalPeerDescriptor())
|
|
361
378
|
}
|
|
362
379
|
|
|
363
380
|
getNeighbors(streamPartId: StreamPartID): DhtAddress[] {
|
|
364
381
|
const streamPart = this.streamParts.get(streamPartId)
|
|
365
382
|
return (streamPart !== undefined) && (streamPart.proxied === false)
|
|
366
|
-
? streamPart.node.getNeighbors().map((n) =>
|
|
383
|
+
? streamPart.node.getNeighbors().map((n) => toNodeId(n))
|
|
367
384
|
: []
|
|
368
385
|
}
|
|
369
386
|
|
|
370
387
|
getStreamParts(): StreamPartID[] {
|
|
371
388
|
return Array.from(this.streamParts.keys()).map((id) => StreamPartIDUtils.parse(id))
|
|
372
389
|
}
|
|
390
|
+
|
|
391
|
+
getDiagnosticInfo(): Record<string, unknown> {
|
|
392
|
+
return {
|
|
393
|
+
streamParts: this.getStreamParts().map((id) => {
|
|
394
|
+
return {
|
|
395
|
+
id,
|
|
396
|
+
info: this.getStreamPartDelivery(id)!.getDiagnosticInfo()
|
|
397
|
+
}
|
|
398
|
+
})
|
|
399
|
+
}
|
|
400
|
+
}
|
|
373
401
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
|
|
2
|
-
import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor,
|
|
2
|
+
import { DhtAddress, DhtCallContext, ListeningRpcCommunicator, PeerDescriptor, toNodeId } from '@streamr/dht'
|
|
3
3
|
import { StreamPartID } from '@streamr/utils'
|
|
4
|
-
import { Empty } from '
|
|
4
|
+
import { Empty } from '../../generated/google/protobuf/empty'
|
|
5
5
|
import {
|
|
6
6
|
LeaveStreamPartNotice,
|
|
7
7
|
MessageID,
|
|
8
8
|
MessageRef,
|
|
9
9
|
StreamMessage
|
|
10
|
-
} from '
|
|
11
|
-
import { IContentDeliveryRpc } from '
|
|
10
|
+
} from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
11
|
+
import { IContentDeliveryRpc } from '../../generated/packages/trackerless-network/protos/NetworkRpc.server'
|
|
12
12
|
|
|
13
13
|
export interface ContentDeliveryRpcLocalOptions {
|
|
14
14
|
localPeerDescriptor: PeerDescriptor
|
|
@@ -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 =
|
|
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 =
|
|
43
|
+
const remoteNodeId = toNodeId(sourcePeerDescriptor)
|
|
44
44
|
this.options.onLeaveNotice(remoteNodeId, message.isEntryPoint)
|
|
45
45
|
}
|
|
46
46
|
return Empty
|
|
@@ -3,13 +3,15 @@ import { Logger, StreamPartID } from '@streamr/utils'
|
|
|
3
3
|
import {
|
|
4
4
|
LeaveStreamPartNotice,
|
|
5
5
|
StreamMessage
|
|
6
|
-
} from '
|
|
7
|
-
import { ContentDeliveryRpcClient } from '
|
|
6
|
+
} from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
7
|
+
import { ContentDeliveryRpcClient } from '../../generated/packages/trackerless-network/protos/NetworkRpc.client'
|
|
8
8
|
|
|
9
9
|
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
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ConnectionsView, DataEntry, DhtAddress, ITransport, PeerDescriptor } from '@streamr/dht'
|
|
2
|
-
import { Any } from '
|
|
2
|
+
import { Any } from '../../generated/google/protobuf/any'
|
|
3
3
|
|
|
4
4
|
export interface ControlLayerNode extends ITransport {
|
|
5
5
|
joinDht(entryPointDescriptors: PeerDescriptor[]): Promise<void>
|
|
@@ -12,11 +12,11 @@ export interface DiscoveryLayerNodeEvents {
|
|
|
12
12
|
|
|
13
13
|
export interface DiscoveryLayerNode {
|
|
14
14
|
on<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
|
|
15
|
-
once<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
|
|
16
|
-
off<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
|
|
17
15
|
on<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
|
|
18
|
-
|
|
16
|
+
off<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
|
|
19
17
|
off<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
|
|
18
|
+
once<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: (peerDescriptor: PeerDescriptor) => void): void
|
|
19
|
+
once<T extends keyof DiscoveryLayerNodeEvents>(eventName: T, listener: () => void): void
|
|
20
20
|
removeContact: (nodeId: DhtAddress) => void
|
|
21
21
|
getClosestContacts: (maxCount?: number) => PeerDescriptor[]
|
|
22
22
|
getRandomContacts: (maxCount?: number) => PeerDescriptor[]
|
|
@@ -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
|
|
|
@@ -83,7 +83,7 @@ export class GapMisMatchError extends Error {
|
|
|
83
83
|
*/
|
|
84
84
|
export class DuplicateMessageDetector {
|
|
85
85
|
private readonly maxGapCount: number
|
|
86
|
-
private readonly gaps:
|
|
86
|
+
private readonly gaps: [NumberPair, NumberPair][]
|
|
87
87
|
|
|
88
88
|
constructor(maxGapCount = 10000) {
|
|
89
89
|
this.maxGapCount = maxGapCount
|
|
@@ -94,7 +94,7 @@ export class DuplicateMessageDetector {
|
|
|
94
94
|
* returns true if number has not yet been seen (i.e. is not a duplicate)
|
|
95
95
|
*/
|
|
96
96
|
markAndCheck(previousNumber: NumberPair | null, number: NumberPair): boolean | never {
|
|
97
|
-
if (previousNumber
|
|
97
|
+
if (previousNumber?.greaterThanOrEqual(number)) {
|
|
98
98
|
throw new InvalidNumberingError()
|
|
99
99
|
}
|
|
100
100
|
|
|
@@ -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 }
|
package/src/logic/NodeList.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DhtAddress,
|
|
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 =
|
|
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(
|
|
110
|
+
this.nodes.forEach((node) => this.remove(toNodeId(node.getPeerDescriptor())))
|
|
111
111
|
this.removeAllListeners()
|
|
112
112
|
}
|
|
113
|
+
|
|
113
114
|
}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
areEqualPeerDescriptors
|
|
6
6
|
} from '@streamr/dht'
|
|
7
7
|
import { Logger, scheduleAtInterval } from '@streamr/utils'
|
|
8
|
-
import { Any } from '
|
|
8
|
+
import { Any } from '../../generated/google/protobuf/any'
|
|
9
9
|
|
|
10
10
|
const parsePeerDescriptor = (dataEntries: DataEntry[]): PeerDescriptor[] => {
|
|
11
11
|
return dataEntries.filter((entry) => !entry.deleted).map((entry) => Any.unpack(entry.data!, PeerDescriptor))
|
|
@@ -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,
|
|
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.
|
|
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(
|
|
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) =>
|
|
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,11 +1,11 @@
|
|
|
1
|
-
import { DhtAddress, ListeningRpcCommunicator,
|
|
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'
|
|
5
5
|
import { StrictContentDeliveryLayerNodeOptions, ContentDeliveryLayerNode } from './ContentDeliveryLayerNode'
|
|
6
6
|
import { NodeList } from './NodeList'
|
|
7
7
|
import { Propagation } from './propagation/Propagation'
|
|
8
|
-
import { StreamMessage } from '
|
|
8
|
+
import { StreamMessage } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
9
9
|
import type { MarkOptional } from 'ts-essentials'
|
|
10
10
|
import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
|
|
11
11
|
import { Inspector } from './inspect/Inspector'
|
|
@@ -24,7 +24,7 @@ type ContentDeliveryLayerNodeOptions = MarkOptional<StrictContentDeliveryLayerNo
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const createConfigWithDefaults = (options: ContentDeliveryLayerNodeOptions): StrictContentDeliveryLayerNodeOptions => {
|
|
27
|
-
const ownNodeId =
|
|
27
|
+
const ownNodeId = toNodeId(options.localPeerDescriptor)
|
|
28
28
|
const rpcCommunicator = options.rpcCommunicator ?? new ListeningRpcCommunicator(
|
|
29
29
|
formStreamPartContentDeliveryServiceId(options.streamPartId),
|
|
30
30
|
options.transport
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { EventEmitter } from 'eventemitter3'
|
|
2
|
-
import { MessageID } from '../../proto/packages/trackerless-network/protos/NetworkRpc'
|
|
3
|
-
import { binaryToHex } from '@streamr/utils'
|
|
4
1
|
import { DhtAddress } from '@streamr/dht'
|
|
2
|
+
import { toUserId } from '@streamr/utils'
|
|
3
|
+
import { EventEmitter } from 'eventemitter3'
|
|
4
|
+
import { MessageID } from '../../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
5
5
|
|
|
6
6
|
export interface Events {
|
|
7
7
|
done: () => void
|
|
@@ -12,8 +12,9 @@ interface InspectSessionOptions {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
const createMessageKey = (messageId: MessageID): string => {
|
|
15
|
-
return `${
|
|
15
|
+
return `${toUserId(messageId.publisherId)}:${messageId.messageChainId}:${messageId.timestamp}:${messageId.sequenceNumber}`
|
|
16
16
|
}
|
|
17
|
+
|
|
17
18
|
export class InspectSession extends EventEmitter<Events> {
|
|
18
19
|
|
|
19
20
|
// Boolean indicates if the message has been received by the inspected node
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ConnectionLocker, DhtAddress, ListeningRpcCommunicator, LockID, PeerDescriptor,
|
|
1
|
+
import { ConnectionLocker, DhtAddress, ListeningRpcCommunicator, LockID, PeerDescriptor, toNodeId } from '@streamr/dht'
|
|
2
2
|
import { Logger, StreamPartID, waitForEvent3 } from '@streamr/utils'
|
|
3
|
-
import { MessageID } from '
|
|
4
|
-
import { TemporaryConnectionRpcClient } from '
|
|
3
|
+
import { MessageID } from '../../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
4
|
+
import { TemporaryConnectionRpcClient } from '../../../generated/packages/trackerless-network/protos/NetworkRpc.client'
|
|
5
5
|
import { TemporaryConnectionRpcRemote } from '../temporary-connection/TemporaryConnectionRpcRemote'
|
|
6
6
|
import { InspectSession, Events as InspectSessionEvents } from './InspectSession'
|
|
7
7
|
|
|
@@ -47,7 +47,7 @@ export class Inspector {
|
|
|
47
47
|
TemporaryConnectionRpcClient
|
|
48
48
|
)
|
|
49
49
|
await rpcRemote.openConnection()
|
|
50
|
-
this.connectionLocker.weakLockConnection(
|
|
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(
|
|
61
|
+
this.connectionLocker.weakUnlockConnection(toNodeId(peerDescriptor), lockId)
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
async inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
|
|
65
|
-
const nodeId =
|
|
65
|
+
const nodeId = toNodeId(peerDescriptor)
|
|
66
66
|
const session = new InspectSession({
|
|
67
67
|
inspectedNode: nodeId
|
|
68
68
|
})
|