@streamr/trackerless-network 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.
- package/dist/package.json +5 -5
- package/package.json +5 -5
- package/src/NetworkNode.ts +0 -142
- package/src/NetworkStack.ts +0 -197
- package/src/exports.ts +0 -18
- package/src/logic/ContentDeliveryLayerNode.ts +0 -424
- package/src/logic/ContentDeliveryManager.ts +0 -401
- package/src/logic/ContentDeliveryRpcLocal.ts +0 -48
- package/src/logic/ContentDeliveryRpcRemote.ts +0 -44
- package/src/logic/ControlLayerNode.ts +0 -17
- package/src/logic/DiscoveryLayerNode.ts +0 -30
- package/src/logic/DuplicateMessageDetector.ts +0 -167
- package/src/logic/ExternalNetworkRpc.ts +0 -42
- package/src/logic/NodeList.ts +0 -114
- package/src/logic/PeerDescriptorStoreManager.ts +0 -96
- package/src/logic/StreamPartNetworkSplitAvoidance.ts +0 -90
- package/src/logic/StreamPartReconnect.ts +0 -38
- package/src/logic/createContentDeliveryLayerNode.ts +0 -130
- package/src/logic/formStreamPartDeliveryServiceId.ts +0 -7
- package/src/logic/inspect/InspectSession.ts +0 -55
- package/src/logic/inspect/Inspector.ts +0 -100
- package/src/logic/neighbor-discovery/HandshakeRpcLocal.ts +0 -138
- package/src/logic/neighbor-discovery/HandshakeRpcRemote.ts +0 -66
- package/src/logic/neighbor-discovery/Handshaker.ts +0 -215
- package/src/logic/neighbor-discovery/NeighborFinder.ts +0 -77
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +0 -69
- package/src/logic/neighbor-discovery/NeighborUpdateRpcLocal.ts +0 -75
- package/src/logic/neighbor-discovery/NeighborUpdateRpcRemote.ts +0 -35
- package/src/logic/node-info/NodeInfoClient.ts +0 -23
- package/src/logic/node-info/NodeInfoRpcLocal.ts +0 -28
- package/src/logic/node-info/NodeInfoRpcRemote.ts +0 -11
- package/src/logic/propagation/FifoMapWithTTL.ts +0 -116
- package/src/logic/propagation/Propagation.ts +0 -84
- package/src/logic/propagation/PropagationTaskStore.ts +0 -41
- package/src/logic/proxy/ProxyClient.ts +0 -286
- package/src/logic/proxy/ProxyConnectionRpcLocal.ts +0 -106
- package/src/logic/proxy/ProxyConnectionRpcRemote.ts +0 -26
- package/src/logic/temporary-connection/TemporaryConnectionRpcLocal.ts +0 -73
- package/src/logic/temporary-connection/TemporaryConnectionRpcRemote.ts +0 -29
- package/src/logic/utils.ts +0 -18
- package/src/types.ts +0 -13
- package/test/benchmark/StreamPartIdDataKeyDistribution.test.ts +0 -60
- package/test/benchmark/first-message.ts +0 -171
- package/test/end-to-end/content-delivery-layer-node-with-real-connections.test.ts +0 -165
- package/test/end-to-end/external-network-rpc.test.ts +0 -67
- package/test/end-to-end/inspect.test.ts +0 -124
- package/test/end-to-end/proxy-and-full-node.test.ts +0 -143
- package/test/end-to-end/proxy-connections.test.ts +0 -226
- package/test/end-to-end/proxy-key-exchange.test.ts +0 -126
- package/test/end-to-end/webrtc-full-node-network.test.ts +0 -83
- package/test/end-to-end/websocket-full-node-network.test.ts +0 -82
- package/test/integration/ContentDeliveryLayerNode-Layer1Node-Latencies.test.ts +0 -139
- package/test/integration/ContentDeliveryLayerNode-Layer1Node.test.ts +0 -162
- package/test/integration/ContentDeliveryManager.test.ts +0 -160
- package/test/integration/ContentDeliveryRpcRemote.test.ts +0 -100
- package/test/integration/HandshakeRpcRemote.test.ts +0 -79
- package/test/integration/Handshakes.test.ts +0 -141
- package/test/integration/Inspect.test.ts +0 -89
- package/test/integration/NeighborUpdateRpcRemote.test.ts +0 -82
- package/test/integration/NetworkNode.test.ts +0 -115
- package/test/integration/NetworkRpc.test.ts +0 -52
- package/test/integration/NetworkStack.test.ts +0 -72
- package/test/integration/NodeInfoRpc.test.ts +0 -109
- package/test/integration/Propagation.test.ts +0 -76
- package/test/integration/joining-streams-on-offline-peers.test.ts +0 -82
- package/test/integration/stream-without-default-entrypoints.test.ts +0 -128
- package/test/integration/streamEntryPointReplacing.test.ts +0 -97
- package/test/types/global.d.ts +0 -1
- package/test/unit/ContentDeliveryLayerNode.test.ts +0 -112
- package/test/unit/ContentDeliveryManager.test.ts +0 -96
- package/test/unit/ContentDeliveryRpcLocal.test.ts +0 -60
- package/test/unit/DuplicateMessageDetector.test.ts +0 -192
- package/test/unit/ExternalNetworkRpc.test.ts +0 -48
- package/test/unit/FifoMapWithTtl.test.ts +0 -253
- package/test/unit/HandshakeRpcLocal.test.ts +0 -155
- package/test/unit/Handshaker.test.ts +0 -69
- package/test/unit/InspectSession.test.ts +0 -83
- package/test/unit/Inspector.test.ts +0 -51
- package/test/unit/NeighborFinder.test.ts +0 -51
- package/test/unit/NeighborUpdateRpcLocal.test.ts +0 -139
- package/test/unit/NetworkNode.test.ts +0 -42
- package/test/unit/NodeList.test.ts +0 -164
- package/test/unit/NumberPair.test.ts +0 -22
- package/test/unit/PeerDescriptorStoreManager.test.ts +0 -103
- package/test/unit/Propagation.test.ts +0 -151
- package/test/unit/ProxyConnectionRpcRemote.test.ts +0 -39
- package/test/unit/StreamPartIDDataKey.test.ts +0 -12
- package/test/unit/StreamPartNetworkSplitAvoidance.test.ts +0 -31
- package/test/unit/StreamPartReconnect.test.ts +0 -30
- package/test/unit/TemporaryConnectionRpcLocal.test.ts +0 -38
- package/test/utils/fake/FakePeerDescriptorStoreManager.ts +0 -29
- package/test/utils/mock/MockConnectionsView.ts +0 -18
- package/test/utils/mock/MockControlLayerNode.ts +0 -78
- package/test/utils/mock/MockDiscoveryLayerNode.ts +0 -60
- package/test/utils/mock/MockHandshaker.ts +0 -17
- package/test/utils/mock/MockNeighborFinder.ts +0 -20
- package/test/utils/mock/MockNeighborUpdateManager.ts +0 -21
- package/test/utils/mock/MockTransport.ts +0 -30
- package/test/utils/utils.ts +0 -144
- package/tsconfig.browser.json +0 -13
- package/tsconfig.jest.json +0 -17
- package/tsconfig.json +0 -3
- package/tsconfig.node.json +0 -17
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { LatencyType, PeerDescriptor, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
2
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
3
|
-
import { StreamPartIDUtils, hexToBinary, toUserIdRaw, utf8ToBinary, until } from '@streamr/utils'
|
|
4
|
-
import { range } from 'lodash'
|
|
5
|
-
import { NetworkNode, createNetworkNode } from '../../src/NetworkNode'
|
|
6
|
-
import { streamPartIdToDataKey } from '../../src/logic/ContentDeliveryManager'
|
|
7
|
-
import { ContentType, EncryptionType, SignatureType, StreamMessage } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
8
|
-
import { createMockPeerDescriptor } from '../utils/utils'
|
|
9
|
-
|
|
10
|
-
const STREAM_PART_ID = StreamPartIDUtils.parse('test#0')
|
|
11
|
-
|
|
12
|
-
describe('stream without default entrypoints', () => {
|
|
13
|
-
|
|
14
|
-
let entrypoint: NetworkNode
|
|
15
|
-
let nodes: NetworkNode[]
|
|
16
|
-
let receivedMessageCount: number
|
|
17
|
-
const entryPointPeerDescriptor: PeerDescriptor = createMockPeerDescriptor()
|
|
18
|
-
|
|
19
|
-
const streamMessage: StreamMessage = {
|
|
20
|
-
messageId: {
|
|
21
|
-
streamId: StreamPartIDUtils.getStreamID(STREAM_PART_ID),
|
|
22
|
-
streamPartition: StreamPartIDUtils.getStreamPartition(STREAM_PART_ID),
|
|
23
|
-
timestamp: 666,
|
|
24
|
-
sequenceNumber: 0,
|
|
25
|
-
publisherId: toUserIdRaw(randomUserId()),
|
|
26
|
-
messageChainId: 'msgChainId'
|
|
27
|
-
},
|
|
28
|
-
previousMessageRef: {
|
|
29
|
-
timestamp: 665,
|
|
30
|
-
sequenceNumber: 0
|
|
31
|
-
},
|
|
32
|
-
body: {
|
|
33
|
-
oneofKind: 'contentMessage',
|
|
34
|
-
contentMessage: {
|
|
35
|
-
content: utf8ToBinary(JSON.stringify({
|
|
36
|
-
hello: 'world'
|
|
37
|
-
})),
|
|
38
|
-
contentType: ContentType.JSON,
|
|
39
|
-
encryptionType: EncryptionType.NONE
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
signatureType: SignatureType.SECP256K1,
|
|
43
|
-
signature: hexToBinary('0x1234'),
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
beforeEach(async () => {
|
|
47
|
-
const simulator = new Simulator(LatencyType.REAL)
|
|
48
|
-
nodes = []
|
|
49
|
-
receivedMessageCount = 0
|
|
50
|
-
const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
|
|
51
|
-
await entryPointTransport.start()
|
|
52
|
-
entrypoint = createNetworkNode({
|
|
53
|
-
layer0: {
|
|
54
|
-
transport: entryPointTransport,
|
|
55
|
-
connectionsView: entryPointTransport,
|
|
56
|
-
peerDescriptor: entryPointPeerDescriptor,
|
|
57
|
-
entryPoints: [entryPointPeerDescriptor]
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
await entrypoint.start()
|
|
61
|
-
await Promise.all(range(20).map(async () => {
|
|
62
|
-
const peerDescriptor = createMockPeerDescriptor()
|
|
63
|
-
const transport = new SimulatorTransport(peerDescriptor, simulator)
|
|
64
|
-
await transport.start()
|
|
65
|
-
const node = createNetworkNode({
|
|
66
|
-
layer0: {
|
|
67
|
-
peerDescriptor,
|
|
68
|
-
transport,
|
|
69
|
-
connectionsView: transport,
|
|
70
|
-
entryPoints: [entryPointPeerDescriptor]
|
|
71
|
-
}
|
|
72
|
-
})
|
|
73
|
-
nodes.push(node)
|
|
74
|
-
await node.start()
|
|
75
|
-
}))
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
afterEach(async () => {
|
|
79
|
-
await entrypoint.stop()
|
|
80
|
-
await Promise.all(nodes.map((node) => node.stop()))
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('can join stream without configured entrypoints one by one', async () => {
|
|
84
|
-
await nodes[0].join(STREAM_PART_ID)
|
|
85
|
-
nodes[0].addMessageListener((_msg) => {
|
|
86
|
-
receivedMessageCount += 1
|
|
87
|
-
})
|
|
88
|
-
await Promise.all([
|
|
89
|
-
until(() => receivedMessageCount === 1, 10000),
|
|
90
|
-
nodes[1].broadcast(streamMessage)
|
|
91
|
-
])
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('can join without configured entrypoints simultaneously', async () => {
|
|
95
|
-
nodes[0].addMessageListener((_msg) => {
|
|
96
|
-
receivedMessageCount += 1
|
|
97
|
-
})
|
|
98
|
-
await Promise.all([
|
|
99
|
-
until(() => receivedMessageCount === 1, 15000),
|
|
100
|
-
nodes[0].join(STREAM_PART_ID),
|
|
101
|
-
nodes[1].broadcast(streamMessage),
|
|
102
|
-
])
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('multiple nodes can join without configured entrypoints simultaneously', async () => {
|
|
106
|
-
const subscriberCount = 8
|
|
107
|
-
await Promise.all(range(subscriberCount).map(async (i) => {
|
|
108
|
-
await nodes[i].join(STREAM_PART_ID, { minCount: 4, timeout: 15000 })
|
|
109
|
-
nodes[i].addMessageListener(() => {
|
|
110
|
-
receivedMessageCount += 1
|
|
111
|
-
})
|
|
112
|
-
}))
|
|
113
|
-
const nonjoinedNode = nodes[subscriberCount]
|
|
114
|
-
await nonjoinedNode.broadcast(streamMessage)
|
|
115
|
-
await until(() => receivedMessageCount === subscriberCount, 15000)
|
|
116
|
-
}, 45000)
|
|
117
|
-
|
|
118
|
-
it('nodes store themselves as entrypoints on streamPart if number of entrypoints is low', async () => {
|
|
119
|
-
for (let i = 0; i < 10; i++) {
|
|
120
|
-
await nodes[i].join(STREAM_PART_ID, { minCount: (i > 0) ? 1 : 0, timeout: 15000 })
|
|
121
|
-
}
|
|
122
|
-
await until(async () => {
|
|
123
|
-
const entryPointData = await nodes[15].stack.getControlLayerNode().fetchDataFromDht(streamPartIdToDataKey(STREAM_PART_ID))
|
|
124
|
-
return entryPointData.length >= 7
|
|
125
|
-
}, 15000)
|
|
126
|
-
|
|
127
|
-
}, 90000)
|
|
128
|
-
})
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { LatencyType, Simulator, SimulatorTransport } from '@streamr/dht'
|
|
2
|
-
import { StreamPartIDUtils, until } from '@streamr/utils'
|
|
3
|
-
import { range } from 'lodash'
|
|
4
|
-
import { NetworkStack } from '../../src/NetworkStack'
|
|
5
|
-
import { MAX_NODE_COUNT } from '../../src/logic/PeerDescriptorStoreManager'
|
|
6
|
-
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
7
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
8
|
-
|
|
9
|
-
describe('Stream Entry Points are replaced when known entry points leave streams', () => {
|
|
10
|
-
|
|
11
|
-
let simulator: Simulator
|
|
12
|
-
let layer0EntryPoint: NetworkStack
|
|
13
|
-
const entryPointPeerDescriptor = createMockPeerDescriptor()
|
|
14
|
-
let initialNodesOnStream: NetworkStack[]
|
|
15
|
-
let laterNodesOnStream: NetworkStack[]
|
|
16
|
-
let newNodeInStream: NetworkStack
|
|
17
|
-
|
|
18
|
-
const NUM_OF_LATER_NODES = 16
|
|
19
|
-
|
|
20
|
-
const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
|
|
21
|
-
|
|
22
|
-
const startNode = async () => {
|
|
23
|
-
const peerDescriptor = createMockPeerDescriptor()
|
|
24
|
-
const transport = new SimulatorTransport(peerDescriptor, simulator)
|
|
25
|
-
await transport.start()
|
|
26
|
-
const node = new NetworkStack({
|
|
27
|
-
layer0: {
|
|
28
|
-
transport,
|
|
29
|
-
connectionsView: 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
|
-
connectionsView: entryPointTransport,
|
|
45
|
-
peerDescriptor: entryPointPeerDescriptor,
|
|
46
|
-
entryPoints: [entryPointPeerDescriptor]
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
await entryPointTransport.start()
|
|
50
|
-
await layer0EntryPoint.start()
|
|
51
|
-
|
|
52
|
-
initialNodesOnStream = await Promise.all(range(MAX_NODE_COUNT).map(async () => {
|
|
53
|
-
return await startNode()
|
|
54
|
-
}))
|
|
55
|
-
|
|
56
|
-
laterNodesOnStream = await Promise.all(range(NUM_OF_LATER_NODES).map(async () => {
|
|
57
|
-
return await startNode()
|
|
58
|
-
}))
|
|
59
|
-
newNodeInStream = await startNode()
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
afterEach(async () => {
|
|
63
|
-
await Promise.all([
|
|
64
|
-
layer0EntryPoint.stop(),
|
|
65
|
-
...initialNodesOnStream.map((node) => node.stop()),
|
|
66
|
-
...laterNodesOnStream.map((node) => node.stop()),
|
|
67
|
-
newNodeInStream.stop()
|
|
68
|
-
])
|
|
69
|
-
simulator.stop()
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
// TODO: Investigate why 60 second timeouts are needed
|
|
73
|
-
it('stream entry points are replaced when nodes leave streams', async () => {
|
|
74
|
-
await Promise.all(initialNodesOnStream.map((node) => node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })))
|
|
75
|
-
|
|
76
|
-
let receivedMessages = 0
|
|
77
|
-
for (const node of laterNodesOnStream) {
|
|
78
|
-
await node.joinStreamPart(STREAM_PART_ID, { minCount: 4, timeout: 60000 })
|
|
79
|
-
node.getContentDeliveryManager().on('newMessage', () => {
|
|
80
|
-
receivedMessages += 1
|
|
81
|
-
})
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
await Promise.all(initialNodesOnStream.map((node) => node.getContentDeliveryManager().leaveStreamPart(STREAM_PART_ID)))
|
|
85
|
-
await until(() =>
|
|
86
|
-
laterNodesOnStream.every((node) => node.getContentDeliveryManager().getNeighbors(STREAM_PART_ID).length >= 4), 60000, 1000
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
const msg = createStreamMessage(
|
|
90
|
-
JSON.stringify({ hello: 'WORLD' }),
|
|
91
|
-
STREAM_PART_ID,
|
|
92
|
-
randomUserId()
|
|
93
|
-
)
|
|
94
|
-
newNodeInStream.getContentDeliveryManager().broadcast(msg)
|
|
95
|
-
await until(() => receivedMessages === NUM_OF_LATER_NODES, 30000)
|
|
96
|
-
}, 200000)
|
|
97
|
-
})
|
package/test/types/global.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import '@streamr/test-utils/customMatcherTypes'
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { toNodeId } from '@streamr/dht'
|
|
2
|
-
import { StreamPartIDUtils, until } from '@streamr/utils'
|
|
3
|
-
import { ContentDeliveryLayerNode } from '../../src/logic/ContentDeliveryLayerNode'
|
|
4
|
-
import { NodeList } from '../../src/logic/NodeList'
|
|
5
|
-
import { createContentDeliveryLayerNode } from '../../src/logic/createContentDeliveryLayerNode'
|
|
6
|
-
import { MockDiscoveryLayerNode } from '../utils/mock/MockDiscoveryLayerNode'
|
|
7
|
-
import { MockHandshaker } from '../utils/mock/MockHandshaker'
|
|
8
|
-
import { MockNeighborFinder } from '../utils/mock/MockNeighborFinder'
|
|
9
|
-
import { MockNeighborUpdateManager } from '../utils/mock/MockNeighborUpdateManager'
|
|
10
|
-
import { MockTransport } from '../utils/mock/MockTransport'
|
|
11
|
-
import { createMockContentDeliveryRpcRemote, createMockPeerDescriptor, mockConnectionLocker } from '../utils/utils'
|
|
12
|
-
|
|
13
|
-
describe('ContentDeliveryLayerNode', () => {
|
|
14
|
-
|
|
15
|
-
let contentDeliveryLayerNode: ContentDeliveryLayerNode
|
|
16
|
-
const peerDescriptor = createMockPeerDescriptor()
|
|
17
|
-
|
|
18
|
-
let neighbors: NodeList
|
|
19
|
-
let nearbyNodeView: NodeList
|
|
20
|
-
let randomNodeView: NodeList
|
|
21
|
-
|
|
22
|
-
let discoveryLayerNode: MockDiscoveryLayerNode
|
|
23
|
-
|
|
24
|
-
beforeEach(async () => {
|
|
25
|
-
const nodeId = toNodeId(peerDescriptor)
|
|
26
|
-
|
|
27
|
-
neighbors = new NodeList(nodeId, 10)
|
|
28
|
-
randomNodeView = new NodeList(nodeId, 10)
|
|
29
|
-
nearbyNodeView = new NodeList(nodeId, 10)
|
|
30
|
-
discoveryLayerNode = new MockDiscoveryLayerNode()
|
|
31
|
-
|
|
32
|
-
contentDeliveryLayerNode = createContentDeliveryLayerNode({
|
|
33
|
-
neighbors,
|
|
34
|
-
randomNodeView,
|
|
35
|
-
nearbyNodeView,
|
|
36
|
-
transport: new MockTransport(),
|
|
37
|
-
localPeerDescriptor: peerDescriptor,
|
|
38
|
-
discoveryLayerNode,
|
|
39
|
-
connectionLocker: mockConnectionLocker,
|
|
40
|
-
handshaker: new MockHandshaker() as any,
|
|
41
|
-
neighborUpdateManager: new MockNeighborUpdateManager() as any,
|
|
42
|
-
neighborFinder: new MockNeighborFinder() as any,
|
|
43
|
-
streamPartId: StreamPartIDUtils.parse('stream#0'),
|
|
44
|
-
isLocalNodeEntryPoint: () => false
|
|
45
|
-
})
|
|
46
|
-
await contentDeliveryLayerNode.start()
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
afterEach(() => {
|
|
50
|
-
contentDeliveryLayerNode.stop()
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('getNeighbors', () => {
|
|
54
|
-
const mockRemote = createMockContentDeliveryRpcRemote()
|
|
55
|
-
neighbors.add(mockRemote)
|
|
56
|
-
const result = contentDeliveryLayerNode.getNeighbors()
|
|
57
|
-
expect(toNodeId(result[0])).toEqual(toNodeId(mockRemote.getPeerDescriptor()))
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('getNearbyNodeView', () => {
|
|
61
|
-
const mockRemote = createMockContentDeliveryRpcRemote()
|
|
62
|
-
nearbyNodeView.add(mockRemote)
|
|
63
|
-
const ids = contentDeliveryLayerNode.getNearbyNodeView().getIds()
|
|
64
|
-
expect(ids[0]).toEqual(toNodeId(mockRemote.getPeerDescriptor()))
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('Adds Closest Nodes from layer1 nearbyContactAdded event to nearbyNodeView', async () => {
|
|
68
|
-
const peerDescriptor1 = createMockPeerDescriptor()
|
|
69
|
-
const peerDescriptor2 = createMockPeerDescriptor()
|
|
70
|
-
discoveryLayerNode.setClosestContacts([peerDescriptor1, peerDescriptor2])
|
|
71
|
-
discoveryLayerNode.emit('nearbyContactAdded', peerDescriptor1)
|
|
72
|
-
await until(() => nearbyNodeView.size() === 2)
|
|
73
|
-
expect(nearbyNodeView.get(toNodeId(peerDescriptor1))).toBeTruthy()
|
|
74
|
-
expect(nearbyNodeView.get(toNodeId(peerDescriptor2))).toBeTruthy()
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('Adds Random Nodes from layer1 randomContactAdded event to randomNodeView', async () => {
|
|
78
|
-
const peerDescriptor1 = createMockPeerDescriptor()
|
|
79
|
-
const peerDescriptor2 = createMockPeerDescriptor()
|
|
80
|
-
discoveryLayerNode.setRandomContacts([peerDescriptor1, peerDescriptor2])
|
|
81
|
-
discoveryLayerNode.emit('randomContactAdded', peerDescriptor1)
|
|
82
|
-
await until(() => randomNodeView.size() === 2)
|
|
83
|
-
expect(randomNodeView.get(toNodeId(peerDescriptor1))).toBeTruthy()
|
|
84
|
-
expect(randomNodeView.get(toNodeId(peerDescriptor2))).toBeTruthy()
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('Adds Nodes from layer1 neighbors to nearbyNodeView if its size is below nodeViewSize', async () => {
|
|
88
|
-
const peerDescriptor1 = createMockPeerDescriptor()
|
|
89
|
-
const peerDescriptor2 = createMockPeerDescriptor()
|
|
90
|
-
discoveryLayerNode.addNewRandomPeerToKBucket()
|
|
91
|
-
discoveryLayerNode.setClosestContacts([peerDescriptor1, peerDescriptor2])
|
|
92
|
-
discoveryLayerNode.emit('nearbyContactAdded', peerDescriptor1)
|
|
93
|
-
await until(() => {
|
|
94
|
-
return nearbyNodeView.size() === 3
|
|
95
|
-
}, 20000)
|
|
96
|
-
expect(nearbyNodeView.get(toNodeId(peerDescriptor1))).toBeTruthy()
|
|
97
|
-
expect(nearbyNodeView.get(toNodeId(peerDescriptor2))).toBeTruthy()
|
|
98
|
-
}, 25000)
|
|
99
|
-
|
|
100
|
-
it('getInfo', () => {
|
|
101
|
-
const nodeWithRtt = createMockContentDeliveryRpcRemote()
|
|
102
|
-
neighbors.add(nodeWithRtt)
|
|
103
|
-
const nodeWithoutRtt = createMockContentDeliveryRpcRemote()
|
|
104
|
-
neighbors.add(nodeWithoutRtt)
|
|
105
|
-
nodeWithRtt.setRtt(100)
|
|
106
|
-
const info = contentDeliveryLayerNode.getInfos()
|
|
107
|
-
expect(info[0].rtt).toEqual(100)
|
|
108
|
-
expect(info[0].peerDescriptor).toEqual(nodeWithRtt.getPeerDescriptor())
|
|
109
|
-
expect(info[1].rtt).toBeUndefined()
|
|
110
|
-
expect(info[1].peerDescriptor).toEqual(nodeWithoutRtt.getPeerDescriptor())
|
|
111
|
-
})
|
|
112
|
-
})
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { areEqualPeerDescriptors } from '@streamr/dht'
|
|
2
|
-
import { StreamPartIDUtils, until } from '@streamr/utils'
|
|
3
|
-
import { ContentDeliveryManager } from '../../src/logic/ContentDeliveryManager'
|
|
4
|
-
import { ProxyDirection } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
5
|
-
import { MockControlLayerNode } from '../utils/mock/MockControlLayerNode'
|
|
6
|
-
import { MockTransport } from '../utils/mock/MockTransport'
|
|
7
|
-
import { createMockPeerDescriptor, createStreamMessage, mockConnectionLocker } from '../utils/utils'
|
|
8
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
9
|
-
|
|
10
|
-
describe('ContentDeliveryManager', () => {
|
|
11
|
-
|
|
12
|
-
let manager: ContentDeliveryManager
|
|
13
|
-
const peerDescriptor = createMockPeerDescriptor()
|
|
14
|
-
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
manager = new ContentDeliveryManager({})
|
|
17
|
-
const mockLayer0 = new MockControlLayerNode(peerDescriptor)
|
|
18
|
-
await manager.start(mockLayer0, new MockTransport(), mockConnectionLocker)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
afterEach(async () => {
|
|
22
|
-
await manager.destroy()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('PeerDescriptor is correct', () => {
|
|
26
|
-
// TODO could use toEqualPeerDescriptor from dht package if we export that custom matcher
|
|
27
|
-
expect(areEqualPeerDescriptors(peerDescriptor, manager.getPeerDescriptor())).toBe(true)
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
describe('join and leave', () => {
|
|
31
|
-
|
|
32
|
-
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
33
|
-
const message = createStreamMessage(
|
|
34
|
-
JSON.stringify({ hello: 'WORLD' }),
|
|
35
|
-
streamPartId,
|
|
36
|
-
randomUserId()
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
beforeEach(async () => {
|
|
40
|
-
manager.setStreamPartEntryPoints(streamPartId, [manager.getPeerDescriptor()])
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('can join stream part', async () => {
|
|
44
|
-
manager.joinStreamPart(streamPartId)
|
|
45
|
-
expect(manager.hasStreamPart(streamPartId)).toEqual(true)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('can leave stream part', async () => {
|
|
49
|
-
manager.joinStreamPart(streamPartId)
|
|
50
|
-
expect(manager.hasStreamPart(streamPartId)).toEqual(true)
|
|
51
|
-
await manager.leaveStreamPart(streamPartId)
|
|
52
|
-
expect(manager.hasStreamPart(streamPartId)).toEqual(false)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('broadcast joins stream', async () => {
|
|
56
|
-
manager.broadcast(message)
|
|
57
|
-
await until(() => manager.hasStreamPart(streamPartId))
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
describe('proxied stream', () => {
|
|
62
|
-
it('happy path', async () => {
|
|
63
|
-
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
64
|
-
const proxy = createMockPeerDescriptor()
|
|
65
|
-
const userId = randomUserId()
|
|
66
|
-
await manager.setProxies(streamPartId, [proxy], ProxyDirection.PUBLISH, userId)
|
|
67
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(true)
|
|
68
|
-
await manager.setProxies(streamPartId, [], ProxyDirection.PUBLISH, userId)
|
|
69
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(false)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
it('empty node list', async () => {
|
|
73
|
-
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
74
|
-
const proxy = createMockPeerDescriptor()
|
|
75
|
-
const userId = randomUserId()
|
|
76
|
-
await manager.setProxies(streamPartId, [], ProxyDirection.PUBLISH, userId)
|
|
77
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(false)
|
|
78
|
-
await manager.setProxies(streamPartId, [proxy], ProxyDirection.PUBLISH, userId)
|
|
79
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(true)
|
|
80
|
-
await manager.setProxies(streamPartId, [], ProxyDirection.PUBLISH, userId)
|
|
81
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(false)
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('connection count to 0', async () => {
|
|
85
|
-
const streamPartId = StreamPartIDUtils.parse('stream#0')
|
|
86
|
-
const proxy = createMockPeerDescriptor()
|
|
87
|
-
const userId = randomUserId()
|
|
88
|
-
await manager.setProxies(streamPartId, [proxy], ProxyDirection.PUBLISH, userId, 0)
|
|
89
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(false)
|
|
90
|
-
await manager.setProxies(streamPartId, [proxy], ProxyDirection.PUBLISH, userId)
|
|
91
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(true)
|
|
92
|
-
await manager.setProxies(streamPartId, [proxy], ProxyDirection.PUBLISH, userId, 0)
|
|
93
|
-
expect(manager.isProxiedStreamPart(streamPartId)).toBe(false)
|
|
94
|
-
})
|
|
95
|
-
})
|
|
96
|
-
})
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { ListeningRpcCommunicator } from '@streamr/dht'
|
|
2
|
-
import { StreamPartIDUtils } from '@streamr/utils'
|
|
3
|
-
import { ContentDeliveryRpcLocal } from '../../src/logic/ContentDeliveryRpcLocal'
|
|
4
|
-
import { LeaveStreamPartNotice } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
5
|
-
import { MockTransport } from '../utils/mock/MockTransport'
|
|
6
|
-
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
7
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
8
|
-
|
|
9
|
-
describe('ContentDeliveryRpcLocal', () => {
|
|
10
|
-
|
|
11
|
-
let rpcLocal: ContentDeliveryRpcLocal
|
|
12
|
-
const peerDescriptor = createMockPeerDescriptor()
|
|
13
|
-
|
|
14
|
-
const mockSender = createMockPeerDescriptor()
|
|
15
|
-
|
|
16
|
-
const message = createStreamMessage(
|
|
17
|
-
JSON.stringify({ hello: 'WORLD' }),
|
|
18
|
-
StreamPartIDUtils.parse('random-graph#0'),
|
|
19
|
-
randomUserId()
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
let mockBroadcast: jest.Mock
|
|
23
|
-
let mockDuplicateCheck: jest.Mock
|
|
24
|
-
let mockOnLeaveNotice: jest.Mock
|
|
25
|
-
let mockMarkForInspection: jest.Mock
|
|
26
|
-
|
|
27
|
-
beforeEach(async () => {
|
|
28
|
-
mockDuplicateCheck = jest.fn((_c, _p) => true)
|
|
29
|
-
mockBroadcast = jest.fn((_m, _p) => {})
|
|
30
|
-
mockOnLeaveNotice = jest.fn((_m) => {})
|
|
31
|
-
mockMarkForInspection = jest.fn((_m) => {})
|
|
32
|
-
|
|
33
|
-
rpcLocal = new ContentDeliveryRpcLocal({
|
|
34
|
-
markAndCheckDuplicate: mockDuplicateCheck,
|
|
35
|
-
broadcast: mockBroadcast,
|
|
36
|
-
onLeaveNotice: mockOnLeaveNotice,
|
|
37
|
-
markForInspection: mockMarkForInspection,
|
|
38
|
-
localPeerDescriptor: peerDescriptor,
|
|
39
|
-
streamPartId: StreamPartIDUtils.parse('stream#0'),
|
|
40
|
-
rpcCommunicator: new ListeningRpcCommunicator('random-graph-node', new MockTransport())
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('Server sendStreamMessage()', async () => {
|
|
45
|
-
await rpcLocal.sendStreamMessage(message, { incomingSourceDescriptor: mockSender } as any)
|
|
46
|
-
expect(mockDuplicateCheck).toHaveBeenCalledTimes(1)
|
|
47
|
-
expect(mockBroadcast).toHaveBeenCalledTimes(1)
|
|
48
|
-
expect(mockMarkForInspection).toHaveBeenCalledTimes(1)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('Server leaveStreamPartNotice()', async () => {
|
|
52
|
-
const leaveNotice: LeaveStreamPartNotice = {
|
|
53
|
-
streamPartId: StreamPartIDUtils.parse('stream#0'),
|
|
54
|
-
isEntryPoint: false
|
|
55
|
-
}
|
|
56
|
-
await rpcLocal.leaveStreamPartNotice(leaveNotice, { incomingSourceDescriptor: mockSender } as any)
|
|
57
|
-
expect(mockOnLeaveNotice).toHaveBeenCalledTimes(1)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
})
|