@streamr/dht 100.2.4-beta.0 → 100.2.5-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.
- package/dist/package.json +8 -9
- package/dist/src/connection/ConnectionManager.d.ts +2 -1
- package/dist/src/connection/ConnectionManager.js +2 -10
- package/dist/src/connection/ConnectionManager.js.map +1 -1
- package/dist/src/connection/ConnectionsView.d.ts +7 -0
- package/dist/src/connection/ConnectionsView.js +3 -0
- package/dist/src/connection/ConnectionsView.js.map +1 -0
- package/dist/src/connection/ConnectorFacade.d.ts +2 -1
- package/dist/src/connection/ConnectorFacade.js +5 -4
- package/dist/src/connection/ConnectorFacade.js.map +1 -1
- package/dist/src/connection/connectivityChecker.d.ts +3 -3
- package/dist/src/connection/connectivityChecker.js +3 -3
- package/dist/src/connection/connectivityChecker.js.map +1 -1
- package/dist/src/connection/connectivityRequestHandler.d.ts +2 -1
- package/dist/src/connection/connectivityRequestHandler.js +13 -6
- package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
- package/dist/src/connection/{ManagedWebrtcConnection.d.ts → webrtc/ManagedWebrtcConnection.d.ts} +3 -3
- package/dist/src/connection/{ManagedWebrtcConnection.js → webrtc/ManagedWebrtcConnection.js} +2 -2
- package/dist/src/connection/webrtc/ManagedWebrtcConnection.js.map +1 -0
- package/dist/src/connection/webrtc/NodeWebrtcConnection.js +3 -26
- package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
- package/dist/src/connection/webrtc/WebrtcConnector.js +1 -1
- package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +1 -1
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +1 -1
- package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
- package/dist/src/connection/websocket/AbstractWebsocketClientConnection.d.ts +1 -1
- package/dist/src/connection/websocket/WebsocketConnector.d.ts +3 -1
- package/dist/src/connection/websocket/WebsocketConnector.js +26 -18
- package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
- package/dist/src/connection/websocket/WebsocketServerConnection.d.ts +2 -1
- package/dist/src/connection/websocket/WebsocketServerConnection.js +4 -0
- package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -1
- package/dist/src/dht/DhtNode.d.ts +14 -11
- package/dist/src/dht/DhtNode.js +74 -61
- package/dist/src/dht/DhtNode.js.map +1 -1
- package/dist/src/dht/DhtNodeRpcLocal.d.ts +3 -3
- package/dist/src/dht/DhtNodeRpcLocal.js +5 -2
- package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
- package/dist/src/dht/PeerManager.d.ts +14 -14
- package/dist/src/dht/PeerManager.js +51 -42
- package/dist/src/dht/PeerManager.js.map +1 -1
- package/dist/src/dht/contact/ContactList.d.ts +1 -2
- package/dist/src/dht/contact/ContactList.js +1 -3
- package/dist/src/dht/contact/ContactList.js.map +1 -1
- package/dist/src/dht/contact/RandomContactList.d.ts +1 -1
- package/dist/src/dht/contact/RandomContactList.js +7 -4
- package/dist/src/dht/contact/RandomContactList.js.map +1 -1
- package/dist/src/dht/contact/getClosestNodes.d.ts +6 -0
- package/dist/src/dht/contact/{getClosestContacts.js → getClosestNodes.js} +7 -6
- package/dist/src/dht/contact/getClosestNodes.js.map +1 -0
- package/dist/src/dht/discovery/DiscoverySession.d.ts +4 -0
- package/dist/src/dht/discovery/DiscoverySession.js +27 -21
- package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
- package/dist/src/dht/discovery/PeerDiscovery.d.ts +8 -5
- package/dist/src/dht/discovery/PeerDiscovery.js +34 -24
- package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
- package/dist/src/dht/discovery/RingDiscoverySession.d.ts +4 -4
- package/dist/src/dht/discovery/RingDiscoverySession.js +10 -19
- package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -1
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +2 -0
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +3 -3
- package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -1
- package/dist/src/dht/store/StoreManager.d.ts +5 -6
- package/dist/src/dht/store/StoreManager.js +21 -76
- package/dist/src/dht/store/StoreManager.js.map +1 -1
- package/dist/src/dht/store/StoreRpcLocal.d.ts +5 -2
- package/dist/src/dht/store/StoreRpcLocal.js +22 -5
- package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
- package/dist/src/exports.d.ts +2 -1
- package/dist/src/exports.js.map +1 -1
- package/dist/src/helpers/version.d.ts +1 -1
- package/dist/src/helpers/version.js +1 -1
- package/dist/src/proto/google/protobuf/any.d.ts +8 -5
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/empty.d.ts +0 -1
- package/dist/src/proto/google/protobuf/empty.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts +10 -1
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +10 -2
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +4 -2
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/transport/ITransport.d.ts +0 -4
- package/dist/src/transport/ITransport.js.map +1 -1
- package/karma.config.js +2 -2
- package/package.json +8 -9
- package/protos/DhtRpc.proto +3 -1
- package/src/connection/ConnectionManager.ts +4 -10
- package/src/connection/ConnectionsView.ts +8 -0
- package/src/connection/ConnectorFacade.ts +7 -5
- package/src/connection/connectivityChecker.ts +4 -4
- package/src/connection/connectivityRequestHandler.ts +19 -6
- package/src/connection/{ManagedWebrtcConnection.ts → webrtc/ManagedWebrtcConnection.ts} +4 -4
- package/src/connection/webrtc/NodeWebrtcConnection.ts +3 -3
- package/src/connection/webrtc/WebrtcConnector.ts +1 -1
- package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +3 -3
- package/src/connection/websocket/AbstractWebsocketClientConnection.ts +1 -1
- package/src/connection/websocket/WebsocketConnector.ts +33 -21
- package/src/connection/websocket/WebsocketServerConnection.ts +6 -1
- package/src/dht/DhtNode.ts +102 -74
- package/src/dht/DhtNodeRpcLocal.ts +12 -5
- package/src/dht/PeerManager.ts +58 -49
- package/src/dht/contact/ContactList.ts +1 -4
- package/src/dht/contact/RandomContactList.ts +7 -5
- package/src/dht/contact/{getClosestContacts.ts → getClosestNodes.ts} +8 -6
- package/src/dht/discovery/DiscoverySession.ts +34 -22
- package/src/dht/discovery/PeerDiscovery.ts +44 -30
- package/src/dht/discovery/RingDiscoverySession.ts +15 -29
- package/src/dht/recursive-operation/RecursiveOperationManager.ts +5 -3
- package/src/dht/store/StoreManager.ts +46 -84
- package/src/dht/store/StoreRpcLocal.ts +32 -9
- package/src/exports.ts +2 -1
- package/src/helpers/version.ts +1 -1
- package/src/proto/google/protobuf/any.ts +8 -5
- package/src/proto/google/protobuf/empty.ts +0 -1
- package/src/proto/google/protobuf/timestamp.ts +10 -1
- package/src/proto/packages/dht/protos/DhtRpc.ts +14 -4
- package/src/transport/ITransport.ts +0 -4
- package/test/benchmark/Find.test.ts +1 -1
- package/test/benchmark/WebsocketServerMemoryLeak.test.ts +1 -1
- package/test/end-to-end/GeoIpLayer0.test.ts +55 -0
- package/test/end-to-end/Layer0-Layer1.test.ts +4 -4
- package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +11 -5
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +7 -1
- package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +11 -2
- package/test/integration/ConnectionLocking.test.ts +1 -1
- package/test/integration/ConnectionManager.test.ts +3 -3
- package/test/integration/ConnectivityChecking.test.ts +3 -3
- package/test/integration/DhtNode.test.ts +5 -20
- package/test/integration/GeoIpConnectivityChecking.test.ts +71 -0
- package/test/integration/Layer1-scale.test.ts +6 -6
- package/test/integration/RouteMessage.test.ts +4 -0
- package/test/integration/ScaleDownDht.test.ts +1 -1
- package/test/integration/SimultaneousConnections.test.ts +2 -2
- package/test/integration/WebrtcConnectionManagement.test.ts +1 -1
- package/test/integration/Websocket.test.ts +1 -1
- package/test/integration/WebsocketConnectionManagement.test.ts +1 -1
- package/test/integration/rpc-connections-over-webrpc.test.ts +1 -1
- package/test/unit/AutoCertifierClientFacade.test.ts +1 -1
- package/test/unit/DiscoverySession.test.ts +4 -2
- package/test/unit/PeerManager.test.ts +45 -51
- package/test/unit/RandomContactList.test.ts +10 -0
- package/test/unit/RecursiveOperationManager.test.ts +4 -2
- package/test/unit/StoreManager.test.ts +42 -34
- package/test/unit/StoreRpcLocal.test.ts +167 -0
- package/test/unit/WebsocketConnector.test.ts +1 -1
- package/test/unit/connectivityRequestHandler.test.ts +3 -3
- package/test/unit/getClosestNodes.test.ts +30 -0
- package/test/utils/FakeTransport.ts +4 -2
- package/test/utils/mock/MockConnectionsView.ts +18 -0
- package/test/utils/mock/{Transport.ts → MockTransport.ts} +0 -15
- package/test/utils/utils.ts +4 -1
- package/tsconfig.jest.json +2 -1
- package/tsconfig.node.json +2 -1
- package/dist/src/connection/ManagedWebrtcConnection.js.map +0 -1
- package/dist/src/dht/contact/getClosestContacts.d.ts +0 -7
- package/dist/src/dht/contact/getClosestContacts.js.map +0 -1
- package/test/unit/getClosestContacts.test.ts +0 -28
- /package/test/utils/mock/{Router.ts → MockRouter.ts} +0 -0
|
@@ -50,41 +50,47 @@ describe('Layer 1 on Layer 0 with mocked connections', () => {
|
|
|
50
50
|
entryPoints: [entrypointDescriptor]
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
+
await layer0EntryPoint.start()
|
|
54
|
+
await layer0Node1.start()
|
|
55
|
+
await layer0Node2.start()
|
|
56
|
+
await layer0Node3.start()
|
|
57
|
+
await layer0Node4.start()
|
|
58
|
+
|
|
53
59
|
layer1EntryPoint = new DhtNode({
|
|
54
60
|
nodeId: getNodeIdFromPeerDescriptor(entrypointDescriptor),
|
|
55
61
|
transport: layer0EntryPoint,
|
|
62
|
+
connectionsView: layer0EntryPoint.getConnectionsView(),
|
|
56
63
|
serviceId: 'layer1'
|
|
57
64
|
})
|
|
58
65
|
|
|
59
66
|
layer1Node1 = new DhtNode({
|
|
60
67
|
nodeId: layer0Node1Id,
|
|
61
68
|
transport: layer0Node1,
|
|
69
|
+
connectionsView: layer0Node1.getConnectionsView(),
|
|
62
70
|
serviceId: 'layer1'
|
|
63
71
|
})
|
|
64
72
|
|
|
65
73
|
layer1Node2 = new DhtNode({
|
|
66
74
|
nodeId: layer0Node2Id,
|
|
67
75
|
transport: layer0Node2,
|
|
76
|
+
connectionsView: layer0Node2.getConnectionsView(),
|
|
68
77
|
serviceId: 'layer1'
|
|
69
78
|
})
|
|
70
79
|
|
|
71
80
|
layer1Node3 = new DhtNode({
|
|
72
81
|
nodeId: layer0Node3Id,
|
|
73
82
|
transport: layer0Node3,
|
|
83
|
+
connectionsView: layer0Node3.getConnectionsView(),
|
|
74
84
|
serviceId: 'layer1'
|
|
75
85
|
})
|
|
76
86
|
|
|
77
87
|
layer1Node4 = new DhtNode({
|
|
78
88
|
nodeId: layer0Node4Id,
|
|
79
89
|
transport: layer0Node4,
|
|
90
|
+
connectionsView: layer0Node4.getConnectionsView(),
|
|
80
91
|
serviceId: 'layer1'
|
|
81
92
|
})
|
|
82
93
|
|
|
83
|
-
await layer0EntryPoint.start()
|
|
84
|
-
await layer0Node1.start()
|
|
85
|
-
await layer0Node2.start()
|
|
86
|
-
await layer0Node3.start()
|
|
87
|
-
await layer0Node4.start()
|
|
88
94
|
await layer1EntryPoint.start()
|
|
89
95
|
await layer1Node1.start()
|
|
90
96
|
await layer1Node2.start()
|
|
@@ -24,7 +24,12 @@ describe('Layer1 Scale', () => {
|
|
|
24
24
|
await epLayer0Node.start()
|
|
25
25
|
await epLayer0Node.joinDht([epPeerDescriptor])
|
|
26
26
|
|
|
27
|
-
epLayer1Node = new DhtNode({
|
|
27
|
+
epLayer1Node = new DhtNode({
|
|
28
|
+
transport: epLayer0Node,
|
|
29
|
+
connectionsView: epLayer0Node.getConnectionsView(),
|
|
30
|
+
peerDescriptor: epPeerDescriptor,
|
|
31
|
+
serviceId: STREAM_ID
|
|
32
|
+
})
|
|
28
33
|
await epLayer1Node.start()
|
|
29
34
|
await epLayer1Node.joinDht([epPeerDescriptor])
|
|
30
35
|
|
|
@@ -42,6 +47,7 @@ describe('Layer1 Scale', () => {
|
|
|
42
47
|
layer0Nodes.push(node)
|
|
43
48
|
const layer1 = new DhtNode({
|
|
44
49
|
transport: node,
|
|
50
|
+
connectionsView: node.getConnectionsView(),
|
|
45
51
|
entryPoints: [epPeerDescriptor],
|
|
46
52
|
peerDescriptor: node.getLocalPeerDescriptor(),
|
|
47
53
|
serviceId: STREAM_ID,
|
|
@@ -16,11 +16,19 @@ describe('Layer1 Scale', () => {
|
|
|
16
16
|
let epLayer1Node: DhtNode
|
|
17
17
|
|
|
18
18
|
beforeEach(async () => {
|
|
19
|
-
epLayer0Node = new DhtNode({
|
|
19
|
+
epLayer0Node = new DhtNode({
|
|
20
|
+
peerDescriptor: epPeerDescriptor,
|
|
21
|
+
websocketServerEnableTls: false
|
|
22
|
+
})
|
|
20
23
|
await epLayer0Node.start()
|
|
21
24
|
await epLayer0Node.joinDht([epPeerDescriptor])
|
|
22
25
|
|
|
23
|
-
epLayer1Node = new DhtNode({
|
|
26
|
+
epLayer1Node = new DhtNode({
|
|
27
|
+
transport: epLayer0Node,
|
|
28
|
+
connectionsView: epLayer0Node.getConnectionsView(),
|
|
29
|
+
peerDescriptor: epPeerDescriptor,
|
|
30
|
+
serviceId: STREAM_ID
|
|
31
|
+
})
|
|
24
32
|
await epLayer1Node.start()
|
|
25
33
|
await epLayer1Node.joinDht([epPeerDescriptor])
|
|
26
34
|
|
|
@@ -36,6 +44,7 @@ describe('Layer1 Scale', () => {
|
|
|
36
44
|
layer0Nodes.push(node)
|
|
37
45
|
const layer1 = new DhtNode({
|
|
38
46
|
transport: node,
|
|
47
|
+
connectionsView: node.getConnectionsView(),
|
|
39
48
|
entryPoints: [epPeerDescriptor],
|
|
40
49
|
peerDescriptor: node.getLocalPeerDescriptor(),
|
|
41
50
|
serviceId: STREAM_ID,
|
|
@@ -13,7 +13,7 @@ const createConnectionManager = (localPeerDescriptor: PeerDescriptor, transport:
|
|
|
13
13
|
return new ConnectionManager({
|
|
14
14
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
15
15
|
transport,
|
|
16
|
-
createLocalPeerDescriptor: () => localPeerDescriptor
|
|
16
|
+
createLocalPeerDescriptor: async () => localPeerDescriptor
|
|
17
17
|
}),
|
|
18
18
|
metricsContext: new MetricsContext()
|
|
19
19
|
})
|
|
@@ -33,7 +33,7 @@ describe('ConnectionManager', () => {
|
|
|
33
33
|
const createConnectionManager = (opts: MarkOptional<DefaultConnectorFacadeConfig, 'createLocalPeerDescriptor'>) => {
|
|
34
34
|
return new ConnectionManager({
|
|
35
35
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
36
|
-
createLocalPeerDescriptor,
|
|
36
|
+
createLocalPeerDescriptor: async (response) => createLocalPeerDescriptor(response),
|
|
37
37
|
websocketServerEnableTls: false,
|
|
38
38
|
...opts
|
|
39
39
|
}),
|
|
@@ -363,7 +363,7 @@ describe('ConnectionManager', () => {
|
|
|
363
363
|
transport: mockTransport,
|
|
364
364
|
websocketHost: '127.0.0.1',
|
|
365
365
|
websocketPortRange: { min: 10002, max: 10002 },
|
|
366
|
-
createLocalPeerDescriptor: () => peerDescriptor1
|
|
366
|
+
createLocalPeerDescriptor: async () => peerDescriptor1
|
|
367
367
|
})
|
|
368
368
|
|
|
369
369
|
await connectionManager1.start()
|
|
@@ -372,7 +372,7 @@ describe('ConnectionManager', () => {
|
|
|
372
372
|
transport: mockTransport,
|
|
373
373
|
websocketHost: '127.0.0.1',
|
|
374
374
|
websocketPortRange: { min: 10003, max: 10003 },
|
|
375
|
-
createLocalPeerDescriptor: () => peerDescriptor2
|
|
375
|
+
createLocalPeerDescriptor: async () => peerDescriptor2
|
|
376
376
|
})
|
|
377
377
|
|
|
378
378
|
await connectionManager2.start()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MetricsContext } from '@streamr/utils'
|
|
2
2
|
import { ConnectionManager } from '../../src/connection/ConnectionManager'
|
|
3
3
|
import { DefaultConnectorFacade } from '../../src/connection/ConnectorFacade'
|
|
4
|
-
import { MockTransport } from '../utils/mock/
|
|
4
|
+
import { MockTransport } from '../utils/mock/MockTransport'
|
|
5
5
|
import { createMockPeerDescriptor } from '../utils/utils'
|
|
6
6
|
import { sendConnectivityRequest } from '../../src/connection/connectivityChecker'
|
|
7
7
|
import { LOCAL_PROTOCOL_VERSION } from '../../src/helpers/version'
|
|
@@ -15,7 +15,7 @@ describe('ConnectivityChecking', () => {
|
|
|
15
15
|
beforeEach(async () => {
|
|
16
16
|
server = new ConnectionManager({
|
|
17
17
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
18
|
-
createLocalPeerDescriptor: () => {
|
|
18
|
+
createLocalPeerDescriptor: async () => {
|
|
19
19
|
return {
|
|
20
20
|
...createMockPeerDescriptor(),
|
|
21
21
|
websocket: {
|
|
@@ -44,7 +44,7 @@ describe('ConnectivityChecking', () => {
|
|
|
44
44
|
host: HOST,
|
|
45
45
|
port: PORT,
|
|
46
46
|
tls: false,
|
|
47
|
-
|
|
47
|
+
allowSelfSignedCertificate: false
|
|
48
48
|
}
|
|
49
49
|
const response = await sendConnectivityRequest(request, server.getLocalPeerDescriptor())
|
|
50
50
|
expect(response.version).toEqual(LOCAL_PROTOCOL_VERSION)
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { waitForCondition } from '@streamr/utils'
|
|
2
2
|
import { range, without } from 'lodash'
|
|
3
3
|
import { DhtNodeRpcLocal } from '../../src/dht/DhtNodeRpcLocal'
|
|
4
|
-
import {
|
|
5
|
-
import { SortedContactList } from '../../src/dht/contact/SortedContactList'
|
|
6
|
-
import { DhtAddress, DhtNode, ListeningRpcCommunicator, getNodeIdFromPeerDescriptor } from '../../src/exports'
|
|
4
|
+
import { DhtNode, ListeningRpcCommunicator, getNodeIdFromPeerDescriptor } from '../../src/exports'
|
|
7
5
|
import { ClosestPeersRequest, ClosestPeersResponse, PeerDescriptor, PingRequest, PingResponse } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
8
6
|
import { FakeEnvironment } from '../utils/FakeTransport'
|
|
9
7
|
import { createMockPeerDescriptor } from '../utils/utils'
|
|
@@ -11,21 +9,6 @@ import { createMockPeerDescriptor } from '../utils/utils'
|
|
|
11
9
|
const OTHER_NODE_COUNT = 3
|
|
12
10
|
const SERVICE_ID_LAYER0 = 'layer0'
|
|
13
11
|
|
|
14
|
-
const getClosestNodes = (
|
|
15
|
-
referenceId: DhtAddress,
|
|
16
|
-
nodes: PeerDescriptor[],
|
|
17
|
-
maxCount: number,
|
|
18
|
-
allowToContainReferenceId: boolean
|
|
19
|
-
): PeerDescriptor[] => {
|
|
20
|
-
const list = new SortedContactList<Contact>({
|
|
21
|
-
referenceId,
|
|
22
|
-
allowToContainReferenceId,
|
|
23
|
-
maxSize: maxCount
|
|
24
|
-
})
|
|
25
|
-
list.addContacts(nodes.map((n) => new Contact(n)))
|
|
26
|
-
return list.getClosestContacts().map((c) => c.getPeerDescriptor())
|
|
27
|
-
}
|
|
28
|
-
|
|
29
12
|
describe('DhtNode', () => {
|
|
30
13
|
|
|
31
14
|
let localPeerDescriptor: PeerDescriptor
|
|
@@ -36,7 +19,7 @@ describe('DhtNode', () => {
|
|
|
36
19
|
const epRpcCommunicator = new ListeningRpcCommunicator(SERVICE_ID_LAYER0, environment.createTransport(peerDescriptor))
|
|
37
20
|
const dhtNodeRpcLocal = new DhtNodeRpcLocal({
|
|
38
21
|
peerDiscoveryQueryBatchSize: undefined as any,
|
|
39
|
-
|
|
22
|
+
getNeighbors: () => without(getAllPeerDescriptors(), peerDescriptor),
|
|
40
23
|
getClosestRingContactsTo: undefined as any,
|
|
41
24
|
addContact: () => {},
|
|
42
25
|
removeContact: undefined as any,
|
|
@@ -64,9 +47,11 @@ describe('DhtNode', () => {
|
|
|
64
47
|
startRemoteNode(other, environment)
|
|
65
48
|
}
|
|
66
49
|
|
|
50
|
+
const transport = environment.createTransport(localPeerDescriptor)
|
|
67
51
|
const localNode = new DhtNode({
|
|
68
52
|
peerDescriptor: localPeerDescriptor,
|
|
69
|
-
transport
|
|
53
|
+
transport,
|
|
54
|
+
connectionsView: transport,
|
|
70
55
|
entryPoints: [entryPointPeerDescriptor]
|
|
71
56
|
})
|
|
72
57
|
await localNode.start()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { MetricsContext } from '@streamr/utils'
|
|
2
|
+
import { ConnectionManager } from '../../src/connection/ConnectionManager'
|
|
3
|
+
import { DefaultConnectorFacade } from '../../src/connection/ConnectorFacade'
|
|
4
|
+
import { MockTransport } from '../utils/mock/MockTransport'
|
|
5
|
+
import { createMockPeerDescriptor } from '../utils/utils'
|
|
6
|
+
import { sendConnectivityRequest } from '../../src/connection/connectivityChecker'
|
|
7
|
+
import { LOCAL_PROTOCOL_VERSION } from '../../src/helpers/version'
|
|
8
|
+
import { WebsocketServerConnection } from '../../src/connection/websocket/WebsocketServerConnection'
|
|
9
|
+
import fs from 'fs'
|
|
10
|
+
|
|
11
|
+
// www.gov.za
|
|
12
|
+
const testIp = '164.151.129.20'
|
|
13
|
+
|
|
14
|
+
// Pretoria, South Africa
|
|
15
|
+
const testLatitude = -25.7599
|
|
16
|
+
const testLongitude = 28.2604
|
|
17
|
+
|
|
18
|
+
const dbPath = '/tmp/geoipdatabasesintegration'
|
|
19
|
+
|
|
20
|
+
describe('ConnectivityChecking', () => {
|
|
21
|
+
|
|
22
|
+
let server: ConnectionManager
|
|
23
|
+
const PORT = 15002
|
|
24
|
+
const HOST = '127.0.0.1'
|
|
25
|
+
let mock: jest.SpyInstance<string, [], any>
|
|
26
|
+
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
server = new ConnectionManager({
|
|
29
|
+
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
30
|
+
createLocalPeerDescriptor: async () => {
|
|
31
|
+
return {
|
|
32
|
+
...createMockPeerDescriptor(),
|
|
33
|
+
websocket: {
|
|
34
|
+
host: HOST,
|
|
35
|
+
port: PORT,
|
|
36
|
+
tls: false
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
websocketHost: HOST,
|
|
41
|
+
websocketPortRange: { min: PORT, max: PORT },
|
|
42
|
+
websocketServerEnableTls: false,
|
|
43
|
+
transport: new MockTransport(),
|
|
44
|
+
geoIpDatabaseFolder: dbPath
|
|
45
|
+
}),
|
|
46
|
+
metricsContext: new MetricsContext()
|
|
47
|
+
})
|
|
48
|
+
await server.start()
|
|
49
|
+
mock = jest.spyOn(WebsocketServerConnection.prototype, 'getRemoteIpAddress').mockImplementation(() => testIp)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
afterEach(async () => {
|
|
53
|
+
await server.stop()
|
|
54
|
+
fs.unlinkSync(dbPath + '/GeoLite2-City.mmdb')
|
|
55
|
+
fs.rmSync(dbPath, { recursive: true })
|
|
56
|
+
mock.mockRestore()
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('connectivityCheck replies with correct latitude and longitude', async () => {
|
|
60
|
+
const request = {
|
|
61
|
+
host: HOST,
|
|
62
|
+
port: PORT,
|
|
63
|
+
tls: false,
|
|
64
|
+
allowSelfSignedCertificate: false
|
|
65
|
+
}
|
|
66
|
+
const response = await sendConnectivityRequest(request, server.getLocalPeerDescriptor())
|
|
67
|
+
expect(response.version).toEqual(LOCAL_PROTOCOL_VERSION)
|
|
68
|
+
expect(response.latitude).toEqual(testLatitude)
|
|
69
|
+
expect(response.longitude).toEqual(testLongitude)
|
|
70
|
+
})
|
|
71
|
+
})
|
|
@@ -63,9 +63,9 @@ describe('Layer1', () => {
|
|
|
63
63
|
const layer0Node = nodes[i]
|
|
64
64
|
const layer1Node = layer1Nodes[i]
|
|
65
65
|
expect(layer1Node.getNodeId()).toEqual(layer0Node.getNodeId())
|
|
66
|
-
expect(layer1Node.getConnectionCount()).toEqual(layer0Node.getConnectionCount())
|
|
66
|
+
expect(layer1Node.getConnectionsView().getConnectionCount()).toEqual(layer0Node.getConnectionsView().getConnectionCount())
|
|
67
67
|
expect(layer1Node.getNeighborCount()).toBeGreaterThanOrEqual(NUM_OF_NODES_PER_KBUCKET / 2)
|
|
68
|
-
expect(layer1Node.getConnections()).toEqual(layer0Node.getConnections())
|
|
68
|
+
expect(layer1Node.getConnectionsView().getConnections()).toEqual(layer0Node.getConnectionsView().getConnections())
|
|
69
69
|
}
|
|
70
70
|
}, 120000)
|
|
71
71
|
|
|
@@ -119,10 +119,10 @@ describe('Layer1', () => {
|
|
|
119
119
|
const stream3Node = stream3[i]
|
|
120
120
|
const stream4Node = stream4[i]
|
|
121
121
|
|
|
122
|
-
expect(layer0Node.getConnectionCount()).toEqual(stream1Node.getConnectionCount())
|
|
123
|
-
expect(layer0Node.getConnectionCount()).toEqual(stream2Node.getConnectionCount())
|
|
124
|
-
expect(layer0Node.getConnectionCount()).toEqual(stream3Node.getConnectionCount())
|
|
125
|
-
expect(layer0Node.getConnectionCount()).toEqual(stream4Node.getConnectionCount())
|
|
122
|
+
expect(layer0Node.getConnectionsView().getConnectionCount()).toEqual(stream1Node.getConnectionsView().getConnectionCount())
|
|
123
|
+
expect(layer0Node.getConnectionsView().getConnectionCount()).toEqual(stream2Node.getConnectionsView().getConnectionCount())
|
|
124
|
+
expect(layer0Node.getConnectionsView().getConnectionCount()).toEqual(stream3Node.getConnectionsView().getConnectionCount())
|
|
125
|
+
expect(layer0Node.getConnectionsView().getConnectionCount()).toEqual(stream4Node.getConnectionsView().getConnectionCount())
|
|
126
126
|
|
|
127
127
|
}
|
|
128
128
|
}, 120000)
|
|
@@ -73,6 +73,7 @@ describe('Route Message With Mock Connections', () => {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
await runAndWaitForEvents3<DhtNodeEvents>([() => {
|
|
76
|
+
// @ts-expect-error private
|
|
76
77
|
sourceNode.router!.doRouteMessage({
|
|
77
78
|
message,
|
|
78
79
|
target: destinationNode.getLocalPeerDescriptor().nodeId,
|
|
@@ -104,6 +105,7 @@ describe('Route Message With Mock Connections', () => {
|
|
|
104
105
|
sourceDescriptor: sourceNode.getLocalPeerDescriptor(),
|
|
105
106
|
targetDescriptor: destinationNode.getLocalPeerDescriptor()
|
|
106
107
|
}
|
|
108
|
+
// @ts-expect-error private
|
|
107
109
|
sourceNode.router!.doRouteMessage({
|
|
108
110
|
message,
|
|
109
111
|
target: destinationNode.getLocalPeerDescriptor().nodeId,
|
|
@@ -141,6 +143,7 @@ describe('Route Message With Mock Connections', () => {
|
|
|
141
143
|
sourceDescriptor: node.getLocalPeerDescriptor(),
|
|
142
144
|
targetDescriptor: destinationNode.getLocalPeerDescriptor()
|
|
143
145
|
}
|
|
146
|
+
// @ts-expect-error private
|
|
144
147
|
node.router!.doRouteMessage({
|
|
145
148
|
message,
|
|
146
149
|
target: receiver.getLocalPeerDescriptor().nodeId,
|
|
@@ -217,6 +220,7 @@ describe('Route Message With Mock Connections', () => {
|
|
|
217
220
|
}
|
|
218
221
|
|
|
219
222
|
await runAndWaitForEvents3<DhtNodeEvents>([() => {
|
|
223
|
+
// @ts-expect-error private
|
|
220
224
|
sourceNode.router!.doRouteMessage(forwardedMessage, RoutingMode.FORWARD)
|
|
221
225
|
}], [[destinationNode, 'message']])
|
|
222
226
|
|
|
@@ -57,7 +57,7 @@ describe('Scaling down a Dht network', () => {
|
|
|
57
57
|
stoppedNodes.add(getNodeIdFromPeerDescriptor(stoppingPeerDescriptor))
|
|
58
58
|
await nodeToStop.stop()
|
|
59
59
|
const nodeIsCleaned = nodes.filter((node) => !stoppedNodes.has(node.getNodeId())).every((node) =>
|
|
60
|
-
node.getConnections().every((peer) => {
|
|
60
|
+
node.getConnectionsView().getConnections().every((peer) => {
|
|
61
61
|
if (areEqualPeerDescriptors(peer, stoppingPeerDescriptor)) {
|
|
62
62
|
logger.error(getNodeIdFromPeerDescriptor(node.getLocalPeerDescriptor()) + ', '
|
|
63
63
|
+ getNodeIdFromPeerDescriptor(stoppingPeerDescriptor) + ' cleaning up failed')
|
|
@@ -7,7 +7,7 @@ import { Message, PeerDescriptor } from '../../src/proto/packages/dht/protos/Dht
|
|
|
7
7
|
import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
|
|
8
8
|
import { createMockPeerDescriptor } from '../utils/utils'
|
|
9
9
|
import { getRandomRegion } from '../../src/connection/simulator/pings'
|
|
10
|
-
import { MockTransport } from '../utils/mock/
|
|
10
|
+
import { MockTransport } from '../utils/mock/MockTransport'
|
|
11
11
|
import { getNodeIdFromPeerDescriptor } from '../../src/identifiers'
|
|
12
12
|
|
|
13
13
|
const BASE_MESSAGE: Message = {
|
|
@@ -22,7 +22,7 @@ const BASE_MESSAGE: Message = {
|
|
|
22
22
|
const createConnectionManager = (localPeerDescriptor: PeerDescriptor, opts: Omit<DefaultConnectorFacadeConfig, 'createLocalPeerDescriptor'>) => {
|
|
23
23
|
return new ConnectionManager({
|
|
24
24
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
25
|
-
createLocalPeerDescriptor: () => localPeerDescriptor,
|
|
25
|
+
createLocalPeerDescriptor: async () => localPeerDescriptor,
|
|
26
26
|
...opts
|
|
27
27
|
}),
|
|
28
28
|
metricsContext: new MetricsContext()
|
|
@@ -15,7 +15,7 @@ const createConnectionManager = (localPeerDescriptor: PeerDescriptor, transport:
|
|
|
15
15
|
return new ConnectionManager({
|
|
16
16
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
17
17
|
transport,
|
|
18
|
-
createLocalPeerDescriptor: () => localPeerDescriptor
|
|
18
|
+
createLocalPeerDescriptor: async () => localPeerDescriptor
|
|
19
19
|
}),
|
|
20
20
|
metricsContext: new MetricsContext()
|
|
21
21
|
})
|
|
@@ -17,7 +17,7 @@ const SERVICE_ID = 'test'
|
|
|
17
17
|
const createConfig = (localPeerDescriptor: PeerDescriptor, opts: Omit<DefaultConnectorFacadeConfig, 'createLocalPeerDescriptor'>) => {
|
|
18
18
|
return {
|
|
19
19
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
20
|
-
createLocalPeerDescriptor: () => localPeerDescriptor,
|
|
20
|
+
createLocalPeerDescriptor: async () => localPeerDescriptor,
|
|
21
21
|
...opts
|
|
22
22
|
}),
|
|
23
23
|
metricsContext: new MetricsContext()
|
|
@@ -18,7 +18,7 @@ const createConnectionManager = (localPeerDescriptor: PeerDescriptor, transport:
|
|
|
18
18
|
return new ConnectionManager({
|
|
19
19
|
createConnectorFacade: () => new DefaultConnectorFacade({
|
|
20
20
|
transport,
|
|
21
|
-
createLocalPeerDescriptor: () => localPeerDescriptor
|
|
21
|
+
createLocalPeerDescriptor: async () => localPeerDescriptor
|
|
22
22
|
}),
|
|
23
23
|
metricsContext: new MetricsContext()
|
|
24
24
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import EventEmitter from 'eventemitter3'
|
|
2
2
|
import { AutoCertifierClientFacade, IAutoCertifierClient } from '../../src/connection/websocket/AutoCertifierClientFacade'
|
|
3
|
-
import { MockTransport } from '../utils/mock/
|
|
3
|
+
import { MockTransport } from '../utils/mock/MockTransport'
|
|
4
4
|
|
|
5
5
|
class MockAutoCertifierClient extends EventEmitter {
|
|
6
6
|
start = async () => {
|
|
@@ -6,6 +6,7 @@ import { DiscoverySession } from '../../src/dht/discovery/DiscoverySession'
|
|
|
6
6
|
import { DhtAddress, getNodeIdFromPeerDescriptor, getRawFromDhtAddress } from '../../src/identifiers'
|
|
7
7
|
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
8
8
|
import { createTestTopology } from '../utils/topology'
|
|
9
|
+
import { getClosestNodes } from '../../src/dht/contact/getClosestNodes'
|
|
9
10
|
|
|
10
11
|
const NODE_COUNT = 40
|
|
11
12
|
const MIN_NEIGHBOR_COUNT = 2 // nodes can get more neighbors when we merge network partitions
|
|
@@ -53,7 +54,7 @@ describe('DiscoverySession', () => {
|
|
|
53
54
|
queriedNodes.push(nodeId)
|
|
54
55
|
await wait(10)
|
|
55
56
|
const peerManager = createPeerManager(nodeId)
|
|
56
|
-
return
|
|
57
|
+
return getClosestNodes(referenceId, peerManager.getNeighbors().map((n) => n.getPeerDescriptor()), { maxCount: QUERY_BATCH_SIZE })
|
|
57
58
|
},
|
|
58
59
|
ping: async () => true
|
|
59
60
|
}
|
|
@@ -70,7 +71,8 @@ describe('DiscoverySession', () => {
|
|
|
70
71
|
noProgressLimit: NO_PROGRESS_LIMIT,
|
|
71
72
|
peerManager,
|
|
72
73
|
contactedPeers,
|
|
73
|
-
abortSignal: new AbortController().signal
|
|
74
|
+
abortSignal: new AbortController().signal,
|
|
75
|
+
createDhtNodeRpcRemote: (peerDescriptor: PeerDescriptor) => createMockRpcRemote(peerDescriptor) as any
|
|
74
76
|
})
|
|
75
77
|
await session.findClosestNodes(1000)
|
|
76
78
|
expect(queriedNodes.length).toBeGreaterThanOrEqual(1)
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
import { waitForCondition } from '@streamr/utils'
|
|
2
|
-
import { range, sample, sampleSize
|
|
2
|
+
import { range, sample, sampleSize } from 'lodash'
|
|
3
3
|
import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote'
|
|
4
|
-
import { PeerManager
|
|
5
|
-
import {
|
|
6
|
-
import { SortedContactList } from '../../src/dht/contact/SortedContactList'
|
|
4
|
+
import { PeerManager } from '../../src/dht/PeerManager'
|
|
5
|
+
import { getClosestNodes } from '../../src/dht/contact/getClosestNodes'
|
|
7
6
|
import { DhtAddress, createRandomDhtAddress, getNodeIdFromPeerDescriptor, getRawFromDhtAddress } from '../../src/identifiers'
|
|
8
7
|
import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
9
8
|
import { MockRpcCommunicator } from '../utils/mock/MockRpcCommunicator'
|
|
10
9
|
import { createMockPeerDescriptor } from '../utils/utils'
|
|
11
10
|
|
|
11
|
+
const createDhtNodeRpcRemote = (
|
|
12
|
+
peerDescriptor: PeerDescriptor,
|
|
13
|
+
localPeerDescriptor: PeerDescriptor,
|
|
14
|
+
pingFailures: Set<DhtAddress>
|
|
15
|
+
) => {
|
|
16
|
+
const remote = new class extends DhtNodeRpcRemote {
|
|
17
|
+
// eslint-disable-next-line class-methods-use-this
|
|
18
|
+
async ping(): Promise<boolean> {
|
|
19
|
+
return !pingFailures.has(getNodeIdFromPeerDescriptor(peerDescriptor))
|
|
20
|
+
}
|
|
21
|
+
}(localPeerDescriptor, peerDescriptor, undefined as any, new MockRpcCommunicator())
|
|
22
|
+
return remote
|
|
23
|
+
}
|
|
24
|
+
|
|
12
25
|
const createPeerManager = (
|
|
13
26
|
nodeIds: DhtAddress[],
|
|
14
27
|
localPeerDescriptor = createMockPeerDescriptor(),
|
|
@@ -18,15 +31,7 @@ const createPeerManager = (
|
|
|
18
31
|
localNodeId: getNodeIdFromPeerDescriptor(localPeerDescriptor),
|
|
19
32
|
localPeerDescriptor: localPeerDescriptor,
|
|
20
33
|
isLayer0: true,
|
|
21
|
-
createDhtNodeRpcRemote: (peerDescriptor: PeerDescriptor) =>
|
|
22
|
-
const remote = new class extends DhtNodeRpcRemote {
|
|
23
|
-
// eslint-disable-next-line class-methods-use-this
|
|
24
|
-
async ping(): Promise<boolean> {
|
|
25
|
-
return !pingFailures.has(getNodeIdFromPeerDescriptor(peerDescriptor))
|
|
26
|
-
}
|
|
27
|
-
}(localPeerDescriptor, peerDescriptor, undefined as any, new MockRpcCommunicator())
|
|
28
|
-
return remote
|
|
29
|
-
},
|
|
34
|
+
createDhtNodeRpcRemote: (peerDescriptor: PeerDescriptor) => createDhtNodeRpcRemote(peerDescriptor, localPeerDescriptor, pingFailures),
|
|
30
35
|
hasConnection: () => false
|
|
31
36
|
} as any)
|
|
32
37
|
const contacts = nodeIds.map((n) => ({ nodeId: getRawFromDhtAddress(n), type: NodeType.NODEJS }))
|
|
@@ -36,45 +41,14 @@ const createPeerManager = (
|
|
|
36
41
|
return manager
|
|
37
42
|
}
|
|
38
43
|
|
|
39
|
-
const getClosestContact = (contacts: PeerDescriptor[], referenceId: DhtAddress): PeerDescriptor | undefined => {
|
|
40
|
-
const list = new SortedContactList({
|
|
41
|
-
referenceId,
|
|
42
|
-
allowToContainReferenceId: false
|
|
43
|
-
})
|
|
44
|
-
for (const contact of contacts) {
|
|
45
|
-
list.addContact(new Contact(contact))
|
|
46
|
-
}
|
|
47
|
-
const id = list.getClosestContactId()
|
|
48
|
-
if (id !== undefined) {
|
|
49
|
-
return contacts.find((c) => getNodeIdFromPeerDescriptor(c) === id)
|
|
50
|
-
} else {
|
|
51
|
-
return undefined
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
44
|
describe('PeerManager', () => {
|
|
56
45
|
|
|
57
|
-
it('
|
|
58
|
-
const nodeIds = range(10).map(() => createRandomDhtAddress())
|
|
59
|
-
const manager = createPeerManager(nodeIds)
|
|
60
|
-
const referenceId = createRandomDhtAddress()
|
|
61
|
-
const excluded = new Set<DhtAddress>(sampleSize(nodeIds, 2))
|
|
62
|
-
|
|
63
|
-
const actual = manager.getClosestNeighborsTo(referenceId, 5, excluded)
|
|
64
|
-
|
|
65
|
-
const expected = sortBy(
|
|
66
|
-
without(manager.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n)), ...Array.from(excluded.values())),
|
|
67
|
-
(n: DhtAddress) => getDistance(getRawFromDhtAddress(n), getRawFromDhtAddress(referenceId))
|
|
68
|
-
).slice(0, 5)
|
|
69
|
-
expect(actual.map((n) => n.getNodeId())).toEqual(expected)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
it('getContactCount', () => {
|
|
46
|
+
it('getNearbyContactCount', () => {
|
|
73
47
|
const nodeIds = range(10).map(() => createRandomDhtAddress())
|
|
74
48
|
const manager = createPeerManager(nodeIds)
|
|
75
|
-
expect(manager.
|
|
76
|
-
expect(manager.
|
|
77
|
-
expect(manager.
|
|
49
|
+
expect(manager.getNearbyContactCount()).toBe(10)
|
|
50
|
+
expect(manager.getNearbyContactCount(new Set(sampleSize(nodeIds, 2)))).toBe(8)
|
|
51
|
+
expect(manager.getNearbyContactCount(new Set([sample(nodeIds)!, createRandomDhtAddress()]))).toBe(9)
|
|
78
52
|
})
|
|
79
53
|
|
|
80
54
|
it('addContact: ping fails', async () => {
|
|
@@ -89,11 +63,31 @@ describe('PeerManager', () => {
|
|
|
89
63
|
}
|
|
90
64
|
expect(manager.getNeighborCount()).toBe(0)
|
|
91
65
|
manager.addContact(failureContact)
|
|
92
|
-
const closesSuccessContact =
|
|
66
|
+
const closesSuccessContact = getClosestNodes(getNodeIdFromPeerDescriptor(localPeerDescriptor), successContacts)[0]
|
|
93
67
|
await waitForCondition(() => {
|
|
94
|
-
const neighborNodeIds = manager.getNeighbors().map((n) =>
|
|
68
|
+
const neighborNodeIds = manager.getNeighbors().map((n) => n.getNodeId())
|
|
95
69
|
return neighborNodeIds.includes(getNodeIdFromPeerDescriptor(closesSuccessContact))
|
|
96
70
|
})
|
|
97
|
-
expect(manager.
|
|
71
|
+
expect(manager.getNeighborCount()).toBe(1)
|
|
72
|
+
expect(manager.getNeighbors()[0].getPeerDescriptor()).toEqualPeerDescriptor(closesSuccessContact)
|
|
98
73
|
})
|
|
74
|
+
|
|
75
|
+
it('pruneOfflineNodes removes offline nodes', async () => {
|
|
76
|
+
const localPeerDescriptor = createMockPeerDescriptor()
|
|
77
|
+
const successContacts = range(5).map(() => createMockPeerDescriptor())
|
|
78
|
+
const failureContact = createMockPeerDescriptor()
|
|
79
|
+
const failureSet: Set<DhtAddress> = new Set()
|
|
80
|
+
const manager = createPeerManager([], localPeerDescriptor, failureSet)
|
|
81
|
+
for (const successContact of successContacts) {
|
|
82
|
+
manager.addContact(successContact)
|
|
83
|
+
}
|
|
84
|
+
manager.addContact(failureContact)
|
|
85
|
+
expect(manager.getNeighborCount()).toBe(6)
|
|
86
|
+
failureSet.add(getNodeIdFromPeerDescriptor(failureContact))
|
|
87
|
+
await manager.pruneOfflineNodes(
|
|
88
|
+
manager.getNeighbors().map((node) => createDhtNodeRpcRemote(node.getPeerDescriptor(), localPeerDescriptor, failureSet))
|
|
89
|
+
)
|
|
90
|
+
expect(manager.getNeighborCount()).toBe(5)
|
|
91
|
+
})
|
|
92
|
+
|
|
99
93
|
})
|
|
@@ -45,4 +45,14 @@ describe('RandomContactList', () => {
|
|
|
45
45
|
expect(list.getSize()).toEqual(3)
|
|
46
46
|
})
|
|
47
47
|
|
|
48
|
+
it('get contacts', () => {
|
|
49
|
+
const list = new RandomContactList(item0.getNodeId(), 5, 1)
|
|
50
|
+
list.addContact(item1)
|
|
51
|
+
list.addContact(item2)
|
|
52
|
+
list.addContact(item3)
|
|
53
|
+
list.addContact(item4)
|
|
54
|
+
expect(list.getContacts()).toHaveLength(4)
|
|
55
|
+
expect(list.getContacts(3)).toHaveLength(3)
|
|
56
|
+
expect(list.getContacts(-2)).toHaveLength(0)
|
|
57
|
+
})
|
|
48
58
|
})
|
|
@@ -13,12 +13,13 @@ import {
|
|
|
13
13
|
import { RecursiveOperationManager } from '../../src/dht/recursive-operation/RecursiveOperationManager'
|
|
14
14
|
import { LocalDataStore } from '../../src/dht/store/LocalDataStore'
|
|
15
15
|
import { v4 } from 'uuid'
|
|
16
|
-
import { MockRouter } from '../utils/mock/
|
|
17
|
-
import { MockTransport } from '../utils/mock/
|
|
16
|
+
import { MockRouter } from '../utils/mock/MockRouter'
|
|
17
|
+
import { MockTransport } from '../utils/mock/MockTransport'
|
|
18
18
|
import { FakeRpcCommunicator } from '../utils/FakeRpcCommunicator'
|
|
19
19
|
import { Router } from '../../src/dht/routing/Router'
|
|
20
20
|
import { ITransport } from '../../src/transport/ITransport'
|
|
21
21
|
import { areEqualPeerDescriptors, createRandomDhtAddress } from '../../src/identifiers'
|
|
22
|
+
import { MockConnectionsView } from '../utils/mock/MockConnectionsView'
|
|
22
23
|
|
|
23
24
|
const createMockRouter = (error?: RouteMessageError): Partial<Router> => {
|
|
24
25
|
return {
|
|
@@ -77,6 +78,7 @@ describe('RecursiveOperationManager', () => {
|
|
|
77
78
|
serviceId: 'RecursiveOperationManager',
|
|
78
79
|
localDataStore: new LocalDataStore(30 * 100),
|
|
79
80
|
sessionTransport: transport,
|
|
81
|
+
connectionsView: new MockConnectionsView(),
|
|
80
82
|
addContact: () => {},
|
|
81
83
|
rpcCommunicator: rpcCommunicator as any,
|
|
82
84
|
createDhtNodeRpcRemote: () => undefined as any
|