@streamr/trackerless-network 100.2.4 → 100.2.5-beta.1

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.
Files changed (33) hide show
  1. package/dist/package.json +6 -6
  2. package/dist/src/logic/ContentDeliveryManager.d.ts +2 -0
  3. package/dist/src/logic/ContentDeliveryManager.js +31 -13
  4. package/dist/src/logic/ContentDeliveryManager.js.map +1 -1
  5. package/dist/src/logic/EntryPointDiscovery.d.ts +3 -16
  6. package/dist/src/logic/EntryPointDiscovery.js +9 -88
  7. package/dist/src/logic/EntryPointDiscovery.js.map +1 -1
  8. package/dist/src/logic/StreamPartNetworkSplitAvoidance.d.ts +18 -0
  9. package/dist/src/logic/StreamPartNetworkSplitAvoidance.js +73 -0
  10. package/dist/src/logic/StreamPartNetworkSplitAvoidance.js.map +1 -0
  11. package/dist/src/logic/StreamPartReconnect.js +3 -3
  12. package/dist/src/logic/StreamPartReconnect.js.map +1 -1
  13. package/dist/src/proto/google/protobuf/any.d.ts +4 -11
  14. package/dist/src/proto/google/protobuf/any.js.map +1 -1
  15. package/dist/src/proto/google/protobuf/empty.d.ts +1 -0
  16. package/dist/src/proto/google/protobuf/empty.js.map +1 -1
  17. package/dist/src/proto/google/protobuf/timestamp.d.ts +3 -9
  18. package/dist/src/proto/google/protobuf/timestamp.js.map +1 -1
  19. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +2 -2
  20. package/dist/src/proto/packages/dht/protos/DhtRpc.js +1 -1
  21. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  22. package/package.json +6 -6
  23. package/src/logic/ContentDeliveryManager.ts +32 -16
  24. package/src/logic/EntryPointDiscovery.ts +14 -108
  25. package/src/logic/StreamPartNetworkSplitAvoidance.ts +89 -0
  26. package/src/logic/StreamPartReconnect.ts +3 -3
  27. package/src/proto/google/protobuf/any.ts +4 -11
  28. package/src/proto/google/protobuf/empty.ts +1 -0
  29. package/src/proto/google/protobuf/timestamp.ts +3 -9
  30. package/src/proto/packages/dht/protos/DhtRpc.ts +3 -3
  31. package/test/unit/EntrypointDiscovery.test.ts +9 -40
  32. package/test/unit/StreamPartNetworkSplitAvoidance.test.ts +32 -0
  33. 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
- * Instant now = Instant.now();
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.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
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 selfSigned = 4;
354
+ * @generated from protobuf field: bool allowSelfSignedCertificate = 4;
355
355
  */
356
- selfSigned: boolean;
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: "selfSigned", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
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('discoverEntryPointsFromDht has known entrypoints', async () => {
94
- const res = await entryPointDiscoveryWithData.discoverEntryPointsFromDht(1)
95
- expect(res.entryPointsFromDht).toEqual(false)
96
- expect(res.discoveredEntryPoints).toEqual([])
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('discoverEntryPointsfromDht on an empty stream', async () => {
106
- const res = await entryPointDiscoveryWithoutData.discoverEntryPointsFromDht(0)
107
- expect(res.entryPointsFromDht).toEqual(true)
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
- addNodesToStreamPart(layer1Node, 4)
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.storeSelfAsEntryPointIfNecessary(0)
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, FindEntryPointsResult } from '../../../src/logic/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 discoverEntryPointsFromDht(): Promise<FindEntryPointsResult> {
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 storeSelfAsEntryPointIfNecessary(): Promise<void> {
21
+ async storeAndKeepLocalNodeAsEntryPoint(): Promise<void> {
25
22
  }
26
23
 
27
24
  // eslint-disable-next-line class-methods-use-this