@splitsoftware/splitio-commons 1.16.1-rc.0 → 1.16.1-rc.10
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 +4 -0
- package/cjs/logger/constants.js +5 -4
- package/cjs/logger/messages/info.js +2 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/readiness/readinessManager.js +3 -9
- package/cjs/services/splitApi.js +4 -8
- package/cjs/storages/AbstractSegmentsCacheSync.js +1 -6
- package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
- package/cjs/storages/AbstractSplitsCacheSync.js +7 -5
- package/cjs/storages/KeyBuilder.js +0 -3
- package/cjs/storages/KeyBuilderCS.js +6 -0
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -2
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +5 -1
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +6 -15
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +4 -7
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +30 -54
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +25 -27
- package/cjs/sync/streaming/SSEHandler/index.js +7 -8
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +18 -5
- package/cjs/sync/streaming/constants.js +2 -3
- package/cjs/sync/streaming/parseUtils.js +14 -9
- package/cjs/sync/streaming/pushManager.js +29 -53
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -2
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +1 -1
- package/cjs/utils/settingsValidation/index.js +1 -5
- package/esm/logger/constants.js +2 -1
- package/esm/logger/messages/info.js +2 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/readiness/readinessManager.js +3 -9
- package/esm/services/splitApi.js +5 -9
- package/esm/storages/AbstractSegmentsCacheSync.js +1 -6
- package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
- package/esm/storages/AbstractSplitsCacheSync.js +5 -3
- package/esm/storages/KeyBuilder.js +0 -3
- package/esm/storages/KeyBuilderCS.js +6 -0
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -2
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +5 -1
- package/esm/storages/inMemory/SplitsCacheInMemory.js +7 -16
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +4 -7
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +31 -55
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +23 -25
- package/esm/sync/streaming/SSEHandler/index.js +8 -9
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +18 -5
- package/esm/sync/streaming/constants.js +1 -2
- package/esm/sync/streaming/parseUtils.js +12 -8
- package/esm/sync/streaming/pushManager.js +31 -54
- package/esm/sync/submitters/telemetrySubmitter.js +0 -2
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +1 -1
- package/esm/utils/settingsValidation/index.js +1 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +14 -8
- package/src/logger/constants.ts +2 -1
- package/src/logger/messages/info.ts +2 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/readiness/readinessManager.ts +3 -7
- package/src/readiness/types.ts +0 -1
- package/src/services/splitApi.ts +6 -11
- package/src/services/splitHttpClient.ts +1 -1
- package/src/services/types.ts +2 -3
- package/src/storages/AbstractSegmentsCacheSync.ts +2 -6
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +6 -4
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +9 -0
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +26 -2
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +7 -1
- package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -13
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +6 -5
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +7 -10
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +2 -2
- package/src/sync/polling/pollingManagerCS.ts +27 -62
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +11 -11
- package/src/sync/polling/types.ts +9 -8
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -24
- package/src/sync/streaming/SSEClient/index.ts +4 -6
- package/src/sync/streaming/SSEHandler/index.ts +11 -13
- package/src/sync/streaming/SSEHandler/types.ts +13 -25
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +21 -7
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
- package/src/sync/streaming/constants.ts +1 -2
- package/src/sync/streaming/parseUtils.ts +19 -11
- package/src/sync/streaming/pushManager.ts +37 -65
- package/src/sync/streaming/types.ts +9 -11
- package/src/sync/submitters/telemetrySubmitter.ts +0 -2
- package/src/sync/submitters/types.ts +1 -3
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +1 -26
- package/src/utils/constants/index.ts +1 -1
- package/src/utils/settingsValidation/index.ts +1 -5
- package/types/dtos/types.d.ts +14 -7
- package/types/logger/constants.d.ts +2 -1
- package/types/readiness/types.d.ts +0 -1
- package/types/services/decorateHeaders.d.ts +2 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +2 -3
- package/types/storages/AbstractSegmentsCacheSync.d.ts +2 -6
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
- package/types/storages/KeyBuilder.d.ts +0 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -0
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +3 -2
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -1
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +4 -4
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
- package/types/sync/polling/fetchers/types.d.ts +2 -2
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +4 -3
- package/types/sync/polling/types.d.ts +7 -13
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -2
- package/types/sync/streaming/SSEHandler/types.d.ts +13 -22
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -2
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +2 -1
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +3 -2
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +1 -2
- package/types/sync/streaming/parseUtils.d.ts +4 -5
- package/types/sync/streaming/pushManager.d.ts +0 -2
- package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +9 -0
- package/types/sync/streaming/pushManager_Spec1_3.d.ts +9 -0
- package/types/sync/streaming/types.d.ts +8 -9
- package/types/sync/submitters/types.d.ts +1 -3
- package/types/types.d.ts +0 -25
- package/types/utils/constants/index.d.ts +1 -1
- package/types/utils/settingsValidation/index.d.ts +0 -2
|
@@ -6,7 +6,7 @@ function splitsEventEmitterFactory(EventEmitter) {
|
|
|
6
6
|
splitsCacheLoaded: false,
|
|
7
7
|
});
|
|
8
8
|
// `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
|
|
9
|
-
// - `/
|
|
9
|
+
// - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
|
|
10
10
|
// - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
|
|
11
11
|
splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
|
|
12
12
|
splitsEventEmitter.splitsArrived = true; });
|
|
@@ -25,9 +25,8 @@ function segmentsEventEmitterFactory(EventEmitter) {
|
|
|
25
25
|
*/
|
|
26
26
|
export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
27
27
|
if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
|
|
28
|
-
var
|
|
28
|
+
var readyTimeout = settings.startup.readyTimeout;
|
|
29
29
|
var segments = segmentsEventEmitterFactory(EventEmitter);
|
|
30
|
-
var largeSegments = largeSegmentsEnabled && waitForLargeSegments ? segmentsEventEmitterFactory(EventEmitter) : undefined;
|
|
31
30
|
var gate = new EventEmitter();
|
|
32
31
|
// emit SDK_READY_FROM_CACHE
|
|
33
32
|
var isReadyFromCache = false;
|
|
@@ -51,8 +50,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
51
50
|
var isReady = false;
|
|
52
51
|
splits.on(SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
|
|
53
52
|
segments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
54
|
-
if (largeSegments)
|
|
55
|
-
largeSegments.on(SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
|
|
56
53
|
var isDestroyed = false;
|
|
57
54
|
function checkIsReadyFromCache() {
|
|
58
55
|
isReadyFromCache = true;
|
|
@@ -78,7 +75,7 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
78
75
|
}
|
|
79
76
|
}
|
|
80
77
|
else {
|
|
81
|
-
if (splits.splitsArrived && segments.segmentsArrived
|
|
78
|
+
if (splits.splitsArrived && segments.segmentsArrived) {
|
|
82
79
|
clearTimeout(readyTimeoutId);
|
|
83
80
|
isReady = true;
|
|
84
81
|
try {
|
|
@@ -95,7 +92,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
95
92
|
return {
|
|
96
93
|
splits: splits,
|
|
97
94
|
segments: segments,
|
|
98
|
-
largeSegments: largeSegments,
|
|
99
95
|
gate: gate,
|
|
100
96
|
shared: function () {
|
|
101
97
|
refCount++;
|
|
@@ -110,8 +106,6 @@ export function readinessManagerFactory(EventEmitter, settings, splits) {
|
|
|
110
106
|
destroy: function () {
|
|
111
107
|
isDestroyed = true;
|
|
112
108
|
segments.removeAllListeners();
|
|
113
|
-
if (largeSegments)
|
|
114
|
-
largeSegments.removeAllListeners();
|
|
115
109
|
gate.removeAllListeners();
|
|
116
110
|
clearTimeout(readyTimeoutId);
|
|
117
111
|
if (refCount > 0)
|
package/esm/services/splitApi.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { splitHttpClientFactory } from './splitHttpClient';
|
|
2
2
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
3
|
-
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT
|
|
3
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
|
|
4
4
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
5
5
|
var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
6
6
|
function userKeyToQueryParam(userKey) {
|
|
@@ -51,20 +51,16 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
51
51
|
var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
|
|
52
52
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SEGMENT));
|
|
53
53
|
},
|
|
54
|
-
|
|
54
|
+
fetchMemberships: function (userMatchingKey, noCache) {
|
|
55
55
|
/**
|
|
56
56
|
* URI encoding of user keys in order to:
|
|
57
|
-
* - avoid 400 responses (due to URI malformed). E.g.: '/api/
|
|
58
|
-
* - avoid 404 responses. E.g.: '/api/
|
|
57
|
+
* - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
|
|
58
|
+
* - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
|
|
59
59
|
* - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
|
|
60
60
|
*/
|
|
61
|
-
var url = urls.sdk + "/
|
|
61
|
+
var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey);
|
|
62
62
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
|
|
63
63
|
},
|
|
64
|
-
fetchMyLargeSegments: function (userMatchingKey, noCache) {
|
|
65
|
-
var url = urls.sdk + "/myLargeSegments/" + encodeURIComponent(userMatchingKey);
|
|
66
|
-
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_LARGE_SEGMENT));
|
|
67
|
-
},
|
|
68
64
|
/**
|
|
69
65
|
* Post events.
|
|
70
66
|
*
|
|
@@ -15,16 +15,11 @@ var AbstractSegmentsCacheSync = /** @class */ (function () {
|
|
|
15
15
|
* For client-side synchronizer: the method is not used.
|
|
16
16
|
*/
|
|
17
17
|
AbstractSegmentsCacheSync.prototype.setChangeNumber = function (name, changeNumber) { return true; };
|
|
18
|
-
/**
|
|
19
|
-
* For server-side synchronizer: get the change number of `name` segment.
|
|
20
|
-
* For client-side synchronizer: the method is not used.
|
|
21
|
-
*/
|
|
22
|
-
AbstractSegmentsCacheSync.prototype.getChangeNumber = function (name) { return -1; };
|
|
23
18
|
/**
|
|
24
19
|
* For server-side synchronizer: the method is not used.
|
|
25
20
|
* For client-side synchronizer: reset the cache with the given list of segments.
|
|
26
21
|
*/
|
|
27
|
-
AbstractSegmentsCacheSync.prototype.resetSegments = function (names) { return true; };
|
|
22
|
+
AbstractSegmentsCacheSync.prototype.resetSegments = function (names, changeNumber) { return true; };
|
|
28
23
|
return AbstractSegmentsCacheSync;
|
|
29
24
|
}());
|
|
30
25
|
export { AbstractSegmentsCacheSync };
|
|
@@ -6,9 +6,9 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
6
6
|
var AbstractSplitsCacheAsync = /** @class */ (function () {
|
|
7
7
|
function AbstractSplitsCacheAsync() {
|
|
8
8
|
}
|
|
9
|
-
// @TODO revisit segment-related methods ('
|
|
9
|
+
// @TODO revisit segment-related methods ('usesSegments', 'getRegisteredSegments', 'registerSegments')
|
|
10
10
|
// noop, just keeping the interface. This is used by standalone client-side API only, and so only implemented by InMemory and InLocalStorage.
|
|
11
|
-
AbstractSplitsCacheAsync.prototype.
|
|
11
|
+
AbstractSplitsCacheAsync.prototype.usesSegments = function () {
|
|
12
12
|
return Promise.resolve(true);
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
+
import { IN_SEGMENT, IN_LARGE_SEGMENT } from '../utils/constants';
|
|
2
3
|
/**
|
|
3
4
|
* This class provides a skeletal implementation of the ISplitsCacheSync interface
|
|
4
5
|
* to minimize the effort required to implement this interface.
|
|
@@ -59,14 +60,15 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
|
|
|
59
60
|
export { AbstractSplitsCacheSync };
|
|
60
61
|
/**
|
|
61
62
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
62
|
-
* This util is intended to simplify the implementation of `splitsCache::
|
|
63
|
+
* This util is intended to simplify the implementation of `splitsCache::usesSegments` method
|
|
63
64
|
*/
|
|
64
|
-
export function
|
|
65
|
+
export function usesSegments(split) {
|
|
65
66
|
var conditions = split.conditions || [];
|
|
66
67
|
for (var i = 0; i < conditions.length; i++) {
|
|
67
68
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
68
69
|
for (var j = 0; j < matchers.length; j++) {
|
|
69
|
-
|
|
70
|
+
var matcher = matchers[j].matcherType;
|
|
71
|
+
if (matcher === IN_SEGMENT || matcher === IN_LARGE_SEGMENT)
|
|
70
72
|
return true;
|
|
71
73
|
}
|
|
72
74
|
}
|
|
@@ -36,9 +36,6 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
36
36
|
KeyBuilder.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
37
37
|
return this.prefix + ".splits.usingSegments";
|
|
38
38
|
};
|
|
39
|
-
KeyBuilder.prototype.buildSplitsWithLargeSegmentCountKey = function () {
|
|
40
|
-
return this.prefix + ".splits.usingLargeSegments";
|
|
41
|
-
};
|
|
42
39
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
43
40
|
return this.prefix + ".segment." + segmentName;
|
|
44
41
|
};
|
|
@@ -32,6 +32,9 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
32
32
|
KeyBuilderCS.prototype.isSplitsCacheKey = function (key) {
|
|
33
33
|
return this.regexSplitsCacheKey.test(key);
|
|
34
34
|
};
|
|
35
|
+
KeyBuilderCS.prototype.buildTillKey = function () {
|
|
36
|
+
return this.prefix + "." + this.matchingKey + ".segments.till";
|
|
37
|
+
};
|
|
35
38
|
return KeyBuilderCS;
|
|
36
39
|
}(KeyBuilder));
|
|
37
40
|
export { KeyBuilderCS };
|
|
@@ -47,6 +50,9 @@ export function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
|
|
|
47
50
|
},
|
|
48
51
|
extractOldSegmentKey: function () {
|
|
49
52
|
return undefined;
|
|
53
|
+
},
|
|
54
|
+
buildTillKey: function () {
|
|
55
|
+
return prefix + "." + matchingKey + ".largeSegments.till";
|
|
50
56
|
}
|
|
51
57
|
};
|
|
52
58
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
+
import { isNaNNumber } from '../../utils/lang';
|
|
2
3
|
import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
|
|
3
4
|
import { LOG_PREFIX, DEFINED } from './constants';
|
|
4
5
|
var MySegmentsCacheInLocal = /** @class */ (function (_super) {
|
|
@@ -48,11 +49,22 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
|
|
|
48
49
|
/**
|
|
49
50
|
* Reset (update) the cached list of segments with the given list, removing and adding segments if necessary.
|
|
50
51
|
*
|
|
51
|
-
* @param {string[]}
|
|
52
|
+
* @param {string[]} names list of segment names
|
|
52
53
|
* @returns boolean indicating if the cache was updated (i.e., given list was different from the cached one)
|
|
53
54
|
*/
|
|
54
|
-
MySegmentsCacheInLocal.prototype.resetSegments = function (names) {
|
|
55
|
+
MySegmentsCacheInLocal.prototype.resetSegments = function (names, changeNumber) {
|
|
55
56
|
var _this = this;
|
|
57
|
+
try {
|
|
58
|
+
if (changeNumber) {
|
|
59
|
+
localStorage.setItem(this.keys.buildTillKey(), changeNumber + '');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
localStorage.removeItem(this.keys.buildTillKey());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
this.log.error(e);
|
|
67
|
+
}
|
|
56
68
|
var isDiff = false;
|
|
57
69
|
var index;
|
|
58
70
|
// Scan current values from localStorage
|
|
@@ -116,6 +128,15 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
|
|
|
116
128
|
MySegmentsCacheInLocal.prototype.getKeysCount = function () {
|
|
117
129
|
return 1;
|
|
118
130
|
};
|
|
131
|
+
MySegmentsCacheInLocal.prototype.getChangeNumber = function () {
|
|
132
|
+
var n = -1;
|
|
133
|
+
var value = localStorage.getItem(this.keys.buildTillKey());
|
|
134
|
+
if (value !== null) {
|
|
135
|
+
value = parseInt(value, 10);
|
|
136
|
+
return isNaNNumber(value) ? n : value;
|
|
137
|
+
}
|
|
138
|
+
return n;
|
|
139
|
+
};
|
|
119
140
|
return MySegmentsCacheInLocal;
|
|
120
141
|
}(AbstractSegmentsCacheSync));
|
|
121
142
|
export { MySegmentsCacheInLocal };
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { LOG_PREFIX } from './constants';
|
|
5
5
|
import { _Set, setToArray } from '../../utils/lang/sets';
|
|
6
6
|
import { getStorageHash } from '../KeyBuilder';
|
|
7
|
-
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
8
7
|
/**
|
|
9
8
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
10
9
|
*/
|
|
@@ -38,14 +37,10 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
38
37
|
if (split) {
|
|
39
38
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
40
39
|
this._decrementCount(ttKey);
|
|
41
|
-
if (
|
|
40
|
+
if (usesSegments(split)) {
|
|
42
41
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
43
42
|
this._decrementCount(segmentsCountKey);
|
|
44
43
|
}
|
|
45
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
46
|
-
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
47
|
-
this._decrementCount(segmentsCountKey);
|
|
48
|
-
}
|
|
49
44
|
}
|
|
50
45
|
}
|
|
51
46
|
catch (e) {
|
|
@@ -58,16 +53,11 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
58
53
|
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
59
54
|
// @ts-expect-error
|
|
60
55
|
localStorage.setItem(ttKey, toNumber(localStorage.getItem(ttKey)) + 1);
|
|
61
|
-
if (
|
|
56
|
+
if (usesSegments(split)) {
|
|
62
57
|
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
63
58
|
// @ts-expect-error
|
|
64
59
|
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
65
60
|
}
|
|
66
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT)) {
|
|
67
|
-
var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
|
|
68
|
-
// @ts-expect-error
|
|
69
|
-
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
70
|
-
}
|
|
71
61
|
}
|
|
72
62
|
}
|
|
73
63
|
catch (e) {
|
|
@@ -180,13 +170,11 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
180
170
|
var ttCount = toNumber(localStorage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
|
|
181
171
|
return isFiniteNumber(ttCount) && ttCount > 0;
|
|
182
172
|
};
|
|
183
|
-
SplitsCacheInLocal.prototype.
|
|
173
|
+
SplitsCacheInLocal.prototype.usesSegments = function () {
|
|
184
174
|
// If cache hasn't been synchronized with the cloud, assume we need them.
|
|
185
175
|
if (!this.hasSync)
|
|
186
176
|
return true;
|
|
187
|
-
var storedCount = localStorage.getItem(
|
|
188
|
-
this.keys.buildSplitsWithSegmentCountKey() :
|
|
189
|
-
this.keys.buildSplitsWithLargeSegmentCountKey());
|
|
177
|
+
var storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
190
178
|
var splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
|
|
191
179
|
if (isFiniteNumber(splitsWithSegmentsCount)) {
|
|
192
180
|
return splitsWithSegmentsCount > 0;
|
|
@@ -32,8 +32,9 @@ var MySegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
32
32
|
* @param {string[]} names list of segment names
|
|
33
33
|
* @returns boolean indicating if the cache was updated (i.e., given list was different from the cached one)
|
|
34
34
|
*/
|
|
35
|
-
MySegmentsCacheInMemory.prototype.resetSegments = function (names) {
|
|
35
|
+
MySegmentsCacheInMemory.prototype.resetSegments = function (names, changeNumber) {
|
|
36
36
|
var _this = this;
|
|
37
|
+
this.cn = changeNumber;
|
|
37
38
|
var isDiff = false;
|
|
38
39
|
var index;
|
|
39
40
|
var storedSegmentKeys = Object.keys(this.segmentCache);
|
|
@@ -63,6 +64,9 @@ var MySegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
63
64
|
}
|
|
64
65
|
return isDiff;
|
|
65
66
|
};
|
|
67
|
+
MySegmentsCacheInMemory.prototype.getChangeNumber = function () {
|
|
68
|
+
return this.cn || -1;
|
|
69
|
+
};
|
|
66
70
|
MySegmentsCacheInMemory.prototype.getRegisteredSegments = function () {
|
|
67
71
|
return Object.keys(this.segmentCache);
|
|
68
72
|
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { AbstractSplitsCacheSync,
|
|
2
|
+
import { AbstractSplitsCacheSync, usesSegments } 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';
|
|
6
5
|
/**
|
|
7
6
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
8
7
|
* Supported by all JS runtimes.
|
|
@@ -15,7 +14,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
15
14
|
_this.ttCache = {};
|
|
16
15
|
_this.changeNumber = -1;
|
|
17
16
|
_this.segmentsCount = 0;
|
|
18
|
-
_this.largeSegmentsCount = 0;
|
|
19
17
|
_this.flagSetsCache = {};
|
|
20
18
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
21
19
|
return _this;
|
|
@@ -25,7 +23,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
25
23
|
this.ttCache = {};
|
|
26
24
|
this.changeNumber = -1;
|
|
27
25
|
this.segmentsCount = 0;
|
|
28
|
-
this.largeSegmentsCount = 0;
|
|
29
26
|
};
|
|
30
27
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
31
28
|
var previousSplit = this.getSplit(name);
|
|
@@ -35,11 +32,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
35
32
|
if (!this.ttCache[previousTtName])
|
|
36
33
|
delete this.ttCache[previousTtName];
|
|
37
34
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
38
|
-
//
|
|
39
|
-
if (
|
|
35
|
+
// Subtract from segments count for the previous version of this Split
|
|
36
|
+
if (usesSegments(previousSplit))
|
|
40
37
|
this.segmentsCount--;
|
|
41
|
-
if (usesMatcher(previousSplit, IN_LARGE_SEGMENT))
|
|
42
|
-
this.largeSegmentsCount--;
|
|
43
38
|
}
|
|
44
39
|
if (split) {
|
|
45
40
|
// Store the Split.
|
|
@@ -49,10 +44,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
49
44
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
50
45
|
this.addToFlagSets(split);
|
|
51
46
|
// Add to segments count for the new version of the Split
|
|
52
|
-
if (
|
|
47
|
+
if (usesSegments(split))
|
|
53
48
|
this.segmentsCount++;
|
|
54
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
55
|
-
this.largeSegmentsCount++;
|
|
56
49
|
return true;
|
|
57
50
|
}
|
|
58
51
|
else {
|
|
@@ -70,10 +63,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
70
63
|
delete this.ttCache[ttName];
|
|
71
64
|
this.removeFromFlagSets(split.name, split.sets);
|
|
72
65
|
// Update the segments count.
|
|
73
|
-
if (
|
|
66
|
+
if (usesSegments(split))
|
|
74
67
|
this.segmentsCount--;
|
|
75
|
-
if (usesMatcher(split, IN_LARGE_SEGMENT))
|
|
76
|
-
this.largeSegmentsCount--;
|
|
77
68
|
return true;
|
|
78
69
|
}
|
|
79
70
|
else {
|
|
@@ -96,8 +87,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
96
87
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
97
88
|
return isFiniteNumber(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
98
89
|
};
|
|
99
|
-
SplitsCacheInMemory.prototype.
|
|
100
|
-
return this.getChangeNumber() === -1 ||
|
|
90
|
+
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
91
|
+
return this.getChangeNumber() === -1 || this.segmentsCount > 0;
|
|
101
92
|
};
|
|
102
93
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
103
94
|
var _this = this;
|
|
@@ -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 = {};
|
|
@@ -2,16 +2,13 @@
|
|
|
2
2
|
* Factory of MySegments fetcher.
|
|
3
3
|
* MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
|
|
4
4
|
*/
|
|
5
|
-
export function mySegmentsFetcherFactory(
|
|
5
|
+
export function mySegmentsFetcherFactory(fetchMemberships) {
|
|
6
6
|
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
7
|
-
// Optional decorator for `
|
|
7
|
+
// Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
|
|
8
8
|
decorator) {
|
|
9
|
-
var mySegmentsPromise =
|
|
9
|
+
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache);
|
|
10
10
|
if (decorator)
|
|
11
11
|
mySegmentsPromise = decorator(mySegmentsPromise);
|
|
12
|
-
|
|
13
|
-
return mySegmentsPromise
|
|
14
|
-
.then(function (resp) { return resp.json(); })
|
|
15
|
-
.then(function (json) { return json.mySegments.map(function (segment) { return segment.name; }); });
|
|
12
|
+
return mySegmentsPromise.then(function (resp) { return resp.json(); });
|
|
16
13
|
};
|
|
17
14
|
}
|
|
@@ -20,7 +20,7 @@ function greedyFetch(fetchSegmentChanges, since, segmentName, noCache, targetTil
|
|
|
20
20
|
*/
|
|
21
21
|
export function segmentChangesFetcherFactory(fetchSegmentChanges) {
|
|
22
22
|
return function segmentChangesFetcher(since, segmentName, noCache, till,
|
|
23
|
-
// Optional decorator for `
|
|
23
|
+
// Optional decorator for `fetchSegmentChanges` promise, such as timeout or time tracker
|
|
24
24
|
decorator) {
|
|
25
25
|
var segmentsPromise = greedyFetch(fetchSegmentChanges, since, segmentName, noCache, till);
|
|
26
26
|
if (decorator)
|
|
@@ -3,8 +3,7 @@ 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 { POLLING_START, POLLING_STOP } from '../../logger/constants';
|
|
7
|
-
import { IN_LARGE_SEGMENT, IN_SEGMENT } from '../../utils/constants';
|
|
6
|
+
import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger/constants';
|
|
8
7
|
/**
|
|
9
8
|
* Expose start / stop mechanism for polling data from services.
|
|
10
9
|
* For client-side API with multiple clients.
|
|
@@ -13,80 +12,59 @@ export function pollingManagerCSFactory(params) {
|
|
|
13
12
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
14
13
|
var log = settings.log;
|
|
15
14
|
var splitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
16
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask
|
|
15
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
17
16
|
var mySegmentsSyncTasks = {};
|
|
18
17
|
var matchingKey = getMatching(settings.core.key);
|
|
19
|
-
var
|
|
18
|
+
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
|
|
20
19
|
function startMySegmentsSyncTasks() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
forOwn(mySegmentsSyncTasks, function (_a) {
|
|
24
|
-
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
25
|
-
if (splitsHaveSegments)
|
|
26
|
-
msSyncTask.start();
|
|
27
|
-
else
|
|
28
|
-
msSyncTask.stop();
|
|
29
|
-
if (mlsSyncTask) {
|
|
30
|
-
if (splitsHaveLargeSegments)
|
|
31
|
-
mlsSyncTask.start();
|
|
32
|
-
else
|
|
33
|
-
mlsSyncTask.stop();
|
|
34
|
-
}
|
|
20
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
21
|
+
mySegmentsSyncTask.start();
|
|
35
22
|
});
|
|
36
23
|
}
|
|
37
24
|
function stopMySegmentsSyncTasks() {
|
|
38
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
mlsSyncTask && mlsSyncTask.stop();
|
|
25
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
26
|
+
if (mySegmentsSyncTask.isRunning())
|
|
27
|
+
mySegmentsSyncTask.stop();
|
|
42
28
|
});
|
|
43
29
|
}
|
|
44
30
|
// smart pausing
|
|
45
31
|
readiness.splits.on(SDK_SPLITS_ARRIVED, function () {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
if (!splitsSyncTask.isRunning())
|
|
33
|
+
return; // noop if not doing polling
|
|
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
|
+
}
|
|
49
44
|
});
|
|
50
45
|
function add(matchingKey, readiness, storage) {
|
|
51
|
-
var
|
|
52
|
-
if (storage.splits.usesMatcher(IN_SEGMENT))
|
|
53
|
-
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
54
|
-
}, settings, matchingKey, settings.scheduler.segmentsRefreshRate);
|
|
55
|
-
var mlsSyncTask;
|
|
56
|
-
if (settings.sync.largeSegmentsEnabled) {
|
|
57
|
-
mlsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMyLargeSegments, storage.largeSegments, function () {
|
|
58
|
-
if (readiness.largeSegments && storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
59
|
-
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED);
|
|
60
|
-
}, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate);
|
|
61
|
-
}
|
|
46
|
+
var mySegmentsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
62
47
|
// smart ready
|
|
63
48
|
function smartReady() {
|
|
64
|
-
if (!readiness.isReady())
|
|
65
|
-
|
|
66
|
-
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
67
|
-
if (readiness.largeSegments && !storage.splits.usesMatcher(IN_LARGE_SEGMENT))
|
|
68
|
-
readiness.largeSegments.emit(SDK_SEGMENTS_ARRIVED);
|
|
69
|
-
}
|
|
49
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
50
|
+
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
70
51
|
}
|
|
71
|
-
if (!storage.splits.
|
|
52
|
+
if (!storage.splits.usesSegments())
|
|
72
53
|
setTimeout(smartReady, 0);
|
|
73
54
|
else
|
|
74
55
|
readiness.splits.once(SDK_SPLITS_ARRIVED, smartReady);
|
|
75
|
-
mySegmentsSyncTasks[matchingKey] =
|
|
76
|
-
return
|
|
77
|
-
msSyncTask: msSyncTask,
|
|
78
|
-
mlsSyncTask: mlsSyncTask
|
|
79
|
-
};
|
|
56
|
+
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
57
|
+
return mySegmentsSyncTask;
|
|
80
58
|
}
|
|
81
59
|
return {
|
|
82
60
|
splitsSyncTask: splitsSyncTask,
|
|
83
|
-
segmentsSyncTask:
|
|
84
|
-
largeSegmentsSyncTask: mlsSyncTask,
|
|
61
|
+
segmentsSyncTask: mySegmentsSyncTask,
|
|
85
62
|
// Start periodic fetching (polling)
|
|
86
63
|
start: function () {
|
|
87
64
|
log.info(POLLING_START);
|
|
88
65
|
splitsSyncTask.start();
|
|
89
|
-
|
|
66
|
+
if (storage.splits.usesSegments())
|
|
67
|
+
startMySegmentsSyncTasks();
|
|
90
68
|
},
|
|
91
69
|
// Stop periodic fetching (polling)
|
|
92
70
|
stop: function () {
|
|
@@ -100,10 +78,8 @@ export function pollingManagerCSFactory(params) {
|
|
|
100
78
|
// fetch splits and segments
|
|
101
79
|
syncAll: function () {
|
|
102
80
|
var promises = [splitsSyncTask.execute()];
|
|
103
|
-
forOwn(mySegmentsSyncTasks, function (
|
|
104
|
-
|
|
105
|
-
promises.push(msSyncTask.execute());
|
|
106
|
-
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
81
|
+
forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
82
|
+
promises.push(mySegmentsSyncTask.execute());
|
|
107
83
|
});
|
|
108
84
|
return Promise.all(promises);
|
|
109
85
|
},
|
|
@@ -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(
|
|
8
|
-
return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(
|
|
7
|
+
export function mySegmentsSyncTaskFactory(fetchMemberships, storage, readiness, settings, matchingKey) {
|
|
8
|
+
return syncTaskFactory(settings.log, mySegmentsUpdaterFactory(settings.log, mySegmentsFetcherFactory(fetchMemberships), storage, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
9
9
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { timeout } from '../../../utils/promise/timeout';
|
|
2
|
+
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
2
3
|
import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
3
4
|
/**
|
|
4
5
|
* factory of MySegments updater, a task that:
|
|
@@ -6,7 +7,8 @@ import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
|
6
7
|
* - updates `mySegmentsCache`
|
|
7
8
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
8
9
|
*/
|
|
9
|
-
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
10
|
+
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
11
|
+
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
10
12
|
var readyOnAlreadyExistentState = true;
|
|
11
13
|
var startingUp = true;
|
|
12
14
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -17,29 +19,31 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache
|
|
|
17
19
|
}
|
|
18
20
|
// @TODO if allowing pluggable storages, handle async execution
|
|
19
21
|
function updateSegments(segmentsData) {
|
|
22
|
+
var _a, _b, _c, _d;
|
|
20
23
|
var shouldNotifyUpdate;
|
|
21
24
|
if (Array.isArray(segmentsData)) {
|
|
22
|
-
//
|
|
23
|
-
|
|
25
|
+
// Add/Delete the segment names
|
|
26
|
+
segmentsData.forEach(function (_a) {
|
|
27
|
+
var isLS = _a.isLS, name = _a.name, add = _a.add;
|
|
28
|
+
var cache = isLS ? largeSegments : segments;
|
|
29
|
+
if (cache.isInSegment(name) !== add) {
|
|
30
|
+
shouldNotifyUpdate = true;
|
|
31
|
+
if (add)
|
|
32
|
+
cache.addToSegment(name);
|
|
33
|
+
else
|
|
34
|
+
cache.removeFromSegment(name);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
24
37
|
}
|
|
25
38
|
else {
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
shouldNotifyUpdate = true;
|
|
30
|
-
if (add)
|
|
31
|
-
mySegmentsCache.addToSegment(name_1);
|
|
32
|
-
else
|
|
33
|
-
mySegmentsCache.removeFromSegment(name_1);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
shouldNotifyUpdate = false;
|
|
37
|
-
}
|
|
39
|
+
// Reset the list of segment names
|
|
40
|
+
shouldNotifyUpdate = segments.resetSegments((((_a = segmentsData.ms) === null || _a === void 0 ? void 0 : _a.k) || []).map(function (segment) { return segment.n; }), (_b = segmentsData.ms) === null || _b === void 0 ? void 0 : _b.cn);
|
|
41
|
+
shouldNotifyUpdate = largeSegments.resetSegments((((_c = segmentsData.ls) === null || _c === void 0 ? void 0 : _c.k) || []).map(function (segment) { return segment.n; }), (_d = segmentsData.ls) === null || _d === void 0 ? void 0 : _d.cn) || shouldNotifyUpdate;
|
|
38
42
|
}
|
|
39
43
|
// Notify update if required
|
|
40
|
-
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
44
|
+
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
41
45
|
readyOnAlreadyExistentState = false;
|
|
42
|
-
|
|
46
|
+
segmentsEventEmitter.emit(SDK_SEGMENTS_ARRIVED);
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -75,13 +79,7 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache
|
|
|
75
79
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
76
80
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
77
81
|
*/
|
|
78
|
-
return function mySegmentsUpdater(segmentsData, noCache
|
|
79
|
-
return
|
|
80
|
-
new Promise(function (res) {
|
|
81
|
-
setTimeout(function () {
|
|
82
|
-
_mySegmentsUpdater(0, segmentsData, noCache).then(res);
|
|
83
|
-
}, delay);
|
|
84
|
-
}) :
|
|
85
|
-
_mySegmentsUpdater(0, segmentsData, noCache);
|
|
82
|
+
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
83
|
+
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
86
84
|
};
|
|
87
85
|
}
|