@streamr/dht 102.0.0-beta.1 → 102.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/google/protobuf/any.d.ts +180 -0
- package/dist/generated/google/protobuf/any.js +155 -0
- package/dist/generated/google/protobuf/any.js.map +1 -0
- package/dist/generated/google/protobuf/empty.d.ts +31 -0
- package/dist/generated/google/protobuf/empty.js +32 -0
- package/dist/generated/google/protobuf/empty.js.map +1 -0
- package/dist/generated/google/protobuf/timestamp.d.ts +155 -0
- package/dist/generated/google/protobuf/timestamp.js +136 -0
- package/dist/generated/google/protobuf/timestamp.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.d.ts +361 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.js +285 -0
- package/dist/generated/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.d.ts +999 -0
- package/dist/generated/packages/dht/protos/DhtRpc.js +677 -0
- package/dist/generated/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.d.ts +162 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.js +3 -0
- package/dist/generated/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js +66 -0
- package/dist/generated/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/package.json +7 -7
- package/package.json +7 -7
- package/src/connection/Connection.ts +0 -28
- package/src/connection/ConnectionLockRpcLocal.ts +0 -78
- package/src/connection/ConnectionLockRpcRemote.ts +0 -64
- package/src/connection/ConnectionLockStates.ts +0 -131
- package/src/connection/ConnectionManager.ts +0 -661
- package/src/connection/ConnectionsView.ts +0 -8
- package/src/connection/ConnectorFacade.ts +0 -217
- package/src/connection/Handshaker.ts +0 -209
- package/src/connection/IConnection.ts +0 -40
- package/src/connection/ManagedConnection.ts +0 -113
- package/src/connection/OutputBuffer.ts +0 -28
- package/src/connection/PendingConnection.ts +0 -68
- package/src/connection/connectivityChecker.ts +0 -108
- package/src/connection/connectivityRequestHandler.ts +0 -116
- package/src/connection/simulator/Simulator.ts +0 -369
- package/src/connection/simulator/SimulatorConnection.ts +0 -137
- package/src/connection/simulator/SimulatorConnector.ts +0 -98
- package/src/connection/simulator/SimulatorTransport.ts +0 -15
- package/src/connection/simulator/pings.ts +0 -42
- package/src/connection/webrtc/BrowserWebrtcConnection.ts +0 -242
- package/src/connection/webrtc/IWebrtcConnection.ts +0 -24
- package/src/connection/webrtc/NodeWebrtcConnection.ts +0 -245
- package/src/connection/webrtc/WebrtcConnector.ts +0 -234
- package/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +0 -108
- package/src/connection/webrtc/WebrtcConnectorRpcRemote.ts +0 -60
- package/src/connection/webrtc/iceServerAsString.ts +0 -15
- package/src/connection/websocket/AbstractWebsocketClientConnection.ts +0 -122
- package/src/connection/websocket/AutoCertifierClientFacade.ts +0 -89
- package/src/connection/websocket/BrowserWebsocketClientConnection.ts +0 -44
- package/src/connection/websocket/NodeWebsocketClientConnection.ts +0 -39
- package/src/connection/websocket/WebsocketClientConnector.ts +0 -119
- package/src/connection/websocket/WebsocketClientConnectorRpcLocal.ts +0 -38
- package/src/connection/websocket/WebsocketClientConnectorRpcRemote.ts +0 -19
- package/src/connection/websocket/WebsocketServer.ts +0 -164
- package/src/connection/websocket/WebsocketServerConnection.ts +0 -109
- package/src/connection/websocket/WebsocketServerConnector.ts +0 -290
- package/src/dht/DhtNode.ts +0 -683
- package/src/dht/DhtNodeRpcLocal.ts +0 -84
- package/src/dht/DhtNodeRpcRemote.ts +0 -107
- package/src/dht/ExternalApiRpcLocal.ts +0 -58
- package/src/dht/ExternalApiRpcRemote.ts +0 -41
- package/src/dht/PeerManager.ts +0 -305
- package/src/dht/contact/Contact.ts +0 -19
- package/src/dht/contact/ContactList.ts +0 -43
- package/src/dht/contact/RandomContactList.ts +0 -56
- package/src/dht/contact/RingContactList.ts +0 -143
- package/src/dht/contact/RpcRemote.ts +0 -72
- package/src/dht/contact/SortedContactList.ts +0 -173
- package/src/dht/contact/getClosestNodes.ts +0 -24
- package/src/dht/contact/ringIdentifiers.ts +0 -62
- package/src/dht/discovery/DiscoverySession.ts +0 -129
- package/src/dht/discovery/PeerDiscovery.ts +0 -244
- package/src/dht/discovery/RingDiscoverySession.ts +0 -148
- package/src/dht/recursive-operation/RecursiveOperationManager.ts +0 -251
- package/src/dht/recursive-operation/RecursiveOperationRpcLocal.ts +0 -34
- package/src/dht/recursive-operation/RecursiveOperationRpcRemote.ts +0 -43
- package/src/dht/recursive-operation/RecursiveOperationSession.ts +0 -231
- package/src/dht/recursive-operation/RecursiveOperationSessionRpcLocal.ts +0 -35
- package/src/dht/recursive-operation/RecursiveOperationSessionRpcRemote.ts +0 -30
- package/src/dht/routing/DuplicateDetector.ts +0 -34
- package/src/dht/routing/Router.ts +0 -246
- package/src/dht/routing/RouterRpcLocal.ts +0 -78
- package/src/dht/routing/RouterRpcRemote.ts +0 -80
- package/src/dht/routing/RoutingSession.ts +0 -243
- package/src/dht/routing/RoutingTablesCache.ts +0 -60
- package/src/dht/routing/getPreviousPeer.ts +0 -6
- package/src/dht/store/LocalDataStore.ts +0 -84
- package/src/dht/store/StoreManager.ts +0 -170
- package/src/dht/store/StoreRpcLocal.ts +0 -89
- package/src/dht/store/StoreRpcRemote.ts +0 -32
- package/src/exports.ts +0 -33
- package/src/helpers/AddressTools.ts +0 -28
- package/src/helpers/Connectivity.ts +0 -19
- package/src/helpers/browser/isBrowserEnvironment.ts +0 -1
- package/src/helpers/browser/isBrowserEnvironment_override.ts +0 -3
- package/src/helpers/createPeerDescriptor.ts +0 -57
- package/src/helpers/createPeerDescriptorSignaturePayload.ts +0 -28
- package/src/helpers/debugHelpers.ts +0 -9
- package/src/helpers/errors.ts +0 -49
- package/src/helpers/offering.ts +0 -15
- package/src/helpers/protoClasses.ts +0 -57
- package/src/helpers/protoToString.ts +0 -21
- package/src/helpers/version.ts +0 -32
- package/src/identifiers.ts +0 -29
- package/src/rpc-protocol/DhtCallContext.ts +0 -14
- package/src/rpc-protocol/DhtRpcOptions.ts +0 -10
- package/src/transport/ITransport.ts +0 -37
- package/src/transport/ListeningRpcCommunicator.ts +0 -32
- package/src/transport/RoutingRpcCommunicator.ts +0 -66
- package/src/types/ServiceID.ts +0 -1
- package/src/types/textencoding.d.ts +0 -6
- package/test/benchmark/Find.test.ts +0 -72
- package/test/benchmark/KademliaCorrectness.test.ts +0 -114
- package/test/benchmark/RingCorrectness.test.ts +0 -157
- package/test/benchmark/SortedContactListBenchmark.test.ts +0 -108
- package/test/benchmark/WebsocketServerMemoryLeak.test.ts +0 -41
- package/test/benchmark/hybrid-network-simulation/RingContactList.test.ts +0 -71
- package/test/end-to-end/GeoIpLayer0.test.ts +0 -55
- package/test/end-to-end/Layer0-Layer1.test.ts +0 -93
- package/test/end-to-end/Layer0.test.ts +0 -76
- package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +0 -110
- package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +0 -137
- package/test/end-to-end/Layer0Webrtc.test.ts +0 -85
- package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +0 -82
- package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +0 -76
- package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +0 -52
- package/test/end-to-end/WebsocketConnectionRequest.test.ts +0 -69
- package/test/end-to-end/memory-leak.test.ts +0 -80
- package/test/integration/ConnectionLocking.test.ts +0 -192
- package/test/integration/ConnectionManager.test.ts +0 -528
- package/test/integration/ConnectivityChecking.test.ts +0 -53
- package/test/integration/DhtJoinPeerDiscovery.test.ts +0 -49
- package/test/integration/DhtNode.test.ts +0 -66
- package/test/integration/DhtNodeExternalAPI.test.ts +0 -48
- package/test/integration/DhtNodeRpcRemote.test.ts +0 -66
- package/test/integration/DhtRpc.test.ts +0 -121
- package/test/integration/Find.test.ts +0 -45
- package/test/integration/GeoIpConnectivityChecking.test.ts +0 -72
- package/test/integration/Layer1-scale.test.ts +0 -189
- package/test/integration/Mock-Layer1-Layer0.test.ts +0 -85
- package/test/integration/MultipleEntryPointJoining.test.ts +0 -105
- package/test/integration/ReplicateData.test.ts +0 -104
- package/test/integration/RouteMessage.test.ts +0 -230
- package/test/integration/RouterRpcRemote.test.ts +0 -77
- package/test/integration/SimultaneousConnections.test.ts +0 -316
- package/test/integration/Store.test.ts +0 -85
- package/test/integration/StoreAndDelete.test.ts +0 -77
- package/test/integration/StoreOnDhtWithThreeNodes.test.ts +0 -59
- package/test/integration/StoreOnDhtWithTwoNodes.test.ts +0 -51
- package/test/integration/StoreRpcRemote.test.ts +0 -54
- package/test/integration/WebrtcConnectionManagement.test.ts +0 -191
- package/test/integration/WebrtcConnectorRpc.test.ts +0 -125
- package/test/integration/Websocket.test.ts +0 -65
- package/test/integration/WebsocketClientConnectorRpc.test.ts +0 -69
- package/test/integration/WebsocketConnectionManagement.test.ts +0 -191
- package/test/integration/rpc-connections-over-webrtc.test.ts +0 -123
- package/test/kademlia-simulation/data/nodeids.json +0 -13002
- package/test/kademlia-simulation/data/orderedneighbors.json +0 -1001
- package/test/types/global.d.ts +0 -1
- package/test/unit/AddressTools.test.ts +0 -44
- package/test/unit/AutoCertifierClientFacade.test.ts +0 -58
- package/test/unit/ConnectionManager.test.ts +0 -65
- package/test/unit/ConnectivityHelpers.test.ts +0 -61
- package/test/unit/DiscoverySession.test.ts +0 -87
- package/test/unit/DuplicateDetector.test.ts +0 -31
- package/test/unit/Handshaker.test.ts +0 -169
- package/test/unit/ListeningRpcCommunicator.test.ts +0 -52
- package/test/unit/LocalDataStore.test.ts +0 -108
- package/test/unit/ManagedConnection.test.ts +0 -58
- package/test/unit/PeerManager.test.ts +0 -93
- package/test/unit/PendingConnection.test.ts +0 -57
- package/test/unit/ProtobufMessage.test.ts +0 -21
- package/test/unit/RandomContactList.test.ts +0 -58
- package/test/unit/RecursiveOperationManager.test.ts +0 -161
- package/test/unit/RecursiveOperationSession.test.ts +0 -68
- package/test/unit/Router.test.ts +0 -137
- package/test/unit/RoutingSession.test.ts +0 -86
- package/test/unit/SortedContactList.test.ts +0 -115
- package/test/unit/StoreManager.test.ts +0 -146
- package/test/unit/StoreRpcLocal.test.ts +0 -167
- package/test/unit/WebrtcConnection.test.ts +0 -29
- package/test/unit/WebrtcConnector.test.ts +0 -56
- package/test/unit/WebsocketClientConnector.test.ts +0 -101
- package/test/unit/WebsocketServer.test.ts +0 -66
- package/test/unit/WebsocketServerConnector.test.ts +0 -102
- package/test/unit/connectivityRequestHandler.test.ts +0 -104
- package/test/unit/createPeerDescriptor.test.ts +0 -69
- package/test/unit/customMatchers.test.ts +0 -34
- package/test/unit/getClosestNodes.test.ts +0 -30
- package/test/unit/version.test.ts +0 -18
- package/test/unit/webrtcReplaceInternalIpWithExternalIp.test.ts +0 -18
- package/test/utils/FakeConnectorFacade.ts +0 -41
- package/test/utils/FakeRpcCommunicator.ts +0 -23
- package/test/utils/FakeTransport.ts +0 -79
- package/test/utils/customMatchers.ts +0 -71
- package/test/utils/mock/MockConnection.ts +0 -26
- package/test/utils/mock/MockConnectionsView.ts +0 -18
- package/test/utils/mock/MockRouter.ts +0 -62
- package/test/utils/mock/MockRpcCommunicator.ts +0 -7
- package/test/utils/mock/MockTransport.ts +0 -26
- package/test/utils/mock/mockDataEntry.ts +0 -38
- package/test/utils/topology.ts +0 -79
- package/test/utils/utils.ts +0 -268
- package/tsconfig.browser.json +0 -17
- package/tsconfig.jest.json +0 -25
- package/tsconfig.json +0 -3
- package/tsconfig.node.json +0 -24
package/test/types/global.d.ts
DELETED
|
@@ -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
|
-
})
|