@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.
Files changed (159) hide show
  1. package/dist/package.json +8 -9
  2. package/dist/src/connection/ConnectionManager.d.ts +2 -1
  3. package/dist/src/connection/ConnectionManager.js +2 -10
  4. package/dist/src/connection/ConnectionManager.js.map +1 -1
  5. package/dist/src/connection/ConnectionsView.d.ts +7 -0
  6. package/dist/src/connection/ConnectionsView.js +3 -0
  7. package/dist/src/connection/ConnectionsView.js.map +1 -0
  8. package/dist/src/connection/ConnectorFacade.d.ts +2 -1
  9. package/dist/src/connection/ConnectorFacade.js +5 -4
  10. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  11. package/dist/src/connection/connectivityChecker.d.ts +3 -3
  12. package/dist/src/connection/connectivityChecker.js +3 -3
  13. package/dist/src/connection/connectivityChecker.js.map +1 -1
  14. package/dist/src/connection/connectivityRequestHandler.d.ts +2 -1
  15. package/dist/src/connection/connectivityRequestHandler.js +13 -6
  16. package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
  17. package/dist/src/connection/{ManagedWebrtcConnection.d.ts → webrtc/ManagedWebrtcConnection.d.ts} +3 -3
  18. package/dist/src/connection/{ManagedWebrtcConnection.js → webrtc/ManagedWebrtcConnection.js} +2 -2
  19. package/dist/src/connection/webrtc/ManagedWebrtcConnection.js.map +1 -0
  20. package/dist/src/connection/webrtc/NodeWebrtcConnection.js +3 -26
  21. package/dist/src/connection/webrtc/NodeWebrtcConnection.js.map +1 -1
  22. package/dist/src/connection/webrtc/WebrtcConnector.js +1 -1
  23. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  24. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +1 -1
  25. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +1 -1
  26. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  27. package/dist/src/connection/websocket/AbstractWebsocketClientConnection.d.ts +1 -1
  28. package/dist/src/connection/websocket/WebsocketConnector.d.ts +3 -1
  29. package/dist/src/connection/websocket/WebsocketConnector.js +26 -18
  30. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  31. package/dist/src/connection/websocket/WebsocketServerConnection.d.ts +2 -1
  32. package/dist/src/connection/websocket/WebsocketServerConnection.js +4 -0
  33. package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -1
  34. package/dist/src/dht/DhtNode.d.ts +14 -11
  35. package/dist/src/dht/DhtNode.js +74 -61
  36. package/dist/src/dht/DhtNode.js.map +1 -1
  37. package/dist/src/dht/DhtNodeRpcLocal.d.ts +3 -3
  38. package/dist/src/dht/DhtNodeRpcLocal.js +5 -2
  39. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  40. package/dist/src/dht/PeerManager.d.ts +14 -14
  41. package/dist/src/dht/PeerManager.js +51 -42
  42. package/dist/src/dht/PeerManager.js.map +1 -1
  43. package/dist/src/dht/contact/ContactList.d.ts +1 -2
  44. package/dist/src/dht/contact/ContactList.js +1 -3
  45. package/dist/src/dht/contact/ContactList.js.map +1 -1
  46. package/dist/src/dht/contact/RandomContactList.d.ts +1 -1
  47. package/dist/src/dht/contact/RandomContactList.js +7 -4
  48. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  49. package/dist/src/dht/contact/getClosestNodes.d.ts +6 -0
  50. package/dist/src/dht/contact/{getClosestContacts.js → getClosestNodes.js} +7 -6
  51. package/dist/src/dht/contact/getClosestNodes.js.map +1 -0
  52. package/dist/src/dht/discovery/DiscoverySession.d.ts +4 -0
  53. package/dist/src/dht/discovery/DiscoverySession.js +27 -21
  54. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  55. package/dist/src/dht/discovery/PeerDiscovery.d.ts +8 -5
  56. package/dist/src/dht/discovery/PeerDiscovery.js +34 -24
  57. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  58. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +4 -4
  59. package/dist/src/dht/discovery/RingDiscoverySession.js +10 -19
  60. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -1
  61. package/dist/src/dht/recursive-operation/RecursiveOperationManager.d.ts +2 -0
  62. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js +3 -3
  63. package/dist/src/dht/recursive-operation/RecursiveOperationManager.js.map +1 -1
  64. package/dist/src/dht/store/StoreManager.d.ts +5 -6
  65. package/dist/src/dht/store/StoreManager.js +21 -76
  66. package/dist/src/dht/store/StoreManager.js.map +1 -1
  67. package/dist/src/dht/store/StoreRpcLocal.d.ts +5 -2
  68. package/dist/src/dht/store/StoreRpcLocal.js +22 -5
  69. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  70. package/dist/src/exports.d.ts +2 -1
  71. package/dist/src/exports.js.map +1 -1
  72. package/dist/src/helpers/version.d.ts +1 -1
  73. package/dist/src/helpers/version.js +1 -1
  74. package/dist/src/proto/google/protobuf/any.d.ts +8 -5
  75. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  76. package/dist/src/proto/google/protobuf/empty.d.ts +0 -1
  77. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  78. package/dist/src/proto/google/protobuf/timestamp.d.ts +10 -1
  79. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  80. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +10 -2
  81. package/dist/src/proto/packages/dht/protos/DhtRpc.js +4 -2
  82. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  83. package/dist/src/transport/ITransport.d.ts +0 -4
  84. package/dist/src/transport/ITransport.js.map +1 -1
  85. package/karma.config.js +2 -2
  86. package/package.json +8 -9
  87. package/protos/DhtRpc.proto +3 -1
  88. package/src/connection/ConnectionManager.ts +4 -10
  89. package/src/connection/ConnectionsView.ts +8 -0
  90. package/src/connection/ConnectorFacade.ts +7 -5
  91. package/src/connection/connectivityChecker.ts +4 -4
  92. package/src/connection/connectivityRequestHandler.ts +19 -6
  93. package/src/connection/{ManagedWebrtcConnection.ts → webrtc/ManagedWebrtcConnection.ts} +4 -4
  94. package/src/connection/webrtc/NodeWebrtcConnection.ts +3 -3
  95. package/src/connection/webrtc/WebrtcConnector.ts +1 -1
  96. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +3 -3
  97. package/src/connection/websocket/AbstractWebsocketClientConnection.ts +1 -1
  98. package/src/connection/websocket/WebsocketConnector.ts +33 -21
  99. package/src/connection/websocket/WebsocketServerConnection.ts +6 -1
  100. package/src/dht/DhtNode.ts +102 -74
  101. package/src/dht/DhtNodeRpcLocal.ts +12 -5
  102. package/src/dht/PeerManager.ts +58 -49
  103. package/src/dht/contact/ContactList.ts +1 -4
  104. package/src/dht/contact/RandomContactList.ts +7 -5
  105. package/src/dht/contact/{getClosestContacts.ts → getClosestNodes.ts} +8 -6
  106. package/src/dht/discovery/DiscoverySession.ts +34 -22
  107. package/src/dht/discovery/PeerDiscovery.ts +44 -30
  108. package/src/dht/discovery/RingDiscoverySession.ts +15 -29
  109. package/src/dht/recursive-operation/RecursiveOperationManager.ts +5 -3
  110. package/src/dht/store/StoreManager.ts +46 -84
  111. package/src/dht/store/StoreRpcLocal.ts +32 -9
  112. package/src/exports.ts +2 -1
  113. package/src/helpers/version.ts +1 -1
  114. package/src/proto/google/protobuf/any.ts +8 -5
  115. package/src/proto/google/protobuf/empty.ts +0 -1
  116. package/src/proto/google/protobuf/timestamp.ts +10 -1
  117. package/src/proto/packages/dht/protos/DhtRpc.ts +14 -4
  118. package/src/transport/ITransport.ts +0 -4
  119. package/test/benchmark/Find.test.ts +1 -1
  120. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +1 -1
  121. package/test/end-to-end/GeoIpLayer0.test.ts +55 -0
  122. package/test/end-to-end/Layer0-Layer1.test.ts +4 -4
  123. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +11 -5
  124. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +7 -1
  125. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +11 -2
  126. package/test/integration/ConnectionLocking.test.ts +1 -1
  127. package/test/integration/ConnectionManager.test.ts +3 -3
  128. package/test/integration/ConnectivityChecking.test.ts +3 -3
  129. package/test/integration/DhtNode.test.ts +5 -20
  130. package/test/integration/GeoIpConnectivityChecking.test.ts +71 -0
  131. package/test/integration/Layer1-scale.test.ts +6 -6
  132. package/test/integration/RouteMessage.test.ts +4 -0
  133. package/test/integration/ScaleDownDht.test.ts +1 -1
  134. package/test/integration/SimultaneousConnections.test.ts +2 -2
  135. package/test/integration/WebrtcConnectionManagement.test.ts +1 -1
  136. package/test/integration/Websocket.test.ts +1 -1
  137. package/test/integration/WebsocketConnectionManagement.test.ts +1 -1
  138. package/test/integration/rpc-connections-over-webrpc.test.ts +1 -1
  139. package/test/unit/AutoCertifierClientFacade.test.ts +1 -1
  140. package/test/unit/DiscoverySession.test.ts +4 -2
  141. package/test/unit/PeerManager.test.ts +45 -51
  142. package/test/unit/RandomContactList.test.ts +10 -0
  143. package/test/unit/RecursiveOperationManager.test.ts +4 -2
  144. package/test/unit/StoreManager.test.ts +42 -34
  145. package/test/unit/StoreRpcLocal.test.ts +167 -0
  146. package/test/unit/WebsocketConnector.test.ts +1 -1
  147. package/test/unit/connectivityRequestHandler.test.ts +3 -3
  148. package/test/unit/getClosestNodes.test.ts +30 -0
  149. package/test/utils/FakeTransport.ts +4 -2
  150. package/test/utils/mock/MockConnectionsView.ts +18 -0
  151. package/test/utils/mock/{Transport.ts → MockTransport.ts} +0 -15
  152. package/test/utils/utils.ts +4 -1
  153. package/tsconfig.jest.json +2 -1
  154. package/tsconfig.node.json +2 -1
  155. package/dist/src/connection/ManagedWebrtcConnection.js.map +0 -1
  156. package/dist/src/dht/contact/getClosestContacts.d.ts +0 -7
  157. package/dist/src/dht/contact/getClosestContacts.js.map +0 -1
  158. package/test/unit/getClosestContacts.test.ts +0 -28
  159. /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({ transport: epLayer0Node, peerDescriptor: epPeerDescriptor, serviceId: STREAM_ID })
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({ peerDescriptor: epPeerDescriptor, websocketServerEnableTls: false })
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({ transport: epLayer0Node, peerDescriptor: epPeerDescriptor, serviceId: STREAM_ID })
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/Transport'
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
- selfSigned: false
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 { Contact } from '../../src/dht/contact/Contact'
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
- getClosestNeighborsTo: (nodeId: DhtAddress, maxCount: number) => getClosestNodes(nodeId, getAllPeerDescriptors(), maxCount, true),
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: environment.createTransport(localPeerDescriptor),
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/Transport'
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
  })
@@ -58,7 +58,7 @@ describe('Websocket', () => {
58
58
  })
59
59
  })
60
60
 
61
- clientWebsocket.connect('ws://127.0.0.1:9977')
61
+ clientWebsocket.connect('ws://127.0.0.1:9977', false)
62
62
  })
63
63
 
64
64
  afterAll(async () => {
@@ -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/Transport'
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 peerManager.getClosestNeighborsTo(referenceId, QUERY_BATCH_SIZE).map((remote) => remote.getPeerDescriptor())
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, sortBy, without } from 'lodash'
2
+ import { range, sample, sampleSize } from 'lodash'
3
3
  import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote'
4
- import { PeerManager, getDistance } from '../../src/dht/PeerManager'
5
- import { Contact } from '../../src/dht/contact/Contact'
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('getClosestNeighborsTo', () => {
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.getContactCount()).toBe(10)
76
- expect(manager.getContactCount(new Set(sampleSize(nodeIds, 2)))).toBe(8)
77
- expect(manager.getContactCount(new Set([sample(nodeIds)!, createRandomDhtAddress()]))).toBe(9)
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 = getClosestContact(successContacts, getNodeIdFromPeerDescriptor(localPeerDescriptor))!
66
+ const closesSuccessContact = getClosestNodes(getNodeIdFromPeerDescriptor(localPeerDescriptor), successContacts)[0]
93
67
  await waitForCondition(() => {
94
- const neighborNodeIds = manager.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
68
+ const neighborNodeIds = manager.getNeighbors().map((n) => n.getNodeId())
95
69
  return neighborNodeIds.includes(getNodeIdFromPeerDescriptor(closesSuccessContact))
96
70
  })
97
- expect(manager.getNeighbors()).toEqual([closesSuccessContact])
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/Router'
17
- import { MockTransport } from '../utils/mock/Transport'
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