@streamr/trackerless-network 100.0.0-pretestnet.6 → 100.0.0-rc.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.
- package/README.md +57 -0
- package/dist/package.json +11 -11
- package/dist/src/NetworkNode.d.ts +6 -5
- package/dist/src/NetworkNode.js +9 -2
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +13 -9
- package/dist/src/NetworkStack.js +80 -12
- package/dist/src/NetworkStack.js.map +1 -1
- package/dist/src/exports.d.ts +4 -3
- package/dist/src/exports.js +12 -1
- package/dist/src/exports.js.map +1 -1
- package/dist/src/logic/DeliveryRpcLocal.d.ts +4 -5
- package/dist/src/logic/DeliveryRpcLocal.js +6 -5
- package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
- package/dist/src/logic/DeliveryRpcRemote.d.ts +5 -4
- package/dist/src/logic/DeliveryRpcRemote.js +4 -3
- package/dist/src/logic/DeliveryRpcRemote.js.map +1 -1
- package/dist/src/logic/DuplicateMessageDetector.d.ts +3 -3
- package/dist/src/logic/DuplicateMessageDetector.js +10 -6
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
- package/dist/src/logic/EntryPointDiscovery.d.ts +8 -5
- package/dist/src/logic/EntryPointDiscovery.js +24 -15
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
- package/dist/src/logic/Layer0Node.d.ts +6 -4
- package/dist/src/logic/Layer1Node.d.ts +12 -6
- package/dist/src/logic/NodeList.d.ts +13 -15
- package/dist/src/logic/NodeList.js +18 -15
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/RandomGraphNode.d.ts +26 -22
- package/dist/src/logic/RandomGraphNode.js +82 -52
- package/dist/src/logic/RandomGraphNode.js.map +1 -1
- package/dist/src/logic/StreamrNode.d.ts +6 -6
- package/dist/src/logic/StreamrNode.js +53 -37
- package/dist/src/logic/StreamrNode.js.map +1 -1
- package/dist/src/logic/createRandomGraphNode.d.ts +2 -2
- package/dist/src/logic/createRandomGraphNode.js +33 -21
- package/dist/src/logic/createRandomGraphNode.js.map +1 -1
- package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +2 -1
- package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -1
- package/dist/src/logic/inspect/InspectSession.d.ts +4 -3
- package/dist/src/logic/inspect/InspectSession.js +6 -2
- package/dist/src/logic/inspect/InspectSession.js.map +1 -1
- package/dist/src/logic/inspect/Inspector.d.ts +11 -16
- package/dist/src/logic/inspect/Inspector.js +21 -9
- package/dist/src/logic/inspect/Inspector.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +7 -9
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +55 -32
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +8 -6
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +25 -16
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +9 -15
- package/dist/src/logic/neighbor-discovery/Handshaker.js +68 -44
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +8 -10
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +12 -2
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +7 -10
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +11 -9
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +8 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +33 -24
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +5 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +4 -5
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.d.ts +9 -0
- package/dist/src/logic/node-info/NodeInfoClient.js +21 -0
- package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +12 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js +22 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +6 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js +11 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js.map +1 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js +7 -3
- package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -1
- package/dist/src/logic/propagation/Propagation.d.ts +4 -4
- package/dist/src/logic/propagation/Propagation.js +4 -0
- package/dist/src/logic/propagation/Propagation.js.map +1 -1
- package/dist/src/logic/propagation/PropagationTaskStore.d.ts +2 -2
- package/dist/src/logic/propagation/PropagationTaskStore.js +1 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +87 -53
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +7 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +32 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -0
- package/dist/src/logic/proxy/ProxyClient.d.ts +8 -6
- package/dist/src/logic/proxy/ProxyClient.js +40 -28
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +6 -7
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +8 -8
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +3 -3
- 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 +9 -4
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +21 -6
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +4 -3
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +13 -3
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/utils.js.map +1 -1
- package/dist/src/proto/google/protobuf/any.js +8 -8
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/empty.js +2 -4
- package/dist/src/proto/google/protobuf/empty.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.js +10 -10
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +36 -49
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +54 -52
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +184 -234
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +118 -168
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +20 -29
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +42 -5
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +52 -19
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +193 -28
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +129 -20
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +20 -3
- package/dist/test/benchmark/first-message.js +14 -15
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.d.ts +2 -4
- package/dist/test/utils/utils.js +20 -19
- package/dist/test/utils/utils.js.map +1 -1
- package/jest.config.js +3 -38
- package/package.json +11 -11
- package/protos/NetworkRpc.proto +57 -12
- package/src/NetworkNode.ts +13 -6
- package/src/NetworkStack.ts +94 -16
- package/src/exports.ts +11 -3
- package/src/logic/DeliveryRpcLocal.ts +7 -8
- package/src/logic/DeliveryRpcRemote.ts +7 -5
- package/src/logic/DuplicateMessageDetector.ts +7 -7
- package/src/logic/EntryPointDiscovery.ts +26 -19
- package/src/logic/Layer0Node.ts +6 -4
- package/src/logic/Layer1Node.ts +21 -6
- package/src/logic/NodeList.ts +25 -26
- package/src/logic/RandomGraphNode.ts +148 -78
- package/src/logic/StreamrNode.ts +58 -41
- package/src/logic/createRandomGraphNode.ts +37 -25
- package/src/logic/formStreamPartDeliveryServiceId.ts +2 -1
- package/src/logic/inspect/InspectSession.ts +8 -4
- package/src/logic/inspect/Inspector.ts +34 -24
- package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +72 -38
- package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +32 -20
- package/src/logic/neighbor-discovery/Handshaker.ts +90 -75
- package/src/logic/neighbor-discovery/NeighborFinder.ts +18 -13
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +19 -20
- package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +43 -33
- package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +6 -6
- package/src/logic/node-info/NodeInfoClient.ts +23 -0
- package/src/logic/node-info/NodeInfoRpcLocal.ts +28 -0
- package/src/logic/node-info/NodeInfoRpcRemote.ts +11 -0
- package/src/logic/propagation/Propagation.ts +7 -6
- package/src/logic/propagation/PropagationTaskStore.ts +2 -2
- package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +1 -1
- package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +1 -2
- package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +95 -69
- package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +37 -0
- package/src/logic/proxy/ProxyClient.ts +60 -40
- package/src/logic/proxy/ProxyConnectionRpcLocal.ts +15 -19
- package/src/logic/proxy/ProxyConnectionRpcRemote.ts +3 -3
- package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +30 -10
- package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +14 -4
- package/src/proto/google/protobuf/any.ts +4 -4
- package/src/proto/google/protobuf/empty.ts +2 -4
- package/src/proto/google/protobuf/timestamp.ts +4 -4
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +50 -66
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +21 -30
- package/src/proto/packages/dht/protos/DhtRpc.ts +242 -316
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +49 -7
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +21 -4
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +251 -44
- package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +60 -0
- package/test/benchmark/first-message.ts +38 -17
- package/test/end-to-end/inspect.test.ts +16 -4
- package/test/end-to-end/proxy-and-full-node.test.ts +26 -13
- package/test/end-to-end/proxy-connections.test.ts +23 -11
- package/test/end-to-end/proxy-key-exchange.test.ts +25 -15
- package/test/end-to-end/random-graph-with-real-connections.test.ts +35 -32
- package/test/end-to-end/webrtc-full-node-network.test.ts +11 -12
- package/test/end-to-end/websocket-full-node-network.test.ts +12 -12
- package/test/integration/DeliveryRpcRemote.test.ts +6 -9
- package/test/integration/HandshakeRpcRemote.test.ts +6 -8
- package/test/integration/Handshakes.test.ts +29 -27
- package/test/integration/Inspect.test.ts +0 -2
- package/test/integration/NeighborUpdateRpcRemote.test.ts +6 -7
- package/test/integration/NetworkNode.test.ts +27 -12
- package/test/integration/NetworkRpc.test.ts +3 -5
- package/test/integration/NetworkStack.test.ts +2 -2
- package/test/integration/NodeInfoRpc.test.ts +104 -0
- package/test/integration/Propagation.test.ts +3 -3
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +24 -25
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +26 -24
- package/test/integration/StreamrNode.test.ts +4 -16
- package/test/integration/joining-streams-on-offline-peers.test.ts +7 -31
- package/test/integration/stream-without-default-entrypoints.test.ts +22 -23
- package/test/integration/streamEntryPointReplacing.test.ts +94 -0
- package/test/unit/DeliveryRpcLocal.test.ts +2 -1
- package/test/unit/EntrypointDiscovery.test.ts +11 -8
- package/test/unit/GroupKeyResponseTranslator.test.ts +1 -1
- package/test/unit/HandshakeRpcLocal.test.ts +80 -28
- package/test/unit/Handshaker.test.ts +14 -9
- package/test/unit/InspectSession.test.ts +5 -6
- package/test/unit/Inspector.test.ts +3 -4
- package/test/unit/NeighborFinder.test.ts +12 -9
- package/test/unit/NeighborUpdateRpcLocal.test.ts +139 -0
- package/test/unit/NodeList.test.ts +77 -80
- package/test/unit/Propagation.test.ts +21 -16
- package/test/unit/ProxyConnectionRpcRemote.test.ts +18 -12
- package/test/unit/RandomGraphNode.test.ts +23 -20
- package/test/unit/StreamMessageTranslator.test.ts +10 -8
- package/test/unit/StreamPartIDDataKey.test.ts +12 -0
- package/test/unit/StreamrNode.test.ts +2 -0
- package/test/unit/TemporaryConnectionRpcLocal.test.ts +38 -0
- package/test/unit/oldStreamMessageBinaryUtils.test.ts +39 -0
- package/test/utils/mock/MockHandshaker.ts +6 -5
- package/test/utils/mock/MockLayer0Node.ts +7 -2
- package/test/utils/mock/MockLayer1Node.ts +5 -2
- package/test/utils/mock/MockNeighborFinder.ts +3 -2
- package/test/utils/mock/MockNeighborUpdateManager.ts +3 -2
- package/test/utils/mock/Transport.ts +1 -1
- package/test/utils/utils.ts +40 -25
- package/tsconfig.jest.json +5 -4
- package/tsconfig.node.json +2 -2
- package/dist/src/identifiers.d.ts +0 -4
- package/dist/src/identifiers.js +0 -9
- package/dist/src/identifiers.js.map +0 -1
- package/src/identifiers.ts +0 -8
- package/test/unit/GroupKeyRequestTranslator.test.ts +0 -36
package/src/logic/Layer1Node.ts
CHANGED
|
@@ -1,21 +1,36 @@
|
|
|
1
|
-
import { 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
|
|
14
|
-
|
|
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
|
|
28
|
+
removeContact: (nodeId: DhtAddress) => void
|
|
15
29
|
getClosestContacts: (maxCount?: number) => PeerDescriptor[]
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
getNeighbors: () => PeerDescriptor[]
|
|
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
|
}
|
package/src/logic/NodeList.ts
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DhtAddress, getNodeIdFromPeerDescriptor } from '@streamr/dht'
|
|
2
2
|
import { sample } from 'lodash'
|
|
3
3
|
import { DeliveryRpcRemote } from './DeliveryRpcRemote'
|
|
4
4
|
import { EventEmitter } from 'eventemitter3'
|
|
5
|
-
import { getNodeIdFromPeerDescriptor, NodeID } from '../identifiers'
|
|
6
5
|
|
|
7
6
|
export interface Events {
|
|
8
|
-
nodeAdded: (id:
|
|
7
|
+
nodeAdded: (id: DhtAddress, remote: DeliveryRpcRemote) => void
|
|
8
|
+
nodeRemoved: (id: DhtAddress, remote: DeliveryRpcRemote) => void
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
const getValuesOfIncludedKeys = (nodes: Map<
|
|
11
|
+
const getValuesOfIncludedKeys = (nodes: Map<DhtAddress, DeliveryRpcRemote>, exclude: DhtAddress[]): DeliveryRpcRemote[] => {
|
|
12
12
|
return Array.from(nodes.entries())
|
|
13
13
|
.filter(([id, _node]) => !exclude.includes(id))
|
|
14
14
|
.map(([_id, node]) => node)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
// The items in the list are in the insertion order
|
|
18
|
+
|
|
17
19
|
export class NodeList extends EventEmitter<Events> {
|
|
18
|
-
private readonly nodes: Map<
|
|
20
|
+
private readonly nodes: Map<DhtAddress, DeliveryRpcRemote>
|
|
19
21
|
private readonly limit: number
|
|
20
|
-
private ownId:
|
|
22
|
+
private ownId: DhtAddress
|
|
21
23
|
|
|
22
|
-
constructor(ownId:
|
|
24
|
+
constructor(ownId: DhtAddress, limit: number) {
|
|
23
25
|
super()
|
|
24
26
|
this.nodes = new Map()
|
|
25
27
|
this.limit = limit
|
|
@@ -38,22 +40,19 @@ export class NodeList extends EventEmitter<Events> {
|
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
remove(
|
|
42
|
-
this.nodes.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
hasNode(peerDescriptor: PeerDescriptor): boolean {
|
|
50
|
-
return this.nodes.has(getNodeIdFromPeerDescriptor(peerDescriptor))
|
|
43
|
+
remove(nodeId: DhtAddress): void {
|
|
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
|
+
}
|
|
51
49
|
}
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
has(nodeId: DhtAddress): boolean {
|
|
54
52
|
return this.nodes.has(nodeId)
|
|
55
53
|
}
|
|
56
54
|
|
|
55
|
+
// Replace nodes does not emit nodeRemoved events, use with caution
|
|
57
56
|
replaceAll(neighbors: DeliveryRpcRemote[]): void {
|
|
58
57
|
this.nodes.clear()
|
|
59
58
|
const limited = neighbors.splice(0, this.limit)
|
|
@@ -62,36 +61,36 @@ export class NodeList extends EventEmitter<Events> {
|
|
|
62
61
|
})
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
getIds():
|
|
64
|
+
getIds(): DhtAddress[] {
|
|
66
65
|
return Array.from(this.nodes.keys())
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
get(id:
|
|
68
|
+
get(id: DhtAddress): DeliveryRpcRemote | undefined {
|
|
70
69
|
return this.nodes.get(id)
|
|
71
70
|
}
|
|
72
71
|
|
|
73
|
-
size(exclude:
|
|
72
|
+
size(exclude: DhtAddress[] = []): number {
|
|
74
73
|
return Array.from(this.nodes.keys()).filter((node) => !exclude.includes(node)).length
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
getRandom(exclude:
|
|
76
|
+
getRandom(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
|
|
78
77
|
return sample(getValuesOfIncludedKeys(this.nodes, exclude))
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
|
|
80
|
+
getFirst(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
|
|
82
81
|
const included = getValuesOfIncludedKeys(this.nodes, exclude)
|
|
83
82
|
return included[0]
|
|
84
83
|
}
|
|
85
84
|
|
|
86
|
-
|
|
85
|
+
getFirstAndLast(exclude: DhtAddress[]): DeliveryRpcRemote[] {
|
|
87
86
|
const included = getValuesOfIncludedKeys(this.nodes, exclude)
|
|
88
87
|
if (included.length === 0) {
|
|
89
88
|
return []
|
|
90
89
|
}
|
|
91
|
-
return included.length > 1 ? [this.
|
|
90
|
+
return included.length > 1 ? [this.getFirst(exclude)!, this.getLast(exclude)!] : [this.getFirst(exclude)!]
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
|
|
93
|
+
getLast(exclude: DhtAddress[]): DeliveryRpcRemote | undefined {
|
|
95
94
|
const included = getValuesOfIncludedKeys(this.nodes, exclude)
|
|
96
95
|
return included[included.length - 1]
|
|
97
96
|
}
|
|
@@ -3,7 +3,10 @@ import {
|
|
|
3
3
|
PeerDescriptor,
|
|
4
4
|
ListeningRpcCommunicator,
|
|
5
5
|
ITransport,
|
|
6
|
-
ConnectionLocker
|
|
6
|
+
ConnectionLocker,
|
|
7
|
+
DhtAddress,
|
|
8
|
+
getNodeIdFromPeerDescriptor,
|
|
9
|
+
RingContacts
|
|
7
10
|
} from '@streamr/dht'
|
|
8
11
|
import {
|
|
9
12
|
StreamMessage,
|
|
@@ -12,6 +15,7 @@ import {
|
|
|
12
15
|
TemporaryConnectionRequest,
|
|
13
16
|
TemporaryConnectionResponse,
|
|
14
17
|
MessageID,
|
|
18
|
+
CloseTemporaryConnection,
|
|
15
19
|
} from '../proto/packages/trackerless-network/protos/NetworkRpc'
|
|
16
20
|
import { NodeList } from './NodeList'
|
|
17
21
|
import { DeliveryRpcClient } from '../proto/packages/trackerless-network/protos/NetworkRpc.client'
|
|
@@ -19,23 +23,23 @@ import { DeliveryRpcRemote } from './DeliveryRpcRemote'
|
|
|
19
23
|
import { IDeliveryRpc } from '../proto/packages/trackerless-network/protos/NetworkRpc.server'
|
|
20
24
|
import { DuplicateMessageDetector } from './DuplicateMessageDetector'
|
|
21
25
|
import { Logger, addManagedEventListener } from '@streamr/utils'
|
|
22
|
-
import {
|
|
23
|
-
import { IHandshaker } from './neighbor-discovery/Handshaker'
|
|
26
|
+
import { Handshaker } from './neighbor-discovery/Handshaker'
|
|
24
27
|
import { Propagation } from './propagation/Propagation'
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
28
|
+
import { NeighborFinder } from './neighbor-discovery/NeighborFinder'
|
|
29
|
+
import { NeighborUpdateManager } from './neighbor-discovery/NeighborUpdateManager'
|
|
27
30
|
import { DeliveryRpcLocal } from './DeliveryRpcLocal'
|
|
28
31
|
import { ProxyConnectionRpcLocal } from './proxy/ProxyConnectionRpcLocal'
|
|
29
|
-
import {
|
|
32
|
+
import { Inspector } from './inspect/Inspector'
|
|
30
33
|
import { TemporaryConnectionRpcLocal } from './temporary-connection/TemporaryConnectionRpcLocal'
|
|
31
34
|
import { markAndCheckDuplicate } from './utils'
|
|
32
|
-
import { NodeID, getNodeIdFromPeerDescriptor } from '../identifiers'
|
|
33
35
|
import { Layer1Node } from './Layer1Node'
|
|
34
36
|
import { StreamPartID } from '@streamr/protocol'
|
|
37
|
+
import { uniqBy } from 'lodash'
|
|
35
38
|
|
|
36
39
|
export interface Events {
|
|
37
40
|
message: (message: StreamMessage) => void
|
|
38
|
-
|
|
41
|
+
neighborConnected: (nodeId: DhtAddress) => void
|
|
42
|
+
entryPointLeaveDetected: () => void
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export interface StrictRandomGraphNodeConfig {
|
|
@@ -47,15 +51,19 @@ export interface StrictRandomGraphNodeConfig {
|
|
|
47
51
|
nodeViewSize: number
|
|
48
52
|
nearbyNodeView: NodeList
|
|
49
53
|
randomNodeView: NodeList
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
leftNodeView: NodeList
|
|
55
|
+
rightNodeView: NodeList
|
|
56
|
+
neighbors: NodeList
|
|
57
|
+
handshaker: Handshaker
|
|
58
|
+
neighborFinder: NeighborFinder
|
|
59
|
+
neighborUpdateManager: NeighborUpdateManager
|
|
54
60
|
propagation: Propagation
|
|
55
61
|
rpcCommunicator: ListeningRpcCommunicator
|
|
56
|
-
|
|
57
|
-
inspector:
|
|
62
|
+
neighborTargetCount: number
|
|
63
|
+
inspector: Inspector
|
|
58
64
|
temporaryConnectionRpcLocal: TemporaryConnectionRpcLocal
|
|
65
|
+
isLocalNodeEntryPoint: () => boolean
|
|
66
|
+
|
|
59
67
|
proxyConnectionRpcLocal?: ProxyConnectionRpcLocal
|
|
60
68
|
rpcRequestTimeout?: number
|
|
61
69
|
}
|
|
@@ -79,23 +87,31 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
79
87
|
streamPartId: this.config.streamPartId,
|
|
80
88
|
rpcCommunicator: this.config.rpcCommunicator,
|
|
81
89
|
markAndCheckDuplicate: (msg: MessageID, prev?: MessageRef) => markAndCheckDuplicate(this.duplicateDetectors, msg, prev),
|
|
82
|
-
broadcast: (message: StreamMessage, previousNode?:
|
|
83
|
-
onLeaveNotice: (
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
broadcast: (message: StreamMessage, previousNode?: DhtAddress) => this.broadcast(message, previousNode),
|
|
91
|
+
onLeaveNotice: (sourceId: DhtAddress, sourceIsStreamEntryPoint: boolean) => {
|
|
92
|
+
if (this.abortController.signal.aborted) {
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
const contact = this.config.nearbyNodeView.get(sourceId)
|
|
96
|
+
|| this.config.randomNodeView.get(sourceId)
|
|
97
|
+
|| this.config.neighbors.get(sourceId)
|
|
98
|
+
|| this.config.proxyConnectionRpcLocal?.getConnection(sourceId)?.remote
|
|
88
99
|
// TODO: check integrity of notifier?
|
|
89
100
|
if (contact) {
|
|
90
|
-
this.config.layer1Node.removeContact(
|
|
91
|
-
this.config.
|
|
92
|
-
this.config.nearbyNodeView.remove(
|
|
93
|
-
this.config.
|
|
94
|
-
this.config.
|
|
95
|
-
this.config.
|
|
101
|
+
this.config.layer1Node.removeContact(sourceId)
|
|
102
|
+
this.config.neighbors.remove(sourceId)
|
|
103
|
+
this.config.nearbyNodeView.remove(sourceId)
|
|
104
|
+
this.config.randomNodeView.remove(sourceId)
|
|
105
|
+
this.config.leftNodeView.remove(sourceId)
|
|
106
|
+
this.config.rightNodeView.remove(sourceId)
|
|
107
|
+
this.config.neighborFinder.start([sourceId])
|
|
108
|
+
this.config.proxyConnectionRpcLocal?.removeConnection(sourceId)
|
|
109
|
+
}
|
|
110
|
+
if (sourceIsStreamEntryPoint) {
|
|
111
|
+
this.emit('entryPointLeaveDetected')
|
|
96
112
|
}
|
|
97
113
|
},
|
|
98
|
-
markForInspection: (senderId:
|
|
114
|
+
markForInspection: (senderId: DhtAddress, messageId: MessageID) => this.config.inspector.markMessage(senderId, messageId)
|
|
99
115
|
})
|
|
100
116
|
}
|
|
101
117
|
|
|
@@ -104,28 +120,44 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
104
120
|
this.registerDefaultServerMethods()
|
|
105
121
|
addManagedEventListener<any, any>(
|
|
106
122
|
this.config.layer1Node as any,
|
|
107
|
-
'
|
|
108
|
-
(_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.
|
|
123
|
+
'contactAdded',
|
|
124
|
+
(_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.onContactAdded(closestPeers),
|
|
109
125
|
this.abortController.signal
|
|
110
126
|
)
|
|
111
127
|
addManagedEventListener<any, any>(
|
|
112
128
|
this.config.layer1Node as any,
|
|
113
129
|
'contactRemoved',
|
|
114
|
-
(_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.
|
|
130
|
+
(_peerDescriptor: PeerDescriptor, closestPeers: PeerDescriptor[]) => this.onContactRemoved(closestPeers),
|
|
115
131
|
this.abortController.signal
|
|
116
132
|
)
|
|
117
133
|
addManagedEventListener<any, any>(
|
|
118
134
|
this.config.layer1Node as any,
|
|
119
|
-
'
|
|
120
|
-
(_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.
|
|
135
|
+
'randomContactAdded',
|
|
136
|
+
(_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactAdded(randomPeers),
|
|
121
137
|
this.abortController.signal
|
|
122
|
-
)
|
|
138
|
+
)
|
|
123
139
|
addManagedEventListener<any, any>(
|
|
124
140
|
this.config.layer1Node as any,
|
|
125
141
|
'randomContactRemoved',
|
|
126
|
-
(_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.
|
|
142
|
+
(_peerDescriptor: PeerDescriptor, randomPeers: PeerDescriptor[]) => this.onRandomContactRemoved(randomPeers),
|
|
143
|
+
this.abortController.signal
|
|
144
|
+
)
|
|
145
|
+
addManagedEventListener<any, any>(
|
|
146
|
+
this.config.layer1Node as any,
|
|
147
|
+
'ringContactAdded',
|
|
148
|
+
(_: PeerDescriptor, peers: RingContacts) => {
|
|
149
|
+
this.onRingContactEvent(peers)
|
|
150
|
+
},
|
|
127
151
|
this.abortController.signal
|
|
128
|
-
)
|
|
152
|
+
)
|
|
153
|
+
addManagedEventListener<any, any>(
|
|
154
|
+
this.config.layer1Node as any,
|
|
155
|
+
'ringContactRemoved',
|
|
156
|
+
(_: PeerDescriptor, peers: RingContacts) => {
|
|
157
|
+
this.onRingContactEvent(peers)
|
|
158
|
+
},
|
|
159
|
+
this.abortController.signal
|
|
160
|
+
)
|
|
129
161
|
addManagedEventListener<any, any>(
|
|
130
162
|
this.config.transport as any,
|
|
131
163
|
'disconnected',
|
|
@@ -133,11 +165,20 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
133
165
|
this.abortController.signal
|
|
134
166
|
)
|
|
135
167
|
addManagedEventListener(
|
|
136
|
-
this.config.
|
|
168
|
+
this.config.neighbors,
|
|
137
169
|
'nodeAdded',
|
|
138
|
-
(id,
|
|
170
|
+
(id, remote) => {
|
|
139
171
|
this.config.propagation.onNeighborJoined(id)
|
|
140
|
-
this.
|
|
172
|
+
this.config.connectionLocker.weakLockConnection(remote.getPeerDescriptor(), this.config.streamPartId)
|
|
173
|
+
this.emit('neighborConnected', id)
|
|
174
|
+
},
|
|
175
|
+
this.abortController.signal
|
|
176
|
+
)
|
|
177
|
+
addManagedEventListener(
|
|
178
|
+
this.config.neighbors,
|
|
179
|
+
'nodeRemoved',
|
|
180
|
+
(_id, remote) => {
|
|
181
|
+
this.config.connectionLocker.weakUnlockConnection(remote.getPeerDescriptor(), this.config.streamPartId)
|
|
141
182
|
},
|
|
142
183
|
this.abortController.signal
|
|
143
184
|
)
|
|
@@ -145,13 +186,13 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
145
186
|
addManagedEventListener(
|
|
146
187
|
this.config.proxyConnectionRpcLocal,
|
|
147
188
|
'newConnection',
|
|
148
|
-
(id:
|
|
189
|
+
(id: DhtAddress) => this.config.propagation.onNeighborJoined(id),
|
|
149
190
|
this.abortController.signal
|
|
150
191
|
)
|
|
151
192
|
}
|
|
152
193
|
const candidates = this.getNeighborCandidatesFromLayer1()
|
|
153
194
|
if (candidates.length > 0) {
|
|
154
|
-
this.
|
|
195
|
+
this.onContactAdded(candidates)
|
|
155
196
|
}
|
|
156
197
|
this.config.neighborFinder.start()
|
|
157
198
|
await this.config.neighborUpdateManager.start()
|
|
@@ -164,20 +205,47 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
164
205
|
(req: LeaveStreamPartNotice, context) => this.deliveryRpcLocal.leaveStreamPartNotice(req, context))
|
|
165
206
|
this.config.rpcCommunicator.registerRpcMethod(TemporaryConnectionRequest, TemporaryConnectionResponse, 'openConnection',
|
|
166
207
|
(req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.openConnection(req, context))
|
|
208
|
+
this.config.rpcCommunicator.registerRpcNotification(CloseTemporaryConnection, 'closeConnection',
|
|
209
|
+
(req: TemporaryConnectionRequest, context) => this.config.temporaryConnectionRpcLocal.closeConnection(req, context))
|
|
167
210
|
}
|
|
168
211
|
|
|
169
|
-
private
|
|
212
|
+
private onRingContactEvent(ringPeers: RingContacts): void {
|
|
213
|
+
logger.trace(`onRingContactAdded`)
|
|
214
|
+
if (this.isStopped()) {
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
this.config.leftNodeView.replaceAll(ringPeers.left.map((peer) =>
|
|
218
|
+
new DeliveryRpcRemote(
|
|
219
|
+
this.config.localPeerDescriptor,
|
|
220
|
+
peer,
|
|
221
|
+
this.config.rpcCommunicator,
|
|
222
|
+
DeliveryRpcClient,
|
|
223
|
+
this.config.rpcRequestTimeout
|
|
224
|
+
)
|
|
225
|
+
))
|
|
226
|
+
this.config.rightNodeView.replaceAll(ringPeers.right.map((peer) =>
|
|
227
|
+
new DeliveryRpcRemote(
|
|
228
|
+
this.config.localPeerDescriptor,
|
|
229
|
+
peer,
|
|
230
|
+
this.config.rpcCommunicator,
|
|
231
|
+
DeliveryRpcClient,
|
|
232
|
+
this.config.rpcRequestTimeout
|
|
233
|
+
)
|
|
234
|
+
))
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
private onContactAdded(closestNodes: PeerDescriptor[]): void {
|
|
170
238
|
logger.trace(`New nearby contact found`)
|
|
171
239
|
if (this.isStopped()) {
|
|
172
240
|
return
|
|
173
241
|
}
|
|
174
242
|
this.updateNearbyNodeView(closestNodes)
|
|
175
|
-
if (this.config.
|
|
243
|
+
if (this.config.neighbors.size() < this.config.neighborTargetCount) {
|
|
176
244
|
this.config.neighborFinder.start()
|
|
177
245
|
}
|
|
178
246
|
}
|
|
179
247
|
|
|
180
|
-
private
|
|
248
|
+
private onContactRemoved(closestNodes: PeerDescriptor[]): void {
|
|
181
249
|
logger.trace(`Nearby contact removed`)
|
|
182
250
|
if (this.isStopped()) {
|
|
183
251
|
return
|
|
@@ -190,12 +258,12 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
190
258
|
new DeliveryRpcRemote(
|
|
191
259
|
this.config.localPeerDescriptor,
|
|
192
260
|
descriptor,
|
|
193
|
-
this.config.
|
|
194
|
-
|
|
261
|
+
this.config.rpcCommunicator,
|
|
262
|
+
DeliveryRpcClient,
|
|
195
263
|
this.config.rpcRequestTimeout
|
|
196
264
|
)
|
|
197
265
|
))
|
|
198
|
-
for (const descriptor of this.config.layer1Node.
|
|
266
|
+
for (const descriptor of this.config.layer1Node.getNeighbors()) {
|
|
199
267
|
if (this.config.nearbyNodeView.size() >= this.config.nodeViewSize) {
|
|
200
268
|
break
|
|
201
269
|
}
|
|
@@ -203,8 +271,8 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
203
271
|
new DeliveryRpcRemote(
|
|
204
272
|
this.config.localPeerDescriptor,
|
|
205
273
|
descriptor,
|
|
206
|
-
this.config.
|
|
207
|
-
|
|
274
|
+
this.config.rpcCommunicator,
|
|
275
|
+
DeliveryRpcClient,
|
|
208
276
|
this.config.rpcRequestTimeout
|
|
209
277
|
|
|
210
278
|
)
|
|
@@ -212,7 +280,7 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
212
280
|
}
|
|
213
281
|
}
|
|
214
282
|
|
|
215
|
-
private
|
|
283
|
+
private onRandomContactAdded(randomNodes: PeerDescriptor[]): void {
|
|
216
284
|
if (this.isStopped()) {
|
|
217
285
|
return
|
|
218
286
|
}
|
|
@@ -220,17 +288,17 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
220
288
|
new DeliveryRpcRemote(
|
|
221
289
|
this.config.localPeerDescriptor,
|
|
222
290
|
descriptor,
|
|
223
|
-
this.config.
|
|
224
|
-
|
|
291
|
+
this.config.rpcCommunicator,
|
|
292
|
+
DeliveryRpcClient,
|
|
225
293
|
this.config.rpcRequestTimeout
|
|
226
294
|
)
|
|
227
295
|
))
|
|
228
|
-
if (this.config.
|
|
296
|
+
if (this.config.neighbors.size() < this.config.neighborTargetCount) {
|
|
229
297
|
this.config.neighborFinder.start()
|
|
230
298
|
}
|
|
231
299
|
}
|
|
232
300
|
|
|
233
|
-
private
|
|
301
|
+
private onRandomContactRemoved(randomNodes: PeerDescriptor[]): void {
|
|
234
302
|
logger.trace(`New nearby contact found`)
|
|
235
303
|
if (this.isStopped()) {
|
|
236
304
|
return
|
|
@@ -239,34 +307,34 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
239
307
|
new DeliveryRpcRemote(
|
|
240
308
|
this.config.localPeerDescriptor,
|
|
241
309
|
descriptor,
|
|
242
|
-
this.config.
|
|
243
|
-
|
|
310
|
+
this.config.rpcCommunicator,
|
|
311
|
+
DeliveryRpcClient,
|
|
244
312
|
this.config.rpcRequestTimeout
|
|
245
313
|
)
|
|
246
314
|
))
|
|
247
315
|
}
|
|
248
316
|
|
|
249
317
|
private onNodeDisconnected(peerDescriptor: PeerDescriptor): void {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
this.config.
|
|
253
|
-
this.config.neighborFinder.start([
|
|
254
|
-
this.config.temporaryConnectionRpcLocal.removeNode(
|
|
318
|
+
const nodeId = getNodeIdFromPeerDescriptor(peerDescriptor)
|
|
319
|
+
if (this.config.neighbors.has(nodeId)) {
|
|
320
|
+
this.config.neighbors.remove(nodeId)
|
|
321
|
+
this.config.neighborFinder.start([nodeId])
|
|
322
|
+
this.config.temporaryConnectionRpcLocal.removeNode(nodeId)
|
|
255
323
|
}
|
|
256
324
|
}
|
|
257
325
|
|
|
258
326
|
private getNeighborCandidatesFromLayer1(): PeerDescriptor[] {
|
|
259
|
-
const
|
|
327
|
+
const nodes: PeerDescriptor[] = []
|
|
260
328
|
this.config.layer1Node.getClosestContacts(this.config.nodeViewSize).forEach((peer: PeerDescriptor) => {
|
|
261
|
-
|
|
329
|
+
nodes.push(peer)
|
|
262
330
|
})
|
|
263
|
-
this.config.layer1Node.
|
|
264
|
-
|
|
331
|
+
this.config.layer1Node.getNeighbors().forEach((peer: PeerDescriptor) => {
|
|
332
|
+
nodes.push(peer)
|
|
265
333
|
})
|
|
266
|
-
return
|
|
334
|
+
return uniqBy(nodes, (p) => getNodeIdFromPeerDescriptor(p))
|
|
267
335
|
}
|
|
268
336
|
|
|
269
|
-
hasProxyConnection(nodeId:
|
|
337
|
+
hasProxyConnection(nodeId: DhtAddress): boolean {
|
|
270
338
|
if (this.config.proxyConnectionRpcLocal) {
|
|
271
339
|
return this.config.proxyConnectionRpcLocal.hasConnection(nodeId)
|
|
272
340
|
}
|
|
@@ -279,52 +347,54 @@ export class RandomGraphNode extends EventEmitter<Events> {
|
|
|
279
347
|
}
|
|
280
348
|
this.abortController.abort()
|
|
281
349
|
this.config.proxyConnectionRpcLocal?.stop()
|
|
282
|
-
this.config.
|
|
350
|
+
this.config.neighbors.getAll().map(
|
|
351
|
+
(remote) => remote.leaveStreamPartNotice(this.config.streamPartId, this.config.isLocalNodeEntryPoint())
|
|
352
|
+
)
|
|
283
353
|
this.config.rpcCommunicator.destroy()
|
|
284
354
|
this.removeAllListeners()
|
|
285
355
|
this.config.nearbyNodeView.stop()
|
|
286
|
-
this.config.
|
|
356
|
+
this.config.neighbors.stop()
|
|
287
357
|
this.config.randomNodeView.stop()
|
|
288
358
|
this.config.neighborFinder.stop()
|
|
289
359
|
this.config.neighborUpdateManager.stop()
|
|
290
360
|
this.config.inspector.stop()
|
|
291
361
|
}
|
|
292
362
|
|
|
293
|
-
broadcast(msg: StreamMessage, previousNode?:
|
|
363
|
+
broadcast(msg: StreamMessage, previousNode?: DhtAddress): void {
|
|
294
364
|
if (!previousNode) {
|
|
295
365
|
markAndCheckDuplicate(this.duplicateDetectors, msg.messageId!, msg.previousMessageRef)
|
|
296
366
|
}
|
|
297
367
|
this.emit('message', msg)
|
|
298
|
-
this.config.
|
|
368
|
+
const skipBackPropagation = previousNode !== undefined && !this.config.temporaryConnectionRpcLocal.hasNode(previousNode)
|
|
369
|
+
this.config.propagation.feedUnseenMessage(msg, this.getPropagationTargets(msg), skipBackPropagation ? previousNode : null)
|
|
299
370
|
}
|
|
300
371
|
|
|
301
372
|
inspect(peerDescriptor: PeerDescriptor): Promise<boolean> {
|
|
302
373
|
return this.config.inspector.inspect(peerDescriptor)
|
|
303
374
|
}
|
|
304
375
|
|
|
305
|
-
private getPropagationTargets(msg: StreamMessage):
|
|
306
|
-
let propagationTargets = this.config.
|
|
376
|
+
private getPropagationTargets(msg: StreamMessage): DhtAddress[] {
|
|
377
|
+
let propagationTargets = this.config.neighbors.getIds()
|
|
307
378
|
if (this.config.proxyConnectionRpcLocal) {
|
|
308
|
-
propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal
|
|
379
|
+
propagationTargets = propagationTargets.concat(this.config.proxyConnectionRpcLocal.getPropagationTargets(msg))
|
|
309
380
|
}
|
|
310
|
-
propagationTargets = propagationTargets.filter((target) => !this.config.inspector.isInspected(target ))
|
|
311
381
|
propagationTargets = propagationTargets.concat(this.config.temporaryConnectionRpcLocal.getNodes().getIds())
|
|
312
382
|
return propagationTargets
|
|
313
383
|
}
|
|
314
384
|
|
|
315
|
-
getOwnNodeId():
|
|
385
|
+
getOwnNodeId(): DhtAddress {
|
|
316
386
|
return getNodeIdFromPeerDescriptor(this.config.localPeerDescriptor)
|
|
317
387
|
}
|
|
318
388
|
|
|
319
|
-
|
|
389
|
+
getOutgoingHandshakeCount(): number {
|
|
320
390
|
return this.config.handshaker.getOngoingHandshakes().size
|
|
321
391
|
}
|
|
322
392
|
|
|
323
|
-
|
|
393
|
+
getNeighbors(): PeerDescriptor[] {
|
|
324
394
|
if (!this.started && this.isStopped()) {
|
|
325
395
|
return []
|
|
326
396
|
}
|
|
327
|
-
return this.config.
|
|
397
|
+
return this.config.neighbors.getAll().map((n) => n.getPeerDescriptor())
|
|
328
398
|
}
|
|
329
399
|
|
|
330
400
|
getNearbyNodeView(): NodeList {
|