@streamr/trackerless-network 100.2.4 → 100.2.5-beta.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/dist/package.json +6 -6
- package/dist/src/logic/ContentDeliveryManager.d.ts +2 -0
- package/dist/src/logic/ContentDeliveryManager.js +31 -13
- package/dist/src/logic/ContentDeliveryManager.js.map +1 -1
- package/dist/src/logic/EntryPointDiscovery.d.ts +3 -16
- package/dist/src/logic/EntryPointDiscovery.js +9 -88
- package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
- package/dist/src/logic/StreamPartNetworkSplitAvoidance.d.ts +18 -0
- package/dist/src/logic/StreamPartNetworkSplitAvoidance.js +73 -0
- package/dist/src/logic/StreamPartNetworkSplitAvoidance.js.map +1 -0
- package/dist/src/logic/StreamPartReconnect.js +3 -3
- package/dist/src/logic/StreamPartReconnect.js.map +1 -1
- package/dist/src/proto/google/protobuf/any.d.ts +4 -11
- package/dist/src/proto/google/protobuf/any.js.map +1 -1
- package/dist/src/proto/google/protobuf/empty.d.ts +1 -0
- package/dist/src/proto/google/protobuf/empty.js.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts +3 -9
- package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +2 -2
- package/dist/src/proto/packages/dht/protos/DhtRpc.js +1 -1
- package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
- package/package.json +6 -6
- package/src/logic/ContentDeliveryManager.ts +32 -16
- package/src/logic/EntryPointDiscovery.ts +14 -108
- package/src/logic/StreamPartNetworkSplitAvoidance.ts +89 -0
- package/src/logic/StreamPartReconnect.ts +3 -3
- package/src/proto/google/protobuf/any.ts +4 -11
- package/src/proto/google/protobuf/empty.ts +1 -0
- package/src/proto/google/protobuf/timestamp.ts +3 -9
- package/src/proto/packages/dht/protos/DhtRpc.ts +3 -3
- package/test/unit/EntrypointDiscovery.test.ts +9 -40
- package/test/unit/StreamPartNetworkSplitAvoidance.test.ts +32 -0
- package/test/utils/fake/FakeEntryPointDiscovery.ts +4 -7
|
@@ -49,6 +49,7 @@ import { MessageType } from "@protobuf-ts/runtime";
|
|
|
49
49
|
* rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
|
|
50
50
|
* }
|
|
51
51
|
*
|
|
52
|
+
* The JSON representation for `Empty` is empty JSON object `{}`.
|
|
52
53
|
*
|
|
53
54
|
* @generated from protobuf message google.protobuf.Empty
|
|
54
55
|
*/
|
|
@@ -97,15 +97,8 @@ import { MessageType } from "@protobuf-ts/runtime";
|
|
|
97
97
|
* Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
|
|
98
98
|
* .setNanos((int) ((millis % 1000) * 1000000)).build();
|
|
99
99
|
*
|
|
100
|
-
* Example 5: Compute Timestamp from Java `Instant.now()`.
|
|
101
100
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* Timestamp timestamp =
|
|
105
|
-
* Timestamp.newBuilder().setSeconds(now.getEpochSecond())
|
|
106
|
-
* .setNanos(now.getNano()).build();
|
|
107
|
-
*
|
|
108
|
-
* Example 6: Compute Timestamp from current time in Python.
|
|
101
|
+
* Example 5: Compute Timestamp from current time in Python.
|
|
109
102
|
*
|
|
110
103
|
* timestamp = Timestamp()
|
|
111
104
|
* timestamp.GetCurrentTime()
|
|
@@ -134,10 +127,11 @@ import { MessageType } from "@protobuf-ts/runtime";
|
|
|
134
127
|
* [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
|
|
135
128
|
* the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
|
|
136
129
|
* the Joda Time's [`ISODateTimeFormat.dateTime()`](
|
|
137
|
-
* http://joda-time
|
|
130
|
+
* http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
|
|
138
131
|
* ) to obtain a formatter capable of generating timestamps in this format.
|
|
139
132
|
*
|
|
140
133
|
*
|
|
134
|
+
*
|
|
141
135
|
* @generated from protobuf message google.protobuf.Timestamp
|
|
142
136
|
*/
|
|
143
137
|
export interface Timestamp {
|
|
@@ -351,9 +351,9 @@ export interface ConnectivityRequest {
|
|
|
351
351
|
*/
|
|
352
352
|
host?: string;
|
|
353
353
|
/**
|
|
354
|
-
* @generated from protobuf field: bool
|
|
354
|
+
* @generated from protobuf field: bool allowSelfSignedCertificate = 4;
|
|
355
355
|
*/
|
|
356
|
-
|
|
356
|
+
allowSelfSignedCertificate: boolean;
|
|
357
357
|
}
|
|
358
358
|
/**
|
|
359
359
|
* @generated from protobuf message dht.ConnectivityResponse
|
|
@@ -962,7 +962,7 @@ class ConnectivityRequest$Type extends MessageType<ConnectivityRequest> {
|
|
|
962
962
|
{ no: 1, name: "port", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
963
963
|
{ no: 2, name: "tls", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
|
|
964
964
|
{ no: 3, name: "host", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
|
|
965
|
-
{ no: 4, name: "
|
|
965
|
+
{ no: 4, name: "allowSelfSignedCertificate", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
|
|
966
966
|
]);
|
|
967
967
|
}
|
|
968
968
|
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { PeerDescriptor, areEqualPeerDescriptors } from '@streamr/dht'
|
|
2
2
|
import { StreamPartIDUtils } from '@streamr/protocol'
|
|
3
3
|
import { wait } from '@streamr/utils'
|
|
4
|
-
import { range } from 'lodash'
|
|
5
4
|
import { EntryPointDiscovery } from '../../src/logic/EntryPointDiscovery'
|
|
6
5
|
import { Any } from '../../src/proto/google/protobuf/any'
|
|
7
6
|
import { DataEntry } from '../../src/proto/packages/dht/protos/DhtRpc'
|
|
8
|
-
import { MockLayer1Node } from '../utils/mock/MockLayer1Node'
|
|
9
7
|
import { createMockPeerDescriptor } from '../utils/utils'
|
|
10
8
|
|
|
11
9
|
const STREAM_PART_ID = StreamPartIDUtils.parse('stream#0')
|
|
@@ -52,24 +50,11 @@ describe('EntryPointDiscovery', () => {
|
|
|
52
50
|
|
|
53
51
|
const fakeDeleteEntryPointData = async (): Promise<void> => {}
|
|
54
52
|
|
|
55
|
-
const addNodesToStreamPart = (layer1: MockLayer1Node, count: number) => {
|
|
56
|
-
range(count).forEach(() => {
|
|
57
|
-
layer1.addNewRandomPeerToKBucket()
|
|
58
|
-
layer1.addNewRandomPeerToKBucket()
|
|
59
|
-
layer1.addNewRandomPeerToKBucket()
|
|
60
|
-
layer1.addNewRandomPeerToKBucket()
|
|
61
|
-
})
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let layer1Node: MockLayer1Node
|
|
65
|
-
|
|
66
53
|
beforeEach(() => {
|
|
67
54
|
storeCalled = 0
|
|
68
|
-
layer1Node = new MockLayer1Node()
|
|
69
55
|
entryPointDiscoveryWithData = new EntryPointDiscovery({
|
|
70
56
|
localPeerDescriptor: peerDescriptor,
|
|
71
57
|
streamPartId: STREAM_PART_ID,
|
|
72
|
-
layer1Node,
|
|
73
58
|
fetchEntryPointData: fakeFetchEntryPointData,
|
|
74
59
|
storeEntryPointData: fakeStoreEntryPointData,
|
|
75
60
|
deleteEntryPointData: fakeDeleteEntryPointData,
|
|
@@ -78,7 +63,6 @@ describe('EntryPointDiscovery', () => {
|
|
|
78
63
|
entryPointDiscoveryWithoutData = new EntryPointDiscovery({
|
|
79
64
|
localPeerDescriptor: peerDescriptor,
|
|
80
65
|
streamPartId: STREAM_PART_ID,
|
|
81
|
-
layer1Node,
|
|
82
66
|
fetchEntryPointData: fakeEmptyFetchEntryPointData,
|
|
83
67
|
storeEntryPointData: fakeStoreEntryPointData,
|
|
84
68
|
deleteEntryPointData: fakeDeleteEntryPointData,
|
|
@@ -90,40 +74,25 @@ describe('EntryPointDiscovery', () => {
|
|
|
90
74
|
entryPointDiscoveryWithData.destroy()
|
|
91
75
|
})
|
|
92
76
|
|
|
93
|
-
it('
|
|
94
|
-
const res = await entryPointDiscoveryWithData.
|
|
95
|
-
expect(res.
|
|
96
|
-
expect(res
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
it('discoverEntryPointsFromDht does not have known entrypoints', async () => {
|
|
100
|
-
const res = await entryPointDiscoveryWithData.discoverEntryPointsFromDht(0)
|
|
101
|
-
expect(res.discoveredEntryPoints.length).toBe(1)
|
|
102
|
-
expect(areEqualPeerDescriptors(res.discoveredEntryPoints[0], peerDescriptor)).toBe(true)
|
|
77
|
+
it('discoverEntryPoints filters deleted data', async () => {
|
|
78
|
+
const res = await entryPointDiscoveryWithData.discoverEntryPoints()
|
|
79
|
+
expect(res.length).toBe(1)
|
|
80
|
+
expect(areEqualPeerDescriptors(res[0], peerDescriptor)).toBe(true)
|
|
103
81
|
})
|
|
104
82
|
|
|
105
|
-
it('
|
|
106
|
-
const res = await entryPointDiscoveryWithoutData.
|
|
107
|
-
expect(res.
|
|
108
|
-
expect(res.discoveredEntryPoints.length).toBe(1)
|
|
109
|
-
expect(areEqualPeerDescriptors(res.discoveredEntryPoints[0], peerDescriptor)).toBe(true) // localPeerDescriptor
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('store on empty stream', async () => {
|
|
113
|
-
await entryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(0)
|
|
114
|
-
expect(storeCalled).toEqual(1)
|
|
115
|
-
expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
|
|
83
|
+
it('discoverEntryPoints without results', async () => {
|
|
84
|
+
const res = await entryPointDiscoveryWithoutData.discoverEntryPoints()
|
|
85
|
+
expect(res.length).toBe(0)
|
|
116
86
|
})
|
|
117
87
|
|
|
118
88
|
it('store on stream without saturated entrypoint count', async () => {
|
|
119
|
-
|
|
120
|
-
await entryPointDiscoveryWithData.storeSelfAsEntryPointIfNecessary(0)
|
|
89
|
+
await entryPointDiscoveryWithData.storeAndKeepLocalNodeAsEntryPoint()
|
|
121
90
|
expect(storeCalled).toEqual(1)
|
|
122
91
|
expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
|
|
123
92
|
})
|
|
124
93
|
|
|
125
94
|
it('will keep stored until destroyed', async () => {
|
|
126
|
-
await entryPointDiscoveryWithData.
|
|
95
|
+
await entryPointDiscoveryWithData.storeAndKeepLocalNodeAsEntryPoint()
|
|
127
96
|
expect(storeCalled).toEqual(1)
|
|
128
97
|
expect(entryPointDiscoveryWithData.isLocalNodeEntryPoint()).toEqual(true)
|
|
129
98
|
await wait(4500)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { MIN_NEIGHBOR_COUNT } from '../../src/logic/StreamPartNetworkSplitAvoidance'
|
|
2
|
+
import { StreamPartNetworkSplitAvoidance } from '../../src/logic/StreamPartNetworkSplitAvoidance'
|
|
3
|
+
import { MockLayer1Node } from '../utils/mock/MockLayer1Node'
|
|
4
|
+
|
|
5
|
+
describe('StreamPartNetworkSplitAvoidance', () => {
|
|
6
|
+
|
|
7
|
+
let avoidance: StreamPartNetworkSplitAvoidance
|
|
8
|
+
let layer1Node: MockLayer1Node
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
layer1Node = new MockLayer1Node()
|
|
12
|
+
avoidance = new StreamPartNetworkSplitAvoidance({
|
|
13
|
+
layer1Node,
|
|
14
|
+
discoverEntryPoints: async () => {
|
|
15
|
+
layer1Node.addNewRandomPeerToKBucket()
|
|
16
|
+
return layer1Node.getNeighbors()
|
|
17
|
+
},
|
|
18
|
+
exponentialRunOfBaseDelay: 1
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
layer1Node.stop()
|
|
24
|
+
avoidance.destroy()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('runs avoidance until number of neighbors is above MIN_NEIGHBOR_COUNT', async () => {
|
|
28
|
+
await avoidance.avoidNetworkSplit()
|
|
29
|
+
expect(layer1Node.getNeighborCount()).toBeGreaterThan(MIN_NEIGHBOR_COUNT)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PeerDescriptor } from '@streamr/dht'
|
|
2
|
-
import { EntryPointDiscovery
|
|
2
|
+
import { EntryPointDiscovery } from '../../../src/logic/EntryPointDiscovery'
|
|
3
3
|
|
|
4
4
|
export const createFakeEntryPointDiscovery = (): EntryPointDiscovery => {
|
|
5
5
|
return new FakeEntryPointDiscovery() as unknown as EntryPointDiscovery
|
|
@@ -13,15 +13,12 @@ class FakeEntryPointDiscovery {
|
|
|
13
13
|
this.entryPoints = nodes
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
async
|
|
17
|
-
return
|
|
18
|
-
entryPointsFromDht: true,
|
|
19
|
-
discoveredEntryPoints: this.entryPoints
|
|
20
|
-
}
|
|
16
|
+
async discoverEntryPoints(): Promise<PeerDescriptor[]> {
|
|
17
|
+
return this.entryPoints
|
|
21
18
|
}
|
|
22
19
|
|
|
23
20
|
// eslint-disable-next-line class-methods-use-this
|
|
24
|
-
async
|
|
21
|
+
async storeAndKeepLocalNodeAsEntryPoint(): Promise<void> {
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
// eslint-disable-next-line class-methods-use-this
|