@streamr/trackerless-network 0.0.1-tatum.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/.eslintignore +7 -0
- package/.eslintrc +3 -0
- package/README.md +6 -0
- package/bin/bootstrap-node.ts +73 -0
- package/bin/full-node-webrtc.ts +102 -0
- package/bin/full-node-websocket.ts +102 -0
- package/bin/network.ts +43 -0
- package/dist/package.json +53 -0
- package/dist/src/NameDirectory.d.ts +5 -0
- package/dist/src/NameDirectory.js +44 -0
- package/dist/src/NameDirectory.js.map +1 -0
- package/dist/src/NetworkNode.d.ts +35 -0
- package/dist/src/NetworkNode.js +130 -0
- package/dist/src/NetworkNode.js.map +1 -0
- package/dist/src/NetworkStack.d.ts +32 -0
- package/dist/src/NetworkStack.js +108 -0
- package/dist/src/NetworkStack.js.map +1 -0
- package/dist/src/exports.d.ts +6 -0
- package/dist/src/exports.js +12 -0
- package/dist/src/exports.js.map +1 -0
- package/dist/src/identifiers.d.ts +1 -0
- package/dist/src/identifiers.js +3 -0
- package/dist/src/identifiers.js.map +1 -0
- package/dist/src/logic/DuplicateMessageDetector.d.ts +55 -0
- package/dist/src/logic/DuplicateMessageDetector.js +155 -0
- package/dist/src/logic/DuplicateMessageDetector.js.map +1 -0
- package/dist/src/logic/ILayer0.d.ts +13 -0
- package/dist/src/logic/ILayer0.js +3 -0
- package/dist/src/logic/ILayer0.js.map +1 -0
- package/dist/src/logic/IStreamNode.d.ts +12 -0
- package/dist/src/logic/IStreamNode.js +3 -0
- package/dist/src/logic/IStreamNode.js.map +1 -0
- package/dist/src/logic/PeerList.d.ts +27 -0
- package/dist/src/logic/PeerList.js +84 -0
- package/dist/src/logic/PeerList.js.map +1 -0
- package/dist/src/logic/RandomGraphNode.d.ts +68 -0
- package/dist/src/logic/RandomGraphNode.js +201 -0
- package/dist/src/logic/RandomGraphNode.js.map +1 -0
- package/dist/src/logic/Remote.d.ts +9 -0
- package/dist/src/logic/Remote.js +15 -0
- package/dist/src/logic/Remote.js.map +1 -0
- package/dist/src/logic/RemoteRandomGraphNode.d.ts +8 -0
- package/dist/src/logic/RemoteRandomGraphNode.js +35 -0
- package/dist/src/logic/RemoteRandomGraphNode.js.map +1 -0
- package/dist/src/logic/StreamEntryPointDiscovery.d.ts +36 -0
- package/dist/src/logic/StreamEntryPointDiscovery.js +179 -0
- package/dist/src/logic/StreamEntryPointDiscovery.js.map +1 -0
- package/dist/src/logic/StreamNodeServer.d.ts +20 -0
- package/dist/src/logic/StreamNodeServer.js +26 -0
- package/dist/src/logic/StreamNodeServer.js.map +1 -0
- package/dist/src/logic/StreamrNode.d.ts +76 -0
- package/dist/src/logic/StreamrNode.js +303 -0
- package/dist/src/logic/StreamrNode.js.map +1 -0
- package/dist/src/logic/createRandomGraphNode.d.ts +5 -0
- package/dist/src/logic/createRandomGraphNode.js +110 -0
- package/dist/src/logic/createRandomGraphNode.js.map +1 -0
- package/dist/src/logic/inspect/InspectSession.d.ts +18 -0
- package/dist/src/logic/inspect/InspectSession.js +38 -0
- package/dist/src/logic/inspect/InspectSession.js.map +1 -0
- package/dist/src/logic/inspect/Inspector.d.ts +33 -0
- package/dist/src/logic/inspect/Inspector.js +63 -0
- package/dist/src/logic/inspect/Inspector.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.d.ts +35 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.js +121 -0
- package/dist/src/logic/neighbor-discovery/Handshaker.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.d.ts +30 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.js +78 -0
- package/dist/src/logic/neighbor-discovery/HandshakerServer.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.d.ts +23 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js +44 -0
- package/dist/src/logic/neighbor-discovery/NeighborFinder.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.d.ts +30 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js +42 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManager.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.d.ts +20 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js +42 -0
- package/dist/src/logic/neighbor-discovery/NeighborUpdateManagerServer.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.d.ts +12 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js +54 -0
- package/dist/src/logic/neighbor-discovery/RemoteHandshaker.js.map +1 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.d.ts +11 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js +37 -0
- package/dist/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.js.map +1 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.d.ts +36 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js +81 -0
- package/dist/src/logic/propagation/FifoMapWithTTL.js.map +1 -0
- package/dist/src/logic/propagation/Propagation.d.ts +31 -0
- package/dist/src/logic/propagation/Propagation.js +64 -0
- package/dist/src/logic/propagation/Propagation.js.map +1 -0
- package/dist/src/logic/propagation/PropagationTaskStore.d.ts +21 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js +32 -0
- package/dist/src/logic/propagation/PropagationTaskStore.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.d.ts +5 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js +17 -0
- package/dist/src/logic/protocol-integration/stream-message/ContentMessageTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js +27 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js +33 -0
- package/dist/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.js.map +1 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.d.ts +6 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js +109 -0
- package/dist/src/logic/protocol-integration/stream-message/StreamMessageTranslator.js.map +1 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.d.ts +44 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.js +189 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionClient.js.map +1 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.d.ts +34 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.js +64 -0
- package/dist/src/logic/proxy/ProxyStreamConnectionServer.js.map +1 -0
- package/dist/src/logic/proxy/RemoteProxyServer.d.ts +7 -0
- package/dist/src/logic/proxy/RemoteProxyServer.js +36 -0
- package/dist/src/logic/proxy/RemoteProxyServer.js.map +1 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.d.ts +6 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js +28 -0
- package/dist/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.js.map +1 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.d.ts +20 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js +29 -0
- package/dist/src/logic/temporary-connection/TemporaryConnectionRpcServer.js.map +1 -0
- package/dist/src/logic/utils.d.ts +3 -0
- package/dist/src/logic/utils.js +16 -0
- package/dist/src/logic/utils.js.map +1 -0
- package/dist/src/proto/google/protobuf/any.d.ts +173 -0
- package/dist/src/proto/google/protobuf/any.js +155 -0
- package/dist/src/proto/google/protobuf/any.js.map +1 -0
- package/dist/src/proto/google/protobuf/empty.d.ts +32 -0
- package/dist/src/proto/google/protobuf/empty.js +34 -0
- package/dist/src/proto/google/protobuf/empty.js.map +1 -0
- package/dist/src/proto/google/protobuf/timestamp.d.ts +149 -0
- package/dist/src/proto/google/protobuf/timestamp.js +136 -0
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.d.ts +320 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js +245 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.client.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +1089 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +710 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.d.ts +145 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js +3 -0
- package/dist/src/proto/packages/dht/protos/DhtRpc.server.js.map +1 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.d.ts +87 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js +66 -0
- package/dist/src/proto/packages/proto-rpc/protos/ProtoRpc.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.d.ts +156 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js +122 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.client.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.d.ts +524 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js +350 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.js.map +1 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.d.ts +65 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js +3 -0
- package/dist/src/proto/packages/trackerless-network/protos/NetworkRpc.server.js.map +1 -0
- package/dist/test/benchmark/first-message.d.ts +1 -0
- package/dist/test/benchmark/first-message.js +137 -0
- package/dist/test/benchmark/first-message.js.map +1 -0
- package/dist/test/utils/utils.d.ts +12 -0
- package/dist/test/utils/utils.js +86 -0
- package/dist/test/utils/utils.js.map +1 -0
- package/jest.config.js +36 -0
- package/karma.config.js +20 -0
- package/log.txt +501 -0
- package/package.json +53 -0
- package/proto.sh +2 -0
- package/protos/NetworkRpc.proto +161 -0
- package/src/NameDirectory.ts +44 -0
- package/src/NetworkNode.ts +169 -0
- package/src/NetworkStack.ts +144 -0
- package/src/exports.ts +6 -0
- package/src/identifiers.ts +1 -0
- package/src/logic/DuplicateMessageDetector.ts +167 -0
- package/src/logic/ILayer0.ts +14 -0
- package/src/logic/IStreamNode.ts +17 -0
- package/src/logic/PeerList.ts +106 -0
- package/src/logic/RandomGraphNode.ts +310 -0
- package/src/logic/Remote.ts +19 -0
- package/src/logic/RemoteRandomGraphNode.ts +39 -0
- package/src/logic/StreamEntryPointDiscovery.ts +221 -0
- package/src/logic/StreamNodeServer.ts +44 -0
- package/src/logic/StreamrNode.ts +416 -0
- package/src/logic/createRandomGraphNode.ts +114 -0
- package/src/logic/inspect/InspectSession.ts +49 -0
- package/src/logic/inspect/Inspector.ts +89 -0
- package/src/logic/neighbor-discovery/Handshaker.ts +180 -0
- package/src/logic/neighbor-discovery/HandshakerServer.ts +99 -0
- package/src/logic/neighbor-discovery/NeighborFinder.ts +61 -0
- package/src/logic/neighbor-discovery/NeighborUpdateManager.ts +67 -0
- package/src/logic/neighbor-discovery/NeighborUpdateManagerServer.ts +61 -0
- package/src/logic/neighbor-discovery/RemoteHandshaker.ts +64 -0
- package/src/logic/neighbor-discovery/RemoteNeighborUpdateManager.ts +41 -0
- package/src/logic/propagation/FifoMapWithTTL.ts +108 -0
- package/src/logic/propagation/Propagation.ts +83 -0
- package/src/logic/propagation/PropagationTaskStore.ts +40 -0
- package/src/logic/protocol-integration/stream-message/ContentMessageTranslator.ts +16 -0
- package/src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator.ts +28 -0
- package/src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator.ts +38 -0
- package/src/logic/protocol-integration/stream-message/StreamMessageTranslator.ts +142 -0
- package/src/logic/proxy/ProxyStreamConnectionClient.ts +255 -0
- package/src/logic/proxy/ProxyStreamConnectionServer.ts +97 -0
- package/src/logic/proxy/RemoteProxyServer.ts +36 -0
- package/src/logic/temporary-connection/RemoteTemporaryConnectionRpcServer.ts +27 -0
- package/src/logic/temporary-connection/TemporaryConnectionRpcServer.ts +50 -0
- package/src/logic/utils.ts +17 -0
- package/src/proto/google/protobuf/any.ts +319 -0
- package/src/proto/google/protobuf/empty.ts +84 -0
- package/src/proto/google/protobuf/timestamp.ts +281 -0
- package/src/proto/packages/dht/protos/DhtRpc.client.ts +373 -0
- package/src/proto/packages/dht/protos/DhtRpc.server.ts +148 -0
- package/src/proto/packages/dht/protos/DhtRpc.ts +1399 -0
- package/src/proto/packages/proto-rpc/protos/ProtoRpc.ts +108 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.client.ts +176 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.server.ts +68 -0
- package/src/proto/packages/trackerless-network/protos/NetworkRpc.ts +667 -0
- package/test/benchmark/first-message.ts +155 -0
- package/test/end-to-end/inspect.test.ts +119 -0
- package/test/end-to-end/proxy-and-full-node.test.ts +140 -0
- package/test/end-to-end/proxy-connections.test.ts +228 -0
- package/test/end-to-end/proxy-key-exchange.test.ts +142 -0
- package/test/end-to-end/random-graph-with-real-connections.test.ts +154 -0
- package/test/end-to-end/webrtc-full-node-network.test.ts +97 -0
- package/test/end-to-end/websocket-full-node-network.test.ts +93 -0
- package/test/integration/Handshakes.test.ts +167 -0
- package/test/integration/Inspect.test.ts +102 -0
- package/test/integration/NetworkNode.test.ts +99 -0
- package/test/integration/NetworkRpc.test.ts +61 -0
- package/test/integration/NetworkStack.test.ts +74 -0
- package/test/integration/NetworkStackStoppedDuringStart.test.ts +45 -0
- package/test/integration/Propagation.test.ts +79 -0
- package/test/integration/RandomGraphNode-Layer1Node-Latencies.test.ts +141 -0
- package/test/integration/RandomGraphNode-Layer1Node.test.ts +226 -0
- package/test/integration/RemoteHandshaker.test.ts +78 -0
- package/test/integration/RemoteNeighborUpdateManager.test.ts +82 -0
- package/test/integration/RemoteRandomGraphNode.test.ts +102 -0
- package/test/integration/StreamrNode.test.ts +145 -0
- package/test/integration/stream-without-default-entrypoints.test.ts +132 -0
- package/test/unit/ContentMessageTranslator.test.ts +20 -0
- package/test/unit/DuplicateMessageDetector.test.ts +192 -0
- package/test/unit/FifoMapWithTtl.test.ts +229 -0
- package/test/unit/GroupKeyRequestTranslator.test.ts +36 -0
- package/test/unit/GroupKeyResponseTranslator.test.ts +39 -0
- package/test/unit/Handshaker.test.ts +63 -0
- package/test/unit/HandshakerServer.test.ts +123 -0
- package/test/unit/InspectSession.test.ts +78 -0
- package/test/unit/Inspector.test.ts +57 -0
- package/test/unit/NeighborFinder.test.ts +48 -0
- package/test/unit/NumberPair.test.ts +22 -0
- package/test/unit/PeerList.test.ts +150 -0
- package/test/unit/Propagation.test.ts +134 -0
- package/test/unit/RandomGraphNode.test.ts +73 -0
- package/test/unit/StreamEntrypointDiscovery.test.ts +152 -0
- package/test/unit/StreamMessageTranslator.test.ts +67 -0
- package/test/unit/StreamNodeServer.test.ts +63 -0
- package/test/unit/StreamrNode.test.ts +74 -0
- package/test/utils/mock/MockHandshaker.ts +15 -0
- package/test/utils/mock/MockLayer0.ts +71 -0
- package/test/utils/mock/MockLayer1.ts +6 -0
- package/test/utils/mock/MockNeighborFinder.ts +19 -0
- package/test/utils/mock/MockNeighborUpdateManager.ts +21 -0
- package/test/utils/mock/Transport.ts +25 -0
- package/test/utils/utils.ts +104 -0
- package/tsconfig.browser.json +12 -0
- package/tsconfig.jest.json +15 -0
- package/tsconfig.node.json +18 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { NetworkNode } from '../../src/NetworkNode'
|
|
2
|
+
import { range } from 'lodash'
|
|
3
|
+
import { NodeType, PeerDescriptor, PeerID, Simulator, SimulatorTransport, LatencyType } from '@streamr/dht'
|
|
4
|
+
import {
|
|
5
|
+
MessageID,
|
|
6
|
+
MessageRef,
|
|
7
|
+
StreamMessage,
|
|
8
|
+
StreamMessageType,
|
|
9
|
+
StreamPartIDUtils,
|
|
10
|
+
toStreamID
|
|
11
|
+
} from '@streamr/protocol'
|
|
12
|
+
import { EthereumAddress, waitForCondition } from '@streamr/utils'
|
|
13
|
+
import { streamPartIdToDataKey } from '../../src/logic/StreamEntryPointDiscovery'
|
|
14
|
+
|
|
15
|
+
describe('stream without default entrypoints', () => {
|
|
16
|
+
|
|
17
|
+
let entrypoint: NetworkNode
|
|
18
|
+
let nodes: NetworkNode[]
|
|
19
|
+
let numOfReceivedMessages: number
|
|
20
|
+
const entryPointPeerDescriptor: PeerDescriptor = {
|
|
21
|
+
kademliaId: new Uint8Array([1, 2, 3]),
|
|
22
|
+
nodeName: 'entrypoint',
|
|
23
|
+
type: NodeType.NODEJS
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const STREAM_ID = StreamPartIDUtils.parse('test#0')
|
|
27
|
+
const streamMessage = new StreamMessage({
|
|
28
|
+
messageId: new MessageID(
|
|
29
|
+
toStreamID('test'),
|
|
30
|
+
0,
|
|
31
|
+
666,
|
|
32
|
+
0,
|
|
33
|
+
'peer2' as EthereumAddress,
|
|
34
|
+
'msgChainId'
|
|
35
|
+
),
|
|
36
|
+
prevMsgRef: new MessageRef(665, 0),
|
|
37
|
+
content: {
|
|
38
|
+
hello: 'world'
|
|
39
|
+
},
|
|
40
|
+
messageType: StreamMessageType.MESSAGE,
|
|
41
|
+
signature: 'signature',
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
beforeEach(async () => {
|
|
45
|
+
Simulator.useFakeTimers()
|
|
46
|
+
const simulator = new Simulator(LatencyType.RANDOM)
|
|
47
|
+
nodes = []
|
|
48
|
+
numOfReceivedMessages = 0
|
|
49
|
+
const entryPointTransport = new SimulatorTransport(entryPointPeerDescriptor, simulator)
|
|
50
|
+
entrypoint = new NetworkNode({
|
|
51
|
+
layer0: {
|
|
52
|
+
transportLayer: entryPointTransport,
|
|
53
|
+
peerDescriptor: entryPointPeerDescriptor,
|
|
54
|
+
entryPoints: [entryPointPeerDescriptor]
|
|
55
|
+
},
|
|
56
|
+
networkNode: {}
|
|
57
|
+
})
|
|
58
|
+
await entrypoint.start()
|
|
59
|
+
await Promise.all(range(20).map(async (i) => {
|
|
60
|
+
const peerDescriptor: PeerDescriptor = {
|
|
61
|
+
kademliaId: PeerID.fromString(`${i}`).value,
|
|
62
|
+
type: NodeType.NODEJS,
|
|
63
|
+
nodeName: `${i}`
|
|
64
|
+
}
|
|
65
|
+
const transport = new SimulatorTransport(peerDescriptor, simulator)
|
|
66
|
+
const node = new NetworkNode({
|
|
67
|
+
layer0: {
|
|
68
|
+
peerDescriptor: peerDescriptor,
|
|
69
|
+
transportLayer: transport,
|
|
70
|
+
entryPoints: [entryPointPeerDescriptor]
|
|
71
|
+
},
|
|
72
|
+
networkNode: {}
|
|
73
|
+
})
|
|
74
|
+
nodes.push(node)
|
|
75
|
+
await node.start()
|
|
76
|
+
}))
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
afterEach(async () => {
|
|
80
|
+
await entrypoint.stop()
|
|
81
|
+
await Promise.all(nodes.map((node) => node.stop()))
|
|
82
|
+
Simulator.useFakeTimers(false)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('can join stream without configured entrypoints one by one', async () => {
|
|
86
|
+
await nodes[0].subscribeAndWaitForJoin(STREAM_ID)
|
|
87
|
+
nodes[0].addMessageListener((_msg) => {
|
|
88
|
+
numOfReceivedMessages += 1
|
|
89
|
+
})
|
|
90
|
+
await Promise.all([
|
|
91
|
+
waitForCondition(() => numOfReceivedMessages === 1, 10000),
|
|
92
|
+
nodes[1].publish(streamMessage)
|
|
93
|
+
])
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('can join without configured entrypoints simultaneously', async () => {
|
|
97
|
+
nodes[0].addMessageListener((_msg) => {
|
|
98
|
+
numOfReceivedMessages += 1
|
|
99
|
+
})
|
|
100
|
+
await Promise.all([
|
|
101
|
+
waitForCondition(() => numOfReceivedMessages === 1, 15000),
|
|
102
|
+
nodes[0].subscribe(STREAM_ID),
|
|
103
|
+
nodes[1].publish(streamMessage),
|
|
104
|
+
])
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// TODO: can't this test make pass
|
|
108
|
+
/*it('multiple nodes can join without configured entrypoints simultaneously', async () => {
|
|
109
|
+
const numOfSubscribers = 8
|
|
110
|
+
await Promise.all(range(numOfSubscribers).map(async (i) => {
|
|
111
|
+
await nodes[i].subscribeAndWaitForJoin(STREAM_ID, undefined, 4)
|
|
112
|
+
nodes[i].addMessageListener((_msg) => {
|
|
113
|
+
numOfReceivedMessages += 1
|
|
114
|
+
})
|
|
115
|
+
}))
|
|
116
|
+
await Promise.all([
|
|
117
|
+
waitForCondition(() => numOfReceivedMessages === numOfSubscribers, 15000),
|
|
118
|
+
nodes[9].publish(streamMessage)
|
|
119
|
+
])
|
|
120
|
+
}, 45000)*/
|
|
121
|
+
|
|
122
|
+
it('nodes store themselves as entrypoints on streamPart if number of entrypoints is low', async () => {
|
|
123
|
+
for (let i = 0; i < 10; i++) {
|
|
124
|
+
await nodes[i].subscribeAndWaitForJoin(STREAM_ID)
|
|
125
|
+
}
|
|
126
|
+
await waitForCondition(async () => {
|
|
127
|
+
const entryPointData = await nodes[15].stack.getLayer0DhtNode().getDataFromDht(streamPartIdToDataKey(STREAM_ID))
|
|
128
|
+
return entryPointData.dataEntries!.length >= 7
|
|
129
|
+
}, 15000)
|
|
130
|
+
|
|
131
|
+
}, 90000)
|
|
132
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ContentMessage } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
2
|
+
import { ContentMessageTranslator } from '../../src/logic/protocol-integration/stream-message/ContentMessageTranslator'
|
|
3
|
+
|
|
4
|
+
describe('ContentMessageTranslator', () => {
|
|
5
|
+
|
|
6
|
+
const oldMessage = JSON.stringify({ hello: 'world' })
|
|
7
|
+
const newMessage: ContentMessage = {
|
|
8
|
+
body: JSON.stringify({ hello: 'world' })
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
it('translates old protocol to protobuf', () => {
|
|
12
|
+
const translated = ContentMessageTranslator.toProtobuf(oldMessage)
|
|
13
|
+
expect(translated).toEqual(newMessage)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('translates protobuf to old protocol', () => {
|
|
17
|
+
const translated = ContentMessageTranslator.toClientProtocol(newMessage)
|
|
18
|
+
expect(translated).toEqual(oldMessage)
|
|
19
|
+
})
|
|
20
|
+
})
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { DuplicateMessageDetector, NumberPair, GapMisMatchError, InvalidNumberingError } from '../../src/logic/DuplicateMessageDetector'
|
|
2
|
+
|
|
3
|
+
test('starts empty', () => {
|
|
4
|
+
const detector = new DuplicateMessageDetector()
|
|
5
|
+
expect(detector.toString()).toEqual('')
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test('first check initializes default gap', () => {
|
|
9
|
+
const detector = new DuplicateMessageDetector()
|
|
10
|
+
const result = detector.markAndCheck(new NumberPair(1, 5), new NumberPair(10, 10))
|
|
11
|
+
const state = detector.toString()
|
|
12
|
+
expect(result).toEqual(true)
|
|
13
|
+
expect(state).toEqual('(10|10, Infinity|Infinity]')
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test('checking numbers in order introduces no new gaps', () => {
|
|
17
|
+
const detector = new DuplicateMessageDetector()
|
|
18
|
+
detector.markAndCheck(null, new NumberPair(10, 0))
|
|
19
|
+
expect(detector.markAndCheck(new NumberPair(10, 0), new NumberPair(20, 0))).toEqual(true)
|
|
20
|
+
expect(detector.markAndCheck(new NumberPair(20, 0), new NumberPair(30, 0))).toEqual(true)
|
|
21
|
+
expect(detector.markAndCheck(null, new NumberPair(30, 1))).toEqual(true)
|
|
22
|
+
expect(detector.markAndCheck(new NumberPair(30, 1), new NumberPair(30, 5))).toEqual(true)
|
|
23
|
+
const state = detector.toString()
|
|
24
|
+
expect(state).toEqual('(30|5, Infinity|Infinity]')
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test('skipping next expected messages creates gaps', () => {
|
|
28
|
+
const detector = new DuplicateMessageDetector()
|
|
29
|
+
detector.markAndCheck(null, new NumberPair(10, 0))
|
|
30
|
+
|
|
31
|
+
expect(detector.markAndCheck(new NumberPair(15, 0), new NumberPair(20, 0))).toEqual(true)
|
|
32
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (20|0, Infinity|Infinity]')
|
|
33
|
+
|
|
34
|
+
expect(detector.markAndCheck(new NumberPair(30, 0), new NumberPair(40, 0))).toEqual(true)
|
|
35
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (20|0, 30|0], (40|0, Infinity|Infinity]')
|
|
36
|
+
|
|
37
|
+
expect(detector.markAndCheck(new NumberPair(40, 10), new NumberPair(80, 20))).toEqual(true)
|
|
38
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (20|0, 30|0], (40|0, 40|10], (80|20, Infinity|Infinity]')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('only last gap is checked if no previous number given', () => {
|
|
42
|
+
const detector = new DuplicateMessageDetector()
|
|
43
|
+
detector.markAndCheck(null, new NumberPair(10, 0))
|
|
44
|
+
detector.markAndCheck(new NumberPair(10, 0), new NumberPair(20, 0))
|
|
45
|
+
|
|
46
|
+
expect(detector.markAndCheck(null, new NumberPair(15, 0))).toEqual(false)
|
|
47
|
+
expect(detector.markAndCheck(null, new NumberPair(30, 5))).toEqual(true)
|
|
48
|
+
const state = detector.toString()
|
|
49
|
+
expect(state).toEqual('(30|5, Infinity|Infinity]')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe('gap handling', () => {
|
|
53
|
+
let detector: DuplicateMessageDetector
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
detector = new DuplicateMessageDetector()
|
|
56
|
+
detector.markAndCheck(null, new NumberPair(10, 0))
|
|
57
|
+
detector.markAndCheck(new NumberPair(20, 0), new NumberPair(40, 0))
|
|
58
|
+
detector.markAndCheck(new NumberPair(80, 10), new NumberPair(100, 0))
|
|
59
|
+
expect(detector.toString()).toEqual('(10|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('gap division', () => {
|
|
63
|
+
expect(detector.markAndCheck(new NumberPair(15, 0), new NumberPair(18, 0)))
|
|
64
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (18|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
65
|
+
|
|
66
|
+
expect(detector.markAndCheck(new NumberPair(60, 0), new NumberPair(79, 5)))
|
|
67
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (18|0, 20|0], (40|0, 60|0], (79|5, 80|10], (100|0, Infinity|Infinity]')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('left-side gap contraction', () => {
|
|
71
|
+
expect(detector.markAndCheck(new NumberPair(10, 0), new NumberPair(15, 0))).toEqual(true)
|
|
72
|
+
expect(detector.toString()).toEqual('(15|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
73
|
+
|
|
74
|
+
expect(detector.markAndCheck(new NumberPair(40, 0), new NumberPair(80, 9))).toEqual(true)
|
|
75
|
+
expect(detector.toString()).toEqual('(15|0, 20|0], (80|9, 80|10], (100|0, Infinity|Infinity]')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test('right-side gap contraction', () => {
|
|
79
|
+
expect(detector.markAndCheck(new NumberPair(15, 0), new NumberPair(20, 0))).toEqual(true)
|
|
80
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
81
|
+
|
|
82
|
+
expect(detector.markAndCheck(new NumberPair(40, 1), new NumberPair(80, 10))).toEqual(true)
|
|
83
|
+
expect(detector.toString()).toEqual('(10|0, 15|0], (40|0, 40|1], (100|0, Infinity|Infinity]')
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
test('full contraction', () => {
|
|
87
|
+
expect(detector.markAndCheck(new NumberPair(40, 0), new NumberPair(80, 10)))
|
|
88
|
+
expect(detector.toString()).toEqual('(10|0, 20|0], (100|0, Infinity|Infinity]')
|
|
89
|
+
|
|
90
|
+
expect(detector.markAndCheck(new NumberPair(10, 0), new NumberPair(20, 0)))
|
|
91
|
+
expect(detector.toString()).toEqual('(100|0, Infinity|Infinity]')
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
describe('duplicates return false and do not change state', () => {
|
|
96
|
+
let detector: DuplicateMessageDetector
|
|
97
|
+
let expectedState: string
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
detector = new DuplicateMessageDetector()
|
|
100
|
+
detector.markAndCheck(new NumberPair(1, 0), new NumberPair(10, 0))
|
|
101
|
+
detector.markAndCheck(new NumberPair(20, 0), new NumberPair(40, 0))
|
|
102
|
+
detector.markAndCheck(new NumberPair(80, 10), new NumberPair(100, 0))
|
|
103
|
+
expectedState = detector.toString()
|
|
104
|
+
expect(expectedState).toEqual('(10|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('way below 1st gap', () => {
|
|
108
|
+
expect(detector.markAndCheck(new NumberPair(5, 0), new NumberPair(7, 0))).toEqual(false)
|
|
109
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('number touches lower bound of 1st gap', () => {
|
|
113
|
+
expect(detector.markAndCheck(new NumberPair(8, 0), new NumberPair(10, 0))).toEqual(false)
|
|
114
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('in-between gaps', () => {
|
|
118
|
+
expect(detector.markAndCheck(new NumberPair(25, 5), new NumberPair(30, 0))).toEqual(false)
|
|
119
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('number touches lower bound of 2nd gap', () => {
|
|
123
|
+
expect(detector.markAndCheck(new NumberPair(25, 0), new NumberPair(40, 0))).toEqual(false)
|
|
124
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('previous number touches upper bound of 2nd gap', () => {
|
|
128
|
+
expect(detector.markAndCheck(new NumberPair(80, 10), new NumberPair(90, 0))).toEqual(false)
|
|
129
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('previous number not provided, number is below last gap', () => {
|
|
133
|
+
expect(detector.markAndCheck(null, new NumberPair(80, 10))).toEqual(false)
|
|
134
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('previous number not provided, number touches lower bound of last gap', () => {
|
|
138
|
+
expect(detector.markAndCheck(null, new NumberPair(100, 0))).toEqual(false)
|
|
139
|
+
expect(detector.toString()).toEqual(expectedState)
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
describe('erroneous messages that overlap gaps', () => {
|
|
144
|
+
let detector: DuplicateMessageDetector
|
|
145
|
+
let expectedState
|
|
146
|
+
beforeEach(() => {
|
|
147
|
+
detector = new DuplicateMessageDetector()
|
|
148
|
+
detector.markAndCheck(new NumberPair(1, 0), new NumberPair(10, 0))
|
|
149
|
+
detector.markAndCheck(new NumberPair(20, 0), new NumberPair(40, 0))
|
|
150
|
+
detector.markAndCheck(new NumberPair(80, 10), new NumberPair(100, 0))
|
|
151
|
+
expectedState = detector.toString()
|
|
152
|
+
expect(expectedState).toEqual('(10|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
it('completely around gap', () => {
|
|
156
|
+
expect(() => detector.markAndCheck(new NumberPair(5, 0), new NumberPair(30, 0))).toThrowError(GapMisMatchError)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
it('previousNumber below gap while number in gap', () => {
|
|
160
|
+
expect(() => detector.markAndCheck(new NumberPair(5, 0), new NumberPair(15, 0))).toThrowError(GapMisMatchError)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('previousNumber in gap while number over gap', () => {
|
|
164
|
+
expect(() => detector.markAndCheck(new NumberPair(15, 0), new NumberPair(20, 5))).toThrowError(GapMisMatchError)
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
it('completely around multiple gaps', () => {
|
|
168
|
+
expect(() => detector.markAndCheck(new NumberPair(10, 0), new NumberPair(200, 0))).toThrowError(GapMisMatchError)
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
test('checks that number > previousNumber', () => {
|
|
173
|
+
const detector = new DuplicateMessageDetector()
|
|
174
|
+
expect(() => detector.markAndCheck(new NumberPair(5, 0), new NumberPair(1, 0)))
|
|
175
|
+
.toThrowError(InvalidNumberingError)
|
|
176
|
+
expect(() => detector.markAndCheck(new NumberPair(5, 5), new NumberPair(5, 5)))
|
|
177
|
+
.toThrowError(InvalidNumberingError)
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
test('lowest gaps get dropped when reaching maximum number of gaps', () => {
|
|
181
|
+
const detector = new DuplicateMessageDetector(3)
|
|
182
|
+
detector.markAndCheck(new NumberPair(1, 0), new NumberPair(10, 0))
|
|
183
|
+
detector.markAndCheck(new NumberPair(20, 0), new NumberPair(40, 0))
|
|
184
|
+
detector.markAndCheck(new NumberPair(80, 10), new NumberPair(100, 0))
|
|
185
|
+
expect(detector.toString()).toEqual('(10|0, 20|0], (40|0, 80|10], (100|0, Infinity|Infinity]')
|
|
186
|
+
|
|
187
|
+
detector.markAndCheck(new NumberPair(150, 0), new NumberPair(200, 0))
|
|
188
|
+
expect(detector.toString()).toEqual('(40|0, 80|10], (100|0, 150|0], (200|0, Infinity|Infinity]')
|
|
189
|
+
|
|
190
|
+
detector.markAndCheck(new NumberPair(50, 0), new NumberPair(70, 0))
|
|
191
|
+
expect(detector.toString()).toEqual('(70|0, 80|10], (100|0, 150|0], (200|0, Infinity|Infinity]')
|
|
192
|
+
})
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { FifoMapWithTTL } from '../../src/logic/propagation/FifoMapWithTTL'
|
|
2
|
+
|
|
3
|
+
describe('FifoMapWithTtl', () => {
|
|
4
|
+
describe('invalid constructor arguments', () => {
|
|
5
|
+
it('cannot instantiate with negative ttl', () => {
|
|
6
|
+
expect(() => new FifoMapWithTTL({ ttlInMs: -5, maxSize: 10 }))
|
|
7
|
+
.toThrow('ttlInMs (-5) cannot be < 0')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('cannot instantiate with negative maxSize', () => {
|
|
11
|
+
expect(() => new FifoMapWithTTL({ ttlInMs: 100, maxSize: -6 }))
|
|
12
|
+
.toThrow('maxSize (-6) cannot be < 0')
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('of maxSize=0 always remains empty', () => {
|
|
17
|
+
const fifoMap = new FifoMapWithTTL<string, string>({
|
|
18
|
+
ttlInMs: 100,
|
|
19
|
+
maxSize: 0
|
|
20
|
+
})
|
|
21
|
+
fifoMap.set('hello', 'world')
|
|
22
|
+
fifoMap.set('are', 'you empty?')
|
|
23
|
+
expect(fifoMap.get('hello')).toBeUndefined()
|
|
24
|
+
expect(fifoMap.get('are')).toBeUndefined()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('of maxSize=5', () => {
|
|
28
|
+
let fifoMap: FifoMapWithTTL<string, string>
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
fifoMap = new FifoMapWithTTL<string, string>({
|
|
32
|
+
ttlInMs: 100,
|
|
33
|
+
maxSize: 5
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
function setFirstFiveMessages() {
|
|
38
|
+
fifoMap.set('1st', 'foo')
|
|
39
|
+
fifoMap.set('2nd', 'bar')
|
|
40
|
+
fifoMap.set('3rd', 'hello')
|
|
41
|
+
fifoMap.set('4th', 'world')
|
|
42
|
+
fifoMap.set('5th', '!')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function set6thAnd7thMessages() {
|
|
46
|
+
fifoMap.set('6th', 'new')
|
|
47
|
+
fifoMap.set('7th', 'messages')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
it('can insert 5 items and retrieve all of them', () => {
|
|
51
|
+
setFirstFiveMessages()
|
|
52
|
+
expect(fifoMap.get('1st')).toEqual('foo')
|
|
53
|
+
expect(fifoMap.get('2nd')).toEqual('bar')
|
|
54
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
55
|
+
expect(fifoMap.get('4th')).toEqual('world')
|
|
56
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('inserting items when full causes oldest items to get dropped', () => {
|
|
60
|
+
setFirstFiveMessages()
|
|
61
|
+
set6thAnd7thMessages()
|
|
62
|
+
expect(fifoMap.get('1st')).toBeUndefined()
|
|
63
|
+
expect(fifoMap.get('2nd')).toBeUndefined()
|
|
64
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
65
|
+
expect(fifoMap.get('4th')).toEqual('world')
|
|
66
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
67
|
+
expect(fifoMap.get('6th')).toEqual('new')
|
|
68
|
+
expect(fifoMap.get('7th')).toEqual('messages')
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
describe('(re-)setting an item', () => {
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
setFirstFiveMessages()
|
|
74
|
+
fifoMap.set('4th', 'modified-once')
|
|
75
|
+
fifoMap.set('4th', 'modified-twice')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('does not cause oldest items to drop', () => {
|
|
79
|
+
expect(fifoMap.get('1st')).toEqual('foo')
|
|
80
|
+
expect(fifoMap.get('2nd')).toEqual('bar')
|
|
81
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
82
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('newest value stays in place', () => {
|
|
86
|
+
expect(fifoMap.get('4th')).toEqual('modified-twice')
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
describe('#delete', () => {
|
|
91
|
+
it('can delete an item', () => {
|
|
92
|
+
setFirstFiveMessages()
|
|
93
|
+
fifoMap.delete('4th')
|
|
94
|
+
expect(fifoMap.get('1st')).toEqual('foo')
|
|
95
|
+
expect(fifoMap.get('2nd')).toEqual('bar')
|
|
96
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
97
|
+
expect(fifoMap.get('4th')).toBeUndefined()
|
|
98
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('deleting items makes room for new ones', () => {
|
|
102
|
+
setFirstFiveMessages()
|
|
103
|
+
fifoMap.delete('2nd')
|
|
104
|
+
fifoMap.delete('4th')
|
|
105
|
+
set6thAnd7thMessages()
|
|
106
|
+
expect(fifoMap.get('1st')).toEqual('foo')
|
|
107
|
+
expect(fifoMap.get('2nd')).toBeUndefined()
|
|
108
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
109
|
+
expect(fifoMap.get('4th')).toBeUndefined()
|
|
110
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
111
|
+
expect(fifoMap.get('6th')).toEqual('new')
|
|
112
|
+
expect(fifoMap.get('7th')).toEqual('messages')
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('deleting a non-existing item does not throw', () => {
|
|
116
|
+
setFirstFiveMessages()
|
|
117
|
+
expect(() =>fifoMap.delete('non-existing-key')).not.toThrow()
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it('deleting a non-existing item keeps existing items intact', () => {
|
|
121
|
+
setFirstFiveMessages()
|
|
122
|
+
fifoMap.delete('non-existing-key')
|
|
123
|
+
expect(fifoMap.get('1st')).toEqual('foo')
|
|
124
|
+
expect(fifoMap.get('2nd')).toEqual('bar')
|
|
125
|
+
expect(fifoMap.get('3rd')).toEqual('hello')
|
|
126
|
+
expect(fifoMap.get('4th')).toEqual('world')
|
|
127
|
+
expect(fifoMap.get('5th')).toEqual('!')
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
describe('TTL', () => {
|
|
132
|
+
let time: number
|
|
133
|
+
|
|
134
|
+
beforeEach(() => {
|
|
135
|
+
time = 0
|
|
136
|
+
fifoMap = new FifoMapWithTTL<string, string>({
|
|
137
|
+
ttlInMs: 100,
|
|
138
|
+
maxSize: 5,
|
|
139
|
+
timeProvider: () => time
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
it('#get returns undefined after TTL', () => {
|
|
144
|
+
time = 0
|
|
145
|
+
fifoMap.set('hello', 'world')
|
|
146
|
+
time = 50
|
|
147
|
+
fifoMap.set('foo', 'bar')
|
|
148
|
+
|
|
149
|
+
time = 100
|
|
150
|
+
expect(fifoMap.get('hello')).toBeUndefined()
|
|
151
|
+
expect(fifoMap.get('foo')).toEqual('bar')
|
|
152
|
+
|
|
153
|
+
time = 160
|
|
154
|
+
expect(fifoMap.get('hello')).toBeUndefined()
|
|
155
|
+
expect(fifoMap.get('foo')).toBeUndefined()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('re-setting an item resets TTL', () => {
|
|
159
|
+
time = 0
|
|
160
|
+
fifoMap.set('hello', 'world')
|
|
161
|
+
|
|
162
|
+
time = 90
|
|
163
|
+
fifoMap.set('hello', 'world')
|
|
164
|
+
|
|
165
|
+
time = 100
|
|
166
|
+
expect(fifoMap.get('hello')).toEqual('world')
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it('re-setting expired resets TTL', () => {
|
|
170
|
+
time = 0
|
|
171
|
+
fifoMap.set('hello', 'world')
|
|
172
|
+
|
|
173
|
+
time = 110
|
|
174
|
+
expect(fifoMap.get('hello')).toBeUndefined() // sanity check
|
|
175
|
+
fifoMap.set('hello', 'world')
|
|
176
|
+
|
|
177
|
+
time = 150
|
|
178
|
+
expect(fifoMap.get('hello')).toEqual('world')
|
|
179
|
+
})
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
describe('onItemDropped callback', () => {
|
|
183
|
+
let time: number
|
|
184
|
+
let onItemDropped: jest.Mock<undefined, [string]>
|
|
185
|
+
|
|
186
|
+
beforeEach(() => {
|
|
187
|
+
time = 0
|
|
188
|
+
onItemDropped = jest.fn<undefined, [string]>()
|
|
189
|
+
fifoMap = new FifoMapWithTTL<string, string>({
|
|
190
|
+
ttlInMs: 100,
|
|
191
|
+
maxSize: 5,
|
|
192
|
+
onItemDropped,
|
|
193
|
+
timeProvider: () => time
|
|
194
|
+
})
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
it('invoked when deleting an item', () => {
|
|
198
|
+
setFirstFiveMessages()
|
|
199
|
+
fifoMap.delete('3rd')
|
|
200
|
+
expect(onItemDropped).toHaveBeenCalledTimes(1)
|
|
201
|
+
expect(onItemDropped).toHaveBeenCalledWith('3rd')
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('invoked when items are dropped due to being full', () => {
|
|
205
|
+
setFirstFiveMessages()
|
|
206
|
+
set6thAnd7thMessages()
|
|
207
|
+
expect(onItemDropped).toHaveBeenCalledTimes(2)
|
|
208
|
+
expect(onItemDropped).toHaveBeenNthCalledWith(1, '1st')
|
|
209
|
+
expect(onItemDropped).toHaveBeenNthCalledWith(2, '2nd')
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
it('invoked when re-setting an item', () => {
|
|
213
|
+
setFirstFiveMessages()
|
|
214
|
+
fifoMap.set('4th', '!!!')
|
|
215
|
+
expect(onItemDropped).toHaveBeenCalledTimes(1)
|
|
216
|
+
expect(onItemDropped).toHaveBeenNthCalledWith(1, '4th')
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
it('invoked when getting a stale item', () => {
|
|
220
|
+
time = 0
|
|
221
|
+
setFirstFiveMessages()
|
|
222
|
+
time = 500
|
|
223
|
+
expect(fifoMap.get('1st')).toBeUndefined()
|
|
224
|
+
expect(onItemDropped).toHaveBeenCalledTimes(1)
|
|
225
|
+
expect(onItemDropped).toHaveBeenNthCalledWith(1, '1st')
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
})
|
|
229
|
+
})
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GroupKeyRequest as OldGroupKeyRequest } from '@streamr/protocol'
|
|
2
|
+
import { EthereumAddress } from '@streamr/utils'
|
|
3
|
+
import { GroupKeyRequest } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
4
|
+
import { GroupKeyRequestTranslator } from '../../src/logic/protocol-integration/stream-message/GroupKeyRequestTranslator'
|
|
5
|
+
|
|
6
|
+
describe('GroupKeyRequestTranslator', () => {
|
|
7
|
+
|
|
8
|
+
const oldGroupKeyRequest = new OldGroupKeyRequest({
|
|
9
|
+
rsaPublicKey: 'aaaaaaaa',
|
|
10
|
+
recipient: 'recipient' as EthereumAddress,
|
|
11
|
+
requestId: 'request',
|
|
12
|
+
groupKeyIds: ['id1', 'id2', 'id3']
|
|
13
|
+
})
|
|
14
|
+
const newGroupKeyRequest: GroupKeyRequest = {
|
|
15
|
+
rsaPublicKey: 'aaaaaaaa',
|
|
16
|
+
recipient: 'recipient',
|
|
17
|
+
requestId: 'request',
|
|
18
|
+
groupKeyIds: ['id1', 'id2', 'id3']
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
it('translates old protocol to protobuf', () => {
|
|
22
|
+
const translated = GroupKeyRequestTranslator.toProtobuf(oldGroupKeyRequest)
|
|
23
|
+
expect(translated.rsaPublicKey).toEqual(newGroupKeyRequest.rsaPublicKey)
|
|
24
|
+
expect(translated.recipient).toEqual(newGroupKeyRequest.recipient)
|
|
25
|
+
expect(translated.requestId).toEqual(newGroupKeyRequest.requestId)
|
|
26
|
+
expect(translated.groupKeyIds).toEqual(newGroupKeyRequest.groupKeyIds)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('translates protobuf to old protocol', () => {
|
|
30
|
+
const translated = GroupKeyRequestTranslator.toClientProtocol(newGroupKeyRequest)
|
|
31
|
+
expect(translated.rsaPublicKey).toEqual(oldGroupKeyRequest.rsaPublicKey)
|
|
32
|
+
expect(translated.recipient).toEqual(oldGroupKeyRequest.recipient)
|
|
33
|
+
expect(translated.requestId).toEqual(oldGroupKeyRequest.requestId)
|
|
34
|
+
expect(translated.groupKeyIds).toEqual(oldGroupKeyRequest.groupKeyIds)
|
|
35
|
+
})
|
|
36
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { GroupKeyResponseTranslator } from '../../src/logic/protocol-integration/stream-message/GroupKeyResponseTranslator'
|
|
2
|
+
import {
|
|
3
|
+
GroupKeyResponse as OldGroupKeyResponse,
|
|
4
|
+
EncryptedGroupKey as OldEncryptedGroupKey
|
|
5
|
+
} from '@streamr/protocol'
|
|
6
|
+
import { EthereumAddress } from '@streamr/utils'
|
|
7
|
+
import { EncryptedGroupKey, GroupKeyResponse } from '../../src/proto/packages/trackerless-network/protos/NetworkRpc'
|
|
8
|
+
|
|
9
|
+
describe('GroupKeyResponseTranslator', () => {
|
|
10
|
+
|
|
11
|
+
const oldGroupKeyResponse = new OldGroupKeyResponse({
|
|
12
|
+
requestId: 'request',
|
|
13
|
+
recipient: 'recipient' as EthereumAddress,
|
|
14
|
+
encryptedGroupKeys: [ new OldEncryptedGroupKey('id', '0000') ]
|
|
15
|
+
})
|
|
16
|
+
const newEncryptedGroupKey: EncryptedGroupKey = {
|
|
17
|
+
groupKeyId: 'id',
|
|
18
|
+
encryptedGroupKeyHex: '0000'
|
|
19
|
+
}
|
|
20
|
+
const newGroupKeyResponse: GroupKeyResponse = {
|
|
21
|
+
requestId: 'request',
|
|
22
|
+
recipient: 'recipient',
|
|
23
|
+
encryptedGroupKeys: [ newEncryptedGroupKey ]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
it('translates old protocol to protobuf', () => {
|
|
27
|
+
const translated = GroupKeyResponseTranslator.toProtobuf(oldGroupKeyResponse)
|
|
28
|
+
expect(translated.encryptedGroupKeys).toEqual(newGroupKeyResponse.encryptedGroupKeys)
|
|
29
|
+
expect(translated.recipient).toEqual(newGroupKeyResponse.recipient)
|
|
30
|
+
expect(translated.requestId).toEqual(newGroupKeyResponse.requestId)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('translates protobuf to old protocol', () => {
|
|
34
|
+
const translated = GroupKeyResponseTranslator.toClientProtocol(newGroupKeyResponse)
|
|
35
|
+
expect(translated.encryptedGroupKeys).toEqual(oldGroupKeyResponse.encryptedGroupKeys)
|
|
36
|
+
expect(translated.recipient).toEqual(oldGroupKeyResponse.recipient)
|
|
37
|
+
expect(translated.requestId).toEqual(oldGroupKeyResponse.requestId)
|
|
38
|
+
})
|
|
39
|
+
})
|