@splitsoftware/splitio-commons 1.16.1-rc.1 → 1.16.1-rc.11
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 +7 -12
- package/cjs/services/splitApi.js +5 -9
- package/cjs/storages/AbstractSegmentsCacheSync.js +41 -12
- 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/dataLoader.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +6 -15
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +4 -11
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +33 -51
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +14 -20
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +3 -6
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -9
- package/cjs/sync/streaming/constants.js +3 -4
- package/cjs/sync/streaming/parseUtils.js +14 -9
- package/cjs/sync/streaming/pushManager.js +29 -55
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -2
- package/cjs/sync/syncManagerOnline.js +14 -24
- package/cjs/utils/constants/index.js +4 -5
- 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 +7 -12
- package/esm/services/splitApi.js +6 -10
- package/esm/storages/AbstractSegmentsCacheSync.js +41 -12
- 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/dataLoader.js +1 -1
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
- package/esm/storages/inMemory/SplitsCacheInMemory.js +7 -16
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +4 -11
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +34 -52
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +12 -18
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/SSEHandler/index.js +4 -7
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -9
- package/esm/sync/streaming/constants.js +2 -3
- package/esm/sync/streaming/parseUtils.js +12 -8
- package/esm/sync/streaming/pushManager.js +32 -57
- package/esm/sync/submitters/telemetrySubmitter.js +0 -2
- package/esm/sync/syncManagerOnline.js +15 -25
- package/esm/utils/constants/index.js +2 -3
- package/esm/utils/settingsValidation/index.js +1 -5
- package/package.json +1 -1
- package/src/dtos/types.ts +7 -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 +7 -9
- package/src/readiness/types.ts +0 -1
- package/src/services/splitApi.ts +7 -12
- package/src/services/splitHttpClient.ts +1 -1
- package/src/services/types.ts +2 -3
- package/src/storages/AbstractSegmentsCacheSync.ts +53 -12
- package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
- package/src/storages/AbstractSplitsCacheSync.ts +7 -5
- package/src/storages/KeyBuilder.ts +0 -3
- package/src/storages/KeyBuilderCS.ts +9 -0
- package/src/storages/dataLoader.ts +1 -1
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +26 -56
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +10 -44
- package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -13
- package/src/storages/types.ts +10 -8
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +7 -14
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +2 -2
- package/src/sync/polling/pollingManagerCS.ts +29 -61
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +12 -13
- package/src/sync/polling/types.ts +8 -8
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +17 -18
- package/src/sync/streaming/AuthClient/index.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +4 -6
- package/src/sync/streaming/SSEHandler/index.ts +5 -9
- package/src/sync/streaming/SSEHandler/types.ts +13 -25
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -12
- 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 +2 -3
- package/src/sync/streaming/parseUtils.ts +19 -11
- package/src/sync/streaming/pushManager.ts +38 -68
- package/src/sync/streaming/types.ts +11 -13
- package/src/sync/submitters/telemetrySubmitter.ts +0 -2
- package/src/sync/submitters/types.ts +3 -6
- package/src/sync/syncManagerOnline.ts +11 -19
- package/src/types.ts +1 -26
- package/src/utils/constants/index.ts +2 -3
- package/src/utils/settingsValidation/index.ts +1 -5
- package/types/dtos/types.d.ts +7 -8
- 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 +9 -11
- package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheSync.d.ts +4 -4
- package/types/storages/KeyBuilder.d.ts +0 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -0
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -12
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -9
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
- package/types/storages/types.d.ts +8 -7
- 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 +8 -12
- 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 -3
- 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 +2 -3
- 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 +9 -10
- package/types/sync/submitters/types.d.ts +3 -6
- package/types/types.d.ts +0 -25
- package/types/utils/constants/index.d.ts +2 -3
- package/types/utils/settingsValidation/index.d.ts +0 -2
|
@@ -5,7 +5,6 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
7
|
var sets_1 = require("../../utils/lang/sets");
|
|
8
|
-
var constants_1 = require("../../utils/constants");
|
|
9
8
|
/**
|
|
10
9
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
11
10
|
* Supported by all JS runtimes.
|
|
@@ -18,7 +17,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
18
17
|
_this.ttCache = {};
|
|
19
18
|
_this.changeNumber = -1;
|
|
20
19
|
_this.segmentsCount = 0;
|
|
21
|
-
_this.largeSegmentsCount = 0;
|
|
22
20
|
_this.flagSetsCache = {};
|
|
23
21
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
24
22
|
return _this;
|
|
@@ -28,7 +26,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
28
26
|
this.ttCache = {};
|
|
29
27
|
this.changeNumber = -1;
|
|
30
28
|
this.segmentsCount = 0;
|
|
31
|
-
this.largeSegmentsCount = 0;
|
|
32
29
|
};
|
|
33
30
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
34
31
|
var previousSplit = this.getSplit(name);
|
|
@@ -38,11 +35,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
38
35
|
if (!this.ttCache[previousTtName])
|
|
39
36
|
delete this.ttCache[previousTtName];
|
|
40
37
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
41
|
-
//
|
|
42
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
38
|
+
// Subtract from segments count for the previous version of this Split
|
|
39
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit))
|
|
43
40
|
this.segmentsCount--;
|
|
44
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
|
|
45
|
-
this.largeSegmentsCount--;
|
|
46
41
|
}
|
|
47
42
|
if (split) {
|
|
48
43
|
// Store the Split.
|
|
@@ -52,10 +47,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
52
47
|
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
53
48
|
this.addToFlagSets(split);
|
|
54
49
|
// Add to segments count for the new version of the Split
|
|
55
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
50
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
56
51
|
this.segmentsCount++;
|
|
57
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
58
|
-
this.largeSegmentsCount++;
|
|
59
52
|
return true;
|
|
60
53
|
}
|
|
61
54
|
else {
|
|
@@ -73,10 +66,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
73
66
|
delete this.ttCache[ttName];
|
|
74
67
|
this.removeFromFlagSets(split.name, split.sets);
|
|
75
68
|
// Update the segments count.
|
|
76
|
-
if ((0, AbstractSplitsCacheSync_1.
|
|
69
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
77
70
|
this.segmentsCount--;
|
|
78
|
-
if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
|
|
79
|
-
this.largeSegmentsCount--;
|
|
80
71
|
return true;
|
|
81
72
|
}
|
|
82
73
|
else {
|
|
@@ -99,8 +90,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
99
90
|
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
100
91
|
return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
101
92
|
};
|
|
102
|
-
SplitsCacheInMemory.prototype.
|
|
103
|
-
return this.getChangeNumber() === -1 ||
|
|
93
|
+
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
94
|
+
return this.getChangeNumber() === -1 || this.segmentsCount > 0;
|
|
104
95
|
};
|
|
105
96
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
106
97
|
var _this = this;
|
|
@@ -5,21 +5,14 @@ exports.mySegmentsFetcherFactory = void 0;
|
|
|
5
5
|
* Factory of MySegments fetcher.
|
|
6
6
|
* MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
|
|
7
7
|
*/
|
|
8
|
-
function mySegmentsFetcherFactory(
|
|
8
|
+
function mySegmentsFetcherFactory(fetchMemberships) {
|
|
9
9
|
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
10
|
-
// Optional decorator for `
|
|
10
|
+
// Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
|
|
11
11
|
decorator) {
|
|
12
|
-
var mySegmentsPromise =
|
|
12
|
+
var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache);
|
|
13
13
|
if (decorator)
|
|
14
14
|
mySegmentsPromise = decorator(mySegmentsPromise);
|
|
15
|
-
|
|
16
|
-
return mySegmentsPromise
|
|
17
|
-
.then(function (resp) { return resp.json(); })
|
|
18
|
-
.then(function (json) {
|
|
19
|
-
return json.mySegments ?
|
|
20
|
-
json.mySegments.map(function (segment) { return segment.name; }) :
|
|
21
|
-
json.myLargeSegments;
|
|
22
|
-
});
|
|
15
|
+
return mySegmentsPromise.then(function (resp) { return resp.json(); });
|
|
23
16
|
};
|
|
24
17
|
}
|
|
25
18
|
exports.mySegmentsFetcherFactory = mySegmentsFetcherFactory;
|
|
@@ -23,7 +23,7 @@ function greedyFetch(fetchSegmentChanges, since, segmentName, noCache, targetTil
|
|
|
23
23
|
*/
|
|
24
24
|
function segmentChangesFetcherFactory(fetchSegmentChanges) {
|
|
25
25
|
return function segmentChangesFetcher(since, segmentName, noCache, till,
|
|
26
|
-
// Optional decorator for `
|
|
26
|
+
// Optional decorator for `fetchSegmentChanges` promise, such as timeout or time tracker
|
|
27
27
|
decorator) {
|
|
28
28
|
var segmentsPromise = greedyFetch(fetchSegmentChanges, since, segmentName, noCache, till);
|
|
29
29
|
if (decorator)
|
|
@@ -7,7 +7,6 @@ var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
|
7
7
|
var key_1 = require("../../utils/key");
|
|
8
8
|
var constants_1 = require("../../readiness/constants");
|
|
9
9
|
var constants_2 = require("../../logger/constants");
|
|
10
|
-
var constants_3 = require("../../utils/constants");
|
|
11
10
|
/**
|
|
12
11
|
* Expose start / stop mechanism for polling data from services.
|
|
13
12
|
* For client-side API with multiple clients.
|
|
@@ -16,74 +15,59 @@ function pollingManagerCSFactory(params) {
|
|
|
16
15
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
16
|
var log = settings.log;
|
|
18
17
|
var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
19
|
-
// Map of matching keys to their corresponding MySegmentsSyncTask
|
|
18
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
20
19
|
var mySegmentsSyncTasks = {};
|
|
21
20
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
22
|
-
var
|
|
21
|
+
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
|
|
23
22
|
function startMySegmentsSyncTasks() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
|
|
27
|
-
var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
|
|
28
|
-
if (splitsHaveSegments)
|
|
29
|
-
msSyncTask.start();
|
|
30
|
-
else
|
|
31
|
-
msSyncTask.stop(); // smart pausing
|
|
32
|
-
if (mlsSyncTask) {
|
|
33
|
-
if (splitsHaveLargeSegments)
|
|
34
|
-
mlsSyncTask.start();
|
|
35
|
-
else
|
|
36
|
-
mlsSyncTask.stop(); // smart pausing
|
|
37
|
-
}
|
|
23
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
24
|
+
mySegmentsSyncTask.start();
|
|
38
25
|
});
|
|
39
26
|
}
|
|
40
27
|
function stopMySegmentsSyncTasks() {
|
|
41
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
mlsSyncTask && mlsSyncTask.stop();
|
|
28
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
29
|
+
if (mySegmentsSyncTask.isRunning())
|
|
30
|
+
mySegmentsSyncTask.stop();
|
|
45
31
|
});
|
|
46
32
|
}
|
|
33
|
+
// smart pausing
|
|
47
34
|
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
48
|
-
if (splitsSyncTask.isRunning())
|
|
49
|
-
|
|
35
|
+
if (!splitsSyncTask.isRunning())
|
|
36
|
+
return; // noop if not doing polling
|
|
37
|
+
var splitsHaveSegments = storage.splits.usesSegments();
|
|
38
|
+
if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
|
|
39
|
+
log.info(constants_2.POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
|
|
40
|
+
if (splitsHaveSegments) {
|
|
41
|
+
startMySegmentsSyncTasks();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
stopMySegmentsSyncTasks();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
50
47
|
});
|
|
51
48
|
function add(matchingKey, readiness, storage) {
|
|
52
|
-
var
|
|
53
|
-
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
54
|
-
var mlsSyncTask;
|
|
55
|
-
if (settings.sync.largeSegmentsEnabled) {
|
|
56
|
-
mlsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMyLargeSegments, storage.largeSegments, function () { if (readiness.largeSegments && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
|
|
57
|
-
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate, 'myLargeSegmentsUpdater');
|
|
58
|
-
}
|
|
49
|
+
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
59
50
|
// smart ready
|
|
60
51
|
function smartReady() {
|
|
61
|
-
if (!readiness.isReady())
|
|
62
|
-
|
|
63
|
-
readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
64
|
-
if (!storage.splits.usesMatcher(constants_3.IN_SEGMENT))
|
|
65
|
-
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
66
|
-
}
|
|
52
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
53
|
+
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
67
54
|
}
|
|
68
|
-
if (storage.splits.
|
|
69
|
-
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
70
|
-
else
|
|
55
|
+
if (!storage.splits.usesSegments())
|
|
71
56
|
setTimeout(smartReady, 0);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
57
|
+
else
|
|
58
|
+
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
59
|
+
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
60
|
+
return mySegmentsSyncTask;
|
|
77
61
|
}
|
|
78
62
|
return {
|
|
79
63
|
splitsSyncTask: splitsSyncTask,
|
|
80
|
-
segmentsSyncTask:
|
|
81
|
-
largeSegmentsSyncTask: mlsSyncTask,
|
|
64
|
+
segmentsSyncTask: mySegmentsSyncTask,
|
|
82
65
|
// Start periodic fetching (polling)
|
|
83
66
|
start: function () {
|
|
84
67
|
log.info(constants_2.POLLING_START);
|
|
85
68
|
splitsSyncTask.start();
|
|
86
|
-
|
|
69
|
+
if (storage.splits.usesSegments())
|
|
70
|
+
startMySegmentsSyncTasks();
|
|
87
71
|
},
|
|
88
72
|
// Stop periodic fetching (polling)
|
|
89
73
|
stop: function () {
|
|
@@ -97,10 +81,8 @@ function pollingManagerCSFactory(params) {
|
|
|
97
81
|
// fetch splits and segments
|
|
98
82
|
syncAll: function () {
|
|
99
83
|
var promises = [splitsSyncTask.execute()];
|
|
100
|
-
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (
|
|
101
|
-
|
|
102
|
-
promises.push(msSyncTask.execute());
|
|
103
|
-
mlsSyncTask && promises.push(mlsSyncTask.execute());
|
|
84
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
85
|
+
promises.push(mySegmentsSyncTask.execute());
|
|
104
86
|
});
|
|
105
87
|
return Promise.all(promises);
|
|
106
88
|
},
|
|
@@ -7,7 +7,7 @@ var mySegmentsUpdater_1 = require("../updaters/mySegmentsUpdater");
|
|
|
7
7
|
/**
|
|
8
8
|
* Creates a sync task that periodically executes a `mySegmentsUpdater` task
|
|
9
9
|
*/
|
|
10
|
-
function mySegmentsSyncTaskFactory(
|
|
11
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(
|
|
10
|
+
function mySegmentsSyncTaskFactory(fetchMemberships, storage, readiness, settings, matchingKey) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMemberships), storage, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
12
12
|
}
|
|
13
13
|
exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
|
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mySegmentsUpdaterFactory = void 0;
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
|
-
var constants_1 = require("../../../
|
|
5
|
+
var constants_1 = require("../../../readiness/constants");
|
|
6
|
+
var constants_2 = require("../../../logger/constants");
|
|
7
|
+
var constants_3 = require("../../streaming/constants");
|
|
6
8
|
/**
|
|
7
9
|
* factory of MySegments updater, a task that:
|
|
8
10
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
9
11
|
* - updates `mySegmentsCache`
|
|
10
12
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
11
13
|
*/
|
|
12
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
14
|
+
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
15
|
+
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
13
16
|
var readyOnAlreadyExistentState = true;
|
|
14
17
|
var startingUp = true;
|
|
15
18
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -21,28 +24,19 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
21
24
|
// @TODO if allowing pluggable storages, handle async execution
|
|
22
25
|
function updateSegments(segmentsData) {
|
|
23
26
|
var shouldNotifyUpdate;
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
if (segmentsData.type !== undefined) {
|
|
28
|
+
shouldNotifyUpdate = segmentsData.type === constants_3.MEMBERSHIP_LS_UPDATE ?
|
|
29
|
+
largeSegments.resetSegments(segmentsData) :
|
|
30
|
+
segments.resetSegments(segmentsData);
|
|
27
31
|
}
|
|
28
32
|
else {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (mySegmentsCache.isInSegment(name_1) !== add) {
|
|
32
|
-
shouldNotifyUpdate = true;
|
|
33
|
-
if (add)
|
|
34
|
-
mySegmentsCache.addToSegment(name_1);
|
|
35
|
-
else
|
|
36
|
-
mySegmentsCache.removeFromSegment(name_1);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
shouldNotifyUpdate = false;
|
|
40
|
-
}
|
|
33
|
+
shouldNotifyUpdate = segments.resetSegments(segmentsData.ms || {});
|
|
34
|
+
shouldNotifyUpdate = largeSegments.resetSegments(segmentsData.ls || {}) || shouldNotifyUpdate;
|
|
41
35
|
}
|
|
42
36
|
// Notify update if required
|
|
43
|
-
if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
|
|
37
|
+
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
44
38
|
readyOnAlreadyExistentState = false;
|
|
45
|
-
|
|
39
|
+
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
46
40
|
}
|
|
47
41
|
}
|
|
48
42
|
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
@@ -59,7 +53,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
|
|
|
59
53
|
return updaterPromise.catch(function (error) {
|
|
60
54
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
61
55
|
retry += 1;
|
|
62
|
-
log.warn(
|
|
56
|
+
log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
|
|
63
57
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
64
58
|
}
|
|
65
59
|
else {
|
|
@@ -13,7 +13,7 @@ var murmur3_1 = require("../../../utils/murmur3/murmur3");
|
|
|
13
13
|
function authenticateFactory(fetchAuth) {
|
|
14
14
|
/**
|
|
15
15
|
* Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
|
|
16
|
-
* @param {string[] | undefined} userKeys set of user Keys to track
|
|
16
|
+
* @param {string[] | undefined} userKeys set of user Keys to track membership updates. It is undefined for server-side API.
|
|
17
17
|
*/
|
|
18
18
|
return function authenticate(userKeys) {
|
|
19
19
|
return fetchAuth(userKeys)
|
|
@@ -68,21 +68,18 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
68
68
|
}
|
|
69
69
|
var parsedData = messageWithParsedData.parsedData, data = messageWithParsedData.data, channel = messageWithParsedData.channel, timestamp = messageWithParsedData.timestamp;
|
|
70
70
|
log.debug(constants_2.STREAMING_NEW_MESSAGE, [data]);
|
|
71
|
-
// we only handle update events if streaming is up
|
|
71
|
+
// we only handle update events if streaming is up
|
|
72
72
|
if (!notificationKeeper.isStreamingUp() && [constants_1.OCCUPANCY, constants_1.CONTROL].indexOf(parsedData.type) === -1)
|
|
73
73
|
return;
|
|
74
74
|
switch (parsedData.type) {
|
|
75
75
|
/* update events */
|
|
76
76
|
case constants_1.SPLIT_UPDATE:
|
|
77
77
|
case constants_1.SEGMENT_UPDATE:
|
|
78
|
-
case constants_1.
|
|
79
|
-
case constants_1.
|
|
78
|
+
case constants_1.MEMBERSHIP_MS_UPDATE:
|
|
79
|
+
case constants_1.MEMBERSHIP_LS_UPDATE:
|
|
80
80
|
case constants_1.SPLIT_KILL:
|
|
81
81
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
82
82
|
break;
|
|
83
|
-
case constants_1.MY_SEGMENTS_UPDATE:
|
|
84
|
-
pushEmitter.emit(parsedData.type, parsedData, channel);
|
|
85
|
-
break;
|
|
86
83
|
/* occupancy & control events, handled by NotificationManagerKeeper */
|
|
87
84
|
case constants_1.OCCUPANCY:
|
|
88
85
|
notificationKeeper.handleOccupancyEvent(parsedData.metrics.publishers, channel, timestamp);
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MySegmentsUpdateWorker = void 0;
|
|
4
4
|
var Backoff_1 = require("../../../utils/Backoff");
|
|
5
|
+
var constants_1 = require("../../../utils/constants");
|
|
5
6
|
/**
|
|
6
7
|
* MySegmentsUpdateWorker factory
|
|
7
8
|
*/
|
|
8
|
-
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker
|
|
9
|
+
function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
|
|
9
10
|
var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
|
|
10
11
|
var currentChangeNumber = -1;
|
|
11
12
|
var handleNewEvent = false;
|
|
@@ -23,6 +24,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
23
24
|
var syncTask = _delay ?
|
|
24
25
|
new Promise(function (res) {
|
|
25
26
|
_delayTimeoutID = setTimeout(function () {
|
|
27
|
+
_delay = undefined;
|
|
26
28
|
mySegmentsSyncTask.execute(_segmentsData, true).then(res);
|
|
27
29
|
}, _delay);
|
|
28
30
|
}) :
|
|
@@ -32,7 +34,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
32
34
|
return; // halt if `stop` has been called
|
|
33
35
|
if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
|
|
34
36
|
if (_segmentsData)
|
|
35
|
-
telemetryTracker.trackUpdatesFromSSE(
|
|
37
|
+
telemetryTracker.trackUpdatesFromSSE(constants_1.MEMBERSHIPS);
|
|
36
38
|
currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
|
|
37
39
|
}
|
|
38
40
|
if (handleNewEvent) {
|
|
@@ -49,17 +51,20 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
49
51
|
}
|
|
50
52
|
return {
|
|
51
53
|
/**
|
|
52
|
-
* Invoked by NotificationProcessor on
|
|
54
|
+
* Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
|
|
53
55
|
*
|
|
54
|
-
* @param
|
|
55
|
-
* @param
|
|
56
|
+
* @param changeNumber change number of the notification
|
|
57
|
+
* @param segmentsData data for KeyList or SegmentRemoval instant updates
|
|
58
|
+
* @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
|
|
56
59
|
*/
|
|
57
|
-
put: function (
|
|
58
|
-
|
|
60
|
+
put: function (mySegmentsData, payload, delay) {
|
|
61
|
+
var type = mySegmentsData.type, cn = mySegmentsData.cn;
|
|
62
|
+
// Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
|
|
63
|
+
if (cn <= currentChangeNumber || cn <= maxChangeNumber || _delay)
|
|
59
64
|
return;
|
|
60
|
-
maxChangeNumber =
|
|
65
|
+
maxChangeNumber = cn;
|
|
61
66
|
handleNewEvent = true;
|
|
62
|
-
_segmentsData =
|
|
67
|
+
_segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
|
|
63
68
|
_delay = delay;
|
|
64
69
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
65
70
|
__handleMySegmentsUpdateCall();
|
|
@@ -67,6 +72,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
|
|
|
67
72
|
},
|
|
68
73
|
stop: function () {
|
|
69
74
|
clearTimeout(_delayTimeoutID);
|
|
75
|
+
_delay = undefined;
|
|
70
76
|
isHandlingEvent = false;
|
|
71
77
|
backoff.reset();
|
|
72
78
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIP_LS_UPDATE = exports.MEMBERSHIP_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
4
4
|
// time for refresh token
|
|
5
5
|
exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
6
6
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -25,12 +25,11 @@ exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
|
|
|
25
25
|
*/
|
|
26
26
|
exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
|
|
27
27
|
// Update-type push notifications, handled by NotificationProcessor
|
|
28
|
-
exports.
|
|
29
|
-
exports.
|
|
28
|
+
exports.MEMBERSHIP_MS_UPDATE = 'MEMBERSHIP_MS_UPDATE';
|
|
29
|
+
exports.MEMBERSHIP_LS_UPDATE = 'MEMBERSHIP_LS_UPDATE';
|
|
30
30
|
exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
|
|
31
31
|
exports.SPLIT_KILL = 'SPLIT_KILL';
|
|
32
32
|
exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
|
|
33
|
-
exports.MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
|
|
34
33
|
// Control-type push notifications, handled by NotificationKeeper
|
|
35
34
|
exports.CONTROL = 'CONTROL';
|
|
36
35
|
exports.OCCUPANCY = 'OCCUPANCY';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
3
|
+
exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
|
|
4
4
|
var decompress_1 = require("../../utils/decompress");
|
|
5
5
|
var base64_1 = require("../../utils/base64");
|
|
6
|
+
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
6
7
|
var GZIP = 1;
|
|
7
8
|
var ZLIB = 2;
|
|
8
9
|
function Uint8ArrayToString(myUint8Arr) {
|
|
@@ -80,15 +81,19 @@ function isInBitmap(bitmap, hash64hex) {
|
|
|
80
81
|
exports.isInBitmap = isInBitmap;
|
|
81
82
|
/**
|
|
82
83
|
* Parse feature flags notifications for instant feature flag updates
|
|
83
|
-
*
|
|
84
|
-
* @param {ISplitUpdateData} data
|
|
85
|
-
* @returns {KeyList}
|
|
86
84
|
*/
|
|
87
85
|
function parseFFUpdatePayload(compression, data) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
else
|
|
92
|
-
return JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
86
|
+
return compression > 0 ?
|
|
87
|
+
parseKeyList(data, compression, false) :
|
|
88
|
+
JSON.parse((0, base64_1.decodeFromBase64)(data));
|
|
93
89
|
}
|
|
94
90
|
exports.parseFFUpdatePayload = parseFFUpdatePayload;
|
|
91
|
+
var DEFAULT_MAX_INTERVAL = 60000;
|
|
92
|
+
function getDelay(parsedData, matchingKey) {
|
|
93
|
+
if (parsedData.h === 0)
|
|
94
|
+
return 0;
|
|
95
|
+
var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
|
|
96
|
+
var seed = parsedData.s || 0;
|
|
97
|
+
return (0, murmur3_1.hash)(matchingKey, seed) % interval;
|
|
98
|
+
}
|
|
99
|
+
exports.getDelay = getDelay;
|