@streamr/dht 0.0.1-tatum.5 → 0.0.1-tatum.7

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 (205) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +1 -1
  2. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  3. package/dist/src/connection/ConnectionManager.d.ts +17 -39
  4. package/dist/src/connection/ConnectionManager.js +138 -192
  5. package/dist/src/connection/ConnectionManager.js.map +1 -1
  6. package/dist/src/connection/ConnectivityChecker.js +14 -11
  7. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  8. package/dist/src/connection/ConnectorFacade.d.ts +49 -0
  9. package/dist/src/connection/ConnectorFacade.js +86 -0
  10. package/dist/src/connection/ConnectorFacade.js.map +1 -0
  11. package/dist/src/connection/ManagedConnection.d.ts +1 -4
  12. package/dist/src/connection/ManagedConnection.js +23 -31
  13. package/dist/src/connection/ManagedConnection.js.map +1 -1
  14. package/dist/src/connection/RemoteConnectionLocker.js +4 -3
  15. package/dist/src/connection/RemoteConnectionLocker.js.map +1 -1
  16. package/dist/src/connection/Simulator/Simulator.d.ts +0 -2
  17. package/dist/src/connection/Simulator/Simulator.js +0 -5
  18. package/dist/src/connection/Simulator/Simulator.js.map +1 -1
  19. package/dist/src/connection/Simulator/SimulatorConnection.js +16 -13
  20. package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -1
  21. package/dist/src/connection/Simulator/SimulatorConnector.d.ts +2 -2
  22. package/dist/src/connection/Simulator/SimulatorConnector.js +10 -11
  23. package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -1
  24. package/dist/src/connection/Simulator/SimulatorTransport.js +6 -1
  25. package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -1
  26. package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +2 -0
  27. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +12 -12
  28. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -1
  29. package/dist/src/connection/WebRTC/WebRtcConnector.d.ts +9 -9
  30. package/dist/src/connection/WebRTC/WebRtcConnector.js +22 -22
  31. package/dist/src/connection/WebRTC/WebRtcConnector.js.map +1 -1
  32. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js +2 -1
  33. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +1 -1
  34. package/dist/src/connection/WebSocket/WebSocketConnector.d.ts +19 -8
  35. package/dist/src/connection/WebSocket/WebSocketConnector.js +67 -46
  36. package/dist/src/connection/WebSocket/WebSocketConnector.js.map +1 -1
  37. package/dist/src/connection/WebSocket/WebSocketServer.d.ts +11 -1
  38. package/dist/src/connection/WebSocket/WebSocketServer.js +15 -10
  39. package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -1
  40. package/dist/src/dht/DhtNode.d.ts +16 -54
  41. package/dist/src/dht/DhtNode.js +116 -137
  42. package/dist/src/dht/DhtNode.js.map +1 -1
  43. package/dist/src/dht/{DhtPeer.d.ts → RemoteDhtNode.d.ts} +3 -2
  44. package/dist/src/dht/{DhtPeer.js → RemoteDhtNode.js} +22 -16
  45. package/dist/src/dht/RemoteDhtNode.js.map +1 -0
  46. package/dist/src/dht/contact/Contact.d.ts +1 -15
  47. package/dist/src/dht/contact/Contact.js +1 -9
  48. package/dist/src/dht/contact/Contact.js.map +1 -1
  49. package/dist/src/dht/contact/ContactList.d.ts +13 -3
  50. package/dist/src/dht/contact/ContactList.js +9 -4
  51. package/dist/src/dht/contact/ContactList.js.map +1 -1
  52. package/dist/src/dht/contact/RandomContactList.d.ts +3 -3
  53. package/dist/src/dht/contact/RandomContactList.js +4 -8
  54. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  55. package/dist/src/dht/contact/Remote.d.ts +1 -5
  56. package/dist/src/dht/contact/Remote.js +0 -5
  57. package/dist/src/dht/contact/Remote.js.map +1 -1
  58. package/dist/src/dht/contact/SortedContactList.d.ts +3 -5
  59. package/dist/src/dht/contact/SortedContactList.js +9 -19
  60. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  61. package/dist/src/dht/discovery/DiscoverySession.d.ts +5 -7
  62. package/dist/src/dht/discovery/DiscoverySession.js +9 -10
  63. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  64. package/dist/src/dht/discovery/PeerDiscovery.d.ts +11 -10
  65. package/dist/src/dht/discovery/PeerDiscovery.js +32 -37
  66. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  67. package/dist/src/dht/find/RecursiveFindSession.d.ts +5 -6
  68. package/dist/src/dht/find/RecursiveFindSession.js +8 -8
  69. package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
  70. package/dist/src/dht/find/RecursiveFinder.d.ts +2 -4
  71. package/dist/src/dht/find/RecursiveFinder.js +11 -12
  72. package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
  73. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +1 -1
  74. package/dist/src/dht/routing/DuplicateDetector.d.ts +1 -2
  75. package/dist/src/dht/routing/DuplicateDetector.js +2 -7
  76. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  77. package/dist/src/dht/routing/RemoteRouter.js +4 -4
  78. package/dist/src/dht/routing/RemoteRouter.js.map +1 -1
  79. package/dist/src/dht/routing/Router.d.ts +10 -13
  80. package/dist/src/dht/routing/Router.js +28 -29
  81. package/dist/src/dht/routing/Router.js.map +1 -1
  82. package/dist/src/dht/routing/RoutingSession.d.ts +3 -5
  83. package/dist/src/dht/routing/RoutingSession.js +19 -13
  84. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  85. package/dist/src/dht/store/DataStore.d.ts +2 -2
  86. package/dist/src/dht/store/DataStore.js +7 -7
  87. package/dist/src/dht/store/DataStore.js.map +1 -1
  88. package/dist/src/exports.d.ts +1 -8
  89. package/dist/src/exports.js +2 -16
  90. package/dist/src/exports.js.map +1 -1
  91. package/dist/src/helpers/PeerID.d.ts +0 -1
  92. package/dist/src/helpers/PeerID.js +0 -6
  93. package/dist/src/helpers/PeerID.js.map +1 -1
  94. package/dist/src/helpers/browser/isBrowserEnvironment.d.ts +1 -0
  95. package/dist/src/helpers/browser/isBrowserEnvironment.js +6 -0
  96. package/dist/src/helpers/browser/isBrowserEnvironment.js.map +1 -0
  97. package/dist/src/helpers/browser/isBrowserEnvironment_override.d.ts +1 -0
  98. package/dist/src/helpers/browser/isBrowserEnvironment_override.js +7 -0
  99. package/dist/src/helpers/browser/isBrowserEnvironment_override.js.map +1 -0
  100. package/dist/src/helpers/kademliaId.d.ts +1 -0
  101. package/dist/src/helpers/kademliaId.js +14 -0
  102. package/dist/src/helpers/kademliaId.js.map +1 -0
  103. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -1
  104. package/dist/src/helpers/peerIdFromPeerDescriptor.js +3 -3
  105. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  106. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +0 -4
  107. package/dist/src/proto/packages/dht/protos/DhtRpc.js +1 -2
  108. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  109. package/package.json +10 -9
  110. package/protos/DhtRpc.proto +0 -1
  111. package/src/connection/ConnectionLockHandler.ts +1 -1
  112. package/src/connection/ConnectionManager.ts +156 -240
  113. package/src/connection/ConnectivityChecker.ts +14 -11
  114. package/src/connection/ConnectorFacade.ts +143 -0
  115. package/src/connection/ManagedConnection.ts +23 -34
  116. package/src/connection/RemoteConnectionLocker.ts +4 -3
  117. package/src/connection/Simulator/Simulator.ts +0 -7
  118. package/src/connection/Simulator/SimulatorConnection.ts +16 -13
  119. package/src/connection/Simulator/SimulatorConnector.ts +11 -12
  120. package/src/connection/Simulator/SimulatorTransport.ts +6 -1
  121. package/src/connection/WebRTC/NodeWebRtcConnection.ts +14 -13
  122. package/src/connection/WebRTC/WebRtcConnector.ts +31 -31
  123. package/src/connection/WebSocket/RemoteWebSocketConnector.ts +2 -1
  124. package/src/connection/WebSocket/WebSocketConnector.ts +85 -62
  125. package/src/connection/WebSocket/WebSocketServer.ts +26 -8
  126. package/src/dht/DhtNode.ts +164 -189
  127. package/src/dht/{DhtPeer.ts → RemoteDhtNode.ts} +14 -7
  128. package/src/dht/contact/Contact.ts +1 -18
  129. package/src/dht/contact/ContactList.ts +16 -6
  130. package/src/dht/contact/RandomContactList.ts +6 -11
  131. package/src/dht/contact/Remote.ts +1 -10
  132. package/src/dht/contact/SortedContactList.ts +12 -25
  133. package/src/dht/discovery/DiscoverySession.ts +20 -23
  134. package/src/dht/discovery/PeerDiscovery.ts +45 -44
  135. package/src/dht/find/RecursiveFindSession.ts +12 -13
  136. package/src/dht/find/RecursiveFinder.ts +16 -19
  137. package/src/dht/registerExternalApiRpcMethods.ts +1 -1
  138. package/src/dht/routing/DuplicateDetector.ts +3 -10
  139. package/src/dht/routing/RemoteRouter.ts +5 -5
  140. package/src/dht/routing/Router.ts +35 -39
  141. package/src/dht/routing/RoutingSession.ts +37 -28
  142. package/src/dht/store/DataStore.ts +11 -11
  143. package/src/exports.ts +1 -8
  144. package/src/helpers/PeerID.ts +0 -7
  145. package/src/helpers/browser/isBrowserEnvironment.ts +1 -0
  146. package/src/helpers/browser/isBrowserEnvironment_override.ts +3 -0
  147. package/src/helpers/kademliaId.ts +8 -0
  148. package/src/helpers/peerIdFromPeerDescriptor.ts +1 -1
  149. package/src/proto/packages/dht/protos/DhtRpc.ts +1 -6
  150. package/test/benchmark/KademliaCorrectness.test.ts +5 -2
  151. package/test/benchmark/RecursiveFind.test.ts +6 -6
  152. package/test/end-to-end/Layer0-Layer1.test.ts +14 -14
  153. package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +5 -5
  154. package/test/end-to-end/Layer0WebRTC.test.ts +5 -6
  155. package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +13 -8
  156. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +15 -10
  157. package/test/end-to-end/WebSocketConnectionRequest.test.ts +5 -5
  158. package/test/integration/ConnectionLocking.test.ts +32 -26
  159. package/test/integration/ConnectionManager.test.ts +90 -93
  160. package/test/integration/DhtJoinPeerDiscovery.test.ts +53 -0
  161. package/test/integration/DhtRpc.test.ts +4 -6
  162. package/test/integration/Layer1-scale.test.ts +8 -8
  163. package/test/integration/MigrateData.test.ts +9 -9
  164. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -2
  165. package/test/integration/RecursiveFind.test.ts +5 -5
  166. package/test/integration/{DhtPeer.test.ts → RemoteDhtNode.test.ts} +11 -12
  167. package/test/integration/RemoteRouter.test.ts +5 -6
  168. package/test/integration/RemoteStore.test.ts +4 -5
  169. package/test/integration/RouteMessage.test.ts +7 -9
  170. package/test/integration/RpcErrors.test.ts +25 -10
  171. package/test/integration/ScaleDownDht.test.ts +8 -8
  172. package/test/integration/SimultaneousConnections.test.ts +35 -36
  173. package/test/integration/Store.test.ts +8 -9
  174. package/test/integration/StoreAndDelete.test.ts +11 -11
  175. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +7 -7
  176. package/test/integration/WebRtcConnectionManagement.test.ts +26 -19
  177. package/test/integration/WebRtcConnectorRpc.test.ts +6 -8
  178. package/test/integration/WebSocket.test.ts +4 -2
  179. package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
  180. package/test/integration/WebSocketConnectorRpc.test.ts +2 -3
  181. package/test/unit/DuplicateDetector.test.ts +3 -4
  182. package/test/unit/LocalDataStore.test.ts +6 -8
  183. package/test/unit/RandomContactList.test.ts +25 -74
  184. package/test/unit/RecursiveFinder.test.ts +8 -12
  185. package/test/unit/Router.test.ts +18 -21
  186. package/test/unit/SortedContactList.test.ts +62 -112
  187. package/test/unit/WebSocketConnector.test.ts +64 -0
  188. package/test/unit/WebSocketServer.test.ts +24 -12
  189. package/test/utils/mock/RecursiveFinder.ts +2 -2
  190. package/test/utils/mock/Router.ts +9 -11
  191. package/test/utils/mock/Transport.ts +2 -2
  192. package/test/utils/utils.ts +40 -49
  193. package/dist/src/dht/DhtPeer.js.map +0 -1
  194. package/dist/src/helpers/browser/isBrowser.d.ts +0 -1
  195. package/dist/src/helpers/browser/isBrowser.js +0 -6
  196. package/dist/src/helpers/browser/isBrowser.js.map +0 -1
  197. package/dist/src/helpers/browser/isNodeJS.d.ts +0 -1
  198. package/dist/src/helpers/browser/isNodeJS.js +0 -6
  199. package/dist/src/helpers/browser/isNodeJS.js.map +0 -1
  200. package/src/helpers/browser/isBrowser.ts +0 -1
  201. package/src/helpers/browser/isNodeJS.ts +0 -1
  202. package/test/integration/DhtWithMockConnectionLatencies.test.ts +0 -46
  203. package/test/integration/DhtWithMockConnections.test.ts +0 -46
  204. package/test/integration/DhtWithRealConnectionLatencies.test.ts +0 -47
  205. /package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +0 -0
@@ -1,10 +1,12 @@
1
1
  import { ConnectionManager } from '../../src/connection/ConnectionManager'
2
- import { Message, MessageType, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
2
+ import { ConnectivityResponse, Message, MessageType, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
3
3
  import { PeerID } from '../../src/helpers/PeerID'
4
4
  import { Simulator } from '../../src/connection/Simulator/Simulator'
5
5
  import { createPeerDescriptor } from '../../src/dht/DhtNode'
6
6
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
7
- import { Logger } from '@streamr/utils'
7
+ import { Logger, MetricsContext } from '@streamr/utils'
8
+ import { SimulatorTransport } from '../../src/exports'
9
+ import { DefaultConnectorFacade, DefaultConnectorFacadeConfig } from '../../src/connection/ConnectorFacade'
8
10
 
9
11
  const logger = new Logger(module)
10
12
 
@@ -14,30 +16,48 @@ describe('ConnectionManager', () => {
14
16
 
15
17
  const mockPeerDescriptor1: PeerDescriptor = {
16
18
  kademliaId: PeerID.fromString('tester1').value,
17
- nodeName: 'tester1',
18
19
  type: NodeType.NODEJS
19
20
  }
20
21
  const mockPeerDescriptor2: PeerDescriptor = {
21
22
  kademliaId: PeerID.fromString('tester2').value,
22
- nodeName: 'tester2',
23
23
  type: NodeType.NODEJS
24
24
  }
25
25
 
26
26
  const mockPeerDescriptor3: PeerDescriptor = {
27
27
  kademliaId: PeerID.fromString('tester3').value,
28
- nodeName: 'tester3',
29
28
  type: NodeType.NODEJS
30
29
  }
31
30
  const mockPeerDescriptor4: PeerDescriptor = {
32
31
  kademliaId: PeerID.fromString('tester4').value,
33
- nodeName: 'tester4',
34
32
  type: NodeType.NODEJS
35
33
  }
36
34
  const simulator = new Simulator()
37
35
 
38
- const mockTransport = new ConnectionManager({ ownPeerDescriptor: mockPeerDescriptor1, simulator: simulator })
39
- const mockConnectorTransport1 = new ConnectionManager({ ownPeerDescriptor: mockPeerDescriptor1, simulator })
40
- const mockConnectorTransport2 = new ConnectionManager({ ownPeerDescriptor: mockPeerDescriptor2, simulator })
36
+ const mockTransport = new SimulatorTransport(mockPeerDescriptor1, simulator)
37
+ const mockConnectorTransport1 = new SimulatorTransport(mockPeerDescriptor1, simulator)
38
+ const mockConnectorTransport2 = new SimulatorTransport(mockPeerDescriptor2, simulator)
39
+
40
+ let createOwnPeerDescriptor: jest.Mock<PeerDescriptor, [ConnectivityResponse]>
41
+
42
+ const createConnectionManager = (opts: Omit<DefaultConnectorFacadeConfig, 'createOwnPeerDescriptor'>) => {
43
+ return new ConnectionManager({
44
+ createConnectorFacade: () => new DefaultConnectorFacade({
45
+ createOwnPeerDescriptor,
46
+ ...opts
47
+ }),
48
+ metricsContext: new MetricsContext()
49
+ })
50
+ }
51
+
52
+ beforeEach(() => {
53
+ createOwnPeerDescriptor = jest.fn().mockImplementation((response) => createPeerDescriptor(response))
54
+ })
55
+
56
+ beforeAll(async () => {
57
+ await mockTransport.start()
58
+ await mockConnectorTransport1.start()
59
+ await mockConnectorTransport2.start()
60
+ })
41
61
 
42
62
  afterAll(async ()=> {
43
63
  await mockTransport.stop()
@@ -46,100 +66,84 @@ describe('ConnectionManager', () => {
46
66
  })
47
67
 
48
68
  it('Can start alone', async () => {
49
- const connectionManager = new ConnectionManager({
50
- transportLayer: mockTransport,
69
+
70
+ const connectionManager = createConnectionManager({
71
+ transport: mockTransport,
51
72
  websocketHost: '127.0.0.1',
52
- websocketPortRange: { min: 9991, max: 9991 }
73
+ websocketPortRange: { min: 9991, max: 9991 },
53
74
  })
54
75
 
55
- await connectionManager.start((report) => {
56
- expect(report.host).toEqual('127.0.0.1')
57
- expect(report.openInternet).toEqual(true)
58
- return createPeerDescriptor(report)
59
- })
76
+ await connectionManager.start()
77
+ expect(createOwnPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
78
+ expect(createOwnPeerDescriptor.mock.calls[0][0].openInternet).toEqual(true)
60
79
 
61
80
  await connectionManager.stop()
62
81
  })
63
82
 
64
83
  it('Throws an async exception if fails to connect to entrypoints', async () => {
65
84
 
66
- const connectionManager = new ConnectionManager({
67
- transportLayer: mockTransport,
85
+ const connectionManager = createConnectionManager({
86
+ transport: mockTransport,
68
87
  websocketPortRange: { min: 9992, max: 9992 },
69
88
  entryPoints: [
70
89
  { kademliaId: Uint8Array.from([1, 2, 3]), type: NodeType.NODEJS, websocket: { host: '127.0.0.1', port: 12345, tls: false } }
71
90
  ]
72
91
  })
73
92
 
74
- await expect(connectionManager.start((report) => {
75
- return createPeerDescriptor(report)
76
- })).rejects.toThrow('Failed to connect to the entrypoints')
93
+ await expect(connectionManager.start()).rejects.toThrow('Failed to connect to the entrypoints')
77
94
 
78
95
  await connectionManager.stop()
79
96
  }, 15000)
80
97
 
81
98
  it('Can probe connectivity in open internet', async () => {
82
- const connectionManager1 = new ConnectionManager({
83
- transportLayer: mockTransport,
99
+ const connectionManager1 = createConnectionManager({
100
+ transport: mockTransport,
84
101
  websocketHost: '127.0.0.1',
85
102
  websocketPortRange: { min: 9993, max: 9993 }
86
103
  })
87
104
 
88
- await connectionManager1.start((report) => {
89
- expect(report.host).toEqual('127.0.0.1')
90
- expect(report.openInternet).toEqual(true)
91
- return createPeerDescriptor(report)
92
- })
105
+ await connectionManager1.start()
106
+ expect(createOwnPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
107
+ expect(createOwnPeerDescriptor.mock.calls[0][0].openInternet).toEqual(true)
93
108
 
94
- const connectionManager2 = new ConnectionManager({
95
- transportLayer: mockConnectorTransport2,
109
+ const connectionManager2 = createConnectionManager({
110
+ transport: mockConnectorTransport2,
96
111
  websocketPortRange: { min: 9994, max: 9994 },
97
112
  entryPoints: [
98
113
  { kademliaId: Uint8Array.from([1, 2, 3]), type: NodeType.NODEJS, websocket: { host: '127.0.0.1', port: 9993, tls: false } }
99
114
  ]
100
115
  })
101
116
 
102
- await connectionManager2.start((report) => {
103
- expect(report.host).toEqual('127.0.0.1')
104
- expect(report.openInternet).toEqual(true)
105
- return createPeerDescriptor(report)
106
- })
117
+ await connectionManager2.start()
118
+ expect(createOwnPeerDescriptor.mock.calls[1][0].host).toEqual('127.0.0.1')
119
+ expect(createOwnPeerDescriptor.mock.calls[1][0].openInternet).toEqual(true)
107
120
 
108
121
  await connectionManager1.stop()
109
122
  await connectionManager2.stop()
110
123
  })
111
124
 
112
125
  it('Can send data to other connectionmanager over websocket', async () => {
113
- const connectionManager1 = new ConnectionManager({
114
- transportLayer: mockConnectorTransport1,
126
+ const connectionManager1 = createConnectionManager({
127
+ transport: mockConnectorTransport1,
115
128
  websocketHost: '127.0.0.1',
116
129
  websocketPortRange: { min: 9995, max: 9995 }
117
130
  })
118
131
 
119
- let peerDescriptor: PeerDescriptor | undefined
132
+ await connectionManager1.start()
133
+ expect(createOwnPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
134
+ expect(createOwnPeerDescriptor.mock.calls[0][0].openInternet).toEqual(true)
120
135
 
121
- await connectionManager1.start((report) => {
122
- expect(report.host).toEqual('127.0.0.1')
123
- expect(report.openInternet).toEqual(true)
124
- peerDescriptor = createPeerDescriptor(report)
125
- return peerDescriptor
126
- })
127
-
128
- const connectionManager2 = new ConnectionManager({
129
- transportLayer: mockConnectorTransport2,
136
+ const connectionManager2 = createConnectionManager({
137
+ transport: mockConnectorTransport2,
130
138
  websocketPortRange: { min: 9996, max: 9996 },
131
139
  entryPoints: [
132
- peerDescriptor!
140
+ connectionManager1.getPeerDescriptor()
133
141
  ]
134
142
  })
135
143
 
136
- let peerDescriptor2: PeerDescriptor | undefined
137
- await connectionManager2.start((report2) => {
138
- expect(report2.host).toEqual('127.0.0.1')
139
- expect(report2.openInternet).toEqual(true)
140
- peerDescriptor2 = createPeerDescriptor(report2)
141
- return peerDescriptor2
142
- })
144
+ await connectionManager2.start()
145
+ expect(createOwnPeerDescriptor.mock.calls[1][0].host).toEqual('127.0.0.1')
146
+ expect(createOwnPeerDescriptor.mock.calls[1][0].openInternet).toEqual(true)
143
147
 
144
148
  const msg: Message = {
145
149
  serviceId,
@@ -159,18 +163,18 @@ describe('ConnectionManager', () => {
159
163
  })
160
164
 
161
165
  const connectedPromise1 = new Promise<void>((resolve, _reject) => {
162
- connectionManager1.on('connected', (_peerDescriptor: PeerDescriptor) => {
166
+ connectionManager1.on('connected', () => {
163
167
  resolve()
164
168
  })
165
169
  })
166
170
 
167
171
  const connectedPromise2 = new Promise<void>((resolve, _reject) => {
168
- connectionManager2.on('connected', (_peerDescriptor: PeerDescriptor) => {
172
+ connectionManager2.on('connected', () => {
169
173
  resolve()
170
174
  })
171
175
  })
172
176
 
173
- msg.targetDescriptor = peerDescriptor2
177
+ msg.targetDescriptor = connectionManager2.getPeerDescriptor()
174
178
  connectionManager1.send(msg)
175
179
 
176
180
  await Promise.all([promise, connectedPromise1, connectedPromise2])
@@ -180,33 +184,25 @@ describe('ConnectionManager', () => {
180
184
  })
181
185
 
182
186
  it('Can disconnect websockets', async () => {
183
- const connectionManager1 = new ConnectionManager({
184
- transportLayer: mockConnectorTransport1,
187
+ const connectionManager1 = createConnectionManager({
188
+ transport: mockConnectorTransport1,
185
189
  websocketHost: '127.0.0.1',
186
190
  websocketPortRange: { min: 9997, max: 9997 }
187
191
  })
188
192
 
189
- let peerDescriptor: PeerDescriptor | undefined
190
- await connectionManager1.start((report) => {
191
- expect(report.host).toEqual('127.0.0.1')
192
- expect(report.openInternet).toEqual(true)
193
- peerDescriptor = createPeerDescriptor(report)
194
- return peerDescriptor
195
- })
193
+ await connectionManager1.start()
194
+ expect(createOwnPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
195
+ expect(createOwnPeerDescriptor.mock.calls[0][0].openInternet).toEqual(true)
196
196
 
197
- const connectionManager2 = new ConnectionManager({
198
- transportLayer: mockConnectorTransport2,
197
+ const connectionManager2 = createConnectionManager({
198
+ transport: mockConnectorTransport2,
199
199
  websocketPortRange: { min: 9999, max: 9999 },
200
200
  entryPoints: [
201
- peerDescriptor!
201
+ connectionManager1.getPeerDescriptor()
202
202
  ]
203
203
  })
204
204
 
205
- let peerDescriptor2: PeerDescriptor | undefined
206
- await connectionManager2.start((report2) => {
207
- peerDescriptor2 = createPeerDescriptor(report2)
208
- return peerDescriptor2
209
- })
205
+ await connectionManager2.start()
210
206
 
211
207
  const msg: Message = {
212
208
  serviceId,
@@ -219,14 +215,14 @@ describe('ConnectionManager', () => {
219
215
  }
220
216
 
221
217
  const disconnectedPromise1 = new Promise<void>((resolve, _reject) => {
222
- connectionManager1.on('disconnected', (_peerDescriptor: PeerDescriptor) => {
218
+ connectionManager1.on('disconnected', () => {
223
219
  logger.info('disconnectedPromise1')
224
220
  resolve()
225
221
  })
226
222
  })
227
223
 
228
224
  const disconnectedPromise2 = new Promise<void>((resolve, _reject) => {
229
- connectionManager2.on('disconnected', (_peerDescriptor: PeerDescriptor) => {
225
+ connectionManager2.on('disconnected', () => {
230
226
  logger.info('disconnectedPromise2')
231
227
  resolve()
232
228
  })
@@ -238,13 +234,13 @@ describe('ConnectionManager', () => {
238
234
  resolve()
239
235
  })
240
236
  })
241
- msg.targetDescriptor = peerDescriptor2
237
+ msg.targetDescriptor = connectionManager2.getPeerDescriptor()
242
238
  connectionManager1.send(msg)
243
239
 
244
240
  await promise
245
241
 
246
242
  // @ts-expect-error private field
247
- connectionManager1.closeConnection(peerDescriptor2)
243
+ connectionManager1.closeConnection(connectionManager2.getPeerDescriptor())
248
244
 
249
245
  await Promise.all([disconnectedPromise1, disconnectedPromise2])
250
246
 
@@ -254,8 +250,10 @@ describe('ConnectionManager', () => {
254
250
 
255
251
  it('Connects and disconnects over simulated connections', async () => {
256
252
  const simulator2 = new Simulator()
257
- const connectionManager3 = new ConnectionManager({ ownPeerDescriptor: mockPeerDescriptor3, simulator: simulator2 })
258
- const connectionManager4 = new ConnectionManager({ ownPeerDescriptor: mockPeerDescriptor4, simulator: simulator2 })
253
+ const connectionManager3 = new SimulatorTransport(mockPeerDescriptor3, simulator2)
254
+ await connectionManager3.start()
255
+ const connectionManager4 = new SimulatorTransport(mockPeerDescriptor4, simulator2)
256
+ await connectionManager4.start()
259
257
 
260
258
  const msg: Message = {
261
259
  serviceId,
@@ -275,25 +273,25 @@ describe('ConnectionManager', () => {
275
273
  })
276
274
 
277
275
  const connectedPromise1 = new Promise<void>((resolve, _reject) => {
278
- connectionManager4.on('connected', (_peerDescriptor: PeerDescriptor) => {
276
+ connectionManager4.on('connected', () => {
279
277
  resolve()
280
278
  })
281
279
  })
282
280
 
283
281
  const connectedPromise2 = new Promise<void>((resolve, _reject) => {
284
- connectionManager3.on('connected', (_peerDescriptor: PeerDescriptor) => {
282
+ connectionManager3.on('connected', () => {
285
283
  resolve()
286
284
  })
287
285
  })
288
286
 
289
287
  const disconnectedPromise1 = new Promise<void>((resolve, _reject) => {
290
- connectionManager4.on('disconnected', (_peerDescriptor: PeerDescriptor) => {
288
+ connectionManager4.on('disconnected', () => {
291
289
  resolve()
292
290
  })
293
291
  })
294
292
 
295
293
  const disconnectedPromise2 = new Promise<void>((resolve, _reject) => {
296
- connectionManager3.on('disconnected', (_peerDescriptor: PeerDescriptor) => {
294
+ connectionManager3.on('disconnected', () => {
297
295
  resolve()
298
296
  })
299
297
  })
@@ -310,17 +308,16 @@ describe('ConnectionManager', () => {
310
308
  })
311
309
 
312
310
  it('Cannot send to own WebSocketServer if kademliaIds do not match', async () => {
313
- const connectionManager1 = new ConnectionManager({
314
- transportLayer: mockTransport,
311
+ const connectionManager1 = createConnectionManager({
312
+ transport: mockTransport,
315
313
  websocketHost: '127.0.0.1',
316
314
  websocketPortRange: { min: 10001, max: 10001 }
317
315
  })
318
316
 
319
- await connectionManager1.start((report) => {
320
- expect(report.host).toEqual('127.0.0.1')
321
- expect(report.openInternet).toEqual(true)
322
- return createPeerDescriptor(report)
323
- })
317
+ await connectionManager1.start()
318
+ expect(createOwnPeerDescriptor.mock.calls[0][0].host).toEqual('127.0.0.1')
319
+ expect(createOwnPeerDescriptor.mock.calls[0][0].openInternet).toEqual(true)
320
+
324
321
  const peerDescriptor = connectionManager1.getPeerDescriptor()
325
322
  peerDescriptor.kademliaId = new Uint8Array([12, 12, 12, 12])
326
323
  const msg: Message = {
@@ -0,0 +1,53 @@
1
+ import { LatencyType, Simulator } from '../../src/connection/Simulator/Simulator'
2
+ import { getRandomRegion } from '../../src/connection/Simulator/pings'
3
+ import { DhtNode } from '../../src/dht/DhtNode'
4
+ import { NodeType } from '../../src/proto/packages/dht/protos/DhtRpc'
5
+ import { createMockConnectionDhtNode } from '../utils/utils'
6
+
7
+ const NUM_OF_NODES_PER_KBUCKET = 8
8
+
9
+ const runTest = async (latencyType: LatencyType) => {
10
+ const simulator = new Simulator(latencyType)
11
+ const entryPointId = '0'
12
+ const entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, undefined, NUM_OF_NODES_PER_KBUCKET)
13
+ const entrypointDescriptor = {
14
+ kademliaId: entryPoint.getNodeId().value,
15
+ type: NodeType.NODEJS,
16
+ region: getRandomRegion()
17
+ }
18
+ const nodes: DhtNode[] = []
19
+ for (let i = 1; i < 100; i++) {
20
+ const nodeId = `${i}`
21
+ const node = await createMockConnectionDhtNode(nodeId, simulator, undefined, NUM_OF_NODES_PER_KBUCKET)
22
+ nodes.push(node)
23
+ }
24
+
25
+ await entryPoint.joinDht([entrypointDescriptor])
26
+ await Promise.all(nodes.map((node) => node.joinDht([entrypointDescriptor])))
27
+ nodes.forEach((node) => {
28
+ expect(node.getBucketSize()).toBeGreaterThanOrEqual(NUM_OF_NODES_PER_KBUCKET / 2)
29
+ expect(node.getClosestContacts().length).toBeGreaterThanOrEqual(NUM_OF_NODES_PER_KBUCKET / 2)
30
+ })
31
+ expect(entryPoint.getBucketSize()).toBeGreaterThanOrEqual(NUM_OF_NODES_PER_KBUCKET / 2)
32
+
33
+ await Promise.all([
34
+ entryPoint.stop(),
35
+ ...nodes.map((node) => node.stop())
36
+ ])
37
+ simulator.stop()
38
+ }
39
+
40
+ describe('DhtJoinPeerDiscovery', () => {
41
+
42
+ it('latency: none', async () => {
43
+ await runTest(LatencyType.NONE)
44
+ }, 60 * 1000)
45
+
46
+ it('latency: random', async () => {
47
+ await runTest(LatencyType.RANDOM)
48
+ }, 60 * 1000)
49
+
50
+ it('latency: real', async () => {
51
+ await runTest(LatencyType.REAL)
52
+ }, 60 * 1000)
53
+ })
@@ -4,8 +4,6 @@ import { DhtRpcServiceClient } from '../../src/proto/packages/dht/protos/DhtRpc.
4
4
  import { generateId } from '../utils/utils'
5
5
  import { ClosestPeersRequest, ClosestPeersResponse, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
6
6
  import { wait } from '@streamr/utils'
7
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
8
- import { DhtCallContext } from '../../src/rpc-protocol/DhtCallContext'
9
7
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
10
8
 
11
9
  describe('DhtRpc', () => {
@@ -24,7 +22,7 @@ describe('DhtRpc', () => {
24
22
  type: NodeType.NODEJS
25
23
  }
26
24
 
27
- const outgoingListener2 = (message: RpcMessage, _requestId: string, _ucallContext?: DhtCallContext) => {
25
+ const outgoingListener2 = (message: RpcMessage) => {
28
26
  rpcCommunicator1.handleIncomingMessage(message)
29
27
  }
30
28
 
@@ -35,7 +33,7 @@ describe('DhtRpc', () => {
35
33
  rpcCommunicator2 = new RpcCommunicator()
36
34
  rpcCommunicator2.registerRpcMethod(ClosestPeersRequest, ClosestPeersResponse, 'getClosestPeers', MockDhtRpc.getClosestPeers)
37
35
 
38
- rpcCommunicator1.on('outgoingMessage', (message: RpcMessage, _requestId: string, _ucallContext?: DhtCallContext) => {
36
+ rpcCommunicator1.on('outgoingMessage', (message: RpcMessage) => {
39
37
  rpcCommunicator2.handleIncomingMessage(message)
40
38
  })
41
39
 
@@ -74,7 +72,7 @@ describe('DhtRpc', () => {
74
72
 
75
73
  it('Default RPC timeout, client side', async () => {
76
74
  rpcCommunicator2.off('outgoingMessage', outgoingListener2)
77
- rpcCommunicator2.on('outgoingMessage', async (_message: RpcMessage, _requestId: string, _ucallContext?: DhtCallContext) => {
75
+ rpcCommunicator2.on('outgoingMessage', async () => {
78
76
  await wait(3000)
79
77
  })
80
78
  const response2 = client2.getClosestPeers(
@@ -92,7 +90,7 @@ describe('DhtRpc', () => {
92
90
  it('Server side timeout', async () => {
93
91
  let timeout: NodeJS.Timeout
94
92
 
95
- async function respondGetClosestPeersWithTimeout(_request: ClosestPeersRequest, _context: ServerCallContext): Promise<ClosestPeersResponse> {
93
+ async function respondGetClosestPeersWithTimeout(): Promise<ClosestPeersResponse> {
96
94
  const neighbors = getMockPeers()
97
95
  const response: ClosestPeersResponse = {
98
96
  peers: neighbors,
@@ -3,7 +3,9 @@ import { PeerID } from '../../src/helpers/PeerID'
3
3
  import { DhtNode } from '../../src/dht/DhtNode'
4
4
  import { createMockConnectionDhtNode, createMockConnectionLayer1Node } from '../utils/utils'
5
5
  import { UUID } from '../../src/helpers/UUID'
6
- import { NodeType } from '../../src/exports'
6
+ import { NodeType } from '../../src/proto/packages/dht/protos/DhtRpc'
7
+
8
+ const NUM_OF_NODES_PER_KBUCKET = 8
7
9
 
8
10
  describe('Layer1', () => {
9
11
 
@@ -12,8 +14,7 @@ describe('Layer1', () => {
12
14
 
13
15
  const entryPoint0Descriptor = {
14
16
  kademliaId: PeerID.fromString(layer0EntryPointId).value,
15
- type: NodeType.NODEJS,
16
- nodeName: layer0EntryPointId
17
+ type: NodeType.NODEJS
17
18
  }
18
19
 
19
20
  let layer0EntryPoint: DhtNode
@@ -38,7 +39,6 @@ describe('Layer1', () => {
38
39
  undefined,
39
40
  undefined,
40
41
  undefined,
41
- undefined,
42
42
  60000
43
43
  )
44
44
  nodes.push(node)
@@ -63,7 +63,7 @@ describe('Layer1', () => {
63
63
  const layer1Nodes: DhtNode[] = []
64
64
  for (let i = 0; i < NODE_COUNT; i++) {
65
65
  const layer0 = nodes[i]
66
- const layer1 = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0)
66
+ const layer1 = await createMockConnectionLayer1Node(layer0.getNodeId().toString(), layer0, undefined, NUM_OF_NODES_PER_KBUCKET)
67
67
  layer1Nodes.push(layer1)
68
68
  layer1CleanUp.push(layer1)
69
69
  }
@@ -75,7 +75,7 @@ describe('Layer1', () => {
75
75
  const layer1Node = layer1Nodes[i]
76
76
  expect(layer1Node.getNodeId().equals(layer0Node.getNodeId())).toEqual(true)
77
77
  expect(layer1Node.getNumberOfConnections()).toEqual(layer0Node.getNumberOfConnections())
78
- expect(layer1Node.getBucketSize()).toBeGreaterThanOrEqual(layer1Node.getK() / 2)
78
+ expect(layer1Node.getBucketSize()).toBeGreaterThanOrEqual(NUM_OF_NODES_PER_KBUCKET / 2)
79
79
  expect(layer1Node.getAllConnectionPeerDescriptors()).toEqual(layer0Node.getAllConnectionPeerDescriptors())
80
80
  }
81
81
  }, 120000)
@@ -163,8 +163,8 @@ describe('Layer1', () => {
163
163
  //
164
164
  // await Promise.all(layer1Nodes.map((node) => node.joinDht(entryPoint0Descriptor)))
165
165
  //
166
- // layer1Nodes.map((sender) => {
167
- // layer1Nodes.map(async (receiver) => {
166
+ // layer1Nodes.forEach((sender) => {
167
+ // layer1Nodes.forEach(async (receiver) => {
168
168
  // if (!sender.getNodeId().equals(receiver.getNodeId())) {
169
169
  // const rpcWrapper = createWrappedClosestPeersRequest(sender.getPeerDescriptor(), receiver.getPeerDescriptor())
170
170
  // const message: Message = {
@@ -6,7 +6,8 @@ import { createMockConnectionDhtNode, waitNodesReadyForTesting } from '../utils/
6
6
  import { execSync } from 'child_process'
7
7
  import fs from 'fs'
8
8
  import { Logger } from '@streamr/utils'
9
- import { PeerID } from '../../src/exports'
9
+ import { PeerID } from '../../src/helpers/PeerID'
10
+ import { keyFromPeerDescriptor } from '../../src/helpers/peerIdFromPeerDescriptor'
10
11
  import { Any } from '../../src/proto/google/protobuf/any'
11
12
  import { SortedContactList } from '../../src/dht/contact/SortedContactList'
12
13
  import { Contact } from '../../src/dht/contact/Contact'
@@ -41,14 +42,13 @@ describe('Migrating data from node to node in DHT', () => {
41
42
  nodes = []
42
43
  const entryPointId = '0'
43
44
  entryPoint = await createMockConnectionDhtNode(entryPointId, simulator,
44
- Uint8Array.from(dhtIds[0].data), K, entryPointId, MAX_CONNECTIONS)
45
+ Uint8Array.from(dhtIds[0].data), K, MAX_CONNECTIONS)
45
46
  nodes.push(entryPoint)
46
47
  nodesById.set(entryPoint.getNodeId().toKey(), entryPoint)
47
48
 
48
49
  entrypointDescriptor = {
49
50
  kademliaId: entryPoint.getNodeId().value,
50
- type: NodeType.NODEJS,
51
- nodeName: entryPointId
51
+ type: NodeType.NODEJS
52
52
  }
53
53
 
54
54
  nodes.push(entryPoint)
@@ -57,7 +57,7 @@ describe('Migrating data from node to node in DHT', () => {
57
57
  const nodeId = `${i}`
58
58
 
59
59
  const node = await createMockConnectionDhtNode(nodeId, simulator,
60
- Uint8Array.from(dhtIds[i].data), K, nodeId, MAX_CONNECTIONS)
60
+ Uint8Array.from(dhtIds[i].data), K, MAX_CONNECTIONS)
61
61
  nodesById.set(node.getNodeId().toKey(), node)
62
62
  nodes.push(node)
63
63
  }
@@ -91,7 +91,7 @@ describe('Migrating data from node to node in DHT', () => {
91
91
 
92
92
  logger.info('Nodes sorted according to distance to data are: ')
93
93
  closest.forEach((contact) => {
94
- logger.info('' + contact.getPeerDescriptor().nodeName)
94
+ logger.info(keyFromPeerDescriptor(contact.getPeerDescriptor()))
95
95
  })
96
96
 
97
97
  logger.info('node 0 joining to the DHT')
@@ -114,13 +114,13 @@ describe('Migrating data from node to node in DHT', () => {
114
114
  hasDataMarker = '<-'
115
115
  }
116
116
 
117
- logger.info(contact.getPeerDescriptor().nodeName + ' ' + node.getPeerDescriptor().nodeName + hasDataMarker)
117
+ logger.info(keyFromPeerDescriptor(contact.getPeerDescriptor()) + ' ' + keyFromPeerDescriptor(node.getPeerDescriptor()) + hasDataMarker)
118
118
  })
119
119
 
120
120
  logger.info(NUM_NODES + ' nodes joining layer0 DHT')
121
121
  await Promise.all(
122
122
  nodes.map((node) => {
123
- if (node.getPeerDescriptor().nodeName != '0') {
123
+ if (keyFromPeerDescriptor(node.getPeerDescriptor()) != '0') {
124
124
  node.joinDht([entrypointDescriptor])
125
125
  }
126
126
  })
@@ -142,7 +142,7 @@ describe('Migrating data from node to node in DHT', () => {
142
142
  hasDataMarker = '<-'
143
143
  }
144
144
 
145
- logger.info('' + node.getPeerDescriptor().nodeName + hasDataMarker)
145
+ logger.info(keyFromPeerDescriptor(node.getPeerDescriptor()) + hasDataMarker)
146
146
  })
147
147
 
148
148
  const closestNode = nodesById.get(PeerID.fromValue(closest[0].getPeerDescriptor().kademliaId).toKey())!
@@ -52,8 +52,7 @@ describe('Layer 1 on Layer 0 with mocked connections', () => {
52
52
 
53
53
  entryPointDescriptor = {
54
54
  kademliaId: layer0EntryPoint.getNodeId().value,
55
- type: NodeType.NODEJS,
56
- nodeName: layer0EntryPointId
55
+ type: NodeType.NODEJS
57
56
  }
58
57
 
59
58
  await layer0EntryPoint.joinDht([entryPointDescriptor])
@@ -2,7 +2,8 @@ import { LatencyType, Simulator } from '../../src/connection/Simulator/Simulator
2
2
  import { DhtNode } from '../../src/dht/DhtNode'
3
3
  import { NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
4
4
  import { createMockConnectionDhtNode, waitConnectionManagersReadyForTesting } from '../utils/utils'
5
- import { PeerID, peerIdFromPeerDescriptor } from '../../src/exports'
5
+ import { PeerID } from '../../src/helpers/PeerID'
6
+ import { peerIdFromPeerDescriptor } from '../../src/helpers/peerIdFromPeerDescriptor'
6
7
 
7
8
  describe('Recursive find correctness', () => {
8
9
 
@@ -16,16 +17,15 @@ describe('Recursive find correctness', () => {
16
17
  beforeEach(async () => {
17
18
  nodes = []
18
19
  const entryPointId = '0'
19
- entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, undefined, K, entryPointId)
20
+ entryPoint = await createMockConnectionDhtNode(entryPointId, simulator, undefined, K)
20
21
  nodes.push(entryPoint)
21
22
  entrypointDescriptor = {
22
23
  kademliaId: entryPoint.getNodeId().value,
23
- type: NodeType.NODEJS,
24
- nodeName: entryPointId
24
+ type: NodeType.NODEJS
25
25
  }
26
26
  for (let i = 1; i < NUM_NODES; i++) {
27
27
  const nodeId = `${i}`
28
- const node = await createMockConnectionDhtNode(nodeId, simulator, undefined, K, nodeId, 20, 60000)
28
+ const node = await createMockConnectionDhtNode(nodeId, simulator, undefined, K, 20, 60000)
29
29
  nodes.push(node)
30
30
  }
31
31
  await entryPoint.joinDht([entrypointDescriptor])