@streamr/dht 102.0.0-beta.1 → 102.0.0-beta.3

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 (211) hide show
  1. package/dist/generated/google/protobuf/any.d.ts +180 -0
  2. package/dist/generated/google/protobuf/any.js +155 -0
  3. package/dist/generated/google/protobuf/any.js.map +1 -0
  4. package/dist/generated/google/protobuf/empty.d.ts +31 -0
  5. package/dist/generated/google/protobuf/empty.js +32 -0
  6. package/dist/generated/google/protobuf/empty.js.map +1 -0
  7. package/dist/generated/google/protobuf/timestamp.d.ts +155 -0
  8. package/dist/generated/google/protobuf/timestamp.js +136 -0
  9. package/dist/generated/google/protobuf/timestamp.js.map +1 -0
  10. package/dist/generated/packages/dht/protos/DhtRpc.client.d.ts +361 -0
  11. package/dist/generated/packages/dht/protos/DhtRpc.client.js +285 -0
  12. package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +1 -0
  13. package/dist/generated/packages/dht/protos/DhtRpc.d.ts +999 -0
  14. package/dist/generated/packages/dht/protos/DhtRpc.js +677 -0
  15. package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -0
  16. package/dist/generated/packages/dht/protos/DhtRpc.server.d.ts +162 -0
  17. package/dist/generated/packages/dht/protos/DhtRpc.server.js +3 -0
  18. package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +1 -0
  19. package/dist/generated/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
  20. package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js +66 -0
  21. package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
  22. package/dist/package.json +7 -7
  23. package/package.json +7 -7
  24. package/eslint.config.mjs +0 -12
  25. package/src/connection/Connection.ts +0 -28
  26. package/src/connection/ConnectionLockRpcLocal.ts +0 -78
  27. package/src/connection/ConnectionLockRpcRemote.ts +0 -64
  28. package/src/connection/ConnectionLockStates.ts +0 -131
  29. package/src/connection/ConnectionManager.ts +0 -661
  30. package/src/connection/ConnectionsView.ts +0 -8
  31. package/src/connection/ConnectorFacade.ts +0 -217
  32. package/src/connection/Handshaker.ts +0 -209
  33. package/src/connection/IConnection.ts +0 -40
  34. package/src/connection/ManagedConnection.ts +0 -113
  35. package/src/connection/OutputBuffer.ts +0 -28
  36. package/src/connection/PendingConnection.ts +0 -68
  37. package/src/connection/connectivityChecker.ts +0 -108
  38. package/src/connection/connectivityRequestHandler.ts +0 -116
  39. package/src/connection/simulator/Simulator.ts +0 -369
  40. package/src/connection/simulator/SimulatorConnection.ts +0 -137
  41. package/src/connection/simulator/SimulatorConnector.ts +0 -98
  42. package/src/connection/simulator/SimulatorTransport.ts +0 -15
  43. package/src/connection/simulator/pings.ts +0 -42
  44. package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -242
  45. package/src/connection/webrtc/IWebrtcConnection.ts +0 -24
  46. package/src/connection/webrtc/NodeWebrtcConnection.ts +0 -245
  47. package/src/connection/webrtc/WebrtcConnector.ts +0 -234
  48. package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +0 -108
  49. package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +0 -60
  50. package/src/connection/webrtc/iceServerAsString.ts +0 -15
  51. package/src/connection/websocket/AbstractWebsocketClientConnection.ts +0 -122
  52. package/src/connection/websocket/AutoCertifierClientFacade.ts +0 -89
  53. package/src/connection/websocket/BrowserWebsocketClientConnection.ts +0 -44
  54. package/src/connection/websocket/NodeWebsocketClientConnection.ts +0 -39
  55. package/src/connection/websocket/WebsocketClientConnector.ts +0 -119
  56. package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +0 -38
  57. package/src/connection/websocket/WebsocketClientConnectorRpcRemote.ts +0 -19
  58. package/src/connection/websocket/WebsocketServer.ts +0 -164
  59. package/src/connection/websocket/WebsocketServerConnection.ts +0 -109
  60. package/src/connection/websocket/WebsocketServerConnector.ts +0 -290
  61. package/src/dht/DhtNode.ts +0 -683
  62. package/src/dht/DhtNodeRpcLocal.ts +0 -84
  63. package/src/dht/DhtNodeRpcRemote.ts +0 -107
  64. package/src/dht/ExternalApiRpcLocal.ts +0 -58
  65. package/src/dht/ExternalApiRpcRemote.ts +0 -41
  66. package/src/dht/PeerManager.ts +0 -305
  67. package/src/dht/contact/Contact.ts +0 -19
  68. package/src/dht/contact/ContactList.ts +0 -43
  69. package/src/dht/contact/RandomContactList.ts +0 -56
  70. package/src/dht/contact/RingContactList.ts +0 -143
  71. package/src/dht/contact/RpcRemote.ts +0 -72
  72. package/src/dht/contact/SortedContactList.ts +0 -173
  73. package/src/dht/contact/getClosestNodes.ts +0 -24
  74. package/src/dht/contact/ringIdentifiers.ts +0 -62
  75. package/src/dht/discovery/DiscoverySession.ts +0 -129
  76. package/src/dht/discovery/PeerDiscovery.ts +0 -244
  77. package/src/dht/discovery/RingDiscoverySession.ts +0 -148
  78. package/src/dht/recursive-operation/RecursiveOperationManager.ts +0 -251
  79. package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +0 -34
  80. package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +0 -43
  81. package/src/dht/recursive-operation/RecursiveOperationSession.ts +0 -231
  82. package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +0 -35
  83. package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +0 -30
  84. package/src/dht/routing/DuplicateDetector.ts +0 -34
  85. package/src/dht/routing/Router.ts +0 -246
  86. package/src/dht/routing/RouterRpcLocal.ts +0 -78
  87. package/src/dht/routing/RouterRpcRemote.ts +0 -80
  88. package/src/dht/routing/RoutingSession.ts +0 -243
  89. package/src/dht/routing/RoutingTablesCache.ts +0 -60
  90. package/src/dht/routing/getPreviousPeer.ts +0 -6
  91. package/src/dht/store/LocalDataStore.ts +0 -84
  92. package/src/dht/store/StoreManager.ts +0 -170
  93. package/src/dht/store/StoreRpcLocal.ts +0 -89
  94. package/src/dht/store/StoreRpcRemote.ts +0 -32
  95. package/src/exports.ts +0 -33
  96. package/src/helpers/AddressTools.ts +0 -28
  97. package/src/helpers/Connectivity.ts +0 -19
  98. package/src/helpers/browser/isBrowserEnvironment.ts +0 -1
  99. package/src/helpers/browser/isBrowserEnvironment_override.ts +0 -3
  100. package/src/helpers/createPeerDescriptor.ts +0 -57
  101. package/src/helpers/createPeerDescriptorSignaturePayload.ts +0 -28
  102. package/src/helpers/debugHelpers.ts +0 -9
  103. package/src/helpers/errors.ts +0 -49
  104. package/src/helpers/offering.ts +0 -15
  105. package/src/helpers/protoClasses.ts +0 -57
  106. package/src/helpers/protoToString.ts +0 -21
  107. package/src/helpers/version.ts +0 -32
  108. package/src/identifiers.ts +0 -29
  109. package/src/rpc-protocol/DhtCallContext.ts +0 -14
  110. package/src/rpc-protocol/DhtRpcOptions.ts +0 -10
  111. package/src/transport/ITransport.ts +0 -37
  112. package/src/transport/ListeningRpcCommunicator.ts +0 -32
  113. package/src/transport/RoutingRpcCommunicator.ts +0 -66
  114. package/src/types/ServiceID.ts +0 -1
  115. package/src/types/textencoding.d.ts +0 -6
  116. package/test/benchmark/Find.test.ts +0 -72
  117. package/test/benchmark/KademliaCorrectness.test.ts +0 -114
  118. package/test/benchmark/RingCorrectness.test.ts +0 -157
  119. package/test/benchmark/SortedContactListBenchmark.test.ts +0 -108
  120. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +0 -41
  121. package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +0 -71
  122. package/test/end-to-end/GeoIpLayer0.test.ts +0 -55
  123. package/test/end-to-end/Layer0-Layer1.test.ts +0 -93
  124. package/test/end-to-end/Layer0.test.ts +0 -76
  125. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +0 -110
  126. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +0 -137
  127. package/test/end-to-end/Layer0Webrtc.test.ts +0 -85
  128. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +0 -82
  129. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +0 -76
  130. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +0 -52
  131. package/test/end-to-end/WebsocketConnectionRequest.test.ts +0 -69
  132. package/test/end-to-end/memory-leak.test.ts +0 -80
  133. package/test/integration/ConnectionLocking.test.ts +0 -192
  134. package/test/integration/ConnectionManager.test.ts +0 -528
  135. package/test/integration/ConnectivityChecking.test.ts +0 -53
  136. package/test/integration/DhtJoinPeerDiscovery.test.ts +0 -49
  137. package/test/integration/DhtNode.test.ts +0 -66
  138. package/test/integration/DhtNodeExternalAPI.test.ts +0 -48
  139. package/test/integration/DhtNodeRpcRemote.test.ts +0 -66
  140. package/test/integration/DhtRpc.test.ts +0 -121
  141. package/test/integration/Find.test.ts +0 -45
  142. package/test/integration/GeoIpConnectivityChecking.test.ts +0 -72
  143. package/test/integration/Layer1-scale.test.ts +0 -189
  144. package/test/integration/Mock-Layer1-Layer0.test.ts +0 -85
  145. package/test/integration/MultipleEntryPointJoining.test.ts +0 -105
  146. package/test/integration/ReplicateData.test.ts +0 -104
  147. package/test/integration/RouteMessage.test.ts +0 -230
  148. package/test/integration/RouterRpcRemote.test.ts +0 -77
  149. package/test/integration/SimultaneousConnections.test.ts +0 -316
  150. package/test/integration/Store.test.ts +0 -85
  151. package/test/integration/StoreAndDelete.test.ts +0 -77
  152. package/test/integration/StoreOnDhtWithThreeNodes.test.ts +0 -59
  153. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +0 -51
  154. package/test/integration/StoreRpcRemote.test.ts +0 -54
  155. package/test/integration/WebrtcConnectionManagement.test.ts +0 -191
  156. package/test/integration/WebrtcConnectorRpc.test.ts +0 -125
  157. package/test/integration/Websocket.test.ts +0 -65
  158. package/test/integration/WebsocketClientConnectorRpc.test.ts +0 -69
  159. package/test/integration/WebsocketConnectionManagement.test.ts +0 -191
  160. package/test/integration/rpc-connections-over-webrtc.test.ts +0 -123
  161. package/test/kademlia-simulation/data/nodeids.json +0 -13002
  162. package/test/kademlia-simulation/data/orderedneighbors.json +0 -1001
  163. package/test/types/global.d.ts +0 -1
  164. package/test/unit/AddressTools.test.ts +0 -44
  165. package/test/unit/AutoCertifierClientFacade.test.ts +0 -58
  166. package/test/unit/ConnectionManager.test.ts +0 -65
  167. package/test/unit/ConnectivityHelpers.test.ts +0 -61
  168. package/test/unit/DiscoverySession.test.ts +0 -87
  169. package/test/unit/DuplicateDetector.test.ts +0 -31
  170. package/test/unit/Handshaker.test.ts +0 -169
  171. package/test/unit/ListeningRpcCommunicator.test.ts +0 -52
  172. package/test/unit/LocalDataStore.test.ts +0 -108
  173. package/test/unit/ManagedConnection.test.ts +0 -58
  174. package/test/unit/PeerManager.test.ts +0 -93
  175. package/test/unit/PendingConnection.test.ts +0 -57
  176. package/test/unit/ProtobufMessage.test.ts +0 -21
  177. package/test/unit/RandomContactList.test.ts +0 -58
  178. package/test/unit/RecursiveOperationManager.test.ts +0 -161
  179. package/test/unit/RecursiveOperationSession.test.ts +0 -68
  180. package/test/unit/Router.test.ts +0 -137
  181. package/test/unit/RoutingSession.test.ts +0 -86
  182. package/test/unit/SortedContactList.test.ts +0 -115
  183. package/test/unit/StoreManager.test.ts +0 -146
  184. package/test/unit/StoreRpcLocal.test.ts +0 -167
  185. package/test/unit/WebrtcConnection.test.ts +0 -29
  186. package/test/unit/WebrtcConnector.test.ts +0 -56
  187. package/test/unit/WebsocketClientConnector.test.ts +0 -101
  188. package/test/unit/WebsocketServer.test.ts +0 -66
  189. package/test/unit/WebsocketServerConnector.test.ts +0 -102
  190. package/test/unit/connectivityRequestHandler.test.ts +0 -104
  191. package/test/unit/createPeerDescriptor.test.ts +0 -69
  192. package/test/unit/customMatchers.test.ts +0 -34
  193. package/test/unit/getClosestNodes.test.ts +0 -30
  194. package/test/unit/version.test.ts +0 -18
  195. package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +0 -18
  196. package/test/utils/FakeConnectorFacade.ts +0 -41
  197. package/test/utils/FakeRpcCommunicator.ts +0 -23
  198. package/test/utils/FakeTransport.ts +0 -79
  199. package/test/utils/customMatchers.ts +0 -71
  200. package/test/utils/mock/MockConnection.ts +0 -26
  201. package/test/utils/mock/MockConnectionsView.ts +0 -18
  202. package/test/utils/mock/MockRouter.ts +0 -62
  203. package/test/utils/mock/MockRpcCommunicator.ts +0 -7
  204. package/test/utils/mock/MockTransport.ts +0 -26
  205. package/test/utils/mock/mockDataEntry.ts +0 -38
  206. package/test/utils/topology.ts +0 -79
  207. package/test/utils/utils.ts +0 -268
  208. package/tsconfig.browser.json +0 -17
  209. package/tsconfig.jest.json +0 -25
  210. package/tsconfig.json +0 -3
  211. package/tsconfig.node.json +0 -24
@@ -1 +0,0 @@
1
- import 'jest-extended'
@@ -1,44 +0,0 @@
1
- import { getAddressFromIceCandidate, isPrivateIPv4 } from '../../src/helpers/AddressTools'
2
-
3
- describe('getAddressFromIceCandidate', () => {
4
- it('extract IPv4 address from ICE host candidate', () => {
5
- expect(getAddressFromIceCandidate('candidate:1 1 udp 2122262783 203.0.113.180 4444 typ host'))
6
- .toEqual('203.0.113.180')
7
- })
8
-
9
- it('extract IPv4 address from ICE server reflexive candidate', () => {
10
- expect(getAddressFromIceCandidate('candidate:1 1 udp 2122262783 198.51.100.130 4445 typ srflx raddr 0.0.0.0 rport 0'))
11
- .toEqual('198.51.100.130')
12
- })
13
-
14
- it('extract IPv6 address from ICE candidate', () => {
15
- expect(getAddressFromIceCandidate('candidate:1 1 udp 3756231458 2001:db8::4125:918c:4402:cc54 6666 typ host'))
16
- .toEqual('2001:db8::4125:918c:4402:cc54')
17
- })
18
-
19
- it('fail on mDNS ICE candidate', () => {
20
- expect(getAddressFromIceCandidate('candidate:1 1 udp 2122296321 9b36eaac-bb2e-49bb-bb78-21c41c499900.local 7000 typ host')).toBeUndefined()
21
- })
22
- })
23
-
24
- describe('isPrivateIPv4', () => {
25
- it('return true for range 10.0.0.0/8', () => {
26
- expect(isPrivateIPv4('10.11.12.13')).toBe(true)
27
- })
28
-
29
- it('return true for range 172.16.0.0/12', () => {
30
- expect(isPrivateIPv4('172.16.130.131')).toBe(true)
31
- })
32
-
33
- it('return true for range 192.168.0.0/16', () => {
34
- expect(isPrivateIPv4('192.168.1.1')).toBe(true)
35
- })
36
-
37
- it('return false for a public address', () => {
38
- expect(isPrivateIPv4('203.0.113.181')).toBe(false)
39
- })
40
-
41
- it('return true for localhost IP address', () => {
42
- expect(isPrivateIPv4('127.0.0.1')).toBe(true)
43
- })
44
- })
@@ -1,58 +0,0 @@
1
- import EventEmitter from 'eventemitter3'
2
- import { AutoCertifierClientFacade, IAutoCertifierClient } from '../../src/connection/websocket/AutoCertifierClientFacade'
3
- import { MockTransport } from '../utils/mock/MockTransport'
4
-
5
- class MockAutoCertifierClient extends EventEmitter {
6
- start = async () => {
7
- this.emit('updatedCertificate', {})
8
- }
9
- // eslint-disable-next-line class-methods-use-this
10
- stop = () => {}
11
- emitUpdateSubdomain = () => {
12
- this.emit('updatedCertificate', {})
13
- }
14
- }
15
-
16
- describe('AutoCertifierClientFacade', () => {
17
-
18
- let client: AutoCertifierClientFacade
19
- let mockClient: IAutoCertifierClient
20
- let setHost: jest.Mock
21
- let updateCertificate: jest.Mock
22
-
23
- beforeEach(() => {
24
- mockClient = new MockAutoCertifierClient()
25
- const mockClientFactory = (): IAutoCertifierClient => mockClient
26
- setHost = jest.fn()
27
- updateCertificate = jest.fn()
28
- client = new AutoCertifierClientFacade({
29
- url: '',
30
- configFile: '',
31
- transport: new MockTransport(),
32
- wsServerPort: 0,
33
- setHost,
34
- updateCertificate,
35
- createClientFactory: mockClientFactory
36
- })
37
- })
38
-
39
- afterEach(() => {
40
- client.stop()
41
- })
42
-
43
- it('start', async () => {
44
- await client.start()
45
- expect(setHost).toHaveBeenCalled()
46
- expect(updateCertificate).toHaveBeenCalled()
47
- })
48
-
49
- it('updated events are processed', async () => {
50
- await client.start()
51
- expect(setHost).toHaveBeenCalledTimes(1)
52
- expect(updateCertificate).toHaveBeenCalledTimes(1);
53
- (mockClient as MockAutoCertifierClient).emitUpdateSubdomain()
54
- expect(setHost).toHaveBeenCalledTimes(2)
55
- expect(updateCertificate).toHaveBeenCalledTimes(2)
56
- })
57
-
58
- })
@@ -1,65 +0,0 @@
1
- import { MetricsContext } from '@streamr/utils'
2
- import { ConnectionManager } from '../../src/connection/ConnectionManager'
3
- import { toNodeId, PendingConnection } from '../../src/exports'
4
- import { FakeConnectorFacade } from '../utils/FakeConnectorFacade'
5
- import { MockConnection } from '../utils/mock/MockConnection'
6
- import { createMockPeerDescriptor } from '../utils/utils'
7
- import { getOfferer } from '../../src/helpers/offering'
8
-
9
- describe('ConnetionManager', () => {
10
-
11
- let connectionManager: ConnectionManager
12
- let fakeConnectorFacade: FakeConnectorFacade
13
- const localPeerDescriptor = createMockPeerDescriptor()
14
-
15
- beforeEach(async () => {
16
- connectionManager = new ConnectionManager({
17
- metricsContext: new MetricsContext(),
18
- allowIncomingPrivateConnections: false,
19
- createConnectorFacade: () => {
20
- fakeConnectorFacade = new FakeConnectorFacade(localPeerDescriptor)
21
- return fakeConnectorFacade
22
- }
23
- })
24
- await connectionManager.start()
25
- })
26
-
27
- afterEach(async () => {
28
- await connectionManager.stop()
29
- })
30
-
31
- it('should replace a duplicate connecting connection', () => {
32
- const remotePeerDescriptor = createMockPeerDescriptor()
33
- const pendingConnection1 = new PendingConnection(remotePeerDescriptor)
34
- const offerer = getOfferer(toNodeId(localPeerDescriptor), toNodeId(remotePeerDescriptor))
35
- const accepted1 = fakeConnectorFacade.callOnNewConnection(pendingConnection1)
36
- expect(accepted1).toBeTrue()
37
- const pendingConnection2 = new PendingConnection(remotePeerDescriptor)
38
- const accepted2 = fakeConnectorFacade.callOnNewConnection(pendingConnection2)
39
-
40
- expect(accepted2).toBe(offerer === 'remote')
41
-
42
- pendingConnection1.close(true)
43
- pendingConnection2.close(true)
44
- })
45
-
46
- it('should replace a duplicate connected connection', () => {
47
- const remotePeerDescriptor = createMockPeerDescriptor()
48
- const pendingConnection1 = new PendingConnection(remotePeerDescriptor)
49
- const offerer = getOfferer(toNodeId(localPeerDescriptor), toNodeId(remotePeerDescriptor))
50
- const accepted1 = fakeConnectorFacade.callOnNewConnection(pendingConnection1)
51
- expect(accepted1).toBeTrue()
52
- pendingConnection1.onHandshakeCompleted(new MockConnection())
53
- const pendingConnection2 = new PendingConnection(remotePeerDescriptor)
54
- const accepted2 = fakeConnectorFacade.callOnNewConnection(pendingConnection2)
55
- if (accepted2) {
56
- pendingConnection1.onHandshakeCompleted(new MockConnection())
57
- }
58
- expect(accepted2).toBe(offerer === 'remote')
59
-
60
- pendingConnection1.close(true)
61
- pendingConnection2.close(true)
62
- })
63
-
64
- })
65
-
@@ -1,61 +0,0 @@
1
- import { NodeType } from '../../generated/packages/dht/protos/DhtRpc'
2
- import { expectedConnectionType } from '../../src/helpers/Connectivity'
3
- import { ConnectionType } from '../../src/connection/IConnection'
4
- import { createMockPeerDescriptor } from '../utils/utils'
5
-
6
- describe('Connectivity helpers', () => {
7
-
8
- const tlsServerPeerDescriptor = createMockPeerDescriptor({
9
- websocket: {
10
- host: 'mock',
11
- port: 1234,
12
- tls: true
13
- }
14
- })
15
- const noTlsServerPeerDescriptor = createMockPeerDescriptor({
16
- websocket: {
17
- host: 'mock',
18
- port: 1234,
19
- tls: false
20
- }
21
- })
22
- const browserPeerDescriptor = createMockPeerDescriptor({
23
- type: NodeType.BROWSER
24
- })
25
- const noServerPeerDescriptor = createMockPeerDescriptor({
26
- type: NodeType.NODEJS
27
- })
28
-
29
- it('two server peers', () => {
30
- expect(expectedConnectionType(tlsServerPeerDescriptor, tlsServerPeerDescriptor)).toBe(ConnectionType.WEBSOCKET_CLIENT)
31
- })
32
-
33
- it('server to noServer', () => {
34
- expect(expectedConnectionType(tlsServerPeerDescriptor, noServerPeerDescriptor)).toBe(ConnectionType.WEBSOCKET_SERVER)
35
- })
36
-
37
- it('no server to server', () => {
38
- expect(expectedConnectionType(noServerPeerDescriptor, tlsServerPeerDescriptor)).toBe(ConnectionType.WEBSOCKET_CLIENT)
39
- })
40
-
41
- it('no server to no server', () => {
42
- expect(expectedConnectionType(noServerPeerDescriptor, noServerPeerDescriptor)).toBe(ConnectionType.WEBRTC)
43
- })
44
-
45
- it('browser to tls server', () => {
46
- expect(expectedConnectionType(browserPeerDescriptor, tlsServerPeerDescriptor)).toBe(ConnectionType.WEBSOCKET_CLIENT)
47
- })
48
-
49
- it('tls server to browser', () => {
50
- expect(expectedConnectionType(tlsServerPeerDescriptor, browserPeerDescriptor)).toBe(ConnectionType.WEBSOCKET_SERVER)
51
- })
52
-
53
- it('browser to no tls server', () => {
54
- expect(expectedConnectionType(browserPeerDescriptor, noTlsServerPeerDescriptor)).toBe(ConnectionType.WEBRTC)
55
- })
56
-
57
- it('no tls server to browser', () => {
58
- expect(expectedConnectionType(noTlsServerPeerDescriptor, browserPeerDescriptor)).toBe(ConnectionType.WEBRTC)
59
- })
60
-
61
- })
@@ -1,87 +0,0 @@
1
- import { Multimap, wait } from '@streamr/utils'
2
- import { sampleSize } from 'lodash'
3
- import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote'
4
- import { PeerManager, getDistance } from '../../src/dht/PeerManager'
5
- import { DiscoverySession } from '../../src/dht/discovery/DiscoverySession'
6
- import { DhtAddress, toNodeId, toDhtAddressRaw } from '../../src/identifiers'
7
- import { NodeType, PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc'
8
- import { createTestTopology } from '../utils/topology'
9
- import { getClosestNodes } from '../../src/dht/contact/getClosestNodes'
10
-
11
- const NODE_COUNT = 40
12
- const MIN_NEIGHBOR_COUNT = 2 // nodes can get more neighbors when we merge network partitions
13
- const PARALLELISM = 1
14
- const NO_PROGRESS_LIMIT = 1
15
- const QUERY_BATCH_SIZE = 5 // the default value in DhtNode's options, not relevant in this test
16
-
17
- const createPeerDescriptor = (nodeId: DhtAddress): PeerDescriptor => {
18
- return {
19
- nodeId: toDhtAddressRaw(nodeId),
20
- type: NodeType.NODEJS
21
- }
22
- }
23
-
24
- describe('DiscoverySession', () => {
25
-
26
- let topology: Multimap<DhtAddress, DhtAddress>
27
- const queriedNodes: DhtAddress[] = []
28
-
29
- beforeAll(() => {
30
- topology = createTestTopology(NODE_COUNT, MIN_NEIGHBOR_COUNT)
31
- })
32
-
33
- const createPeerManager = (localNodeId: DhtAddress): PeerManager => {
34
- const peerManager = new PeerManager({
35
- localNodeId,
36
- localPeerDescriptor: createPeerDescriptor(localNodeId),
37
- isLayer0: true,
38
- createDhtNodeRpcRemote: (peerDescriptor: PeerDescriptor) => createMockRpcRemote(peerDescriptor) as any,
39
- hasConnection: () => true
40
- } as any)
41
- for (const neighbor of topology.get(localNodeId)) {
42
- peerManager.addContact(createPeerDescriptor(neighbor))
43
- }
44
- return peerManager
45
- }
46
-
47
- const createMockRpcRemote = (peerDescriptor: PeerDescriptor): Partial<DhtNodeRpcRemote> => {
48
- const nodeId = toNodeId(peerDescriptor)
49
- return {
50
- id: toDhtAddressRaw(nodeId),
51
- getPeerDescriptor: () => peerDescriptor,
52
- getNodeId: () => nodeId,
53
- getClosestPeers: async (referenceId: DhtAddress) => {
54
- queriedNodes.push(nodeId)
55
- await wait(10)
56
- const peerManager = createPeerManager(nodeId)
57
- return getClosestNodes(referenceId, peerManager.getNeighbors().map((n) => n.getPeerDescriptor()), { maxCount: QUERY_BATCH_SIZE })
58
- },
59
- ping: async () => true
60
- }
61
- }
62
-
63
- it('happy path', async () => {
64
- const nodeIds = [...topology.keys()]
65
- const [localNodeId, targetId] = sampleSize(nodeIds, 2)
66
- const contactedPeers = new Set<DhtAddress>()
67
- const peerManager = createPeerManager(localNodeId)
68
- const session = new DiscoverySession({
69
- targetId,
70
- parallelism: PARALLELISM,
71
- noProgressLimit: NO_PROGRESS_LIMIT,
72
- peerManager,
73
- contactedPeers,
74
- abortSignal: new AbortController().signal,
75
- createDhtNodeRpcRemote: (peerDescriptor: PeerDescriptor) => createMockRpcRemote(peerDescriptor) as any
76
- })
77
- await session.findClosestNodes(1000)
78
- expect(queriedNodes.length).toBeGreaterThanOrEqual(1)
79
- // Each queried node should closer to the target than the previous queried node, because we
80
- // use parallelism=1 and noProgressLimit=1
81
- const distancesToTarget = queriedNodes
82
- .map((nodeId) => getDistance(toDhtAddressRaw(nodeId), toDhtAddressRaw(targetId)))
83
- for (let i = 1; i < distancesToTarget.length ; i++) {
84
- expect(distancesToTarget[i]).toBeLessThan(distancesToTarget[i - 1])
85
- }
86
- })
87
- })
@@ -1,31 +0,0 @@
1
- import { DuplicateDetector } from '../../src/dht/routing/DuplicateDetector'
2
-
3
- const MAX_VALUE_COUNT = 10
4
-
5
- describe('Duplicate Detector', () => {
6
-
7
- let detector: DuplicateDetector
8
-
9
- beforeEach(async () => {
10
- detector = new DuplicateDetector(MAX_VALUE_COUNT)
11
- })
12
-
13
- it('detects duplicates', async () => {
14
- detector.add('test')
15
- expect(detector.size()).toEqual(1)
16
- expect(detector.isMostLikelyDuplicate('test')).toEqual(true)
17
- })
18
-
19
- it('removes from tail when full', () => {
20
- for (let i = 0; i < MAX_VALUE_COUNT; i++) {
21
- detector.add(`test${i}`)
22
- }
23
- for (let i = 0; i < MAX_VALUE_COUNT; i++) {
24
- expect(detector.isMostLikelyDuplicate(`test${i}`)).toEqual(true)
25
- }
26
- detector.add('test10')
27
- expect(detector.size()).toEqual(10)
28
- expect(detector.isMostLikelyDuplicate('test0')).toEqual(false)
29
- expect(detector.isMostLikelyDuplicate('test10')).toEqual(true)
30
- })
31
- })
@@ -1,169 +0,0 @@
1
- import EventEmitter from 'eventemitter3'
2
- import {
3
- acceptHandshake,
4
- createHandshakeRequest,
5
- createHandshakeResponse,
6
- createIncomingHandshaker,
7
- createOutgoingHandshaker,
8
- Handshaker,
9
- rejectHandshake
10
- } from '../../src/connection/Handshaker'
11
- import { ConnectionEvents, IConnection } from '../../src/connection/IConnection'
12
- import { createMockPeerDescriptor } from '../utils/utils'
13
- import { HandshakeError, Message } from '../../generated/packages/dht/protos/DhtRpc'
14
- import { PendingConnection } from '../../src/connection/PendingConnection'
15
-
16
- describe('Handshaker', () => {
17
-
18
- let handshaker: Handshaker
19
- let pendingConnection: PendingConnection
20
- let connection: IConnection
21
-
22
- let mockOnHandshakeCompleted: () => void
23
- let mockSend: () => void
24
- let mockConnectionClose: () => void
25
- let mockPendingConnectionClose: () => void
26
- let mockPendingConnectionDestroy: () => void
27
- let mockConnectionDestroy: () => void
28
-
29
- beforeEach(() => {
30
- mockOnHandshakeCompleted = jest.fn()
31
- mockPendingConnectionClose = jest.fn()
32
- mockPendingConnectionDestroy = jest.fn()
33
- mockConnectionDestroy = jest.fn()
34
- pendingConnection = new class extends EventEmitter {
35
- // eslint-disable-next-line class-methods-use-this
36
- attachConnection() {
37
- mockOnHandshakeCompleted()
38
- }
39
- // eslint-disable-next-line class-methods-use-this
40
- close() {
41
- mockPendingConnectionClose()
42
- }
43
-
44
- // eslint-disable-next-line class-methods-use-this
45
- destroy() {
46
- mockPendingConnectionDestroy()
47
- }
48
-
49
- // eslint-disable-next-line class-methods-use-this
50
- onHandshakeCompleted(_connection: IConnection) {
51
- mockOnHandshakeCompleted()
52
- }
53
- } as any
54
-
55
- mockSend = jest.fn()
56
- mockConnectionClose = jest.fn()
57
- connection = new class extends EventEmitter<ConnectionEvents> {
58
- // eslint-disable-next-line class-methods-use-this
59
- send(_message: any) {
60
- mockSend()
61
- }
62
- // eslint-disable-next-line class-methods-use-this
63
- close() {
64
- mockConnectionClose()
65
- }
66
-
67
- // eslint-disable-next-line class-methods-use-this
68
- destroy() {
69
- mockConnectionDestroy()
70
- }
71
- } as any
72
- })
73
-
74
- describe('Outgoing', () => {
75
-
76
- beforeEach(() => {
77
- handshaker = createOutgoingHandshaker(
78
- createMockPeerDescriptor(),
79
- pendingConnection,
80
- connection,
81
- createMockPeerDescriptor()
82
- )
83
- })
84
-
85
- afterEach(() => {
86
- handshaker.stop()
87
- })
88
-
89
- it('sends request after connected', () => {
90
- (connection as any).emit('connected')
91
- expect(mockSend).toHaveBeenCalledTimes(1)
92
- })
93
-
94
- it('onHandshakeCompleted', () => {
95
- const message = createHandshakeResponse(createMockPeerDescriptor());
96
- (connection as any).emit('data', Message.toBinary(message))
97
- handshaker.emit('handshakeCompleted', createMockPeerDescriptor())
98
- expect(mockOnHandshakeCompleted).toHaveBeenCalledTimes(1)
99
- })
100
-
101
- it('onHandshakeFailed invalid PeerDescriptor', () => {
102
- handshaker.emit('handshakeFailed', HandshakeError.INVALID_TARGET_PEER_DESCRIPTOR)
103
- expect(mockOnHandshakeCompleted).not.toHaveBeenCalled()
104
- })
105
-
106
- it('onHandshakeFailed unsupported version', () => {
107
- handshaker.emit('handshakeFailed', HandshakeError.UNSUPPORTED_PROTOCOL_VERSION)
108
- expect(mockOnHandshakeCompleted).not.toHaveBeenCalled()
109
- expect(mockPendingConnectionClose).toHaveBeenCalledTimes(1)
110
- })
111
-
112
- it('onHandShakeFailed ', () => {
113
- handshaker.emit('handshakeFailed', HandshakeError.DUPLICATE_CONNECTION)
114
- expect(mockPendingConnectionDestroy).not.toHaveBeenCalled()
115
- expect(mockOnHandshakeCompleted).not.toHaveBeenCalled()
116
- })
117
-
118
- it('calls pending connection close if connection closes', () => {
119
- (connection as any).emit('disconnected')
120
- expect(mockPendingConnectionClose).toHaveBeenCalledTimes(1)
121
- })
122
-
123
- it('closes connection if managed connection closes', () => {
124
- (pendingConnection as any).emit('disconnected')
125
- expect(mockConnectionClose).toHaveBeenCalledTimes(1)
126
- })
127
-
128
- })
129
-
130
- describe('Incoming', () => {
131
-
132
- beforeEach(() => {
133
- handshaker = createIncomingHandshaker(createMockPeerDescriptor(), pendingConnection, connection)
134
- })
135
-
136
- afterEach(() => {
137
- handshaker.stop()
138
- })
139
-
140
- it('onHandshakeRequest', () => {
141
- const message = createHandshakeRequest(createMockPeerDescriptor(), createMockPeerDescriptor());
142
- (connection as any).emit('data', Message.toBinary(message))
143
- handshaker.emit('handshakeRequest', createMockPeerDescriptor(), '1.0')
144
- })
145
-
146
- it('calls pending connection onDisconnected if connection closes', () => {
147
- (connection as any).emit('disconnected')
148
- expect(mockPendingConnectionClose).toHaveBeenCalledTimes(1)
149
- })
150
-
151
- it('closes connection if managed connection closes', () => {
152
- (pendingConnection as any).emit('disconnected')
153
- expect(mockConnectionClose).toHaveBeenCalledTimes(1)
154
- })
155
-
156
- it('destroys connection if handshake is rejected', () => {
157
- rejectHandshake(pendingConnection, connection, handshaker, HandshakeError.DUPLICATE_CONNECTION)
158
- expect(mockPendingConnectionDestroy).toHaveBeenCalled()
159
- expect(mockConnectionDestroy).toHaveBeenCalled()
160
- })
161
-
162
- it('calls onHandshakeCompleted if handshake is accepted', () => {
163
- acceptHandshake(handshaker, pendingConnection, connection)
164
- expect(mockOnHandshakeCompleted).toHaveBeenCalled()
165
- })
166
-
167
- })
168
-
169
- })
@@ -1,52 +0,0 @@
1
- import { until } from '@streamr/utils'
2
- import { ListeningRpcCommunicator } from '../../src/transport/ListeningRpcCommunicator'
3
- import { MockTransport } from '../utils/mock/MockTransport'
4
- import { createMockPeerDescriptor } from '../utils/utils'
5
- import { RpcMessage } from '@streamr/proto-rpc'
6
- import { Deferred, RpcMetadata, RpcStatus } from '@protobuf-ts/runtime-rpc'
7
-
8
- const createDeferredPromises = () => {
9
-
10
- const defHeader = new Deferred<RpcMetadata>()
11
- const defMessage = new Deferred<any>()
12
- const defStatus = new Deferred<RpcStatus>()
13
- const defTrailer = new Deferred<RpcMetadata>()
14
-
15
- const deferredParser = () => {}
16
- return {
17
- message: defMessage,
18
- header: defHeader,
19
- trailer: defTrailer,
20
- status: defStatus,
21
- messageParser: deferredParser as any
22
- }
23
- }
24
-
25
- describe('ListeningRpcCommunicator', () => {
26
- const SERVICE_ID = 'test'
27
- let rpcCommunicator: ListeningRpcCommunicator
28
- let transport: MockTransport
29
-
30
- beforeEach(() => {
31
- transport = new MockTransport()
32
- rpcCommunicator = new ListeningRpcCommunicator(SERVICE_ID, transport)
33
- })
34
-
35
- afterEach(() => {
36
- rpcCommunicator.destroy()
37
- transport.stop()
38
- })
39
-
40
- it('rejects requests on disconnect event to the target', async () => {
41
- const peerDescriptor = createMockPeerDescriptor()
42
- rpcCommunicator.getRpcClientTransport().emit(
43
- 'rpcRequest',
44
- RpcMessage.create(),
45
- { targetDescriptor: peerDescriptor }, createDeferredPromises()
46
- )
47
- await until(() => rpcCommunicator.getRequestIds(() => true).length > 0)
48
- transport.emit('disconnected', peerDescriptor, false)
49
- await until(() => rpcCommunicator.getRequestIds(() => true).length === 0)
50
- }, 10000)
51
-
52
- })
@@ -1,108 +0,0 @@
1
- import { wait } from '@streamr/utils'
2
- import { LocalDataStore } from '../../src/dht/store/LocalDataStore'
3
- import { createMockPeerDescriptor } from '../utils/utils'
4
- import { createMockDataEntry } from '../utils/mock/mockDataEntry'
5
- import { randomDhtAddress, toDhtAddress, toNodeId } from '../../src/identifiers'
6
-
7
- describe('LocalDataStore', () => {
8
-
9
- let localDataStore: LocalDataStore
10
-
11
- beforeEach(() => {
12
- localDataStore = new LocalDataStore(30 * 1000)
13
- })
14
-
15
- afterEach(() => {
16
- localDataStore.clear()
17
- })
18
-
19
- it('can store', () => {
20
- const storedEntry = createMockDataEntry()
21
- localDataStore.storeEntry(storedEntry)
22
- const fetchedEntries = Array.from(localDataStore.values(toDhtAddress(storedEntry.key)))
23
- expect(fetchedEntries).toIncludeSameMembers([storedEntry])
24
- })
25
-
26
- it('multiple storers behind one key', () => {
27
- const creator1 = randomDhtAddress()
28
- const creator2 = randomDhtAddress()
29
- const key = randomDhtAddress()
30
- const storedEntry1 = createMockDataEntry({ key, creator: creator1 })
31
- const storedEntry2 = createMockDataEntry({ key, creator: creator2 })
32
- localDataStore.storeEntry(storedEntry1)
33
- localDataStore.storeEntry(storedEntry2)
34
- const fetchedEntries = Array.from(localDataStore.values(key))
35
- expect(fetchedEntries).toIncludeSameMembers([storedEntry1, storedEntry2])
36
- })
37
-
38
- it('can remove data entries', () => {
39
- const creator1 = randomDhtAddress()
40
- const creator2 = randomDhtAddress()
41
- const key = randomDhtAddress()
42
- const storedEntry1 = createMockDataEntry({ key, creator: creator1 })
43
- const storedEntry2 = createMockDataEntry({ key, creator: creator2 })
44
- localDataStore.storeEntry(storedEntry1)
45
- localDataStore.storeEntry(storedEntry2)
46
- localDataStore.deleteEntry(key, creator1)
47
- const fetchedEntries = Array.from(localDataStore.values(key))
48
- expect(fetchedEntries).toIncludeSameMembers([storedEntry2])
49
- })
50
-
51
- it('can remove all data entries', () => {
52
- const creator1 = randomDhtAddress()
53
- const creator2 = randomDhtAddress()
54
- const key = randomDhtAddress()
55
- const storedEntry1 = createMockDataEntry({ key, creator: creator1 })
56
- const storedEntry2 = createMockDataEntry({ key, creator: creator2 })
57
- localDataStore.storeEntry(storedEntry1)
58
- localDataStore.storeEntry(storedEntry2)
59
- localDataStore.deleteEntry(key, creator1)
60
- localDataStore.deleteEntry(key, creator2)
61
- expect(Array.from(localDataStore.values(key))).toHaveLength(0)
62
- })
63
-
64
- it('data is deleted after TTL', async () => {
65
- const storedEntry = createMockDataEntry({ ttl: 1000 })
66
- localDataStore.storeEntry(storedEntry)
67
- expect(Array.from(localDataStore.values(toDhtAddress(storedEntry.key)))).toHaveLength(1)
68
- await wait(1100)
69
- expect(Array.from(localDataStore.values(toDhtAddress(storedEntry.key)))).toHaveLength(0)
70
- })
71
-
72
- describe('mark data as deleted', () => {
73
-
74
- it('happy path', () => {
75
- const creator1 = randomDhtAddress()
76
- const storedEntry = createMockDataEntry({ creator: creator1 })
77
- localDataStore.storeEntry(storedEntry)
78
- const notDeletedData = Array.from(localDataStore.values(toDhtAddress(storedEntry.key)))
79
- expect(notDeletedData[0].deleted).toBeFalse()
80
- const returnValue = localDataStore.markAsDeleted(
81
- toDhtAddress(storedEntry.key),
82
- creator1
83
- )
84
- expect(returnValue).toBe(true)
85
- const deletedData = Array.from(localDataStore.values(toDhtAddress(storedEntry.key)))
86
- expect(deletedData[0].deleted).toBeTrue()
87
- })
88
-
89
- it('data not stored', () => {
90
- const key = randomDhtAddress()
91
- const returnValue = localDataStore.markAsDeleted(
92
- key,
93
- toNodeId(createMockPeerDescriptor())
94
- )
95
- expect(returnValue).toBe(false)
96
- })
97
-
98
- it('data not stored by the given creator', () => {
99
- const storedEntry = createMockDataEntry()
100
- localDataStore.storeEntry(storedEntry)
101
- const returnValue = localDataStore.markAsDeleted(
102
- toDhtAddress(storedEntry.key),
103
- toNodeId(createMockPeerDescriptor())
104
- )
105
- expect(returnValue).toBe(false)
106
- })
107
- })
108
- })