@streamr/trackerless-network 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/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,171 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
DhtNode,
|
|
5
|
-
toNodeId,
|
|
6
|
-
getRandomRegion,
|
|
7
|
-
LatencyType,
|
|
8
|
-
PeerDescriptor,
|
|
9
|
-
Simulator
|
|
10
|
-
} from '@streamr/dht'
|
|
11
|
-
import {
|
|
12
|
-
hexToBinary,
|
|
13
|
-
StreamPartID,
|
|
14
|
-
StreamPartIDUtils,
|
|
15
|
-
toStreamID,
|
|
16
|
-
toStreamPartID,
|
|
17
|
-
toUserId,
|
|
18
|
-
toUserIdRaw,
|
|
19
|
-
utf8ToBinary, waitForEvent3
|
|
20
|
-
} from '@streamr/utils'
|
|
21
|
-
import fs from 'fs'
|
|
22
|
-
import { ContentDeliveryLayerNode } from '../../src/logic/ContentDeliveryLayerNode'
|
|
23
|
-
import { streamPartIdToDataKey } from '../../src/logic/ContentDeliveryManager'
|
|
24
|
-
import { DiscoveryLayerNode } from '../../src/logic/DiscoveryLayerNode'
|
|
25
|
-
import { NetworkNode } from '../../src/NetworkNode'
|
|
26
|
-
import { ContentType, EncryptionType, SignatureType } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
27
|
-
import { createMockPeerDescriptor, createNetworkNodeWithSimulator } from '../utils/utils'
|
|
28
|
-
|
|
29
|
-
const numNodes = 10000
|
|
30
|
-
|
|
31
|
-
let nodes: NetworkNode[]
|
|
32
|
-
let simulator: Simulator
|
|
33
|
-
let layer0Ep: PeerDescriptor
|
|
34
|
-
const publishIntervals: NodeJS.Timeout[] = []
|
|
35
|
-
const streamParts: Map<StreamPartID, NetworkNode> = new Map()
|
|
36
|
-
let currentNode: NetworkNode
|
|
37
|
-
let publishInterval: NodeJS.Timeout | undefined
|
|
38
|
-
let i = 0
|
|
39
|
-
|
|
40
|
-
const prepareLayer0 = async () => {
|
|
41
|
-
console.log('Preparing network')
|
|
42
|
-
nodes = []
|
|
43
|
-
simulator = new Simulator(LatencyType.REAL)
|
|
44
|
-
const peerDescriptor = createMockPeerDescriptor({
|
|
45
|
-
region: getRandomRegion()
|
|
46
|
-
})
|
|
47
|
-
layer0Ep = peerDescriptor
|
|
48
|
-
const entryPoint = await createNetworkNodeWithSimulator(peerDescriptor, simulator, [peerDescriptor])
|
|
49
|
-
await entryPoint.start()
|
|
50
|
-
nodes.push(entryPoint)
|
|
51
|
-
|
|
52
|
-
console.log('Entrypoint ready')
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const prepareStream = async (streamId: string) => {
|
|
56
|
-
console.log('Preparing stream ')
|
|
57
|
-
const peerDescriptor = createMockPeerDescriptor({
|
|
58
|
-
region: getRandomRegion()
|
|
59
|
-
})
|
|
60
|
-
const streamPartId = toStreamPartID(toStreamID(streamId), 0)
|
|
61
|
-
const streamPublisher = await createNetworkNodeWithSimulator(peerDescriptor, simulator, [layer0Ep])
|
|
62
|
-
await streamPublisher.start()
|
|
63
|
-
streamPublisher.join(streamPartId)
|
|
64
|
-
nodes.push(streamPublisher)
|
|
65
|
-
streamParts.set(streamPartId, streamPublisher)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const shutdownNetwork = async () => {
|
|
69
|
-
publishIntervals.forEach((interval) => clearInterval(interval))
|
|
70
|
-
await Promise.all([
|
|
71
|
-
...nodes.map((node) => node.stop())
|
|
72
|
-
])
|
|
73
|
-
simulator.stop()
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const measureJoiningTime = async () => {
|
|
77
|
-
const peerDescriptor = createMockPeerDescriptor({
|
|
78
|
-
region: getRandomRegion()
|
|
79
|
-
})
|
|
80
|
-
console.log('starting node with id ', toNodeId(peerDescriptor))
|
|
81
|
-
|
|
82
|
-
// start publishing ons stream
|
|
83
|
-
const stream = Array.from(streamParts.keys())[Math.floor(Math.random() * streamParts.size)]
|
|
84
|
-
console.log(stream)
|
|
85
|
-
publishInterval = setInterval(() => {
|
|
86
|
-
i += 1
|
|
87
|
-
const streamMessage = {
|
|
88
|
-
messageId: {
|
|
89
|
-
streamId: StreamPartIDUtils.getStreamID(stream),
|
|
90
|
-
streamPartition: 0,
|
|
91
|
-
timestamp: i,
|
|
92
|
-
sequenceNumber: Math.floor(Math.random() * 20000),
|
|
93
|
-
publisherId: toUserIdRaw(toUserId('0x2222')),
|
|
94
|
-
messageChainId: 'msgChainId'
|
|
95
|
-
},
|
|
96
|
-
body: {
|
|
97
|
-
oneofKind: 'contentMessage' as const,
|
|
98
|
-
contentMessage: {
|
|
99
|
-
content: utf8ToBinary(JSON.stringify({
|
|
100
|
-
hello: 'world'
|
|
101
|
-
})),
|
|
102
|
-
contentType: ContentType.JSON,
|
|
103
|
-
encryptionType: EncryptionType.NONE,
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
signature: hexToBinary('0x1234'),
|
|
107
|
-
signatureType: SignatureType.SECP256K1,
|
|
108
|
-
}
|
|
109
|
-
streamParts.get(stream)!.broadcast(streamMessage)
|
|
110
|
-
}, 1000)
|
|
111
|
-
// get random node from network to use as entrypoint
|
|
112
|
-
const randomNode = nodes[Math.floor(Math.random() * nodes.length)]
|
|
113
|
-
const streamSubscriber = await createNetworkNodeWithSimulator(
|
|
114
|
-
peerDescriptor,
|
|
115
|
-
simulator,
|
|
116
|
-
[randomNode.stack.getControlLayerNode().getLocalPeerDescriptor()]
|
|
117
|
-
)
|
|
118
|
-
currentNode = streamSubscriber
|
|
119
|
-
const start = performance.now()
|
|
120
|
-
await streamSubscriber.start()
|
|
121
|
-
|
|
122
|
-
await Promise.all([
|
|
123
|
-
waitForEvent3(streamSubscriber.stack.getContentDeliveryManager() as any, 'newMessage', 60000),
|
|
124
|
-
streamSubscriber.join(stream)
|
|
125
|
-
])
|
|
126
|
-
|
|
127
|
-
const end = performance.now()
|
|
128
|
-
|
|
129
|
-
nodes.push(streamSubscriber)
|
|
130
|
-
clearInterval(publishInterval)
|
|
131
|
-
publishInterval = undefined
|
|
132
|
-
return end - start
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const run = async () => {
|
|
136
|
-
await prepareLayer0()
|
|
137
|
-
for (let i = 0; i < 20; i++) {
|
|
138
|
-
await prepareStream(`stream-${i}`)
|
|
139
|
-
}
|
|
140
|
-
const logFile = fs.openSync('FirstMessageTime.log', 'w')
|
|
141
|
-
|
|
142
|
-
fs.writeSync(logFile, 'Network size' + '\t' + 'Time to receive first message time (ms)' + '\n')
|
|
143
|
-
for (let i = 0; i < numNodes; i++) {
|
|
144
|
-
const time = await measureJoiningTime()
|
|
145
|
-
console.log(`Time to receive first message for ${i + 1} nodes network: ${time}ms`)
|
|
146
|
-
fs.writeSync(logFile, `${i + 1}` + '\t' + `${Math.round(time)}\n`)
|
|
147
|
-
}
|
|
148
|
-
fs.closeSync(logFile)
|
|
149
|
-
await shutdownNetwork()
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
run().then(() => {
|
|
153
|
-
console.log('done')
|
|
154
|
-
}).catch((err) => {
|
|
155
|
-
console.error(err)
|
|
156
|
-
const contentDeliveryManager = currentNode.stack.getContentDeliveryManager()
|
|
157
|
-
const streamParts = contentDeliveryManager.getStreamParts()
|
|
158
|
-
const foundData = nodes[0].stack.getControlLayerNode().fetchDataFromDht(streamPartIdToDataKey(streamParts[0]))
|
|
159
|
-
console.log(foundData)
|
|
160
|
-
const controlLayerNode = currentNode.stack.getControlLayerNode() as DhtNode
|
|
161
|
-
console.log(controlLayerNode.getNeighbors().length)
|
|
162
|
-
console.log(controlLayerNode.getConnectionsView().getConnectionCount())
|
|
163
|
-
const streamPartDelivery = contentDeliveryManager
|
|
164
|
-
.getStreamPartDelivery(streamParts[0])! as { discoveryLayerNode: DiscoveryLayerNode, node: ContentDeliveryLayerNode }
|
|
165
|
-
console.log(streamPartDelivery.discoveryLayerNode.getNeighbors())
|
|
166
|
-
console.log(streamPartDelivery.node.getNeighbors())
|
|
167
|
-
console.log(nodes[nodes.length - 1])
|
|
168
|
-
if (publishInterval) {
|
|
169
|
-
clearInterval(publishInterval)
|
|
170
|
-
}
|
|
171
|
-
})
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { ConnectionManager, DhtNode, PeerDescriptor } from '@streamr/dht'
|
|
2
|
-
import { StreamPartIDUtils, until } from '@streamr/utils'
|
|
3
|
-
import { ContentDeliveryLayerNode } from '../../src/logic/ContentDeliveryLayerNode'
|
|
4
|
-
import { ControlLayerNode } from '../../src/logic/ControlLayerNode'
|
|
5
|
-
import { DiscoveryLayerNode } from '../../src/logic/DiscoveryLayerNode'
|
|
6
|
-
import { createContentDeliveryLayerNode } from '../../src/logic/createContentDeliveryLayerNode'
|
|
7
|
-
import { createMockPeerDescriptor, createStreamMessage } from '../utils/utils'
|
|
8
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
9
|
-
|
|
10
|
-
describe('content delivery layer node with real connections', () => {
|
|
11
|
-
|
|
12
|
-
const epPeerDescriptor: PeerDescriptor = createMockPeerDescriptor({
|
|
13
|
-
websocket: { host: '127.0.0.1', port: 12221, tls: false }
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
const streamPartId = StreamPartIDUtils.parse('random-graph#0')
|
|
17
|
-
// Currently the nodes here are practically layer0 nodes acting as layer1 nodes, for the purpose of this test
|
|
18
|
-
// they are layer1 nodes as the DHT is per stream
|
|
19
|
-
// TODO refactor the test to use normal layering style (i.e. have separate objects for layer0 and layer1 nodes)
|
|
20
|
-
let epDhtNode: ControlLayerNode & DiscoveryLayerNode
|
|
21
|
-
let dhtNode1: ControlLayerNode & DiscoveryLayerNode
|
|
22
|
-
let dhtNode2: ControlLayerNode & DiscoveryLayerNode
|
|
23
|
-
let dhtNode3: ControlLayerNode & DiscoveryLayerNode
|
|
24
|
-
let dhtNode4: ControlLayerNode & DiscoveryLayerNode
|
|
25
|
-
let contentDeliveryLayerNode1: ContentDeliveryLayerNode
|
|
26
|
-
let contentDeliveryLayerNode2: ContentDeliveryLayerNode
|
|
27
|
-
let contentDeliveryLayerNode3: ContentDeliveryLayerNode
|
|
28
|
-
let contentDeliveryLayerNode4: ContentDeliveryLayerNode
|
|
29
|
-
let contentDeliveryLayerNode5: ContentDeliveryLayerNode
|
|
30
|
-
const websocketPortRange = { min: 12222, max: 12225 }
|
|
31
|
-
|
|
32
|
-
beforeEach(async () => {
|
|
33
|
-
epDhtNode = new DhtNode({ peerDescriptor: epPeerDescriptor, websocketServerEnableTls: false })
|
|
34
|
-
await epDhtNode.start()
|
|
35
|
-
dhtNode1 = new DhtNode({ websocketPortRange, entryPoints: [epPeerDescriptor], websocketServerEnableTls: false })
|
|
36
|
-
dhtNode2 = new DhtNode({ websocketPortRange, entryPoints: [epPeerDescriptor], websocketServerEnableTls: false })
|
|
37
|
-
dhtNode3 = new DhtNode({ websocketPortRange, entryPoints: [epPeerDescriptor], websocketServerEnableTls: false })
|
|
38
|
-
dhtNode4 = new DhtNode({ websocketPortRange, entryPoints: [epPeerDescriptor], websocketServerEnableTls: false })
|
|
39
|
-
await dhtNode1.start()
|
|
40
|
-
await dhtNode2.start()
|
|
41
|
-
await dhtNode3.start()
|
|
42
|
-
await dhtNode4.start()
|
|
43
|
-
|
|
44
|
-
contentDeliveryLayerNode1 = createContentDeliveryLayerNode(
|
|
45
|
-
{
|
|
46
|
-
streamPartId,
|
|
47
|
-
discoveryLayerNode: epDhtNode,
|
|
48
|
-
transport: epDhtNode.getTransport(),
|
|
49
|
-
connectionLocker: epDhtNode.getTransport() as ConnectionManager,
|
|
50
|
-
localPeerDescriptor: epPeerDescriptor,
|
|
51
|
-
isLocalNodeEntryPoint: () => false
|
|
52
|
-
}
|
|
53
|
-
)
|
|
54
|
-
contentDeliveryLayerNode2 = createContentDeliveryLayerNode({
|
|
55
|
-
streamPartId,
|
|
56
|
-
discoveryLayerNode: dhtNode1,
|
|
57
|
-
transport: dhtNode1.getTransport(),
|
|
58
|
-
connectionLocker: dhtNode1.getTransport() as ConnectionManager,
|
|
59
|
-
localPeerDescriptor: dhtNode1.getLocalPeerDescriptor(),
|
|
60
|
-
isLocalNodeEntryPoint: () => false
|
|
61
|
-
})
|
|
62
|
-
contentDeliveryLayerNode3 = createContentDeliveryLayerNode({
|
|
63
|
-
streamPartId,
|
|
64
|
-
discoveryLayerNode: dhtNode2,
|
|
65
|
-
transport: dhtNode2.getTransport(),
|
|
66
|
-
connectionLocker: dhtNode2.getTransport() as ConnectionManager,
|
|
67
|
-
localPeerDescriptor: dhtNode2.getLocalPeerDescriptor(),
|
|
68
|
-
isLocalNodeEntryPoint: () => false
|
|
69
|
-
})
|
|
70
|
-
contentDeliveryLayerNode4 = createContentDeliveryLayerNode({
|
|
71
|
-
streamPartId,
|
|
72
|
-
discoveryLayerNode: dhtNode3,
|
|
73
|
-
transport: dhtNode3.getTransport(),
|
|
74
|
-
connectionLocker: dhtNode3.getTransport() as ConnectionManager,
|
|
75
|
-
localPeerDescriptor: dhtNode3.getLocalPeerDescriptor(),
|
|
76
|
-
isLocalNodeEntryPoint: () => false
|
|
77
|
-
})
|
|
78
|
-
contentDeliveryLayerNode5 = createContentDeliveryLayerNode({
|
|
79
|
-
streamPartId,
|
|
80
|
-
discoveryLayerNode: dhtNode4,
|
|
81
|
-
transport: dhtNode4.getTransport(),
|
|
82
|
-
connectionLocker: dhtNode4.getTransport() as ConnectionManager,
|
|
83
|
-
localPeerDescriptor: dhtNode4.getLocalPeerDescriptor(),
|
|
84
|
-
isLocalNodeEntryPoint: () => false
|
|
85
|
-
})
|
|
86
|
-
await Promise.all([
|
|
87
|
-
contentDeliveryLayerNode1.start(),
|
|
88
|
-
contentDeliveryLayerNode2.start(),
|
|
89
|
-
contentDeliveryLayerNode3.start(),
|
|
90
|
-
contentDeliveryLayerNode4.start(),
|
|
91
|
-
contentDeliveryLayerNode5.start()
|
|
92
|
-
])
|
|
93
|
-
await epDhtNode.joinDht([epPeerDescriptor])
|
|
94
|
-
await Promise.all([
|
|
95
|
-
dhtNode1.joinDht([epPeerDescriptor]),
|
|
96
|
-
dhtNode2.joinDht([epPeerDescriptor]),
|
|
97
|
-
dhtNode3.joinDht([epPeerDescriptor]),
|
|
98
|
-
dhtNode4.joinDht([epPeerDescriptor])
|
|
99
|
-
])
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
afterEach(async () => {
|
|
103
|
-
await Promise.all([
|
|
104
|
-
epDhtNode.stop(),
|
|
105
|
-
dhtNode1.stop(),
|
|
106
|
-
dhtNode2.stop(),
|
|
107
|
-
dhtNode3.stop(),
|
|
108
|
-
dhtNode4.stop(),
|
|
109
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
110
|
-
contentDeliveryLayerNode1.stop(),
|
|
111
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
112
|
-
contentDeliveryLayerNode2.stop(),
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
114
|
-
contentDeliveryLayerNode3.stop(),
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
116
|
-
contentDeliveryLayerNode4.stop(),
|
|
117
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
118
|
-
contentDeliveryLayerNode5.stop(),
|
|
119
|
-
(epDhtNode.getTransport() as ConnectionManager).stop(),
|
|
120
|
-
(dhtNode1.getTransport() as ConnectionManager).stop(),
|
|
121
|
-
(dhtNode2.getTransport() as ConnectionManager).stop(),
|
|
122
|
-
(dhtNode3.getTransport() as ConnectionManager).stop(),
|
|
123
|
-
(dhtNode4.getTransport() as ConnectionManager).stop()
|
|
124
|
-
])
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it('can fully connected topologies ', async () => {
|
|
128
|
-
await until(() => {
|
|
129
|
-
return contentDeliveryLayerNode1.getNeighbors().length >= 3
|
|
130
|
-
&& contentDeliveryLayerNode2.getNeighbors().length >= 3
|
|
131
|
-
&& contentDeliveryLayerNode3.getNeighbors().length >= 3
|
|
132
|
-
&& contentDeliveryLayerNode4.getNeighbors().length >= 3
|
|
133
|
-
&& contentDeliveryLayerNode5.getNeighbors().length >= 3
|
|
134
|
-
}, 10000)
|
|
135
|
-
expect(contentDeliveryLayerNode1.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
136
|
-
expect(contentDeliveryLayerNode2.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
137
|
-
expect(contentDeliveryLayerNode3.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
138
|
-
expect(contentDeliveryLayerNode4.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
139
|
-
expect(contentDeliveryLayerNode5.getNeighbors().length).toBeGreaterThanOrEqual(3)
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
it('can propagate messages', async () => {
|
|
143
|
-
let receivedMessageCount = 0
|
|
144
|
-
contentDeliveryLayerNode2.on('message', () => receivedMessageCount += 1)
|
|
145
|
-
contentDeliveryLayerNode3.on('message', () => receivedMessageCount += 1)
|
|
146
|
-
contentDeliveryLayerNode4.on('message', () => receivedMessageCount += 1)
|
|
147
|
-
contentDeliveryLayerNode5.on('message', () => receivedMessageCount += 1)
|
|
148
|
-
|
|
149
|
-
await until(() => {
|
|
150
|
-
return contentDeliveryLayerNode1.getNeighbors().length >= 3
|
|
151
|
-
&& contentDeliveryLayerNode2.getNeighbors().length >= 3
|
|
152
|
-
&& contentDeliveryLayerNode3.getNeighbors().length >= 3
|
|
153
|
-
&& contentDeliveryLayerNode4.getNeighbors().length >= 3
|
|
154
|
-
&& contentDeliveryLayerNode5.getNeighbors().length >= 3
|
|
155
|
-
}, 10000)
|
|
156
|
-
|
|
157
|
-
const msg = createStreamMessage(
|
|
158
|
-
JSON.stringify({ hello: 'WORLD' }),
|
|
159
|
-
streamPartId,
|
|
160
|
-
randomUserId()
|
|
161
|
-
)
|
|
162
|
-
contentDeliveryLayerNode1.broadcast(msg)
|
|
163
|
-
await until(() => receivedMessageCount >= 4)
|
|
164
|
-
})
|
|
165
|
-
})
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { NetworkNode } from '../../src/NetworkNode'
|
|
2
|
-
import { NetworkStack } from '../../src/NetworkStack'
|
|
3
|
-
import { StreamPartHandshakeRequest, StreamPartHandshakeResponse } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
4
|
-
import { HandshakeRpcClient } from '../../generated/packages/trackerless-network/protos/NetworkRpc.client'
|
|
5
|
-
import { createMockPeerDescriptor } from '../utils/utils'
|
|
6
|
-
|
|
7
|
-
describe('ExternalNetworkRpc', () => {
|
|
8
|
-
|
|
9
|
-
let clientNode: NetworkNode
|
|
10
|
-
let serverNode: NetworkNode
|
|
11
|
-
|
|
12
|
-
const serverPeerDescriptor = createMockPeerDescriptor({
|
|
13
|
-
websocket: {
|
|
14
|
-
host: '127.0.0.1',
|
|
15
|
-
port: 15499,
|
|
16
|
-
tls: false
|
|
17
|
-
}
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
const clientPeerDescriptor = createMockPeerDescriptor()
|
|
21
|
-
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
const clientStack = new NetworkStack({
|
|
24
|
-
layer0: {
|
|
25
|
-
entryPoints: [serverPeerDescriptor],
|
|
26
|
-
peerDescriptor: clientPeerDescriptor,
|
|
27
|
-
websocketServerEnableTls: false
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
const serverStack = new NetworkStack({
|
|
31
|
-
layer0: {
|
|
32
|
-
entryPoints: [serverPeerDescriptor],
|
|
33
|
-
peerDescriptor: serverPeerDescriptor,
|
|
34
|
-
websocketServerEnableTls: false
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
clientNode = new NetworkNode(clientStack)
|
|
38
|
-
serverNode = new NetworkNode(serverStack)
|
|
39
|
-
|
|
40
|
-
await serverNode.start()
|
|
41
|
-
await clientNode.start()
|
|
42
|
-
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
afterEach(() => {
|
|
46
|
-
serverNode.stop()
|
|
47
|
-
clientNode.stop()
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('can make queries', async () => {
|
|
51
|
-
const requestId = 'TEST'
|
|
52
|
-
serverNode.registerExternalNetworkRpcMethod(
|
|
53
|
-
StreamPartHandshakeRequest,
|
|
54
|
-
StreamPartHandshakeResponse,
|
|
55
|
-
'handshake',
|
|
56
|
-
async () => StreamPartHandshakeResponse.create({ requestId })
|
|
57
|
-
)
|
|
58
|
-
const client = clientNode.createExternalRpcClient(HandshakeRpcClient)
|
|
59
|
-
const response = await client.handshake(StreamPartHandshakeRequest.create(), {
|
|
60
|
-
sourceDescriptor: clientPeerDescriptor,
|
|
61
|
-
targetDescriptor: serverPeerDescriptor
|
|
62
|
-
})
|
|
63
|
-
expect(response.requestId).toEqual(requestId)
|
|
64
|
-
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
})
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
2
|
-
import { StreamPartIDUtils, hexToBinary, toUserIdRaw, utf8ToBinary, until } from '@streamr/utils'
|
|
3
|
-
import { NetworkNode, createNetworkNode } from '../../src/NetworkNode'
|
|
4
|
-
import { ContentType, EncryptionType, SignatureType, StreamMessage } from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
5
|
-
import { createMockPeerDescriptor } from '../utils/utils'
|
|
6
|
-
|
|
7
|
-
const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
|
|
8
|
-
|
|
9
|
-
describe('inspect', () => {
|
|
10
|
-
|
|
11
|
-
const publisherDescriptor = createMockPeerDescriptor({
|
|
12
|
-
websocket: {
|
|
13
|
-
host: '127.0.0.1',
|
|
14
|
-
port: 15478,
|
|
15
|
-
tls: false
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const inspectedDescriptor = createMockPeerDescriptor({
|
|
20
|
-
websocket: {
|
|
21
|
-
host: '127.0.0.1',
|
|
22
|
-
port: 15479,
|
|
23
|
-
tls: false
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
const inspectorDescriptor = createMockPeerDescriptor({
|
|
28
|
-
websocket: {
|
|
29
|
-
host: '127.0.0.1',
|
|
30
|
-
port: 15480,
|
|
31
|
-
tls: false
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
let publisherNode: NetworkNode
|
|
36
|
-
|
|
37
|
-
let inspectedNode: NetworkNode
|
|
38
|
-
|
|
39
|
-
let inspectorNode: NetworkNode
|
|
40
|
-
|
|
41
|
-
const message: StreamMessage = {
|
|
42
|
-
messageId: {
|
|
43
|
-
streamId: StreamPartIDUtils.getStreamID(STREAM_PART_ID),
|
|
44
|
-
streamPartition: StreamPartIDUtils.getStreamPartition(STREAM_PART_ID),
|
|
45
|
-
timestamp: 666,
|
|
46
|
-
sequenceNumber: 0,
|
|
47
|
-
publisherId: toUserIdRaw(randomUserId()),
|
|
48
|
-
messageChainId: 'msgChainId'
|
|
49
|
-
},
|
|
50
|
-
previousMessageRef: {
|
|
51
|
-
timestamp: 665,
|
|
52
|
-
sequenceNumber: 0
|
|
53
|
-
},
|
|
54
|
-
body: {
|
|
55
|
-
oneofKind: 'contentMessage',
|
|
56
|
-
contentMessage: {
|
|
57
|
-
content: utf8ToBinary(JSON.stringify({
|
|
58
|
-
hello: 'world'
|
|
59
|
-
})),
|
|
60
|
-
contentType: ContentType.JSON,
|
|
61
|
-
encryptionType: EncryptionType.NONE
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
signatureType: SignatureType.SECP256K1,
|
|
65
|
-
signature: hexToBinary('0x1234'),
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
beforeEach(async () => {
|
|
69
|
-
publisherNode = createNetworkNode({
|
|
70
|
-
layer0: {
|
|
71
|
-
entryPoints: [publisherDescriptor],
|
|
72
|
-
peerDescriptor: publisherDescriptor,
|
|
73
|
-
websocketServerEnableTls: false
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
inspectedNode = createNetworkNode({
|
|
78
|
-
layer0: {
|
|
79
|
-
entryPoints: [publisherDescriptor],
|
|
80
|
-
peerDescriptor: inspectedDescriptor,
|
|
81
|
-
websocketServerEnableTls: false
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
inspectorNode = createNetworkNode({
|
|
86
|
-
layer0: {
|
|
87
|
-
entryPoints: [publisherDescriptor],
|
|
88
|
-
peerDescriptor: inspectorDescriptor,
|
|
89
|
-
websocketServerEnableTls: false
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
await publisherNode.start()
|
|
94
|
-
await inspectedNode.start()
|
|
95
|
-
await inspectorNode.start()
|
|
96
|
-
|
|
97
|
-
publisherNode.stack.getContentDeliveryManager().joinStreamPart(STREAM_PART_ID)
|
|
98
|
-
inspectedNode.stack.getContentDeliveryManager().joinStreamPart(STREAM_PART_ID)
|
|
99
|
-
inspectorNode.stack.getContentDeliveryManager().joinStreamPart(STREAM_PART_ID)
|
|
100
|
-
|
|
101
|
-
await until(() =>
|
|
102
|
-
publisherNode.stack.getContentDeliveryManager().getNeighbors(STREAM_PART_ID).length === 2
|
|
103
|
-
&& inspectedNode.stack.getContentDeliveryManager().getNeighbors(STREAM_PART_ID).length === 2
|
|
104
|
-
&& inspectorNode.stack.getContentDeliveryManager().getNeighbors(STREAM_PART_ID).length === 2
|
|
105
|
-
)
|
|
106
|
-
}, 30000)
|
|
107
|
-
|
|
108
|
-
afterEach(async () => {
|
|
109
|
-
await Promise.all([
|
|
110
|
-
publisherNode.stop(),
|
|
111
|
-
inspectedNode.stop(),
|
|
112
|
-
inspectorNode.stop()
|
|
113
|
-
])
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should inspect succesfully', async () => {
|
|
117
|
-
setTimeout(async () => {
|
|
118
|
-
await publisherNode.broadcast(message)
|
|
119
|
-
}, 250)
|
|
120
|
-
const success = await inspectorNode.inspect(inspectedDescriptor, STREAM_PART_ID)
|
|
121
|
-
expect(success).toBe(true)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
})
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { randomUserId } from '@streamr/test-utils'
|
|
2
|
-
import { StreamPartID, StreamPartIDUtils, hexToBinary, toUserIdRaw, utf8ToBinary, waitForEvent3 } from '@streamr/utils'
|
|
3
|
-
import { NetworkNode, createNetworkNode } from '../../src/NetworkNode'
|
|
4
|
-
import {
|
|
5
|
-
ContentType,
|
|
6
|
-
EncryptionType,
|
|
7
|
-
ProxyDirection,
|
|
8
|
-
SignatureType,
|
|
9
|
-
StreamMessage
|
|
10
|
-
} from '../../generated/packages/trackerless-network/protos/NetworkRpc'
|
|
11
|
-
import { createMockPeerDescriptor } from '../utils/utils'
|
|
12
|
-
|
|
13
|
-
const PROXIED_NODE_USER_ID = randomUserId()
|
|
14
|
-
|
|
15
|
-
const createMessage = (streamPartId: StreamPartID): StreamMessage => {
|
|
16
|
-
return {
|
|
17
|
-
messageId: {
|
|
18
|
-
streamId: StreamPartIDUtils.getStreamID(streamPartId),
|
|
19
|
-
streamPartition: StreamPartIDUtils.getStreamPartition(streamPartId),
|
|
20
|
-
timestamp: 666,
|
|
21
|
-
sequenceNumber: 0,
|
|
22
|
-
publisherId: toUserIdRaw(randomUserId()),
|
|
23
|
-
messageChainId: 'msgChainId'
|
|
24
|
-
},
|
|
25
|
-
previousMessageRef: {
|
|
26
|
-
timestamp: 665,
|
|
27
|
-
sequenceNumber: 0
|
|
28
|
-
},
|
|
29
|
-
body: {
|
|
30
|
-
oneofKind: 'contentMessage',
|
|
31
|
-
contentMessage: {
|
|
32
|
-
content: utf8ToBinary(JSON.stringify({
|
|
33
|
-
hello: 'world'
|
|
34
|
-
})),
|
|
35
|
-
contentType: ContentType.JSON,
|
|
36
|
-
encryptionType: EncryptionType.NONE,
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
signatureType: SignatureType.SECP256K1,
|
|
40
|
-
signature: hexToBinary('0x1234'),
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
describe('proxy and full node', () => {
|
|
45
|
-
|
|
46
|
-
const proxyNodeDescriptor = createMockPeerDescriptor({
|
|
47
|
-
websocket: { host: '127.0.0.1', port: 23135, tls: false }
|
|
48
|
-
})
|
|
49
|
-
const proxiedNodeDescriptor = createMockPeerDescriptor()
|
|
50
|
-
const proxiedStreamPart = StreamPartIDUtils.parse('proxy-stream#0')
|
|
51
|
-
const regularStreamPart1 = StreamPartIDUtils.parse('regular-stream1#0')
|
|
52
|
-
const regularStreamPart2 = StreamPartIDUtils.parse('regular-stream2#0')
|
|
53
|
-
const regularStreamPart3 = StreamPartIDUtils.parse('regular-stream3#0')
|
|
54
|
-
const regularStreamPart4 = StreamPartIDUtils.parse('regular-stream4#0')
|
|
55
|
-
let proxyNode: NetworkNode
|
|
56
|
-
let proxiedNode: NetworkNode
|
|
57
|
-
|
|
58
|
-
beforeEach(async () => {
|
|
59
|
-
proxyNode = createNetworkNode({
|
|
60
|
-
layer0: {
|
|
61
|
-
entryPoints: [proxyNodeDescriptor],
|
|
62
|
-
peerDescriptor: proxyNodeDescriptor,
|
|
63
|
-
websocketServerEnableTls: false
|
|
64
|
-
},
|
|
65
|
-
networkNode: {
|
|
66
|
-
acceptProxyConnections: true
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
await proxyNode.start()
|
|
70
|
-
proxyNode.stack.getContentDeliveryManager().joinStreamPart(proxiedStreamPart)
|
|
71
|
-
proxyNode.stack.getContentDeliveryManager().joinStreamPart(regularStreamPart1)
|
|
72
|
-
proxyNode.stack.getContentDeliveryManager().joinStreamPart(regularStreamPart2)
|
|
73
|
-
proxyNode.stack.getContentDeliveryManager().joinStreamPart(regularStreamPart3)
|
|
74
|
-
proxyNode.stack.getContentDeliveryManager().joinStreamPart(regularStreamPart4)
|
|
75
|
-
|
|
76
|
-
proxiedNode = createNetworkNode({
|
|
77
|
-
layer0: {
|
|
78
|
-
entryPoints: [proxyNodeDescriptor],
|
|
79
|
-
peerDescriptor: proxiedNodeDescriptor,
|
|
80
|
-
}
|
|
81
|
-
})
|
|
82
|
-
await proxiedNode.start(false)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
afterEach(async () => {
|
|
86
|
-
await proxyNode.stop()
|
|
87
|
-
await proxiedNode.stop()
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('proxied node can act as full node on another stream part', async () => {
|
|
91
|
-
await proxiedNode.setProxies(proxiedStreamPart, [proxyNodeDescriptor], ProxyDirection.PUBLISH, PROXIED_NODE_USER_ID, 1)
|
|
92
|
-
expect(proxiedNode.stack.getControlLayerNode().hasJoined()).toBe(false)
|
|
93
|
-
|
|
94
|
-
await Promise.all([
|
|
95
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage'),
|
|
96
|
-
proxiedNode.broadcast(createMessage(regularStreamPart1))
|
|
97
|
-
])
|
|
98
|
-
|
|
99
|
-
expect(proxiedNode.stack.getControlLayerNode().hasJoined()).toBe(true)
|
|
100
|
-
|
|
101
|
-
await Promise.all([
|
|
102
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage'),
|
|
103
|
-
proxiedNode.broadcast(createMessage(proxiedStreamPart))
|
|
104
|
-
])
|
|
105
|
-
|
|
106
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(proxiedStreamPart)!.proxied).toBe(true)
|
|
107
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(regularStreamPart1)!.proxied).toBe(false)
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('proxied node can act as full node on multiple stream parts', async () => {
|
|
111
|
-
await proxiedNode.setProxies(proxiedStreamPart, [proxyNodeDescriptor], ProxyDirection.PUBLISH, PROXIED_NODE_USER_ID, 1)
|
|
112
|
-
expect(proxiedNode.stack.getControlLayerNode().hasJoined()).toBe(false)
|
|
113
|
-
|
|
114
|
-
await Promise.all([
|
|
115
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage', 5000,
|
|
116
|
-
(streamMessage: StreamMessage) => streamMessage.messageId!.streamId === StreamPartIDUtils.getStreamID(regularStreamPart1)),
|
|
117
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage', 5000,
|
|
118
|
-
(streamMessage: StreamMessage) => streamMessage.messageId!.streamId === StreamPartIDUtils.getStreamID(regularStreamPart2)),
|
|
119
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage', 5000,
|
|
120
|
-
(streamMessage: StreamMessage) => streamMessage.messageId!.streamId === StreamPartIDUtils.getStreamID(regularStreamPart3)),
|
|
121
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage', 5000,
|
|
122
|
-
(streamMessage: StreamMessage) => streamMessage.messageId!.streamId === StreamPartIDUtils.getStreamID(regularStreamPart4)),
|
|
123
|
-
proxiedNode.broadcast(createMessage(regularStreamPart1)),
|
|
124
|
-
proxiedNode.broadcast(createMessage(regularStreamPart2)),
|
|
125
|
-
proxiedNode.broadcast(createMessage(regularStreamPart3)),
|
|
126
|
-
proxiedNode.broadcast(createMessage(regularStreamPart4))
|
|
127
|
-
])
|
|
128
|
-
|
|
129
|
-
expect(proxiedNode.stack.getControlLayerNode().hasJoined()).toBe(true)
|
|
130
|
-
|
|
131
|
-
await Promise.all([
|
|
132
|
-
waitForEvent3(proxyNode.stack.getContentDeliveryManager() as any, 'newMessage'),
|
|
133
|
-
proxiedNode.broadcast(createMessage(proxiedStreamPart))
|
|
134
|
-
])
|
|
135
|
-
|
|
136
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(proxiedStreamPart)!.proxied).toBe(true)
|
|
137
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(regularStreamPart1)!.proxied).toBe(false)
|
|
138
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(regularStreamPart2)!.proxied).toBe(false)
|
|
139
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(regularStreamPart3)!.proxied).toBe(false)
|
|
140
|
-
expect(proxiedNode.stack.getContentDeliveryManager().getStreamPartDelivery(regularStreamPart4)!.proxied).toBe(false)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
})
|