@splitsoftware/splitio-commons 1.16.0 → 1.16.1-rc.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.
- package/CHANGES.txt +3 -0
- package/cjs/evaluator/matchers/index.js +3 -1
- package/cjs/evaluator/matchers/large_segment.js +16 -0
- package/cjs/evaluator/matchers/matcherTypes.js +1 -0
- package/cjs/evaluator/matchersTransform/index.js +1 -1
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/info.js +0 -1
- package/cjs/readiness/readinessManager.js +14 -10
- package/cjs/readiness/sdkReadinessManager.js +5 -6
- package/cjs/sdkClient/sdkClientMethodCS.js +3 -4
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +4 -5
- package/cjs/sdkFactory/index.js +1 -1
- package/cjs/services/splitApi.js +4 -0
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +5 -5
- package/cjs/storages/KeyBuilder.js +3 -0
- package/cjs/storages/KeyBuilderCS.js +17 -5
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +16 -4
- package/cjs/storages/inLocalStorage/index.js +6 -2
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +20 -11
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/cjs/sync/polling/pollingManagerCS.js +51 -33
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +5 -6
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -0
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/cjs/sync/streaming/constants.js +2 -1
- package/cjs/sync/streaming/pushManager.js +95 -64
- package/cjs/sync/submitters/telemetrySubmitter.js +2 -0
- package/cjs/sync/syncManagerOnline.js +24 -14
- package/cjs/utils/constants/index.js +5 -1
- package/cjs/utils/settingsValidation/index.js +9 -4
- package/esm/evaluator/matchers/index.js +3 -1
- package/esm/evaluator/matchers/large_segment.js +12 -0
- package/esm/evaluator/matchers/matcherTypes.js +1 -0
- package/esm/evaluator/matchersTransform/index.js +1 -1
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +0 -1
- package/esm/readiness/readinessManager.js +14 -10
- package/esm/readiness/sdkReadinessManager.js +5 -6
- package/esm/sdkClient/sdkClientMethodCS.js +4 -5
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +5 -6
- package/esm/sdkFactory/index.js +1 -1
- package/esm/services/splitApi.js +5 -1
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +3 -3
- package/esm/storages/KeyBuilder.js +3 -0
- package/esm/storages/KeyBuilderCS.js +15 -4
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +17 -5
- package/esm/storages/inLocalStorage/index.js +7 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
- package/esm/storages/inMemory/SplitsCacheInMemory.js +21 -12
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
- package/esm/sync/polling/pollingManagerCS.js +52 -34
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -4
- package/esm/sync/polling/updaters/splitChangesUpdater.js +2 -1
- package/esm/sync/streaming/SSEHandler/index.js +2 -1
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
- package/esm/sync/streaming/constants.js +1 -0
- package/esm/sync/streaming/pushManager.js +95 -65
- package/esm/sync/submitters/telemetrySubmitter.js +2 -0
- package/esm/sync/syncManagerOnline.js +25 -15
- package/esm/utils/constants/index.js +4 -0
- package/esm/utils/settingsValidation/index.js +10 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +17 -7
- package/src/evaluator/matchers/index.ts +2 -0
- package/src/evaluator/matchers/large_segment.ts +18 -0
- package/src/evaluator/matchers/matcherTypes.ts +1 -0
- package/src/evaluator/matchersTransform/index.ts +1 -1
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +0 -1
- package/src/readiness/readinessManager.ts +13 -9
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +3 -2
- package/src/sdkClient/sdkClientMethodCS.ts +4 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +5 -7
- package/src/sdkFactory/index.ts +1 -1
- package/src/services/splitApi.ts +6 -1
- package/src/services/types.ts +1 -0
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +4 -4
- package/src/storages/KeyBuilder.ts +3 -0
- package/src/storages/KeyBuilderCS.ts +25 -5
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +20 -5
- package/src/storages/inLocalStorage/index.ts +8 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
- package/src/storages/inMemory/SplitsCacheInMemory.ts +15 -10
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +7 -5
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +6 -2
- package/src/sync/polling/pollingManagerCS.ts +61 -29
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
- package/src/sync/polling/types.ts +3 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +5 -8
- package/src/sync/polling/updaters/splitChangesUpdater.ts +4 -3
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +14 -2
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -5
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +100 -63
- package/src/sync/streaming/types.ts +5 -3
- package/src/sync/submitters/telemetrySubmitter.ts +2 -0
- package/src/sync/submitters/types.ts +10 -4
- package/src/sync/syncManagerOnline.ts +19 -11
- package/src/types.ts +26 -1
- package/src/utils/constants/index.ts +5 -0
- package/src/utils/settingsValidation/index.ts +11 -6
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +14 -6
- package/types/evaluator/matchers/large_segment.d.ts +5 -0
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +2 -3
- package/types/readiness/types.d.ts +3 -2
- package/types/services/types.d.ts +1 -0
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +1 -0
- package/types/storages/KeyBuilderCS.d.ts +7 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +3 -2
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +4 -3
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -3
- package/types/sync/polling/types.d.ts +9 -2
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -2
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/constants.d.ts +1 -0
- package/types/sync/streaming/pushManager.d.ts +2 -0
- package/types/sync/streaming/types.d.ts +5 -4
- package/types/sync/submitters/types.d.ts +9 -3
- package/types/types.d.ts +25 -0
- package/types/utils/constants/index.d.ts +3 -0
- package/types/utils/settingsValidation/index.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +1 -1
|
@@ -15,9 +15,11 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
15
15
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
16
16
|
var splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
17
17
|
var segments = new MySegmentsCacheInMemory();
|
|
18
|
+
var largeSegments = new MySegmentsCacheInMemory();
|
|
18
19
|
var storage = {
|
|
19
20
|
splits: splits,
|
|
20
21
|
segments: segments,
|
|
22
|
+
largeSegments: largeSegments,
|
|
21
23
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
22
24
|
impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
|
|
23
25
|
events: new EventsCacheInMemory(eventsQueueSize),
|
|
@@ -27,6 +29,7 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
27
29
|
destroy: function () {
|
|
28
30
|
this.splits.clear();
|
|
29
31
|
this.segments.clear();
|
|
32
|
+
this.largeSegments.clear();
|
|
30
33
|
this.impressions.clear();
|
|
31
34
|
this.impressionCounts && this.impressionCounts.clear();
|
|
32
35
|
this.events.clear();
|
|
@@ -37,6 +40,7 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
37
40
|
return {
|
|
38
41
|
splits: this.splits,
|
|
39
42
|
segments: new MySegmentsCacheInMemory(),
|
|
43
|
+
largeSegments: new MySegmentsCacheInMemory(),
|
|
40
44
|
impressions: this.impressions,
|
|
41
45
|
impressionCounts: this.impressionCounts,
|
|
42
46
|
events: this.events,
|
|
@@ -45,6 +49,7 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
45
49
|
destroy: function () {
|
|
46
50
|
this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
47
51
|
this.segments.clear();
|
|
52
|
+
this.largeSegments.clear();
|
|
48
53
|
}
|
|
49
54
|
};
|
|
50
55
|
},
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesMatcher } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber } from '../../utils/lang';
|
|
4
4
|
import { _Set } from '../../utils/lang/sets';
|
|
5
|
+
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
5
6
|
/**
|
|
6
7
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
7
8
|
* Supported by all JS runtimes.
|
|
@@ -13,7 +14,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
13
14
|
_this.splitsCache = {};
|
|
14
15
|
_this.ttCache = {};
|
|
15
16
|
_this.changeNumber = -1;
|
|
16
|
-
_this.
|
|
17
|
+
_this.segmentsCount = 0;
|
|
18
|
+
_this.largeSegmentsCount = 0;
|
|
17
19
|
_this.flagSetsCache = {};
|
|
18
20
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
19
21
|
return _this;
|
|
@@ -22,7 +24,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
22
24
|
this.splitsCache = {};
|
|
23
25
|
this.ttCache = {};
|
|
24
26
|
this.changeNumber = -1;
|
|
25
|
-
this.
|
|
27
|
+
this.segmentsCount = 0;
|
|
28
|
+
this.largeSegmentsCount = 0;
|
|
26
29
|
};
|
|
27
30
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
28
31
|
var previousSplit = this.getSplit(name);
|
|
@@ -32,9 +35,11 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
32
35
|
if (!this.ttCache[previousTtName])
|
|
33
36
|
delete this.ttCache[previousTtName];
|
|
34
37
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
// Substract from segments count for the previous version of this Split.
|
|
39
|
+
if (usesMatcher(previousSplit, IN_SEGMENT))
|
|
40
|
+
this.segmentsCount--;
|
|
41
|
+
if (usesMatcher(previousSplit, IN_LARGE_SEGMENT))
|
|
42
|
+
this.largeSegmentsCount--;
|
|
38
43
|
}
|
|
39
44
|
if (split) {
|
|
40
45
|
// Store the Split.
|
|
@@ -44,8 +49,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
44
49
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
45
50
|
this.addToFlagSets(split);
|
|
46
51
|
// Add to segments count for the new version of the Split
|
|
47
|
-
if (
|
|
48
|
-
this.
|
|
52
|
+
if (usesMatcher(split, IN_SEGMENT))
|
|
53
|
+
this.segmentsCount++;
|
|
54
|
+
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
55
|
+
this.largeSegmentsCount++;
|
|
49
56
|
return true;
|
|
50
57
|
}
|
|
51
58
|
else {
|
|
@@ -63,8 +70,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
63
70
|
delete this.ttCache[ttName];
|
|
64
71
|
this.removeFromFlagSets(split.name, split.sets);
|
|
65
72
|
// Update the segments count.
|
|
66
|
-
if (
|
|
67
|
-
this.
|
|
73
|
+
if (usesMatcher(split, IN_SEGMENT))
|
|
74
|
+
this.segmentsCount--;
|
|
75
|
+
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
76
|
+
this.largeSegmentsCount--;
|
|
68
77
|
return true;
|
|
69
78
|
}
|
|
70
79
|
else {
|
|
@@ -87,8 +96,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
87
96
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
88
97
|
return isFiniteNumber(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
89
98
|
};
|
|
90
|
-
SplitsCacheInMemory.prototype.
|
|
91
|
-
return this.getChangeNumber() === -1 || this.
|
|
99
|
+
SplitsCacheInMemory.prototype.usesMatcher = function (matcherType) {
|
|
100
|
+
return this.getChangeNumber() === -1 || (matcherType === IN_SEGMENT ? this.segmentsCount > 0 : this.largeSegmentsCount > 0);
|
|
92
101
|
};
|
|
93
102
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
94
103
|
var _this = this;
|
|
@@ -18,9 +18,10 @@ export function shouldRecordTelemetry(_a) {
|
|
|
18
18
|
return settings.mode !== LOCALHOST_MODE && (settings.core.key === undefined || Math.random() <= ACCEPTANCE_RANGE);
|
|
19
19
|
}
|
|
20
20
|
var TelemetryCacheInMemory = /** @class */ (function () {
|
|
21
|
-
function TelemetryCacheInMemory(splits, segments) {
|
|
21
|
+
function TelemetryCacheInMemory(splits, segments, largeSegments) {
|
|
22
22
|
this.splits = splits;
|
|
23
23
|
this.segments = segments;
|
|
24
|
+
this.largeSegments = largeSegments;
|
|
24
25
|
// isEmpty flag
|
|
25
26
|
this.e = true;
|
|
26
27
|
this.notReadyUsage = 0;
|
|
@@ -36,10 +37,7 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
36
37
|
this.tags = [];
|
|
37
38
|
this.exceptions = {};
|
|
38
39
|
this.latencies = {};
|
|
39
|
-
this.updatesFromSSE = {
|
|
40
|
-
sp: 0,
|
|
41
|
-
ms: 0
|
|
42
|
-
};
|
|
40
|
+
this.updatesFromSSE = {};
|
|
43
41
|
}
|
|
44
42
|
TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
|
|
45
43
|
TelemetryCacheInMemory.prototype.clear = function () { };
|
|
@@ -59,6 +57,8 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
59
57
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
60
58
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
61
59
|
skC: this.segments && this.segments.getKeysCount(),
|
|
60
|
+
lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
61
|
+
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
62
62
|
sL: this.getSessionLength(),
|
|
63
63
|
eQ: this.getEventStats(QUEUED),
|
|
64
64
|
eD: this.getEventStats(DROPPED),
|
|
@@ -190,14 +190,11 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
190
190
|
};
|
|
191
191
|
TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
|
|
192
192
|
var result = this.updatesFromSSE;
|
|
193
|
-
this.updatesFromSSE = {
|
|
194
|
-
sp: 0,
|
|
195
|
-
ms: 0,
|
|
196
|
-
};
|
|
193
|
+
this.updatesFromSSE = {};
|
|
197
194
|
return result;
|
|
198
195
|
};
|
|
199
196
|
TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
|
|
200
|
-
this.updatesFromSSE[type]
|
|
197
|
+
this.updatesFromSSE[type] = (this.updatesFromSSE[type] || 0) + 1;
|
|
201
198
|
this.e = false;
|
|
202
199
|
};
|
|
203
200
|
return TelemetryCacheInMemory;
|
|
@@ -5,7 +5,7 @@ import { setToArray, _Set } from '../../utils/lang/sets';
|
|
|
5
5
|
* The `_cache` property is the object were items are stored.
|
|
6
6
|
* Intended for testing purposes.
|
|
7
7
|
*
|
|
8
|
-
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves
|
|
8
|
+
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves immediately.
|
|
9
9
|
*/
|
|
10
10
|
export function inMemoryWrapperFactory(connDelay) {
|
|
11
11
|
var _cache = {};
|
|
@@ -12,6 +12,10 @@ export function mySegmentsFetcherFactory(fetchMySegments) {
|
|
|
12
12
|
// Extract segment names
|
|
13
13
|
return mySegmentsPromise
|
|
14
14
|
.then(function (resp) { return resp.json(); })
|
|
15
|
-
.then(function (json) {
|
|
15
|
+
.then(function (json) {
|
|
16
|
+
return json.mySegments ?
|
|
17
|
+
json.mySegments.map(function (segment) { return segment.name; }) :
|
|
18
|
+
json.myLargeSegments;
|
|
19
|
+
});
|
|
16
20
|
};
|
|
17
21
|
}
|
|
@@ -3,7 +3,8 @@ import { mySegmentsSyncTaskFactory } from './syncTasks/mySegmentsSyncTask';
|
|
|
3
3
|
import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
|
|
4
4
|
import { getMatching } from '../../utils/key';
|
|
5
5
|
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../readiness/constants';
|
|
6
|
-
import {
|
|
6
|
+
import { POLLING_START, POLLING_STOP } from '../../logger/constants';
|
|
7
|
+
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
7
8
|
/**
|
|
8
9
|
* Expose start / stop mechanism for polling data from services.
|
|
9
10
|
* For client-side API with multiple clients.
|
|
@@ -12,59 +13,74 @@ export function pollingManagerCSFactory(params) {
|
|
|
12
13
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
13
14
|
var log = settings.log;
|
|
14
15
|
var splitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
15
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
16
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask for segments and large segments.
|
|
16
17
|
var mySegmentsSyncTasks = {};
|
|
17
18
|
var matchingKey = getMatching(settings.core.key);
|
|
18
|
-
var
|
|
19
|
+
var _a = add(matchingKey, readiness, storage), msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
19
20
|
function startMySegmentsSyncTasks() {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
var splitsHaveSegments = storage.splits.usesMatcher(IN_SEGMENT);
|
|
22
|
+
var splitsHaveLargeSegments = storage.splits.usesMatcher(IN_LARGE_SEGMENT);
|
|
23
|
+
forOwn(mySegmentsSyncTasks, function (_a) {
|
|
24
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
25
|
+
if (splitsHaveSegments)
|
|
26
|
+
msSyncTask.start();
|
|
27
|
+
else
|
|
28
|
+
msSyncTask.stop(); // smart pausing
|
|
29
|
+
if (mlsSyncTask) {
|
|
30
|
+
if (splitsHaveLargeSegments)
|
|
31
|
+
mlsSyncTask.start();
|
|
32
|
+
else
|
|
33
|
+
mlsSyncTask.stop(); // smart pausing
|
|
34
|
+
}
|
|
22
35
|
});
|
|
23
36
|
}
|
|
24
37
|
function stopMySegmentsSyncTasks() {
|
|
25
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
26
|
-
|
|
27
|
-
|
|
38
|
+
forOwn(mySegmentsSyncTasks, function (_a) {
|
|
39
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
40
|
+
msSyncTask.stop();
|
|
41
|
+
mlsSyncTask && mlsSyncTask.stop();
|
|
28
42
|
});
|
|
29
43
|
}
|
|
30
|
-
// smart pausing
|
|
31
44
|
readiness.splits.on(SDK_SPLITS_ARRIVED, function () {
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
var splitsHaveSegments = storage.splits.usesSegments();
|
|
35
|
-
if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
|
|
36
|
-
log.info(POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
|
|
37
|
-
if (splitsHaveSegments) {
|
|
38
|
-
startMySegmentsSyncTasks();
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
stopMySegmentsSyncTasks();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
45
|
+
if (splitsSyncTask.isRunning())
|
|
46
|
+
startMySegmentsSyncTasks();
|
|
44
47
|
});
|
|
45
48
|
function add(matchingKey, readiness, storage) {
|
|
46
|
-
var
|
|
49
|
+
var msSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMySegments, storage.segments, function () { if (storage.splits.usesMatcher(IN_SEGMENT))
|
|
50
|
+
readiness.segments.emit(SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
51
|
+
var mlsSyncTask;
|
|
52
|
+
if (settings.sync.largeSegmentsEnabled) {
|
|
53
|
+
mlsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMyLargeSegments, storage.largeSegments, function () { if (readiness.largeSegments && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
54
|
+
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate, 'myLargeSegmentsUpdater');
|
|
55
|
+
}
|
|
47
56
|
// smart ready
|
|
48
57
|
function smartReady() {
|
|
49
|
-
if (!readiness.isReady()
|
|
50
|
-
readiness.
|
|
58
|
+
if (!readiness.isReady()) {
|
|
59
|
+
if (readiness.largeSegments && !storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
60
|
+
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED);
|
|
61
|
+
if (!storage.splits.usesMatcher(IN_SEGMENT))
|
|
62
|
+
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
63
|
+
}
|
|
51
64
|
}
|
|
52
|
-
if (
|
|
53
|
-
setTimeout(smartReady, 0);
|
|
54
|
-
else
|
|
65
|
+
if (storage.splits.usesMatcher(IN_SEGMENT) && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
55
66
|
readiness.splits.once(SDK_SPLITS_ARRIVED, smartReady);
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
else
|
|
68
|
+
setTimeout(smartReady, 0);
|
|
69
|
+
mySegmentsSyncTasks[matchingKey] = { msSyncTask: msSyncTask, mlsSyncTask: mlsSyncTask };
|
|
70
|
+
return {
|
|
71
|
+
msSyncTask: msSyncTask,
|
|
72
|
+
mlsSyncTask: mlsSyncTask
|
|
73
|
+
};
|
|
58
74
|
}
|
|
59
75
|
return {
|
|
60
76
|
splitsSyncTask: splitsSyncTask,
|
|
61
|
-
segmentsSyncTask:
|
|
77
|
+
segmentsSyncTask: msSyncTask,
|
|
78
|
+
largeSegmentsSyncTask: mlsSyncTask,
|
|
62
79
|
// Start periodic fetching (polling)
|
|
63
80
|
start: function () {
|
|
64
81
|
log.info(POLLING_START);
|
|
65
82
|
splitsSyncTask.start();
|
|
66
|
-
|
|
67
|
-
startMySegmentsSyncTasks();
|
|
83
|
+
startMySegmentsSyncTasks();
|
|
68
84
|
},
|
|
69
85
|
// Stop periodic fetching (polling)
|
|
70
86
|
stop: function () {
|
|
@@ -78,8 +94,10 @@ export function pollingManagerCSFactory(params) {
|
|
|
78
94
|
// fetch splits and segments
|
|
79
95
|
syncAll: function () {
|
|
80
96
|
var promises = [splitsSyncTask.execute()];
|
|
81
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
82
|
-
|
|
97
|
+
forOwn(mySegmentsSyncTasks, function (_a) {
|
|
98
|
+
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
99
|
+
promises.push(msSyncTask.execute());
|
|
100
|
+
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
83
101
|
});
|
|
84
102
|
return Promise.all(promises);
|
|
85
103
|
},
|
|
@@ -4,6 +4,6 @@ import { mySegmentsUpdaterFactory } from '../updaters/mySegmentsUpdater';
|
|
|
4
4
|
/**
|
|
5
5
|
* Creates a sync task that periodically executes a `mySegmentsUpdater` task
|
|
6
6
|
*/
|
|
7
|
-
export function mySegmentsSyncTaskFactory(fetchMySegments,
|
|
8
|
-
return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMySegments),
|
|
7
|
+
export function mySegmentsSyncTaskFactory(fetchMySegments, mySegmentsCache, notifyUpdate, settings, matchingKey, segmentsRefreshRate, NAME) {
|
|
8
|
+
return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMySegments), mySegmentsCache, notifyUpdate, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), segmentsRefreshRate, NAME);
|
|
9
9
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { timeout } from '../../../utils/promise/timeout';
|
|
2
|
-
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
3
2
|
import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
4
3
|
/**
|
|
5
4
|
* factory of MySegments updater, a task that:
|
|
@@ -7,7 +6,7 @@ import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
|
7
6
|
* - updates `mySegmentsCache`
|
|
8
7
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
9
8
|
*/
|
|
10
|
-
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
9
|
+
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notifyUpdate, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
11
10
|
var readyOnAlreadyExistentState = true;
|
|
12
11
|
var startingUp = true;
|
|
13
12
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -38,9 +37,9 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, my
|
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
// Notify update if required
|
|
41
|
-
if (
|
|
40
|
+
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
42
41
|
readyOnAlreadyExistentState = false;
|
|
43
|
-
|
|
42
|
+
notifyUpdate();
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -3,6 +3,7 @@ import { timeout } from '../../../utils/promise/timeout';
|
|
|
3
3
|
import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
|
|
4
4
|
import { SYNC_SPLITS_FETCH, SYNC_SPLITS_NEW, SYNC_SPLITS_REMOVED, SYNC_SPLITS_SEGMENTS, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
|
|
5
5
|
import { startsWith } from '../../../utils/lang';
|
|
6
|
+
import { IN_SEGMENT } from '../../../utils/constants';
|
|
6
7
|
// Checks that all registered segments have been fetched (changeNumber !== -1 for every segment).
|
|
7
8
|
// Returns a promise that could be rejected.
|
|
8
9
|
// @TODO review together with Segments and MySegments storage APIs
|
|
@@ -23,7 +24,7 @@ export function parseSegments(_a) {
|
|
|
23
24
|
for (var i = 0; i < conditions.length; i++) {
|
|
24
25
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
25
26
|
matchers.forEach(function (matcher) {
|
|
26
|
-
if (matcher.matcherType ===
|
|
27
|
+
if (matcher.matcherType === IN_SEGMENT)
|
|
27
28
|
segments.add(matcher.userDefinedSegmentMatcherData.segmentName);
|
|
28
29
|
});
|
|
29
30
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { errorParser, messageParser } from './NotificationParser';
|
|
2
2
|
import { notificationKeeperFactory } from './NotificationKeeper';
|
|
3
|
-
import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE } from '../constants';
|
|
3
|
+
import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, MY_LARGE_SEGMENTS_UPDATE } from '../constants';
|
|
4
4
|
import { STREAMING_PARSING_ERROR_FAILS, ERROR_STREAMING_SSE, STREAMING_PARSING_MESSAGE_FAILS, STREAMING_NEW_MESSAGE } from '../../../logger/constants';
|
|
5
5
|
import { ABLY_ERROR, NON_REQUESTED, SSE_CONNECTION_ERROR } from '../../../utils/constants';
|
|
6
6
|
/**
|
|
@@ -73,6 +73,7 @@ export function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
73
73
|
case SPLIT_UPDATE:
|
|
74
74
|
case SEGMENT_UPDATE:
|
|
75
75
|
case MY_SEGMENTS_UPDATE_V2:
|
|
76
|
+
case MY_LARGE_SEGMENTS_UPDATE:
|
|
76
77
|
case SPLIT_KILL:
|
|
77
78
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
78
79
|
break;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Backoff } from '../../../utils/Backoff';
|
|
2
|
-
import { MY_SEGMENT } from '../../../utils/constants';
|
|
3
2
|
/**
|
|
4
3
|
* MySegmentsUpdateWorker factory
|
|
5
4
|
*/
|
|
6
|
-
export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
5
|
+
export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType) {
|
|
7
6
|
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
8
7
|
var currentChangeNumber = -1;
|
|
9
8
|
var handleNewEvent = false;
|
|
10
9
|
var isHandlingEvent;
|
|
11
10
|
var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
|
|
11
|
+
var _delay;
|
|
12
|
+
var _delayTimeoutID;
|
|
12
13
|
var backoff = new Backoff(__handleMySegmentsUpdateCall);
|
|
13
14
|
function __handleMySegmentsUpdateCall() {
|
|
14
15
|
isHandlingEvent = true;
|
|
@@ -16,12 +17,19 @@ export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
|
16
17
|
handleNewEvent = false;
|
|
17
18
|
var currentMaxChangeNumber_1 = maxChangeNumber;
|
|
18
19
|
// fetch mySegments revalidating data if cached
|
|
19
|
-
|
|
20
|
+
var syncTask = _delay ?
|
|
21
|
+
new Promise(function (res) {
|
|
22
|
+
_delayTimeoutID = setTimeout(function () {
|
|
23
|
+
mySegmentsSyncTask.execute(_segmentsData, true).then(res);
|
|
24
|
+
}, _delay);
|
|
25
|
+
}) :
|
|
26
|
+
mySegmentsSyncTask.execute(_segmentsData, true);
|
|
27
|
+
syncTask.then(function (result) {
|
|
20
28
|
if (!isHandlingEvent)
|
|
21
29
|
return; // halt if `stop` has been called
|
|
22
30
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
23
31
|
if (_segmentsData)
|
|
24
|
-
telemetryTracker.trackUpdatesFromSSE(
|
|
32
|
+
telemetryTracker.trackUpdatesFromSSE(updateType);
|
|
25
33
|
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
26
34
|
}
|
|
27
35
|
if (handleNewEvent) {
|
|
@@ -43,17 +51,19 @@ export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
|
43
51
|
* @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
|
|
44
52
|
* @param {SegmentsData | undefined} segmentsData might be undefined
|
|
45
53
|
*/
|
|
46
|
-
put: function (changeNumber, segmentsData) {
|
|
54
|
+
put: function (changeNumber, segmentsData, delay) {
|
|
47
55
|
if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
|
|
48
56
|
return;
|
|
49
57
|
maxChangeNumber = changeNumber;
|
|
50
58
|
handleNewEvent = true;
|
|
51
59
|
_segmentsData = segmentsData;
|
|
60
|
+
_delay = delay;
|
|
52
61
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
53
62
|
__handleMySegmentsUpdateCall();
|
|
54
63
|
backoff.reset();
|
|
55
64
|
},
|
|
56
65
|
stop: function () {
|
|
66
|
+
clearTimeout(_delayTimeoutID);
|
|
57
67
|
isHandlingEvent = false;
|
|
58
68
|
backoff.reset();
|
|
59
69
|
}
|
|
@@ -27,6 +27,7 @@ export var MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
|
|
|
27
27
|
export var SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
28
28
|
export var SPLIT_KILL = 'SPLIT_KILL';
|
|
29
29
|
export var SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
30
|
+
export var MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
|
|
30
31
|
// Control-type push notifications, handled by NotificationKeeper
|
|
31
32
|
export var CONTROL = 'CONTROL';
|
|
32
33
|
export var OCCUPANCY = 'OCCUPANCY';
|