@streamr/trackerless-network 100.0.0-pretestnet.4 → 100.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/dist/package.json +11 -11
- package/dist/src/NetworkNode.d.ts +6 -5
- package/dist/src/NetworkNode.js +9 -2
- package/dist/src/NetworkNode.js.map +1 -1
- package/dist/src/NetworkStack.d.ts +13 -9
- package/dist/src/NetworkStack.js +80 -12
- package/dist/src/NetworkStack.js.map +1 -1
- package/dist/src/exports.d.ts +4 -3
- package/dist/src/exports.js +12 -1
- package/dist/src/exports.js.map +1 -1
- package/dist/src/logic/DeliveryRpcLocal.d.ts +4 -5
- package/dist/src/logic/DeliveryRpcLocal.js +6 -5
- package/dist/src/logic/DeliveryRpcLocal.js.map +1 -1
- package/dist/src/logic/DeliveryRpcRemote.d.ts +5 -4
- package/dist/src/logic/DeliveryRpcRemote.js +4 -3
- package/dist/src/logic/DeliveryRpcRemote.js.map +1 -1
- package/dist/src/logic/DuplicateMessageDetector.d.ts +3 -3
- package/dist/src/logic/DuplicateMessageDetector.js +10 -6
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -1
- package/dist/src/logic/EntryPointDiscovery.d.ts +8 -5
- package/dist/src/logic/EntryPointDiscovery.js +24 -15
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
- package/dist/src/logic/Layer0Node.d.ts +6 -4
- package/dist/src/logic/Layer1Node.d.ts +12 -6
- package/dist/src/logic/NodeList.d.ts +13 -15
- package/dist/src/logic/NodeList.js +18 -15
- package/dist/src/logic/NodeList.js.map +1 -1
- package/dist/src/logic/RandomGraphNode.d.ts +26 -22
- package/dist/src/logic/RandomGraphNode.js +82 -52
- package/dist/src/logic/RandomGraphNode.js.map +1 -1
- package/dist/src/logic/StreamrNode.d.ts +6 -6
- package/dist/src/logic/StreamrNode.js +53 -37
- package/dist/src/logic/StreamrNode.js.map +1 -1
- package/dist/src/logic/createRandomGraphNode.d.ts +2 -2
- package/dist/src/logic/createRandomGraphNode.js +33 -21
- package/dist/src/logic/createRandomGraphNode.js.map +1 -1
- package/dist/src/logic/formStreamPartDeliveryServiceId.d.ts +2 -1
- package/dist/src/logic/formStreamPartDeliveryServiceId.js.map +1 -1
- package/dist/src/logic/inspect/InspectSession.d.ts +4 -3
- package/dist/src/logic/inspect/InspectSession.js +6 -2
- package/dist/src/logic/inspect/InspectSession.js.map +1 -1
- package/dist/src/logic/inspect/Inspector.d.ts +11 -16
- package/dist/src/logic/inspect/Inspector.js +21 -9
- package/dist/src/logic/inspect/Inspector.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.d.ts +7 -9
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js +55 -32
- package/dist/src/logic/neighbor-discovery/HandshakeRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.d.ts +8 -6
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js +25 -16
- package/dist/src/logic/neighbor-discovery/HandshakeRpcRemote.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +9 -15
- package/dist/src/logic/neighbor-discovery/Handshaker.js +68 -44
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +8 -10
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +12 -2
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +7 -10
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +11 -9
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.d.ts +8 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js +33 -24
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.js.map +1 -1
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.d.ts +5 -4
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js +4 -5
- package/dist/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.js.map +1 -1
- package/dist/src/logic/node-info/NodeInfoClient.d.ts +9 -0
- package/dist/src/logic/node-info/NodeInfoClient.js +21 -0
- package/dist/src/logic/node-info/NodeInfoClient.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.d.ts +12 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js +22 -0
- package/dist/src/logic/node-info/NodeInfoRpcLocal.js.map +1 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.d.ts +6 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js +11 -0
- package/dist/src/logic/node-info/NodeInfoRpcRemote.js.map +1 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js +7 -3
- package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -1
- package/dist/src/logic/propagation/Propagation.d.ts +4 -4
- package/dist/src/logic/propagation/Propagation.js +4 -0
- package/dist/src/logic/propagation/Propagation.js.map +1 -1
- package/dist/src/logic/propagation/PropagationTaskStore.d.ts +2 -2
- package/dist/src/logic/propagation/PropagationTaskStore.js +1 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +1 -1
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +87 -53
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -1
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.d.ts +7 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js +32 -0
- package/dist/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.js.map +1 -0
- package/dist/src/logic/proxy/ProxyClient.d.ts +8 -6
- package/dist/src/logic/proxy/ProxyClient.js +40 -28
- package/dist/src/logic/proxy/ProxyClient.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.d.ts +6 -7
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js +8 -8
- package/dist/src/logic/proxy/ProxyConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.d.ts +3 -3
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js +1 -1
- package/dist/src/logic/proxy/ProxyConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.d.ts +9 -4
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js +21 -6
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcLocal.js.map +1 -1
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.d.ts +4 -3
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js +13 -3
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcRemote.js.map +1 -1
- package/dist/src/logic/utils.js.map +1 -1
- package/dist/src/proto/google/protobuf/any.js +8 -8
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/empty.js +2 -4
- package/dist/src/proto/google/protobuf/empty.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.js +10 -10
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +36 -49
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +54 -52
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +184 -234
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +118 -168
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +20 -29
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +42 -5
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +52 -19
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +193 -28
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +129 -20
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -1
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +20 -3
- package/dist/test/benchmark/first-message.js +14 -15
- package/dist/test/benchmark/first-message.js.map +1 -1
- package/dist/test/utils/utils.d.ts +2 -4
- package/dist/test/utils/utils.js +20 -19
- package/dist/test/utils/utils.js.map +1 -1
- package/jest.config.js +3 -38
- package/package.json +11 -11
- package/protos/NetworkRpc.proto +57 -12
- package/src/NetworkNode.ts +13 -6
- package/src/NetworkStack.ts +94 -16
- package/src/exports.ts +11 -3
- package/src/logic/DeliveryRpcLocal.ts +7 -8
- package/src/logic/DeliveryRpcRemote.ts +7 -5
- package/src/logic/DuplicateMessageDetector.ts +7 -7
- package/src/logic/EntryPointDiscovery.ts +26 -19
- package/src/logic/Layer0Node.ts +6 -4
- package/src/logic/Layer1Node.ts +21 -6
- package/src/logic/NodeList.ts +25 -26
- package/src/logic/RandomGraphNode.ts +148 -78
- package/src/logic/StreamrNode.ts +58 -41
- package/src/logic/createRandomGraphNode.ts +37 -25
- package/src/logic/formStreamPartDeliveryServiceId.ts +2 -1
- package/src/logic/inspect/InspectSession.ts +8 -4
- package/src/logic/inspect/Inspector.ts +34 -24
- package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +72 -38
- package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +32 -20
- package/src/logic/neighbor-discovery/Handshaker.ts +90 -75
- package/src/logic/neighbor-discovery/NeighborFinder.ts +18 -13
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +19 -20
- package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +43 -33
- package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +6 -6
- package/src/logic/node-info/NodeInfoClient.ts +23 -0
- package/src/logic/node-info/NodeInfoRpcLocal.ts +28 -0
- package/src/logic/node-info/NodeInfoRpcRemote.ts +11 -0
- package/src/logic/propagation/Propagation.ts +7 -6
- package/src/logic/propagation/PropagationTaskStore.ts +2 -2
- package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +1 -1
- package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +1 -2
- package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +95 -69
- package/src/logic/protocol-integration/stream-message/oldStreamMessageBinaryUtils.ts +37 -0
- package/src/logic/proxy/ProxyClient.ts +60 -40
- package/src/logic/proxy/ProxyConnectionRpcLocal.ts +15 -19
- package/src/logic/proxy/ProxyConnectionRpcRemote.ts +3 -3
- package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +30 -10
- package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +14 -4
- package/src/proto/google/protobuf/any.ts +4 -4
- package/src/proto/google/protobuf/empty.ts +2 -4
- package/src/proto/google/protobuf/timestamp.ts +4 -4
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +50 -66
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +21 -30
- package/src/proto/packages/dht/protos/DhtRpc.ts +242 -316
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +1 -1
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +49 -7
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +21 -4
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +251 -44
- package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +60 -0
- package/test/benchmark/first-message.ts +38 -17
- package/test/end-to-end/inspect.test.ts +16 -4
- package/test/end-to-end/proxy-and-full-node.test.ts +26 -13
- package/test/end-to-end/proxy-connections.test.ts +23 -11
- package/test/end-to-end/proxy-key-exchange.test.ts +25 -15
- package/test/end-to-end/random-graph-with-real-connections.test.ts +35 -32
- package/test/end-to-end/webrtc-full-node-network.test.ts +11 -12
- package/test/end-to-end/websocket-full-node-network.test.ts +12 -12
- package/test/integration/DeliveryRpcRemote.test.ts +6 -9
- package/test/integration/HandshakeRpcRemote.test.ts +6 -8
- package/test/integration/Handshakes.test.ts +29 -27
- package/test/integration/Inspect.test.ts +0 -2
- package/test/integration/NeighborUpdateRpcRemote.test.ts +6 -7
- package/test/integration/NetworkNode.test.ts +27 -12
- package/test/integration/NetworkRpc.test.ts +3 -5
- package/test/integration/NetworkStack.test.ts +2 -2
- package/test/integration/NodeInfoRpc.test.ts +104 -0
- package/test/integration/Propagation.test.ts +3 -3
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +24 -25
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +26 -24
- package/test/integration/StreamrNode.test.ts +4 -16
- package/test/integration/joining-streams-on-offline-peers.test.ts +7 -31
- package/test/integration/stream-without-default-entrypoints.test.ts +22 -23
- package/test/integration/streamEntryPointReplacing.test.ts +94 -0
- package/test/unit/DeliveryRpcLocal.test.ts +2 -1
- package/test/unit/EntrypointDiscovery.test.ts +11 -8
- package/test/unit/GroupKeyResponseTranslator.test.ts +1 -1
- package/test/unit/HandshakeRpcLocal.test.ts +80 -28
- package/test/unit/Handshaker.test.ts +14 -9
- package/test/unit/InspectSession.test.ts +5 -6
- package/test/unit/Inspector.test.ts +3 -4
- package/test/unit/NeighborFinder.test.ts +12 -9
- package/test/unit/NeighborUpdateRpcLocal.test.ts +139 -0
- package/test/unit/NodeList.test.ts +77 -80
- package/test/unit/Propagation.test.ts +21 -16
- package/test/unit/ProxyConnectionRpcRemote.test.ts +18 -12
- package/test/unit/RandomGraphNode.test.ts +23 -20
- package/test/unit/StreamMessageTranslator.test.ts +10 -8
- package/test/unit/StreamPartIDDataKey.test.ts +12 -0
- package/test/unit/StreamrNode.test.ts +2 -0
- package/test/unit/TemporaryConnectionRpcLocal.test.ts +38 -0
- package/test/unit/oldStreamMessageBinaryUtils.test.ts +39 -0
- package/test/utils/mock/MockHandshaker.ts +6 -5
- package/test/utils/mock/MockLayer0Node.ts +7 -2
- package/test/utils/mock/MockLayer1Node.ts +5 -2
- package/test/utils/mock/MockNeighborFinder.ts +3 -2
- package/test/utils/mock/MockNeighborUpdateManager.ts +3 -2
- package/test/utils/mock/Transport.ts +1 -1
- package/test/utils/utils.ts +40 -25
- package/tsconfig.jest.json +5 -4
- package/tsconfig.node.json +2 -2
- package/dist/src/identifiers.d.ts +0 -4
- package/dist/src/identifiers.js +0 -9
- package/dist/src/identifiers.js.map +0 -1
- package/src/identifiers.ts +0 -8
- package/test/unit/GroupKeyRequestTranslator.test.ts +0 -36
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
1
|
+
import { DhtNode, LatencyType, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor } from '@streamr/dht'
|
|
2
2
|
import { waitForCondition } from '@streamr/utils'
|
|
3
3
|
import { range } from 'lodash'
|
|
4
4
|
import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
|
|
@@ -8,7 +8,7 @@ import { StreamPartIDUtils } from '@streamr/protocol'
|
|
|
8
8
|
import { Layer1Node } from '../../src/logic/Layer1Node'
|
|
9
9
|
|
|
10
10
|
describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
11
|
-
const
|
|
11
|
+
const nodeCount = 64
|
|
12
12
|
let layer1Nodes: Layer1Node[]
|
|
13
13
|
let dhtEntryPoint: Layer1Node
|
|
14
14
|
let entryPointRandomGraphNode: RandomGraphNode
|
|
@@ -17,12 +17,11 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
17
17
|
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
18
18
|
const entrypointDescriptor = createMockPeerDescriptor()
|
|
19
19
|
|
|
20
|
-
const peerDescriptors: PeerDescriptor[] = range(
|
|
20
|
+
const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => createMockPeerDescriptor())
|
|
21
21
|
beforeEach(async () => {
|
|
22
|
-
Simulator.useFakeTimers()
|
|
23
22
|
const simulator = new Simulator(LatencyType.FIXED, 50)
|
|
24
23
|
const entrypointCm = new SimulatorTransport(entrypointDescriptor, simulator)
|
|
25
|
-
const cms: SimulatorTransport[] = range(
|
|
24
|
+
const cms: SimulatorTransport[] = range(nodeCount).map((i) =>
|
|
26
25
|
new SimulatorTransport(peerDescriptors[i], simulator)
|
|
27
26
|
)
|
|
28
27
|
await entrypointCm.start()
|
|
@@ -33,24 +32,26 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
33
32
|
peerDescriptor: entrypointDescriptor,
|
|
34
33
|
serviceId: streamPartId
|
|
35
34
|
})
|
|
36
|
-
layer1Nodes = range(
|
|
35
|
+
layer1Nodes = range(nodeCount).map((i) => new DhtNode({
|
|
37
36
|
transport: cms[i],
|
|
38
37
|
peerDescriptor: peerDescriptors[i],
|
|
39
38
|
serviceId: streamPartId
|
|
40
39
|
}))
|
|
41
|
-
graphNodes = range(
|
|
40
|
+
graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
|
|
42
41
|
streamPartId,
|
|
43
42
|
layer1Node: layer1Nodes[i],
|
|
44
43
|
transport: cms[i],
|
|
45
44
|
connectionLocker: cms[i],
|
|
46
|
-
localPeerDescriptor: peerDescriptors[i]
|
|
45
|
+
localPeerDescriptor: peerDescriptors[i],
|
|
46
|
+
isLocalNodeEntryPoint: () => false
|
|
47
47
|
}))
|
|
48
48
|
entryPointRandomGraphNode = createRandomGraphNode({
|
|
49
49
|
streamPartId,
|
|
50
50
|
layer1Node: dhtEntryPoint,
|
|
51
51
|
transport: entrypointCm,
|
|
52
52
|
connectionLocker: entrypointCm,
|
|
53
|
-
localPeerDescriptor: entrypointDescriptor
|
|
53
|
+
localPeerDescriptor: entrypointDescriptor,
|
|
54
|
+
isLocalNodeEntryPoint: () => false
|
|
54
55
|
})
|
|
55
56
|
|
|
56
57
|
await dhtEntryPoint.start()
|
|
@@ -63,7 +64,6 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
63
64
|
entryPointRandomGraphNode.stop()
|
|
64
65
|
await Promise.all(layer1Nodes.map((node) => node.stop()))
|
|
65
66
|
await Promise.all(graphNodes.map((node) => node.stop()))
|
|
66
|
-
Simulator.useFakeTimers(false)
|
|
67
67
|
})
|
|
68
68
|
|
|
69
69
|
it('happy path single node', async () => {
|
|
@@ -72,10 +72,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
72
72
|
await graphNodes[0].start()
|
|
73
73
|
await Promise.all([
|
|
74
74
|
waitForCondition(() => graphNodes[0].getNearbyNodeView().getIds().length === 1),
|
|
75
|
-
waitForCondition(() => graphNodes[0].
|
|
75
|
+
waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
|
|
76
76
|
])
|
|
77
77
|
expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
|
|
78
|
-
expect(graphNodes[0].
|
|
78
|
+
expect(graphNodes[0].getNeighbors().length).toEqual(1)
|
|
79
79
|
})
|
|
80
80
|
|
|
81
81
|
it('happy path 5 nodes', async () => {
|
|
@@ -84,14 +84,10 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
84
84
|
await Promise.all(range(4).map(async (i) => {
|
|
85
85
|
await layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
86
86
|
}))
|
|
87
|
-
await
|
|
88
|
-
return waitForCondition(() => {
|
|
89
|
-
return graphNodes[i].getTargetNeighborIds().length >= 4
|
|
90
|
-
}, 15000, 2000)
|
|
91
|
-
}))
|
|
87
|
+
await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length >= 4), 15000, 1000)
|
|
92
88
|
range(4).forEach((i) => {
|
|
93
89
|
expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
|
|
94
|
-
expect(graphNodes[i].
|
|
90
|
+
expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
|
|
95
91
|
})
|
|
96
92
|
// Check bidirectionality
|
|
97
93
|
const allNodes = graphNodes
|
|
@@ -102,32 +98,35 @@ describe('RandomGraphNode-DhtNode-Latencies', () => {
|
|
|
102
98
|
const neighbor = allNodes.find((node) => {
|
|
103
99
|
return node.getOwnNodeId() === ownNodeId
|
|
104
100
|
})
|
|
105
|
-
|
|
101
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
102
|
+
expect(neighborIds).toContain(nodeId)
|
|
106
103
|
})
|
|
107
104
|
})
|
|
108
105
|
}, 60000)
|
|
109
106
|
|
|
110
107
|
it('happy path 64 nodes', async () => {
|
|
111
|
-
await Promise.all(range(
|
|
112
|
-
await Promise.all(range(
|
|
108
|
+
await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
|
|
109
|
+
await Promise.all(range(nodeCount).map((i) => {
|
|
113
110
|
layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
114
111
|
}))
|
|
115
112
|
await Promise.all(graphNodes.map((node) =>
|
|
116
|
-
waitForCondition(() => node.
|
|
113
|
+
waitForCondition(() => node.getNeighbors().length >= 4, 10000)
|
|
117
114
|
))
|
|
118
115
|
|
|
119
116
|
await Promise.all(graphNodes.map((node) =>
|
|
120
|
-
waitForCondition(() => node.
|
|
117
|
+
waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
|
|
121
118
|
))
|
|
122
119
|
|
|
123
120
|
await waitForCondition(() => {
|
|
124
121
|
let mismatchCounter = 0
|
|
125
122
|
graphNodes.forEach((node) => {
|
|
126
123
|
const nodeId = node.getOwnNodeId()
|
|
127
|
-
node.
|
|
124
|
+
node.getNeighbors().forEach((neighbor) => {
|
|
125
|
+
const neighborId = getNodeIdFromPeerDescriptor(neighbor)
|
|
128
126
|
if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
|
|
129
127
|
const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
|
|
130
|
-
|
|
128
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
129
|
+
if (!neighborIds.includes(nodeId)) {
|
|
131
130
|
mismatchCounter += 1
|
|
132
131
|
}
|
|
133
132
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getRandomRegion } from '@streamr/dht'
|
|
1
|
+
import { ConnectionManager, DhtNode, PeerDescriptor, Simulator, SimulatorTransport, getNodeIdFromPeerDescriptor, getRandomRegion } from '@streamr/dht'
|
|
2
2
|
import { Logger, waitForCondition } from '@streamr/utils'
|
|
3
3
|
import { range } from 'lodash'
|
|
4
4
|
import { RandomGraphNode } from '../../src/logic/RandomGraphNode'
|
|
@@ -10,7 +10,7 @@ import { Layer1Node } from '../../src/logic/Layer1Node'
|
|
|
10
10
|
const logger = new Logger(module)
|
|
11
11
|
|
|
12
12
|
describe('RandomGraphNode-DhtNode', () => {
|
|
13
|
-
const
|
|
13
|
+
const nodeCount = 64
|
|
14
14
|
let layer1Nodes: Layer1Node[]
|
|
15
15
|
let dhtEntryPoint: Layer1Node
|
|
16
16
|
let entryPointRandomGraphNode: RandomGraphNode
|
|
@@ -21,14 +21,12 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
21
21
|
region: getRandomRegion()
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
const peerDescriptors: PeerDescriptor[] = range(
|
|
24
|
+
const peerDescriptors: PeerDescriptor[] = range(nodeCount).map(() => {
|
|
25
25
|
return createMockPeerDescriptor({
|
|
26
26
|
region: getRandomRegion()
|
|
27
27
|
})
|
|
28
28
|
})
|
|
29
29
|
beforeEach(async () => {
|
|
30
|
-
|
|
31
|
-
Simulator.useFakeTimers()
|
|
32
30
|
const simulator = new Simulator()
|
|
33
31
|
const entrypointCm = new SimulatorTransport(
|
|
34
32
|
entrypointDescriptor,
|
|
@@ -36,7 +34,7 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
36
34
|
)
|
|
37
35
|
await entrypointCm.start()
|
|
38
36
|
|
|
39
|
-
const cms: ConnectionManager[] = range(
|
|
37
|
+
const cms: ConnectionManager[] = range(nodeCount).map((i) =>
|
|
40
38
|
new SimulatorTransport(
|
|
41
39
|
peerDescriptors[i],
|
|
42
40
|
simulator
|
|
@@ -50,19 +48,20 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
50
48
|
serviceId: streamPartId
|
|
51
49
|
})
|
|
52
50
|
|
|
53
|
-
layer1Nodes = range(
|
|
51
|
+
layer1Nodes = range(nodeCount).map((i) => new DhtNode({
|
|
54
52
|
transport: cms[i],
|
|
55
53
|
peerDescriptor: peerDescriptors[i],
|
|
56
54
|
serviceId: streamPartId
|
|
57
55
|
}))
|
|
58
56
|
|
|
59
|
-
graphNodes = range(
|
|
57
|
+
graphNodes = range(nodeCount).map((i) => createRandomGraphNode({
|
|
60
58
|
streamPartId,
|
|
61
59
|
layer1Node: layer1Nodes[i],
|
|
62
60
|
transport: cms[i],
|
|
63
61
|
connectionLocker: cms[i],
|
|
64
62
|
localPeerDescriptor: peerDescriptors[i],
|
|
65
|
-
neighborUpdateInterval: 2000
|
|
63
|
+
neighborUpdateInterval: 2000,
|
|
64
|
+
isLocalNodeEntryPoint: () => false
|
|
66
65
|
}))
|
|
67
66
|
|
|
68
67
|
entryPointRandomGraphNode = createRandomGraphNode({
|
|
@@ -71,7 +70,8 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
71
70
|
transport: entrypointCm,
|
|
72
71
|
connectionLocker: entrypointCm,
|
|
73
72
|
localPeerDescriptor: entrypointDescriptor,
|
|
74
|
-
neighborUpdateInterval: 2000
|
|
73
|
+
neighborUpdateInterval: 2000,
|
|
74
|
+
isLocalNodeEntryPoint: () => false
|
|
75
75
|
})
|
|
76
76
|
|
|
77
77
|
await dhtEntryPoint.start()
|
|
@@ -84,7 +84,6 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
84
84
|
entryPointRandomGraphNode.stop()
|
|
85
85
|
await Promise.all(layer1Nodes.map((node) => node.stop()))
|
|
86
86
|
await Promise.all(graphNodes.map((node) => node.stop()))
|
|
87
|
-
Simulator.useFakeTimers(false)
|
|
88
87
|
})
|
|
89
88
|
|
|
90
89
|
it('happy path single node ', async () => {
|
|
@@ -93,9 +92,9 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
93
92
|
|
|
94
93
|
await graphNodes[0].start()
|
|
95
94
|
|
|
96
|
-
await waitForCondition(() => graphNodes[0].
|
|
95
|
+
await waitForCondition(() => graphNodes[0].getNeighbors().length === 1)
|
|
97
96
|
expect(graphNodes[0].getNearbyNodeView().getIds().length).toEqual(1)
|
|
98
|
-
expect(graphNodes[0].
|
|
97
|
+
expect(graphNodes[0].getNeighbors().length).toEqual(1)
|
|
99
98
|
})
|
|
100
99
|
|
|
101
100
|
it('happy path 4 nodes', async () => {
|
|
@@ -105,10 +104,10 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
105
104
|
await layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
106
105
|
}))
|
|
107
106
|
|
|
108
|
-
await waitForCondition(() => range(4).every((i) => graphNodes[i].
|
|
107
|
+
await waitForCondition(() => range(4).every((i) => graphNodes[i].getNeighbors().length === 4))
|
|
109
108
|
range(4).forEach((i) => {
|
|
110
109
|
expect(graphNodes[i].getNearbyNodeView().getIds().length).toBeGreaterThanOrEqual(4)
|
|
111
|
-
expect(graphNodes[i].
|
|
110
|
+
expect(graphNodes[i].getNeighbors().length).toBeGreaterThanOrEqual(4)
|
|
112
111
|
})
|
|
113
112
|
|
|
114
113
|
// Check bidirectionality
|
|
@@ -119,36 +118,39 @@ describe('RandomGraphNode-DhtNode', () => {
|
|
|
119
118
|
const neighbor = allNodes.find((node) => {
|
|
120
119
|
return node.getOwnNodeId() === nodeId
|
|
121
120
|
})
|
|
122
|
-
|
|
121
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
122
|
+
expect(neighborIds.includes(allNodes[i].getOwnNodeId())).toEqual(true)
|
|
123
123
|
})
|
|
124
124
|
})
|
|
125
125
|
}, 10000)
|
|
126
126
|
|
|
127
127
|
it('happy path 64 nodes', async () => {
|
|
128
|
-
await Promise.all(range(
|
|
129
|
-
await Promise.all(range(
|
|
128
|
+
await Promise.all(range(nodeCount).map((i) => graphNodes[i].start()))
|
|
129
|
+
await Promise.all(range(nodeCount).map((i) => {
|
|
130
130
|
layer1Nodes[i].joinDht([entrypointDescriptor])
|
|
131
131
|
}))
|
|
132
132
|
await Promise.all(graphNodes.map((node) =>
|
|
133
|
-
waitForCondition(() => node.
|
|
133
|
+
waitForCondition(() => node.getNeighbors().length >= 4, 10000)
|
|
134
134
|
))
|
|
135
135
|
|
|
136
136
|
const avg = graphNodes.reduce((acc, curr) => {
|
|
137
|
-
return acc + curr.
|
|
138
|
-
}, 0) /
|
|
137
|
+
return acc + curr.getNeighbors().length
|
|
138
|
+
}, 0) / nodeCount
|
|
139
139
|
|
|
140
140
|
logger.info(`AVG Number of neighbors: ${avg}`)
|
|
141
141
|
await Promise.all(graphNodes.map((node) =>
|
|
142
|
-
waitForCondition(() => node.
|
|
142
|
+
waitForCondition(() => node.getOutgoingHandshakeCount() === 0)
|
|
143
143
|
))
|
|
144
144
|
await waitForCondition(() => {
|
|
145
145
|
let mismatchCounter = 0
|
|
146
146
|
graphNodes.forEach((node) => {
|
|
147
147
|
const nodeId = node.getOwnNodeId()
|
|
148
|
-
node.
|
|
148
|
+
node.getNeighbors().forEach((neighbor) => {
|
|
149
|
+
const neighborId = getNodeIdFromPeerDescriptor(neighbor)
|
|
149
150
|
if (neighborId !== entryPointRandomGraphNode.getOwnNodeId()) {
|
|
150
151
|
const neighbor = graphNodes.find((n) => n.getOwnNodeId() === neighborId)
|
|
151
|
-
|
|
152
|
+
const neighborIds = neighbor!.getNeighbors().map((n) => getNodeIdFromPeerDescriptor(n))
|
|
153
|
+
if (!neighborIds.includes(nodeId)) {
|
|
152
154
|
mismatchCounter += 1
|
|
153
155
|
}
|
|
154
156
|
}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DhtNode,
|
|
3
|
-
PeerDescriptor,
|
|
4
|
-
Simulator,
|
|
5
|
-
SimulatorTransport,
|
|
6
|
-
NodeType
|
|
7
|
-
} from '@streamr/dht'
|
|
1
|
+
import { DhtNode, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
8
2
|
import { StreamrNode, Events } from '../../src/logic/StreamrNode'
|
|
9
3
|
import { waitForEvent3, waitForCondition } from '@streamr/utils'
|
|
10
|
-
import { createStreamMessage } from '../utils/utils'
|
|
4
|
+
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
11
5
|
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
12
6
|
import { randomEthereumAddress } from '@streamr/test-utils'
|
|
13
7
|
import { Layer0Node } from '../../src/logic/Layer0Node'
|
|
@@ -21,14 +15,8 @@ describe('StreamrNode', () => {
|
|
|
21
15
|
let node1: StreamrNode
|
|
22
16
|
let node2: StreamrNode
|
|
23
17
|
|
|
24
|
-
const peerDescriptor1: PeerDescriptor =
|
|
25
|
-
|
|
26
|
-
type: NodeType.NODEJS
|
|
27
|
-
}
|
|
28
|
-
const peerDescriptor2: PeerDescriptor = {
|
|
29
|
-
kademliaId: new Uint8Array([1, 1, 1]),
|
|
30
|
-
type: NodeType.NODEJS
|
|
31
|
-
}
|
|
18
|
+
const peerDescriptor1: PeerDescriptor = createMockPeerDescriptor()
|
|
19
|
+
const peerDescriptor2: PeerDescriptor = createMockPeerDescriptor()
|
|
32
20
|
const STREAM_PART_ID = StreamPartIDUtils.parse('test#0')
|
|
33
21
|
|
|
34
22
|
const msg = createStreamMessage(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PeerDescriptor, Simulator, SimulatorTransport, LatencyType } from '@streamr/dht'
|
|
2
2
|
import { NetworkStack } from '../../src/NetworkStack'
|
|
3
3
|
import { streamPartIdToDataKey } from '../../src/logic/EntryPointDiscovery'
|
|
4
4
|
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
5
5
|
import { Any } from '../../src/proto/google/protobuf/any'
|
|
6
|
-
import { createStreamMessage } from '../utils/utils'
|
|
6
|
+
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
7
7
|
import { waitForCondition } from '@streamr/utils'
|
|
8
8
|
import { randomEthereumAddress } from '@streamr/test-utils'
|
|
9
9
|
|
|
@@ -11,35 +11,11 @@ const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
|
|
|
11
11
|
|
|
12
12
|
describe('Joining stream parts on offline nodes', () => {
|
|
13
13
|
|
|
14
|
-
const entryPointPeerDescriptor: PeerDescriptor =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const node1PeerDescriptor: PeerDescriptor = {
|
|
21
|
-
kademliaId: new Uint8Array([1, 1, 1]),
|
|
22
|
-
type: NodeType.NODEJS,
|
|
23
|
-
region: getRandomRegion()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const node2PeerDescriptor: PeerDescriptor = {
|
|
27
|
-
kademliaId: new Uint8Array([2, 2, 2]),
|
|
28
|
-
type: NodeType.NODEJS,
|
|
29
|
-
region: getRandomRegion()
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const offlineDescriptor1: PeerDescriptor = {
|
|
33
|
-
kademliaId: new Uint8Array([3, 3, 3]),
|
|
34
|
-
type: NodeType.NODEJS,
|
|
35
|
-
region: getRandomRegion()
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const offlineDescriptor2: PeerDescriptor = {
|
|
39
|
-
kademliaId: new Uint8Array([4, 4, 4]),
|
|
40
|
-
type: NodeType.NODEJS,
|
|
41
|
-
region: getRandomRegion()
|
|
42
|
-
}
|
|
14
|
+
const entryPointPeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
|
|
15
|
+
const node1PeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
|
|
16
|
+
const node2PeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
|
|
17
|
+
const offlineDescriptor1: PeerDescriptor = createMockPeerDescriptor()
|
|
18
|
+
const offlineDescriptor2: PeerDescriptor = createMockPeerDescriptor()
|
|
43
19
|
|
|
44
20
|
let entryPoint: NetworkStack
|
|
45
21
|
let node1: NetworkStack
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { LatencyType,
|
|
1
|
+
import { LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
2
2
|
import {
|
|
3
|
+
ContentType,
|
|
4
|
+
EncryptionType,
|
|
3
5
|
MessageID,
|
|
4
6
|
MessageRef,
|
|
7
|
+
SignatureType,
|
|
5
8
|
StreamMessage,
|
|
6
9
|
StreamMessageType,
|
|
7
10
|
StreamPartIDUtils
|
|
@@ -18,12 +21,8 @@ describe('stream without default entrypoints', () => {
|
|
|
18
21
|
|
|
19
22
|
let entrypoint: NetworkNode
|
|
20
23
|
let nodes: NetworkNode[]
|
|
21
|
-
let
|
|
22
|
-
const entryPointPeerDescriptor: PeerDescriptor =
|
|
23
|
-
kademliaId: new Uint8Array([1, 2, 3]),
|
|
24
|
-
type: NodeType.NODEJS,
|
|
25
|
-
region: getRandomRegion()
|
|
26
|
-
}
|
|
24
|
+
let receivedMessageCount: number
|
|
25
|
+
const entryPointPeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
|
|
27
26
|
|
|
28
27
|
const streamMessage = new StreamMessage({
|
|
29
28
|
messageId: new MessageID(
|
|
@@ -39,14 +38,16 @@ describe('stream without default entrypoints', () => {
|
|
|
39
38
|
hello: 'world'
|
|
40
39
|
})),
|
|
41
40
|
messageType: StreamMessageType.MESSAGE,
|
|
41
|
+
contentType: ContentType.JSON,
|
|
42
|
+
encryptionType: EncryptionType.NONE,
|
|
43
|
+
signatureType: SignatureType.SECP256K1,
|
|
42
44
|
signature: hexToBinary('0x1234'),
|
|
43
45
|
})
|
|
44
46
|
|
|
45
47
|
beforeEach(async () => {
|
|
46
|
-
Simulator.useFakeTimers()
|
|
47
48
|
const simulator = new Simulator(LatencyType.REAL)
|
|
48
49
|
nodes = []
|
|
49
|
-
|
|
50
|
+
receivedMessageCount = 0
|
|
50
51
|
const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
|
|
51
52
|
await entryPointTransport.start()
|
|
52
53
|
entrypoint = createNetworkNode({
|
|
@@ -76,43 +77,41 @@ describe('stream without default entrypoints', () => {
|
|
|
76
77
|
afterEach(async () => {
|
|
77
78
|
await entrypoint.stop()
|
|
78
79
|
await Promise.all(nodes.map((node) => node.stop()))
|
|
79
|
-
Simulator.useFakeTimers(false)
|
|
80
80
|
})
|
|
81
81
|
|
|
82
82
|
it('can join stream without configured entrypoints one by one', async () => {
|
|
83
83
|
await nodes[0].join(STREAM_PART_ID)
|
|
84
84
|
nodes[0].addMessageListener((_msg) => {
|
|
85
|
-
|
|
85
|
+
receivedMessageCount += 1
|
|
86
86
|
})
|
|
87
87
|
await Promise.all([
|
|
88
|
-
waitForCondition(() =>
|
|
88
|
+
waitForCondition(() => receivedMessageCount === 1, 10000),
|
|
89
89
|
nodes[1].broadcast(streamMessage)
|
|
90
90
|
])
|
|
91
91
|
})
|
|
92
92
|
|
|
93
93
|
it('can join without configured entrypoints simultaneously', async () => {
|
|
94
94
|
nodes[0].addMessageListener((_msg) => {
|
|
95
|
-
|
|
95
|
+
receivedMessageCount += 1
|
|
96
96
|
})
|
|
97
97
|
await Promise.all([
|
|
98
|
-
waitForCondition(() =>
|
|
98
|
+
waitForCondition(() => receivedMessageCount === 1, 15000),
|
|
99
99
|
nodes[0].join(STREAM_PART_ID),
|
|
100
100
|
nodes[1].broadcast(streamMessage),
|
|
101
101
|
])
|
|
102
102
|
})
|
|
103
103
|
|
|
104
104
|
it('multiple nodes can join without configured entrypoints simultaneously', async () => {
|
|
105
|
-
const
|
|
106
|
-
await Promise.all(range(
|
|
105
|
+
const subscriberCount = 8
|
|
106
|
+
await Promise.all(range(subscriberCount).map(async (i) => {
|
|
107
107
|
await nodes[i].join(STREAM_PART_ID, { minCount: 4, timeout: 15000 })
|
|
108
|
-
nodes[i].addMessageListener((
|
|
109
|
-
|
|
108
|
+
nodes[i].addMessageListener(() => {
|
|
109
|
+
receivedMessageCount += 1
|
|
110
110
|
})
|
|
111
111
|
}))
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
])
|
|
112
|
+
const nonjoinedNode = nodes[subscriberCount]
|
|
113
|
+
await nonjoinedNode.broadcast(streamMessage)
|
|
114
|
+
await waitForCondition(() => receivedMessageCount === subscriberCount, 15000)
|
|
116
115
|
}, 45000)
|
|
117
116
|
|
|
118
117
|
it('nodes store themselves as entrypoints on streamPart if number of entrypoints is low', async () => {
|
|
@@ -120,7 +119,7 @@ describe('stream without default entrypoints', () => {
|
|
|
120
119
|
await nodes[i].join(STREAM_PART_ID, { minCount: (i > 0) ? 1 : 0, timeout: 15000 })
|
|
121
120
|
}
|
|
122
121
|
await waitForCondition(async () => {
|
|
123
|
-
const entryPointData = await nodes[15].stack.getLayer0Node().
|
|
122
|
+
const entryPointData = await nodes[15].stack.getLayer0Node().fetchDataFromDht(streamPartIdToDataKey(STREAM_PART_ID))
|
|
124
123
|
return entryPointData.length >= 7
|
|
125
124
|
}, 15000)
|
|
126
125
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Simulator, SimulatorTransport, LatencyType } from '@streamr/dht'
|
|
2
|
+
import { NetworkStack } from '../../src/NetworkStack'
|
|
3
|
+
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
4
|
+
import { ENTRYPOINT_STORE_LIMIT } from '../../src/logic/EntryPointDiscovery'
|
|
5
|
+
import { range } from 'lodash'
|
|
6
|
+
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
7
|
+
import { waitForCondition } from '@streamr/utils'
|
|
8
|
+
import { randomEthereumAddress } from '@streamr/test-utils'
|
|
9
|
+
|
|
10
|
+
describe('Stream Entry Points are replaced when known entry points leave streams', () => {
|
|
11
|
+
|
|
12
|
+
let simulator: Simulator
|
|
13
|
+
let layer0EntryPoint: NetworkStack
|
|
14
|
+
const entryPointPeerDescriptor = createMockPeerDescriptor()
|
|
15
|
+
let initialNodesOnStream: NetworkStack[]
|
|
16
|
+
let laterNodesOnStream: NetworkStack[]
|
|
17
|
+
let newNodeInStream: NetworkStack
|
|
18
|
+
|
|
19
|
+
const NUM_OF_LATER_NODES = 16
|
|
20
|
+
|
|
21
|
+
const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
|
|
22
|
+
|
|
23
|
+
const startNode = async () => {
|
|
24
|
+
const peerDescriptor = createMockPeerDescriptor()
|
|
25
|
+
const transport = new SimulatorTransport(peerDescriptor, simulator)
|
|
26
|
+
await transport.start()
|
|
27
|
+
const node = new NetworkStack({
|
|
28
|
+
layer0: {
|
|
29
|
+
transport,
|
|
30
|
+
peerDescriptor,
|
|
31
|
+
entryPoints: [entryPointPeerDescriptor]
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
await node.start()
|
|
35
|
+
return node
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
beforeEach(async () => {
|
|
39
|
+
simulator = new Simulator(LatencyType.REAL)
|
|
40
|
+
const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
|
|
41
|
+
layer0EntryPoint = new NetworkStack({
|
|
42
|
+
layer0: {
|
|
43
|
+
transport: entryPointTransport,
|
|
44
|
+
peerDescriptor: entryPointPeerDescriptor,
|
|
45
|
+
entryPoints: [entryPointPeerDescriptor]
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
await entryPointTransport.start()
|
|
49
|
+
await layer0EntryPoint.start()
|
|
50
|
+
|
|
51
|
+
initialNodesOnStream = await Promise.all(range(ENTRYPOINT_STORE_LIMIT).map(async () => {
|
|
52
|
+
return await startNode()
|
|
53
|
+
}))
|
|
54
|
+
|
|
55
|
+
laterNodesOnStream = await Promise.all(range(NUM_OF_LATER_NODES).map(async () => {
|
|
56
|
+
return await startNode()
|
|
57
|
+
}))
|
|
58
|
+
newNodeInStream = await startNode()
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
afterEach(async () => {
|
|
62
|
+
await Promise.all([
|
|
63
|
+
layer0EntryPoint.stop(),
|
|
64
|
+
...initialNodesOnStream.map((node) => node.stop()),
|
|
65
|
+
...laterNodesOnStream.map((node) => node.stop()),
|
|
66
|
+
newNodeInStream.stop()
|
|
67
|
+
])
|
|
68
|
+
simulator.stop()
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// TODO: Investigate why 60 second timeouts are needed
|
|
72
|
+
it('stream entry points are replaced when nodes leave streams', async () => {
|
|
73
|
+
await Promise.all(initialNodesOnStream.map((node) => node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })))
|
|
74
|
+
|
|
75
|
+
let receivedMessages = 0
|
|
76
|
+
for (const node of laterNodesOnStream) {
|
|
77
|
+
await node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })
|
|
78
|
+
node.getStreamrNode().on('newMessage', () => {
|
|
79
|
+
receivedMessages += 1
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
await Promise.all(initialNodesOnStream.map((node) => node.getStreamrNode().leaveStreamPart(STREAM_PART_ID)))
|
|
84
|
+
await waitForCondition(() => laterNodesOnStream.every((node) => node.getStreamrNode().getNeighbors(STREAM_PART_ID).length >= 4), 60000, 1000)
|
|
85
|
+
|
|
86
|
+
const msg = createStreamMessage(
|
|
87
|
+
JSON.stringify({ hello: 'WORLD' }),
|
|
88
|
+
STREAM_PART_ID,
|
|
89
|
+
randomEthereumAddress()
|
|
90
|
+
)
|
|
91
|
+
newNodeInStream.getStreamrNode().broadcast(msg)
|
|
92
|
+
await waitForCondition(() => receivedMessages === NUM_OF_LATER_NODES, 30000)
|
|
93
|
+
}, 200000)
|
|
94
|
+
})
|
|
@@ -50,7 +50,8 @@ describe('DeliveryRpcLocal', () => {
|
|
|
50
50
|
|
|
51
51
|
it('Server leaveStreamPartNotice()', async () => {
|
|
52
52
|
const leaveNotice: LeaveStreamPartNotice = {
|
|
53
|
-
streamPartId: StreamPartIDUtils.parse('stream#0')
|
|
53
|
+
streamPartId: StreamPartIDUtils.parse('stream#0'),
|
|
54
|
+
isEntryPoint: false
|
|
54
55
|
}
|
|
55
56
|
await rpcLocal.leaveStreamPartNotice(leaveNotice, { incomingSourceDescriptor: mockSender } as any)
|
|
56
57
|
expect(mockOnLeaveNotice).toHaveBeenCalledTimes(1)
|