@streamr/dht 100.0.0-testnet-three.6 → 100.0.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 (153) hide show
  1. package/README.md +1 -1
  2. package/dist/package.json +12 -8
  3. package/dist/src/connection/ConnectionLockHandler.d.ts +2 -2
  4. package/dist/src/connection/ConnectionLockHandler.js +13 -5
  5. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  6. package/dist/src/connection/ConnectionManager.d.ts +4 -4
  7. package/dist/src/connection/ConnectionManager.js +8 -7
  8. package/dist/src/connection/ConnectionManager.js.map +1 -1
  9. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  10. package/dist/src/connection/Handshaker.js +6 -13
  11. package/dist/src/connection/Handshaker.js.map +1 -1
  12. package/dist/src/connection/connectivityChecker.d.ts +1 -1
  13. package/dist/src/connection/connectivityChecker.js +5 -5
  14. package/dist/src/connection/connectivityChecker.js.map +1 -1
  15. package/dist/src/connection/connectivityRequestHandler.d.ts +2 -2
  16. package/dist/src/connection/connectivityRequestHandler.js +6 -7
  17. package/dist/src/connection/connectivityRequestHandler.js.map +1 -1
  18. package/dist/src/connection/webrtc/WebrtcConnector.d.ts +1 -0
  19. package/dist/src/connection/webrtc/WebrtcConnector.js +13 -8
  20. package/dist/src/connection/webrtc/WebrtcConnector.js.map +1 -1
  21. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.d.ts +2 -0
  22. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js +4 -6
  23. package/dist/src/connection/webrtc/WebrtcConnectorRpcLocal.js.map +1 -1
  24. package/dist/src/connection/websocket/WebsocketConnector.js +24 -21
  25. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  26. package/dist/src/connection/websocket/WebsocketServer.js +25 -35
  27. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  28. package/dist/src/connection/websocket/{ServerWebsocket.d.ts → WebsocketServerConnection.d.ts} +4 -5
  29. package/dist/src/connection/websocket/{ServerWebsocket.js → WebsocketServerConnection.js} +15 -48
  30. package/dist/src/connection/websocket/WebsocketServerConnection.js.map +1 -0
  31. package/dist/src/dht/DhtNode.d.ts +13 -6
  32. package/dist/src/dht/DhtNode.js +50 -15
  33. package/dist/src/dht/DhtNode.js.map +1 -1
  34. package/dist/src/dht/DhtNodeRpcLocal.d.ts +5 -1
  35. package/dist/src/dht/DhtNodeRpcLocal.js +10 -0
  36. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  37. package/dist/src/dht/DhtNodeRpcRemote.d.ts +3 -0
  38. package/dist/src/dht/DhtNodeRpcRemote.js +15 -0
  39. package/dist/src/dht/DhtNodeRpcRemote.js.map +1 -1
  40. package/dist/src/dht/ExternalApiRpcLocal.d.ts +2 -2
  41. package/dist/src/dht/ExternalApiRpcLocal.js +3 -3
  42. package/dist/src/dht/ExternalApiRpcLocal.js.map +1 -1
  43. package/dist/src/dht/ExternalApiRpcRemote.d.ts +1 -1
  44. package/dist/src/dht/ExternalApiRpcRemote.js +2 -2
  45. package/dist/src/dht/ExternalApiRpcRemote.js.map +1 -1
  46. package/dist/src/dht/PeerManager.d.ts +12 -0
  47. package/dist/src/dht/PeerManager.js +30 -5
  48. package/dist/src/dht/PeerManager.js.map +1 -1
  49. package/dist/src/dht/contact/RingContactList.d.ts +31 -0
  50. package/dist/src/dht/contact/RingContactList.js +133 -0
  51. package/dist/src/dht/contact/RingContactList.js.map +1 -0
  52. package/dist/src/dht/contact/ringIdentifiers.d.ts +16 -0
  53. package/dist/src/dht/contact/ringIdentifiers.js +54 -0
  54. package/dist/src/dht/contact/ringIdentifiers.js.map +1 -0
  55. package/dist/src/dht/discovery/PeerDiscovery.d.ts +4 -0
  56. package/dist/src/dht/discovery/PeerDiscovery.js +35 -0
  57. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  58. package/dist/src/dht/discovery/RingDiscoverySession.d.ts +29 -0
  59. package/dist/src/dht/discovery/RingDiscoverySession.js +123 -0
  60. package/dist/src/dht/discovery/RingDiscoverySession.js.map +1 -0
  61. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js +0 -1
  62. package/dist/src/dht/recursive-operation/RecursiveOperationSession.js.map +1 -1
  63. package/dist/src/dht/store/StoreManager.js +1 -1
  64. package/dist/src/dht/store/StoreManager.js.map +1 -1
  65. package/dist/src/exports.d.ts +1 -0
  66. package/dist/src/exports.js.map +1 -1
  67. package/dist/src/helpers/createPeerDescriptor.d.ts +1 -1
  68. package/dist/src/helpers/createPeerDescriptor.js +2 -1
  69. package/dist/src/helpers/createPeerDescriptor.js.map +1 -1
  70. package/dist/src/helpers/version.d.ts +6 -0
  71. package/dist/src/helpers/version.js +38 -0
  72. package/dist/src/helpers/version.js.map +1 -0
  73. package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +16 -6
  74. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +11 -4
  75. package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
  76. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +98 -87
  77. package/dist/src/proto/packages/dht/protos/DhtRpc.js +45 -49
  78. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  79. package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +10 -4
  80. package/dist/src/transport/RoutingRpcCommunicator.js +0 -2
  81. package/dist/src/transport/RoutingRpcCommunicator.js.map +1 -1
  82. package/package.json +12 -8
  83. package/protos/DhtRpc.proto +21 -21
  84. package/src/connection/ConnectionLockHandler.ts +13 -5
  85. package/src/connection/ConnectionManager.ts +10 -10
  86. package/src/connection/ConnectorFacade.ts +0 -1
  87. package/src/connection/Handshaker.ts +7 -15
  88. package/src/connection/connectivityChecker.ts +6 -7
  89. package/src/connection/connectivityRequestHandler.ts +12 -12
  90. package/src/connection/webrtc/NodeWebrtcConnection.ts +1 -1
  91. package/src/connection/webrtc/WebrtcConnector.ts +14 -8
  92. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +5 -5
  93. package/src/connection/websocket/WebsocketConnector.ts +25 -26
  94. package/src/connection/websocket/WebsocketServer.ts +27 -42
  95. package/src/connection/websocket/{ServerWebsocket.ts → WebsocketServerConnection.ts} +14 -55
  96. package/src/dht/DhtNode.ts +72 -34
  97. package/src/dht/DhtNodeRpcLocal.ts +16 -0
  98. package/src/dht/DhtNodeRpcRemote.ts +18 -0
  99. package/src/dht/ExternalApiRpcLocal.ts +5 -5
  100. package/src/dht/ExternalApiRpcRemote.ts +4 -4
  101. package/src/dht/PeerManager.ts +48 -12
  102. package/src/dht/contact/RingContactList.ts +151 -0
  103. package/src/dht/contact/ringIdentifiers.ts +62 -0
  104. package/src/dht/discovery/PeerDiscovery.ts +37 -0
  105. package/src/dht/discovery/RingDiscoverySession.ts +160 -0
  106. package/src/dht/recursive-operation/RecursiveOperationSession.ts +1 -3
  107. package/src/dht/store/StoreManager.ts +1 -1
  108. package/src/exports.ts +1 -0
  109. package/src/helpers/createPeerDescriptor.ts +2 -1
  110. package/src/helpers/version.ts +32 -0
  111. package/src/proto/packages/dht/protos/DhtRpc.client.ts +22 -9
  112. package/src/proto/packages/dht/protos/DhtRpc.server.ts +10 -4
  113. package/src/proto/packages/dht/protos/DhtRpc.ts +122 -100
  114. package/src/transport/RoutingRpcCommunicator.ts +1 -2
  115. package/test/benchmark/Find.test.ts +3 -4
  116. package/test/benchmark/KademliaCorrectness.test.ts +14 -8
  117. package/test/benchmark/RingCorrectness.test.ts +157 -0
  118. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +72 -0
  119. package/test/data/generateGroundTruthData.ts +2 -2
  120. package/test/end-to-end/memory-leak.test.ts +1 -2
  121. package/test/integration/ConnectionManager.test.ts +28 -10
  122. package/test/integration/ConnectivityChecking.test.ts +3 -15
  123. package/test/integration/DhtNodeExternalAPI.test.ts +6 -6
  124. package/test/integration/Find.test.ts +4 -4
  125. package/test/integration/Layer1-scale.test.ts +0 -1
  126. package/test/integration/ReplicateData.test.ts +1 -1
  127. package/test/integration/RouteMessage.test.ts +1 -6
  128. package/test/integration/RouterRpcRemote.test.ts +1 -3
  129. package/test/integration/SimultaneousConnections.test.ts +9 -10
  130. package/test/integration/Store.test.ts +2 -2
  131. package/test/integration/StoreAndDelete.test.ts +3 -3
  132. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +5 -5
  133. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +3 -3
  134. package/test/integration/WebrtcConnectionManagement.test.ts +3 -9
  135. package/test/integration/WebsocketConnectionManagement.test.ts +1 -6
  136. package/test/integration/rpc-connections-over-webrpc.test.ts +1 -2
  137. package/test/unit/PeerManager.test.ts +5 -2
  138. package/test/unit/RecursiveOperationManager.test.ts +14 -8
  139. package/test/unit/RecursiveOperationSession.test.ts +1 -1
  140. package/test/unit/Router.test.ts +0 -2
  141. package/test/unit/RoutingSession.test.ts +1 -2
  142. package/test/unit/connectivityRequestHandler.test.ts +5 -9
  143. package/test/unit/createPeerDescriptor.test.ts +12 -6
  144. package/test/unit/version.test.ts +18 -0
  145. package/test/utils/utils.ts +43 -10
  146. package/tsconfig.jest.json +2 -1
  147. package/tsconfig.node.json +2 -1
  148. package/dist/src/connection/websocket/ServerWebsocket.js.map +0 -1
  149. package/dist/src/helpers/versionCompatibility.d.ts +0 -2
  150. package/dist/src/helpers/versionCompatibility.js +0 -18
  151. package/dist/src/helpers/versionCompatibility.js.map +0 -1
  152. package/src/helpers/versionCompatibility.ts +0 -13
  153. package/test/unit/versionCompatibility.test.ts +0 -16
@@ -0,0 +1,157 @@
1
+ /* eslint-disable no-console */
2
+ import { Simulator } from '../../src/connection/simulator/Simulator'
3
+ import { DhtNode } from '../../src/dht/DhtNode'
4
+ import { createMockRingNode } from '../utils/utils'
5
+ import { execSync } from 'child_process'
6
+ import fs from 'fs'
7
+ import { DhtAddress, getDhtAddressFromRaw, getNodeIdFromPeerDescriptor } from '../../src/identifiers'
8
+ import { Logger } from '@streamr/utils'
9
+ import { getRingIdRawFromPeerDescriptor } from '../../src/dht/contact/ringIdentifiers'
10
+
11
+ const logger = new Logger(module)
12
+
13
+ describe('Ring correctness', () => {
14
+ let entryPoint: DhtNode
15
+ let nodes: DhtNode[]
16
+ const simulator = new Simulator()
17
+
18
+ const NUM_NODES = 900
19
+ const nodeIndicesById: Record<DhtAddress, number> = {}
20
+
21
+ const regions: Array<number> = []
22
+ for (let i = 0; i < (NUM_NODES + 1); i++) {
23
+ regions.push(i)
24
+ }
25
+
26
+ // Shuffle the regions
27
+ for (let i = regions.length - 1; i > 0; i--) {
28
+ const j = Math.floor(Math.random() * (i + 1))
29
+ const temp = regions[i]
30
+ regions[i] = regions[j]
31
+ regions[j] = temp
32
+ }
33
+
34
+ if (!fs.existsSync('test/data/nodeids.json')) {
35
+ console.log('gound truth data does not exist yet, generating..')
36
+ execSync('npm run prepare-kademlia-simulation')
37
+ }
38
+
39
+ const dhtIds: Array<{ type: string, data: Array<number> }> = JSON.parse(fs.readFileSync('test/data/nodeids.json').toString())
40
+ const groundTruth: Record<string, Array<{ name: string, distance: number, id: { type: string, data: Array<number> } }>>
41
+ = JSON.parse(fs.readFileSync('test/data/orderedneighbors.json').toString())
42
+
43
+ beforeEach(async () => {
44
+ jest.setTimeout(60000)
45
+ nodes = []
46
+ entryPoint = await createMockRingNode(simulator, getDhtAddressFromRaw(Uint8Array.from(dhtIds[0].data)), regions[0])
47
+ nodes.push(entryPoint)
48
+ nodeIndicesById[entryPoint.getNodeId()] = 0
49
+
50
+ for (let i = 1; i < NUM_NODES; i++) {
51
+ const node = await createMockRingNode(simulator, getDhtAddressFromRaw(Uint8Array.from(dhtIds[i].data)), regions[i + 1])
52
+ nodeIndicesById[node.getNodeId()] = i
53
+ nodes.push(node)
54
+ }
55
+ })
56
+
57
+ afterEach(async () => {
58
+ await Promise.all([
59
+ entryPoint.stop(),
60
+ ...nodes.map((node) => node.stop())
61
+ ])
62
+ })
63
+
64
+ it('Can find correct neighbors', async () => {
65
+ await entryPoint.joinDht([entryPoint.getLocalPeerDescriptor()])
66
+
67
+ //await Promise.all(
68
+ // nodes.map((node) => node.joinDht([entryPoint.getLocalPeerDescriptor()]))
69
+ //)
70
+
71
+ for (let i = 1; i < NUM_NODES; i++) {
72
+ // time to join the network
73
+ const startTimestamp = Date.now()
74
+ await nodes[i].joinDht([entryPoint.getLocalPeerDescriptor()])
75
+ const endTimestamp = Date.now()
76
+ logger.info('Node ' + i + ' joined in ' + (endTimestamp - startTimestamp) + ' ms')
77
+ const ringStartTimestamp = Date.now()
78
+ await nodes[i].joinRing()
79
+ const ringEndTimestamp = Date.now()
80
+ logger.info('Node ' + i + ' joined ring in ' + (ringEndTimestamp - ringStartTimestamp) + ' ms')
81
+
82
+ }
83
+
84
+ /*
85
+ for (let i = 1; i < NUM_NODES; i++) {
86
+ // time to join the network
87
+ const ringStartTimestamp = Date.now()
88
+ await nodes[i].joinRing()
89
+ const ringEndTimestamp = Date.now()
90
+ logger.info('Node ' + i + ' joined ring in ' + (ringEndTimestamp - ringStartTimestamp) + ' ms')
91
+ }*/
92
+
93
+ for (let i = 1; i < NUM_NODES; i++) {
94
+ logger.info('Node ' + i + ', own region: ' + nodes[i].getLocalPeerDescriptor().region
95
+ + '. Regions of closest ring peers, left: '
96
+ + nodes[i].getClosestRingContactsTo(
97
+ getRingIdRawFromPeerDescriptor(nodes[i].getLocalPeerDescriptor()), 10).left.map((p) => p.region)
98
+ + ', right: ' + nodes[i].getClosestRingContactsTo(getRingIdRawFromPeerDescriptor(
99
+ nodes[i].getLocalPeerDescriptor()), 10).right.map((p) => p.region)
100
+ )
101
+ }
102
+
103
+ let minimumCorrectNeighbors = Number.MAX_SAFE_INTEGER
104
+ let sumCorrectNeighbors = 0
105
+ let sumKbucketSize = 1
106
+
107
+ for (let i = nodes.length - 1; i >= 0; i--) {
108
+ let groundTruthString = 'groundTruthNeighb: '
109
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
110
+ for (let j = 0; j < groundTruth[i + ''].length; j++) {
111
+ groundTruthString += groundTruth[i + ''][j].name + ','
112
+ }
113
+
114
+ const kademliaNeighbors = nodes[i].getClosestContacts(8).map((p) => getNodeIdFromPeerDescriptor(p))
115
+
116
+ let kadString = 'kademliaNeighbors: '
117
+ kademliaNeighbors.forEach((neighbor) => {
118
+ kadString += nodeIndicesById[neighbor] + ','
119
+ })
120
+
121
+ let correctNeighbors = 0
122
+ try {
123
+ for (let j = 0; j < groundTruth[i + ''].length; j++) {
124
+ if (groundTruth[i + ''][j].name != (nodeIndicesById[kademliaNeighbors[j]] + '')) {
125
+ break
126
+ }
127
+ correctNeighbors++
128
+ }
129
+ } catch (e) {
130
+ console.error('Node ' + getNodeIdFromPeerDescriptor(nodes[i].getLocalPeerDescriptor()) + ' had only '
131
+ + kademliaNeighbors.length + ' kademlia neighbors')
132
+ }
133
+ if (correctNeighbors === 0) {
134
+ console.log('No correct neighbors found for node ' + i)
135
+ console.log(groundTruthString)
136
+ console.log(kadString)
137
+ }
138
+ if (correctNeighbors < minimumCorrectNeighbors) {
139
+ console.log('NEW MIN', i, correctNeighbors)
140
+ minimumCorrectNeighbors = correctNeighbors
141
+ }
142
+
143
+ if (i > 0) {
144
+ sumKbucketSize += nodes[i].getNeighborCount()
145
+ sumCorrectNeighbors += correctNeighbors
146
+ }
147
+ }
148
+
149
+ const avgKbucketSize = sumKbucketSize / (NUM_NODES - 1)
150
+ const avgCorrectNeighbors = sumCorrectNeighbors / (NUM_NODES - 1)
151
+
152
+ console.log('----------- Simulation results ------------------')
153
+ console.log('Minimum correct neighbors: ' + minimumCorrectNeighbors)
154
+ console.log('Average correct neighbors: ' + avgCorrectNeighbors)
155
+ console.log('Average Kbucket size: ' + avgKbucketSize)
156
+ }, 240000)
157
+ })
@@ -0,0 +1,72 @@
1
+ import { ConnectivityResponse, PeerDescriptor } from '../../../src/proto/packages/dht/protos/DhtRpc'
2
+ import { createPeerDescriptor } from '../../../src/helpers/createPeerDescriptor'
3
+ import { NatType } from '../../../src/connection/ConnectionManager'
4
+ import { ipv4ToNumber, Logger } from '@streamr/utils'
5
+ import { RingContactList } from '../../../src/dht/contact/RingContactList'
6
+ import { getRingIdRawFromPeerDescriptor } from '../../../src/dht/contact/ringIdentifiers'
7
+ import { getRandomRegion } from '../../../src/connection/simulator/pings'
8
+
9
+ const logger = new Logger(module)
10
+
11
+ function ipv4ToString(ip: number): string {
12
+ return [
13
+ (ip >>> 24) & 0xFF,
14
+ (ip >>> 16) & 0xFF,
15
+ (ip >>> 8) & 0xFF,
16
+ ip & 0xFF
17
+ ].join('.')
18
+ }
19
+
20
+ class MockNode {
21
+ private readonly peerDescriptor: PeerDescriptor
22
+
23
+ constructor(_region: number, ipAddress: string) {
24
+
25
+ const connectivityResponse: ConnectivityResponse = {
26
+ host: 'localhost',
27
+ natType: NatType.UNKNOWN,
28
+ ipAddress: ipv4ToNumber(ipAddress),
29
+ version: '0.0.0'
30
+
31
+ }
32
+ this.peerDescriptor = createPeerDescriptor(connectivityResponse, getRandomRegion())
33
+ logger.info(ipv4ToString(this.peerDescriptor.ipAddress!))
34
+ }
35
+
36
+ public getPeerDescriptor(): PeerDescriptor {
37
+ return this.peerDescriptor
38
+ }
39
+ }
40
+
41
+ // populate with mock ip addresses
42
+ const mockData: Array< [number, string] > = [
43
+ [0, '5.2.4.2'],
44
+ [0, '6.23.2.4'],
45
+ [0, '7.2.4.2'],
46
+ [0, '8.23.2.4'],
47
+ [0, '9.3.2.4'],
48
+ [0, '10.3.2.4'],
49
+ [0, '24.23.2.4'],
50
+ [0, '31.23.2.4'],
51
+ [0, '33.2.4.2'],
52
+ [0, '35.3.2.4'],
53
+ [0, '37.23.2.4'],
54
+ [0, '39.2.4.2'],
55
+ [0, '42.3.2.4'],
56
+ [0, '46.2.4.2'],
57
+ [0, '48.3.2.4'],
58
+ [0, '50.23.2.4']
59
+ ]
60
+
61
+ const mockNodes: MockNode[] = mockData.map(([region, ipAddress]) => new MockNode(region, ipAddress))
62
+ const referenceNode = mockNodes[5]
63
+ const ringContactList: RingContactList<MockNode> = new RingContactList<MockNode>(
64
+ getRingIdRawFromPeerDescriptor(referenceNode.getPeerDescriptor()),
65
+ false
66
+ )
67
+
68
+ mockNodes.forEach((node) => ringContactList.addContact(node))
69
+
70
+ ringContactList.getClosestContacts().left.forEach((node) => logger.info(ipv4ToString(node.getPeerDescriptor().ipAddress!)))
71
+ logger.info('reference node: ' + ipv4ToString(referenceNode.getPeerDescriptor().ipAddress!))
72
+ ringContactList.getClosestContacts().right.forEach((node) => logger.info(ipv4ToString(node.getPeerDescriptor().ipAddress!)))
@@ -3,8 +3,8 @@ import crypto from 'crypto'
3
3
  import KBucket from 'k-bucket'
4
4
  import { DhtAddressRaw } from '../../src/identifiers'
5
5
 
6
- const ID_LENGTH = 8
7
- const NUM_NODES = 2000
6
+ const ID_LENGTH = 20
7
+ const NUM_NODES = 900
8
8
  const NUM_NEAREST = 10
9
9
 
10
10
  const generateId = function(): DhtAddressRaw {
@@ -1,7 +1,7 @@
1
1
  import LeakDetector from 'jest-leak-detector'
2
2
  import { waitForCondition } from '@streamr/utils'
3
3
  import { DhtNode } from '../../src/dht/DhtNode'
4
- import { Message, MessageType } from '../../src/proto/packages/dht/protos/DhtRpc'
4
+ import { Message } from '../../src/proto/packages/dht/protos/DhtRpc'
5
5
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
6
6
  import { createMockPeerDescriptor } from '../utils/utils'
7
7
  import { getNodeIdFromPeerDescriptor } from '../../src/identifiers'
@@ -48,7 +48,6 @@ describe('memory leak', () => {
48
48
  const msg: Message = {
49
49
  serviceId: 'mock-service-id',
50
50
  targetDescriptor: receiver.getLocalPeerDescriptor(),
51
- messageType: MessageType.RPC,
52
51
  messageId: 'mock-message-id',
53
52
  body: {
54
53
  oneofKind: 'rpcMessage',
@@ -6,10 +6,12 @@ import { Simulator } from '../../src/connection/simulator/Simulator'
6
6
  import { SimulatorTransport } from '../../src/connection/simulator/SimulatorTransport'
7
7
  import { createPeerDescriptor } from '../../src/helpers/createPeerDescriptor'
8
8
  import { createRandomDhtAddress, getRawFromDhtAddress } from '../../src/identifiers'
9
- import { ConnectivityResponse, Message, MessageType, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
9
+ import { ConnectivityResponse, Message, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
10
10
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
11
11
  import { TransportEvents } from '../../src/transport/ITransport'
12
12
  import { createMockPeerDescriptor } from '../utils/utils'
13
+ import { getRandomRegion } from '../../src/connection/simulator/pings'
14
+ import { range } from 'lodash'
13
15
 
14
16
  const SERVICE_ID = 'demo'
15
17
 
@@ -40,7 +42,7 @@ describe('ConnectionManager', () => {
40
42
  }
41
43
 
42
44
  beforeEach(() => {
43
- createLocalPeerDescriptor = jest.fn().mockImplementation((response) => createPeerDescriptor(response))
45
+ createLocalPeerDescriptor = jest.fn().mockImplementation((response) => createPeerDescriptor(response, getRandomRegion()))
44
46
  })
45
47
 
46
48
  beforeAll(async () => {
@@ -85,6 +87,27 @@ describe('ConnectionManager', () => {
85
87
  await connectionManager.stop()
86
88
  }, 15000)
87
89
 
90
+ it('Succesfully connectivityChecks if at least one entry point is online', async () => {
91
+ // Create offline PeerDescriptors
92
+ const entryPoints = range(4).map((i) => {
93
+ return createMockPeerDescriptor({
94
+ websocket: { host: '127.0.0.1', port: 12345 + i, tls: false }
95
+ })
96
+ })
97
+ entryPoints.push(createMockPeerDescriptor({
98
+ websocket: { host: '127.0.0.1', port: 9998, tls: false }
99
+ }))
100
+ const connectionManager = createConnectionManager({
101
+ transport: mockTransport,
102
+ websocketPortRange: { min: 9998, max: 9998 },
103
+ entryPoints
104
+ })
105
+ await connectionManager.start()
106
+ expect(createLocalPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
107
+
108
+ await connectionManager.stop()
109
+ }, 20000)
110
+
88
111
  it('Can probe connectivity in open internet', async () => {
89
112
  const connectionManager1 = createConnectionManager({
90
113
  transport: mockTransport,
@@ -134,7 +157,6 @@ describe('ConnectionManager', () => {
134
157
 
135
158
  const msg: Message = {
136
159
  serviceId: SERVICE_ID,
137
- messageType: MessageType.RPC,
138
160
  messageId: '1',
139
161
  body: {
140
162
  oneofKind: 'rpcMessage',
@@ -144,7 +166,7 @@ describe('ConnectionManager', () => {
144
166
 
145
167
  const promise = new Promise<void>((resolve, _reject) => {
146
168
  connectionManager2.on('message', async (message: Message) => {
147
- expect(message.messageType).toBe(MessageType.RPC)
169
+ expect(message.body.oneofKind).toBe('rpcMessage')
148
170
  resolve()
149
171
  })
150
172
  })
@@ -193,7 +215,6 @@ describe('ConnectionManager', () => {
193
215
 
194
216
  const msg: Message = {
195
217
  serviceId: SERVICE_ID,
196
- messageType: MessageType.RPC,
197
218
  messageId: '1',
198
219
  body: {
199
220
  oneofKind: 'rpcMessage',
@@ -217,7 +238,7 @@ describe('ConnectionManager', () => {
217
238
 
218
239
  const promise = new Promise<void>((resolve, _reject) => {
219
240
  connectionManager2.on('message', async (message: Message) => {
220
- expect(message.messageType).toBe(MessageType.RPC)
241
+ expect(message.body.oneofKind).toBe('rpcMessage')
221
242
  resolve()
222
243
  })
223
244
  })
@@ -244,7 +265,6 @@ describe('ConnectionManager', () => {
244
265
 
245
266
  const msg: Message = {
246
267
  serviceId: SERVICE_ID,
247
- messageType: MessageType.RPC,
248
268
  messageId: '1',
249
269
  body: {
250
270
  oneofKind: 'rpcMessage',
@@ -254,7 +274,7 @@ describe('ConnectionManager', () => {
254
274
 
255
275
  const dataPromise = new Promise<void>((resolve, _reject) => {
256
276
  connectionManager4.on('message', async (message: Message) => {
257
- expect(message.messageType).toBe(MessageType.RPC)
277
+ expect(message.body.oneofKind).toBe('rpcMessage')
258
278
  resolve()
259
279
  })
260
280
  })
@@ -309,7 +329,6 @@ describe('ConnectionManager', () => {
309
329
  peerDescriptor.nodeId = new Uint8Array([12, 12, 12, 12])
310
330
  const msg: Message = {
311
331
  serviceId: SERVICE_ID,
312
- messageType: MessageType.RPC,
313
332
  messageId: '1',
314
333
  targetDescriptor: peerDescriptor,
315
334
  body: {
@@ -360,7 +379,6 @@ describe('ConnectionManager', () => {
360
379
 
361
380
  const msg: Message = {
362
381
  serviceId: SERVICE_ID,
363
- messageType: MessageType.RPC,
364
382
  messageId: '1',
365
383
  targetDescriptor: {
366
384
  // This is not the correct nodeId of peerDescriptor2
@@ -4,7 +4,7 @@ import { DefaultConnectorFacade } from '../../src/connection/ConnectorFacade'
4
4
  import { MockTransport } from '../utils/mock/Transport'
5
5
  import { createMockPeerDescriptor } from '../utils/utils'
6
6
  import { sendConnectivityRequest } from '../../src/connection/connectivityChecker'
7
- import { version } from '../../package.json'
7
+ import { LOCAL_PROTOCOL_VERSION } from '../../src/helpers/version'
8
8
 
9
9
  describe('ConnectivityChecking', () => {
10
10
 
@@ -46,19 +46,7 @@ describe('ConnectivityChecking', () => {
46
46
  tls: false,
47
47
  selfSigned: false
48
48
  }
49
- const response = await sendConnectivityRequest(request, server.getLocalPeerDescriptor(), version)
50
- expect(response.version).toEqual(version)
49
+ const response = await sendConnectivityRequest(request, server.getLocalPeerDescriptor())
50
+ expect(response.version).toEqual(LOCAL_PROTOCOL_VERSION)
51
51
  })
52
-
53
- it('connectivityCheck with incompatible version', async () => {
54
- const request = {
55
- host: HOST,
56
- port: PORT,
57
- tls: false,
58
- selfSigned: false
59
- }
60
- await expect(sendConnectivityRequest(request, server.getLocalPeerDescriptor(), '0.0.1'))
61
- .toReject()
62
- })
63
-
64
52
  })
@@ -25,22 +25,22 @@ describe('DhtNodeExternalApi', () => {
25
25
  simulator.stop()
26
26
  })
27
27
 
28
- it('findData happy path', async () => {
28
+ it('fetch data happy path', async () => {
29
29
  const entry = createMockDataEntry()
30
30
  await dhtNode1.storeDataToDht(getDhtAddressFromRaw(entry.key), entry.data!)
31
- const foundData = await remote.findDataViaPeer(getDhtAddressFromRaw(entry.key), dhtNode1.getLocalPeerDescriptor())
31
+ const foundData = await remote.fetchDataFromDhtViaPeer(getDhtAddressFromRaw(entry.key), dhtNode1.getLocalPeerDescriptor())
32
32
  expectEqualData(foundData[0], entry)
33
33
  })
34
34
 
35
- it('findData returns empty array if no data found', async () => {
36
- const foundData = await remote.findDataViaPeer(createRandomDhtAddress(), dhtNode1.getLocalPeerDescriptor())
35
+ it('fetch data returns empty array if no data found', async () => {
36
+ const foundData = await remote.fetchDataFromDhtViaPeer(createRandomDhtAddress(), dhtNode1.getLocalPeerDescriptor())
37
37
  expect(foundData).toEqual([])
38
38
  })
39
39
 
40
40
  it('external store data happy path', async () => {
41
41
  const entry = createMockDataEntry()
42
- await remote.storeDataViaPeer(getDhtAddressFromRaw(entry.key), entry.data!, dhtNode1.getLocalPeerDescriptor())
43
- const foundData = await remote.findDataViaPeer(getDhtAddressFromRaw(entry.key), dhtNode1.getLocalPeerDescriptor())
42
+ await remote.storeDataToDhtViaPeer(getDhtAddressFromRaw(entry.key), entry.data!, dhtNode1.getLocalPeerDescriptor())
43
+ const foundData = await remote.fetchDataFromDhtViaPeer(getDhtAddressFromRaw(entry.key), dhtNode1.getLocalPeerDescriptor())
44
44
  expectEqualData(foundData[0], entry)
45
45
  expect(getDhtAddressFromRaw(foundData[0].creator)).toEqual(getNodeIdFromPeerDescriptor(remote.getLocalPeerDescriptor()))
46
46
  })
@@ -1,6 +1,6 @@
1
1
  import { LatencyType, Simulator } from '../../src/connection/simulator/Simulator'
2
2
  import { DhtNode } from '../../src/dht/DhtNode'
3
- import { PeerDescriptor, RecursiveOperation } from '../../src/proto/packages/dht/protos/DhtRpc'
3
+ import { PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
4
4
  import { createMockConnectionDhtNode, waitConnectionManagersReadyForTesting } from '../utils/utils'
5
5
  import { getDhtAddressFromRaw, getNodeIdFromPeerDescriptor, getRawFromDhtAddress } from '../../src/identifiers'
6
6
 
@@ -37,9 +37,9 @@ describe('Find correctness', () => {
37
37
 
38
38
  it('Entrypoint can find a node from the network (exact match)', async () => {
39
39
  const targetId = getRawFromDhtAddress(nodes[45].getNodeId())
40
- const results = await entryPoint.executeRecursiveOperation(getDhtAddressFromRaw(targetId), RecursiveOperation.FIND_NODE)
41
- expect(results.closestNodes.length).toBeGreaterThanOrEqual(5)
42
- expect(getDhtAddressFromRaw(targetId)).toEqual(getNodeIdFromPeerDescriptor(results.closestNodes[0]))
40
+ const closestNodes = await entryPoint.findClosestNodesFromDht(getDhtAddressFromRaw(targetId))
41
+ expect(closestNodes.length).toBeGreaterThanOrEqual(5)
42
+ expect(getDhtAddressFromRaw(targetId)).toEqual(getNodeIdFromPeerDescriptor(closestNodes[0]))
43
43
  }, 30000)
44
44
 
45
45
  })
@@ -159,7 +159,6 @@ describe('Layer1', () => {
159
159
  // const message: Message = {
160
160
  // serviceId: 'service',
161
161
  // messageId: v4(),
162
- // messageType: MessageType.RPC,
163
162
  // body: {
164
163
  // oneofKind: 'rpcMessage',
165
164
  // rpcMessage: rpcWrapper
@@ -99,7 +99,7 @@ describe('Replicate data from node to node in DHT', () => {
99
99
  }))
100
100
 
101
101
  const randomNonStoppedNode = sample(nodes.filter((n) => !stoppedNodeIds.includes(n.getNodeId())))!
102
- const data = await randomNonStoppedNode.getDataFromDht(getDhtAddressFromRaw(DATA.key))
102
+ const data = await randomNonStoppedNode.fetchDataFromDht(getDhtAddressFromRaw(DATA.key))
103
103
  expect(data).toHaveLength(1)
104
104
  expectEqualData(data[0], DATA)
105
105
  }, 180000)
@@ -1,5 +1,5 @@
1
1
  import { DhtNode, Events as DhtNodeEvents } from '../../src/dht/DhtNode'
2
- import { Message, MessageType, NodeType, PeerDescriptor, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
2
+ import { Message, NodeType, PeerDescriptor, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
3
3
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
4
4
  import { Logger, runAndWaitForEvents3, waitForCondition } from '@streamr/utils'
5
5
  import { createMockConnectionDhtNode, createWrappedClosestPeersRequest } from '../utils/utils'
@@ -64,7 +64,6 @@ describe('Route Message With Mock Connections', () => {
64
64
  const message: Message = {
65
65
  serviceId: 'unknown',
66
66
  messageId: v4(),
67
- messageType: MessageType.RPC,
68
67
  body: {
69
68
  oneofKind: 'rpcMessage',
70
69
  rpcMessage: rpcWrapper
@@ -98,7 +97,6 @@ describe('Route Message With Mock Connections', () => {
98
97
  const message: Message = {
99
98
  serviceId: 'unknown',
100
99
  messageId: v4(),
101
- messageType: MessageType.RPC,
102
100
  body: {
103
101
  oneofKind: 'rpcMessage',
104
102
  rpcMessage: rpcWrapper
@@ -136,7 +134,6 @@ describe('Route Message With Mock Connections', () => {
136
134
  const message: Message = {
137
135
  serviceId: 'nonexisting_service',
138
136
  messageId: v4(),
139
- messageType: MessageType.RPC,
140
137
  body: {
141
138
  oneofKind: 'rpcMessage',
142
139
  rpcMessage: rpcWrapper
@@ -171,7 +168,6 @@ describe('Route Message With Mock Connections', () => {
171
168
  const closestPeersRequestMessage: Message = {
172
169
  serviceId: 'unknown',
173
170
  messageId: v4(),
174
- messageType: MessageType.RPC,
175
171
  body: {
176
172
  oneofKind: 'rpcMessage',
177
173
  rpcMessage: closestPeersRequest
@@ -202,7 +198,6 @@ describe('Route Message With Mock Connections', () => {
202
198
  const requestMessage: Message = {
203
199
  serviceId: 'layer0',
204
200
  messageId: v4(),
205
- messageType: MessageType.RPC,
206
201
  body: {
207
202
  oneofKind: 'rpcMessage',
208
203
  rpcMessage
@@ -1,6 +1,6 @@
1
1
  import { RpcCommunicator } from '@streamr/proto-rpc'
2
2
  import { RouterRpcRemote } from '../../src/dht/routing/RouterRpcRemote'
3
- import { Message, MessageType, RouteMessageAck, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
3
+ import { Message, RouteMessageAck, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
4
4
  import { RouterRpcClient } from '../../src/proto/packages/dht/protos/DhtRpc.client'
5
5
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
6
6
  import { createMockPeerDescriptor, createWrappedClosestPeersRequest, mockRouterRpc } from '../utils/utils'
@@ -34,7 +34,6 @@ describe('RemoteRouter', () => {
34
34
  const routed: Message = {
35
35
  serviceId: SERVICE_ID,
36
36
  messageId: 'routed',
37
- messageType: MessageType.RPC,
38
37
  body: {
39
38
  oneofKind: 'rpcMessage',
40
39
  rpcMessage: rpcWrapper
@@ -58,7 +57,6 @@ describe('RemoteRouter', () => {
58
57
  const routed: Message = {
59
58
  serviceId: SERVICE_ID,
60
59
  messageId: 'routed',
61
- messageType: MessageType.RPC,
62
60
  body: {
63
61
  oneofKind: 'rpcMessage',
64
62
  rpcMessage: rpcWrapper
@@ -3,7 +3,7 @@ import { ConnectionManager } from '../../src/connection/ConnectionManager'
3
3
  import { DefaultConnectorFacade, DefaultConnectorFacadeConfig } from '../../src/connection/ConnectorFacade'
4
4
  import { LatencyType, Simulator } from '../../src/connection/simulator/Simulator'
5
5
  import { SimulatorTransport } from '../../src/connection/simulator/SimulatorTransport'
6
- import { Message, MessageType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
6
+ import { Message, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
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'
@@ -12,7 +12,6 @@ import { getNodeIdFromPeerDescriptor } from '../../src/identifiers'
12
12
 
13
13
  const BASE_MESSAGE: Message = {
14
14
  serviceId: 'serviceId',
15
- messageType: MessageType.RPC,
16
15
  messageId: '1',
17
16
  body: {
18
17
  oneofKind: 'rpcMessage',
@@ -63,13 +62,13 @@ describe('SimultaneousConnections', () => {
63
62
 
64
63
  const promise1 = new Promise<void>((resolve, _reject) => {
65
64
  simTransport1.on('message', async (message: Message) => {
66
- expect(message.messageType).toBe(MessageType.RPC)
65
+ expect(message.body.oneofKind).toBe('rpcMessage')
67
66
  resolve()
68
67
  })
69
68
  })
70
69
  const promise2 = new Promise<void>((resolve, _reject) => {
71
70
  simTransport2.on('message', async (message: Message) => {
72
- expect(message.messageType).toBe(MessageType.RPC)
71
+ expect(message.body.oneofKind).toBe('rpcMessage')
73
72
  resolve()
74
73
  })
75
74
  })
@@ -142,13 +141,13 @@ describe('SimultaneousConnections', () => {
142
141
 
143
142
  const promise1 = new Promise<void>((resolve, _reject) => {
144
143
  connectionManager1.on('message', async (message: Message) => {
145
- expect(message.messageType).toBe(MessageType.RPC)
144
+ expect(message.body.oneofKind).toBe('rpcMessage')
146
145
  resolve()
147
146
  })
148
147
  })
149
148
  const promise2 = new Promise<void>((resolve, _reject) => {
150
149
  connectionManager2.on('message', async (message: Message) => {
151
- expect(message.messageType).toBe(MessageType.RPC)
150
+ expect(message.body.oneofKind).toBe('rpcMessage')
152
151
  resolve()
153
152
  })
154
153
  })
@@ -222,13 +221,13 @@ describe('SimultaneousConnections', () => {
222
221
 
223
222
  const promise1 = new Promise<void>((resolve, _reject) => {
224
223
  connectionManager1.on('message', async (message: Message) => {
225
- expect(message.messageType).toBe(MessageType.RPC)
224
+ expect(message.body.oneofKind).toBe('rpcMessage')
226
225
  resolve()
227
226
  })
228
227
  })
229
228
  const promise2 = new Promise<void>((resolve, _reject) => {
230
229
  connectionManager2.on('message', async (message: Message) => {
231
- expect(message.messageType).toBe(MessageType.RPC)
230
+ expect(message.body.oneofKind).toBe('rpcMessage')
232
231
  resolve()
233
232
  })
234
233
  })
@@ -290,13 +289,13 @@ describe('SimultaneousConnections', () => {
290
289
 
291
290
  const promise1 = new Promise<void>((resolve, _reject) => {
292
291
  connectionManager1.on('message', async (message: Message) => {
293
- expect(message.messageType).toBe(MessageType.RPC)
292
+ expect(message.body.oneofKind).toBe('rpcMessage')
294
293
  resolve()
295
294
  })
296
295
  })
297
296
  const promise2 = new Promise<void>((resolve, _reject) => {
298
297
  connectionManager2.on('message', async (message: Message) => {
299
- expect(message.messageType).toBe(MessageType.RPC)
298
+ expect(message.body.oneofKind).toBe('rpcMessage')
300
299
  resolve()
301
300
  })
302
301
  })
@@ -59,7 +59,7 @@ describe('Storing data in DHT', () => {
59
59
  )
60
60
  expect(successfulStorers.length).toBeGreaterThan(4)
61
61
  const fetchingNode = getRandomNode()
62
- const results = await fetchingNode.getDataFromDht(getDhtAddressFromRaw(entry.key))
62
+ const results = await fetchingNode.fetchDataFromDht(getDhtAddressFromRaw(entry.key))
63
63
  results.forEach((result) => {
64
64
  expectEqualData(result, entry)
65
65
  })
@@ -76,7 +76,7 @@ describe('Storing data in DHT', () => {
76
76
  )
77
77
  expect(successfulStorers.length).toBeGreaterThan(4)
78
78
  const fetchingNode = getRandomNode()
79
- const results = await fetchingNode.getDataFromDht(getDhtAddressFromRaw(entry.key))
79
+ const results = await fetchingNode.fetchDataFromDht(getDhtAddressFromRaw(entry.key))
80
80
  results.forEach((result) => {
81
81
  expectEqualData(result, entry)
82
82
  expect(getDhtAddressFromRaw(result.creator)).toEqual(getNodeIdFromPeerDescriptor(requestor))