@splitsoftware/splitio-commons 1.17.1-rc.4 → 1.17.1-rc.5
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 +28 -29
- package/LICENSE +1 -1
- package/README.md +4 -3
- package/cjs/consent/sdkUserConsent.js +4 -2
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchers/segment.js +0 -6
- package/cjs/evaluator/matchersTransform/index.js +1 -4
- package/cjs/evaluator/matchersTransform/segment.js +1 -3
- package/cjs/logger/constants.js +2 -2
- package/cjs/logger/messages/info.js +1 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/readiness/readinessManager.js +8 -18
- package/cjs/readiness/sdkReadinessManager.js +6 -5
- package/cjs/sdkClient/sdkClient.js +5 -5
- package/cjs/sdkClient/sdkClientMethod.js +1 -3
- package/cjs/sdkClient/sdkClientMethodCS.js +15 -9
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +15 -9
- package/cjs/sdkFactory/index.js +10 -32
- package/cjs/services/decorateHeaders.js +6 -1
- package/cjs/services/splitApi.js +5 -5
- package/cjs/services/splitHttpClient.js +5 -2
- package/cjs/storages/AbstractSegmentsCacheSync.js +33 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +1 -2
- package/cjs/storages/KeyBuilderCS.js +5 -23
- package/cjs/storages/dataLoader.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
- package/cjs/storages/inLocalStorage/index.js +2 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -6
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +28 -14
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +9 -8
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +21 -15
- package/cjs/storages/inRedis/index.js +11 -5
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +34 -13
- package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
- package/cjs/sync/offline/syncManagerOffline.js +11 -18
- package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +1 -1
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +28 -12
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +1 -1
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +5 -3
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +9 -14
- package/cjs/sync/streaming/pushManager.js +67 -69
- package/cjs/sync/syncManagerOnline.js +21 -20
- package/cjs/sync/syncTask.js +2 -2
- package/cjs/trackers/eventTracker.js +10 -12
- package/cjs/trackers/impressionsTracker.js +14 -16
- package/cjs/trackers/uniqueKeysTracker.js +3 -5
- package/cjs/utils/constants/index.js +4 -5
- package/cjs/utils/settingsValidation/index.js +1 -2
- package/esm/consent/sdkUserConsent.js +4 -2
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchers/segment.js +0 -6
- package/esm/evaluator/matchersTransform/index.js +1 -4
- package/esm/evaluator/matchersTransform/segment.js +1 -3
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/info.js +1 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/readiness/readinessManager.js +8 -18
- package/esm/readiness/sdkReadinessManager.js +6 -5
- package/esm/sdkClient/sdkClient.js +5 -5
- package/esm/sdkClient/sdkClientMethod.js +1 -3
- package/esm/sdkClient/sdkClientMethodCS.js +13 -7
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +13 -7
- package/esm/sdkFactory/index.js +10 -32
- package/esm/services/decorateHeaders.js +4 -0
- package/esm/services/splitApi.js +6 -6
- package/esm/services/splitHttpClient.js +6 -3
- package/esm/storages/AbstractSegmentsCacheSync.js +30 -0
- package/esm/storages/AbstractSplitsCacheSync.js +2 -3
- package/esm/storages/KeyBuilderCS.js +4 -21
- package/esm/storages/dataLoader.js +1 -1
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
- package/esm/storages/inLocalStorage/index.js +3 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +1 -6
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +28 -14
- package/esm/storages/inMemory/SplitsCacheInMemory.js +9 -8
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
- package/esm/storages/inRedis/SegmentsCacheInRedis.js +21 -15
- package/esm/storages/inRedis/index.js +11 -5
- package/esm/storages/pluggable/SegmentsCachePluggable.js +34 -13
- package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
- package/esm/sync/offline/syncManagerOffline.js +11 -18
- package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +1 -1
- package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +28 -12
- package/esm/sync/polling/updaters/splitChangesUpdater.js +1 -1
- package/esm/sync/streaming/AuthClient/index.js +1 -1
- package/esm/sync/streaming/SSEHandler/index.js +6 -4
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +8 -12
- package/esm/sync/streaming/pushManager.js +70 -72
- package/esm/sync/syncManagerOnline.js +21 -20
- package/esm/sync/syncTask.js +2 -2
- package/esm/trackers/eventTracker.js +10 -12
- package/esm/trackers/impressionsTracker.js +14 -16
- package/esm/trackers/uniqueKeysTracker.js +3 -5
- package/esm/utils/constants/index.js +2 -3
- package/esm/utils/settingsValidation/index.js +1 -2
- package/package.json +1 -1
- package/src/consent/sdkUserConsent.ts +3 -2
- package/src/dtos/types.ts +7 -21
- package/src/evaluator/matchers/index.ts +0 -2
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchers/segment.ts +0 -7
- package/src/evaluator/matchersTransform/index.ts +1 -4
- package/src/evaluator/matchersTransform/segment.ts +3 -5
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/info.ts +1 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/readiness/readinessManager.ts +8 -19
- package/src/readiness/sdkReadinessManager.ts +7 -7
- package/src/readiness/types.ts +2 -5
- package/src/sdkClient/sdkClient.ts +5 -5
- package/src/sdkClient/sdkClientMethod.ts +1 -4
- package/src/sdkClient/sdkClientMethodCS.ts +15 -7
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +15 -7
- package/src/sdkFactory/index.ts +12 -35
- package/src/sdkFactory/types.ts +1 -4
- package/src/services/decorateHeaders.ts +5 -0
- package/src/services/splitApi.ts +7 -7
- package/src/services/splitHttpClient.ts +7 -4
- package/src/services/types.ts +2 -2
- package/src/storages/AbstractSegmentsCacheSync.ts +68 -0
- package/src/storages/AbstractSplitsCacheSync.ts +3 -4
- package/src/storages/KeyBuilderCS.ts +5 -34
- package/src/storages/dataLoader.ts +1 -1
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +63 -33
- package/src/storages/inLocalStorage/index.ts +4 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +1 -6
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +47 -13
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +27 -13
- package/src/storages/inMemory/SplitsCacheInMemory.ts +9 -7
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
- package/src/storages/inRedis/SegmentsCacheInRedis.ts +24 -15
- package/src/storages/inRedis/index.ts +12 -6
- package/src/storages/pluggable/SegmentsCachePluggable.ts +37 -13
- package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
- package/src/storages/types.ts +17 -15
- package/src/sync/offline/syncManagerOffline.ts +13 -21
- package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
- package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
- package/src/sync/polling/fetchers/types.ts +2 -3
- package/src/sync/polling/pollingManagerCS.ts +4 -4
- package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
- package/src/sync/polling/types.ts +6 -7
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +29 -13
- package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
- package/src/sync/streaming/AuthClient/index.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +6 -4
- package/src/sync/streaming/SSEHandler/index.ts +8 -5
- package/src/sync/streaming/SSEHandler/types.ts +15 -15
- package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
- 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 -2
- package/src/sync/streaming/parseUtils.ts +11 -19
- package/src/sync/streaming/pushManager.ts +72 -73
- package/src/sync/streaming/types.ts +10 -10
- package/src/sync/submitters/types.ts +5 -8
- package/src/sync/syncManagerOnline.ts +17 -17
- package/src/sync/syncTask.ts +2 -2
- package/src/sync/types.ts +1 -1
- package/src/trackers/eventTracker.ts +8 -11
- package/src/trackers/impressionsTracker.ts +10 -13
- package/src/trackers/types.ts +0 -1
- package/src/trackers/uniqueKeysTracker.ts +4 -6
- package/src/types.ts +1 -7
- package/src/utils/constants/index.ts +2 -3
- package/src/utils/settingsValidation/index.ts +2 -3
- package/src/utils/settingsValidation/types.ts +1 -1
- package/types/dtos/types.d.ts +7 -18
- package/types/evaluator/matchersTransform/segment.d.ts +2 -2
- package/types/logger/constants.d.ts +1 -1
- package/types/readiness/readinessManager.d.ts +2 -2
- package/types/readiness/sdkReadinessManager.d.ts +3 -2
- package/types/readiness/types.d.ts +2 -5
- package/types/sdkClient/sdkClientMethod.d.ts +1 -1
- package/types/sdkFactory/types.d.ts +1 -3
- package/types/services/decorateHeaders.d.ts +1 -0
- package/types/services/splitApi.d.ts +1 -1
- package/types/services/splitHttpClient.d.ts +1 -1
- package/types/services/types.d.ts +2 -2
- package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
- package/types/storages/AbstractSplitsCacheSync.d.ts +1 -1
- package/types/storages/KeyBuilderCS.d.ts +2 -9
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +18 -8
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +13 -7
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +8 -6
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -1
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +4 -7
- package/types/storages/inRedis/index.d.ts +1 -1
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +17 -5
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
- package/types/storages/types.d.ts +15 -11
- 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 +2 -2
- package/types/sync/polling/types.d.ts +4 -7
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
- package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
- package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
- package/types/sync/streaming/constants.d.ts +2 -2
- package/types/sync/streaming/parseUtils.d.ts +5 -4
- package/types/sync/streaming/types.d.ts +8 -8
- package/types/sync/submitters/types.d.ts +4 -7
- package/types/sync/types.d.ts +1 -1
- package/types/trackers/eventTracker.d.ts +1 -1
- package/types/trackers/impressionsTracker.d.ts +1 -1
- package/types/trackers/types.d.ts +0 -1
- package/types/types.d.ts +1 -7
- package/types/utils/constants/index.d.ts +2 -3
- package/types/utils/settingsValidation/types.d.ts +1 -1
- package/cjs/evaluator/matchers/large_segment.js +0 -16
- package/cjs/sdkClient/identity.js +0 -7
- package/cjs/storages/AbstractMySegmentsCacheSync.js +0 -60
- package/esm/evaluator/matchers/large_segment.js +0 -12
- package/esm/sdkClient/identity.js +0 -3
- package/esm/storages/AbstractMySegmentsCacheSync.js +0 -57
- package/src/evaluator/matchers/large_segment.ts +0 -18
- package/src/sdkClient/identity.ts +0 -5
- package/src/storages/AbstractMySegmentsCacheSync.ts +0 -94
- package/types/evaluator/matchers/large_segment.d.ts +0 -5
- package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
- package/types/evaluator/matchersTransform/set.d.ts +0 -5
- package/types/evaluator/matchersTransform/string.d.ts +0 -7
- package/types/sdkClient/identity.d.ts +0 -2
- package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
- package/types/storages/AbstractSplitsCache.d.ts +0 -46
- package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
- package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
- package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
- package/types/trackers/impressionObserver/utils.d.ts +0 -5
- package/types/utils/inputValidation/sdkKey.d.ts +0 -7
- package/types/utils/inputValidation/splitExistance.d.ts +0 -7
- package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
- package/types/utils/redis/RedisMock.d.ts +0 -4
- package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
- /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
|
@@ -7,6 +7,7 @@ var lang_1 = require("../../utils/lang");
|
|
|
7
7
|
var sets_1 = require("../../utils/lang/sets");
|
|
8
8
|
/**
|
|
9
9
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
10
|
+
* Supported by all JS runtimes.
|
|
10
11
|
*/
|
|
11
12
|
var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
12
13
|
(0, tslib_1.__extends)(SplitsCacheInMemory, _super);
|
|
@@ -15,7 +16,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
15
16
|
_this.splitsCache = {};
|
|
16
17
|
_this.ttCache = {};
|
|
17
18
|
_this.changeNumber = -1;
|
|
18
|
-
_this.
|
|
19
|
+
_this.splitsWithSegmentsCount = 0;
|
|
19
20
|
_this.flagSetsCache = {};
|
|
20
21
|
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
21
22
|
return _this;
|
|
@@ -24,7 +25,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
24
25
|
this.splitsCache = {};
|
|
25
26
|
this.ttCache = {};
|
|
26
27
|
this.changeNumber = -1;
|
|
27
|
-
this.
|
|
28
|
+
this.splitsWithSegmentsCount = 0;
|
|
28
29
|
};
|
|
29
30
|
SplitsCacheInMemory.prototype.addSplit = function (name, split) {
|
|
30
31
|
var previousSplit = this.getSplit(name);
|
|
@@ -34,9 +35,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
34
35
|
if (!this.ttCache[previousTtName])
|
|
35
36
|
delete this.ttCache[previousTtName];
|
|
36
37
|
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit)) { // Substract from segments count for the previous version of this Split.
|
|
39
|
+
this.splitsWithSegmentsCount--;
|
|
40
|
+
}
|
|
40
41
|
}
|
|
41
42
|
if (split) {
|
|
42
43
|
// Store the Split.
|
|
@@ -47,7 +48,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
47
48
|
this.addToFlagSets(split);
|
|
48
49
|
// Add to segments count for the new version of the Split
|
|
49
50
|
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
50
|
-
this.
|
|
51
|
+
this.splitsWithSegmentsCount++;
|
|
51
52
|
return true;
|
|
52
53
|
}
|
|
53
54
|
else {
|
|
@@ -66,7 +67,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
66
67
|
this.removeFromFlagSets(split.name, split.sets);
|
|
67
68
|
// Update the segments count.
|
|
68
69
|
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
69
|
-
this.
|
|
70
|
+
this.splitsWithSegmentsCount--;
|
|
70
71
|
return true;
|
|
71
72
|
}
|
|
72
73
|
else {
|
|
@@ -90,7 +91,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
90
91
|
return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
91
92
|
};
|
|
92
93
|
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
93
|
-
return this.getChangeNumber() === -1 || this.
|
|
94
|
+
return this.getChangeNumber() === -1 || this.splitsWithSegmentsCount > 0;
|
|
94
95
|
};
|
|
95
96
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
96
97
|
var _this = this;
|
|
@@ -23,10 +23,9 @@ function shouldRecordTelemetry(_a) {
|
|
|
23
23
|
}
|
|
24
24
|
exports.shouldRecordTelemetry = shouldRecordTelemetry;
|
|
25
25
|
var TelemetryCacheInMemory = /** @class */ (function () {
|
|
26
|
-
function TelemetryCacheInMemory(splits, segments
|
|
26
|
+
function TelemetryCacheInMemory(splits, segments) {
|
|
27
27
|
this.splits = splits;
|
|
28
28
|
this.segments = segments;
|
|
29
|
-
this.largeSegments = largeSegments;
|
|
30
29
|
// isEmpty flag
|
|
31
30
|
this.e = true;
|
|
32
31
|
this.notReadyUsage = 0;
|
|
@@ -42,7 +41,10 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
42
41
|
this.tags = [];
|
|
43
42
|
this.exceptions = {};
|
|
44
43
|
this.latencies = {};
|
|
45
|
-
this.updatesFromSSE = {
|
|
44
|
+
this.updatesFromSSE = {
|
|
45
|
+
sp: 0,
|
|
46
|
+
ms: 0
|
|
47
|
+
};
|
|
46
48
|
}
|
|
47
49
|
TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
|
|
48
50
|
TelemetryCacheInMemory.prototype.clear = function () { };
|
|
@@ -62,8 +64,6 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
62
64
|
spC: this.splits && this.splits.getSplitNames().length,
|
|
63
65
|
seC: this.segments && this.segments.getRegisteredSegments().length,
|
|
64
66
|
skC: this.segments && this.segments.getKeysCount(),
|
|
65
|
-
lsC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
|
|
66
|
-
lskC: this.largeSegments && this.largeSegments.getKeysCount(),
|
|
67
67
|
sL: this.getSessionLength(),
|
|
68
68
|
eQ: this.getEventStats(constants_1.QUEUED),
|
|
69
69
|
eD: this.getEventStats(constants_1.DROPPED),
|
|
@@ -195,11 +195,14 @@ var TelemetryCacheInMemory = /** @class */ (function () {
|
|
|
195
195
|
};
|
|
196
196
|
TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
|
|
197
197
|
var result = this.updatesFromSSE;
|
|
198
|
-
this.updatesFromSSE = {
|
|
198
|
+
this.updatesFromSSE = {
|
|
199
|
+
sp: 0,
|
|
200
|
+
ms: 0,
|
|
201
|
+
};
|
|
199
202
|
return result;
|
|
200
203
|
};
|
|
201
204
|
TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
|
|
202
|
-
this.updatesFromSSE[type]
|
|
205
|
+
this.updatesFromSSE[type]++;
|
|
203
206
|
this.e = false;
|
|
204
207
|
};
|
|
205
208
|
return TelemetryCacheInMemory;
|
|
@@ -9,32 +9,38 @@ var SegmentsCacheInRedis = /** @class */ (function () {
|
|
|
9
9
|
this.redis = redis;
|
|
10
10
|
this.keys = keys;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
* Update the given segment `name` with the lists of `addedKeys`, `removedKeys` and `changeNumber`.
|
|
14
|
-
* The returned promise is resolved if the operation success, with `true` if the segment was updated (i.e., some key was added or removed),
|
|
15
|
-
* or rejected if it fails (e.g., Redis operation fails).
|
|
16
|
-
*/
|
|
17
|
-
SegmentsCacheInRedis.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
|
|
12
|
+
SegmentsCacheInRedis.prototype.addToSegment = function (name, segmentKeys) {
|
|
18
13
|
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
if (segmentKeys.length) {
|
|
15
|
+
return this.redis.sadd(segmentKey, segmentKeys).then(function () { return true; });
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return Promise.resolve(true);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
SegmentsCacheInRedis.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
22
|
+
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
23
|
+
if (segmentKeys.length) {
|
|
24
|
+
return this.redis.srem(segmentKey, segmentKeys).then(function () { return true; });
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return Promise.resolve(true);
|
|
28
|
+
}
|
|
26
29
|
};
|
|
27
30
|
SegmentsCacheInRedis.prototype.isInSegment = function (name, key) {
|
|
28
31
|
return this.redis.sismember(this.keys.buildSegmentNameKey(name), key).then(function (matches) { return matches !== 0; });
|
|
29
32
|
};
|
|
33
|
+
SegmentsCacheInRedis.prototype.setChangeNumber = function (name, changeNumber) {
|
|
34
|
+
return this.redis.set(this.keys.buildSegmentTillKey(name), changeNumber + '').then(function (status) { return status === 'OK'; });
|
|
35
|
+
};
|
|
30
36
|
SegmentsCacheInRedis.prototype.getChangeNumber = function (name) {
|
|
31
37
|
var _this = this;
|
|
32
38
|
return this.redis.get(this.keys.buildSegmentTillKey(name)).then(function (value) {
|
|
33
39
|
var i = parseInt(value, 10);
|
|
34
|
-
return (0, lang_1.isNaNNumber)(i) ?
|
|
40
|
+
return (0, lang_1.isNaNNumber)(i) ? undefined : i;
|
|
35
41
|
}).catch(function (e) {
|
|
36
42
|
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from segments storage. Error: ' + e);
|
|
37
|
-
return
|
|
43
|
+
return undefined;
|
|
38
44
|
});
|
|
39
45
|
};
|
|
40
46
|
SegmentsCacheInRedis.prototype.registerSegments = function (segments) {
|
|
@@ -12,17 +12,23 @@ var TelemetryCacheInRedis_1 = require("./TelemetryCacheInRedis");
|
|
|
12
12
|
var UniqueKeysCacheInRedis_1 = require("./UniqueKeysCacheInRedis");
|
|
13
13
|
var ImpressionCountsCacheInRedis_1 = require("./ImpressionCountsCacheInRedis");
|
|
14
14
|
var utils_1 = require("../utils");
|
|
15
|
+
var RD;
|
|
16
|
+
try {
|
|
17
|
+
// Using `require` to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
|
|
18
|
+
// Redis storage is not supported with .mjs files.
|
|
19
|
+
RD = require('./RedisAdapter').RedisAdapter;
|
|
20
|
+
}
|
|
21
|
+
catch (error) { /* empty */ }
|
|
15
22
|
/**
|
|
16
|
-
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.
|
|
23
|
+
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.js
|
|
17
24
|
* @see {@link https://www.npmjs.com/package/ioredis}
|
|
18
25
|
*/
|
|
19
26
|
function InRedisStorage(options) {
|
|
20
27
|
if (options === void 0) { options = {}; }
|
|
21
|
-
// Lazy loading to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
|
|
22
|
-
// Redis storage is not supported with .mjs files.
|
|
23
|
-
var RD = require('./RedisAdapter').RedisAdapter;
|
|
24
28
|
var prefix = (0, KeyBuilder_1.validatePrefix)(options.prefix);
|
|
25
29
|
function InRedisStorageFactory(params) {
|
|
30
|
+
if (!RD)
|
|
31
|
+
throw new Error('The SDK Redis storage is unavailable. Make sure your runtime environment supports CommonJS (`require`) so the `ioredis` dependency can be imported.');
|
|
26
32
|
var onReadyCb = params.onReadyCb, settings = params.settings, _a = params.settings, log = _a.log, impressionsMode = _a.sync.impressionsMode;
|
|
27
33
|
var metadata = (0, utils_1.metadataBuilder)(settings);
|
|
28
34
|
var keys = new KeyBuilderSS_1.KeyBuilderSS(prefix, metadata);
|
|
@@ -30,7 +36,7 @@ function InRedisStorage(options) {
|
|
|
30
36
|
var telemetry = new TelemetryCacheInRedis_1.TelemetryCacheInRedis(log, keys, redisClient);
|
|
31
37
|
var impressionCountsCache = impressionsMode !== constants_1.DEBUG ? new ImpressionCountsCacheInRedis_1.ImpressionCountsCacheInRedis(log, keys.buildImpressionsCountKey(), redisClient) : undefined;
|
|
32
38
|
var uniqueKeysCache = impressionsMode === constants_1.NONE ? new UniqueKeysCacheInRedis_1.UniqueKeysCacheInRedis(log, keys.buildUniqueKeysKey(), redisClient) : undefined;
|
|
33
|
-
//
|
|
39
|
+
// Subscription to Redis connect event in order to emit SDK_READY event on consumer mode
|
|
34
40
|
redisClient.on('connect', function () {
|
|
35
41
|
onReadyCb();
|
|
36
42
|
if (impressionCountsCache)
|
|
@@ -15,19 +15,32 @@ var SegmentsCachePluggable = /** @class */ (function () {
|
|
|
15
15
|
this.wrapper = wrapper;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
* The returned promise is resolved
|
|
20
|
-
* or rejected if
|
|
18
|
+
* Add a list of `segmentKeys` to the given segment `name`.
|
|
19
|
+
* The returned promise is resolved when the operation success
|
|
20
|
+
* or rejected if wrapper operation fails.
|
|
21
21
|
*/
|
|
22
|
-
SegmentsCachePluggable.prototype.
|
|
22
|
+
SegmentsCachePluggable.prototype.addToSegment = function (name, segmentKeys) {
|
|
23
23
|
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
if (segmentKeys.length) {
|
|
25
|
+
return this.wrapper.addItems(segmentKey, segmentKeys);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return Promise.resolve();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Remove a list of `segmentKeys` from the given segment `name`.
|
|
33
|
+
* The returned promise is resolved when the operation success
|
|
34
|
+
* or rejected if wrapper operation fails.
|
|
35
|
+
*/
|
|
36
|
+
SegmentsCachePluggable.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
37
|
+
var segmentKey = this.keys.buildSegmentNameKey(name);
|
|
38
|
+
if (segmentKeys.length) {
|
|
39
|
+
return this.wrapper.removeItems(segmentKey, segmentKeys);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return Promise.resolve();
|
|
43
|
+
}
|
|
31
44
|
};
|
|
32
45
|
/**
|
|
33
46
|
* Returns a promise that resolves with a boolean value indicating if `key` is part of `name` segment.
|
|
@@ -36,6 +49,14 @@ var SegmentsCachePluggable = /** @class */ (function () {
|
|
|
36
49
|
SegmentsCachePluggable.prototype.isInSegment = function (name, key) {
|
|
37
50
|
return this.wrapper.itemContains(this.keys.buildSegmentNameKey(name), key);
|
|
38
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Set till number for the given segment `name`.
|
|
54
|
+
* The returned promise is resolved when the operation success,
|
|
55
|
+
* or rejected if it fails (e.g., wrapper operation fails).
|
|
56
|
+
*/
|
|
57
|
+
SegmentsCachePluggable.prototype.setChangeNumber = function (name, changeNumber) {
|
|
58
|
+
return this.wrapper.set(this.keys.buildSegmentTillKey(name), changeNumber + '');
|
|
59
|
+
};
|
|
39
60
|
/**
|
|
40
61
|
* Get till number or -1 if it's not defined.
|
|
41
62
|
* The returned promise is resolved with the changeNumber or -1 if it doesn't exist or a wrapper operation fails.
|
|
@@ -45,10 +66,10 @@ var SegmentsCachePluggable = /** @class */ (function () {
|
|
|
45
66
|
var _this = this;
|
|
46
67
|
return this.wrapper.get(this.keys.buildSegmentTillKey(name)).then(function (value) {
|
|
47
68
|
var i = parseInt(value, 10);
|
|
48
|
-
return (0, lang_1.isNaNNumber)(i) ?
|
|
69
|
+
return (0, lang_1.isNaNNumber)(i) ? undefined : i;
|
|
49
70
|
}).catch(function (e) {
|
|
50
71
|
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from segments storage. Error: ' + e);
|
|
51
|
-
return
|
|
72
|
+
return undefined;
|
|
52
73
|
});
|
|
53
74
|
};
|
|
54
75
|
/**
|
|
@@ -8,7 +8,7 @@ var sets_1 = require("../../utils/lang/sets");
|
|
|
8
8
|
* The `_cache` property is the object were items are stored.
|
|
9
9
|
* Intended for testing purposes.
|
|
10
10
|
*
|
|
11
|
-
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves
|
|
11
|
+
* @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
|
|
12
12
|
*/
|
|
13
13
|
function inMemoryWrapperFactory(connDelay) {
|
|
14
14
|
var _cache = {};
|
|
@@ -19,30 +19,23 @@ function syncManagerOfflineFactory(splitsParserFactory) {
|
|
|
19
19
|
*/
|
|
20
20
|
return function (_a) {
|
|
21
21
|
var settings = _a.settings, readiness = _a.readiness, storage = _a.storage;
|
|
22
|
-
|
|
23
|
-
var mainStart = mainSyncManager.start;
|
|
24
|
-
var sharedStarts = [];
|
|
25
|
-
return (0, objectAssign_1.objectAssign)(mainSyncManager, {
|
|
26
|
-
start: function () {
|
|
27
|
-
mainStart();
|
|
28
|
-
sharedStarts.forEach(function (cb) { return cb(); });
|
|
29
|
-
sharedStarts.length = 0;
|
|
30
|
-
},
|
|
22
|
+
return (0, objectAssign_1.objectAssign)((0, fromObjectSyncTask_1.fromObjectSyncTaskFactory)(splitsParserFactory(), storage, readiness, settings), {
|
|
31
23
|
// fake flush, that resolves immediately
|
|
32
24
|
flush: flush,
|
|
33
25
|
// [Only used for client-side]
|
|
34
26
|
shared: function (matchingKey, readinessManager) {
|
|
35
|
-
// In LOCALHOST mode, shared clients are ready in the next event-loop cycle than created
|
|
36
|
-
// SDK_READY cannot be emitted directly because this will not update the readiness status
|
|
37
|
-
function emitSdkReady() {
|
|
38
|
-
readinessManager.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); // SDK_SPLITS_ARRIVED emitted by main SyncManager
|
|
39
|
-
}
|
|
40
|
-
if (mainSyncManager.isRunning())
|
|
41
|
-
setTimeout(emitSdkReady);
|
|
42
|
-
else
|
|
43
|
-
sharedStarts.push(emitSdkReady);
|
|
44
27
|
return {
|
|
28
|
+
start: function () {
|
|
29
|
+
// In LOCALHOST mode, shared clients are ready in the next event-loop cycle than created
|
|
30
|
+
// SDK_READY cannot be emitted directly because this will not update the readiness status
|
|
31
|
+
setTimeout(function () {
|
|
32
|
+
readinessManager.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); // SDK_SPLITS_ARRIVED emitted by main SyncManager
|
|
33
|
+
}, 0);
|
|
34
|
+
},
|
|
45
35
|
stop: function () { },
|
|
36
|
+
isRunning: function () {
|
|
37
|
+
return true;
|
|
38
|
+
},
|
|
46
39
|
flush: flush,
|
|
47
40
|
};
|
|
48
41
|
}
|
|
@@ -5,14 +5,17 @@ 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(
|
|
9
|
-
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
10
|
-
// Optional decorator for `
|
|
8
|
+
function mySegmentsFetcherFactory(fetchMySegments) {
|
|
9
|
+
return function mySegmentsFetcher(userMatchingKey, noCache,
|
|
10
|
+
// Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
|
|
11
11
|
decorator) {
|
|
12
|
-
var mySegmentsPromise =
|
|
12
|
+
var mySegmentsPromise = fetchMySegments(userMatchingKey, noCache);
|
|
13
13
|
if (decorator)
|
|
14
14
|
mySegmentsPromise = decorator(mySegmentsPromise);
|
|
15
|
-
|
|
15
|
+
// Extract segment names
|
|
16
|
+
return mySegmentsPromise
|
|
17
|
+
.then(function (resp) { return resp.json(); })
|
|
18
|
+
.then(function (json) { return json.mySegments.map(function (segment) { return segment.name; }); });
|
|
16
19
|
};
|
|
17
20
|
}
|
|
18
21
|
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 `fetchMySegments` promise, such as timeout or time tracker
|
|
27
27
|
decorator) {
|
|
28
28
|
var segmentsPromise = greedyFetch(fetchSegmentChanges, since, segmentName, noCache, till);
|
|
29
29
|
if (decorator)
|
|
@@ -46,7 +46,7 @@ function pollingManagerCSFactory(params) {
|
|
|
46
46
|
}
|
|
47
47
|
});
|
|
48
48
|
function add(matchingKey, readiness, storage) {
|
|
49
|
-
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.
|
|
49
|
+
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMySegments, storage, readiness, settings, matchingKey);
|
|
50
50
|
// smart ready
|
|
51
51
|
function smartReady() {
|
|
52
52
|
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
@@ -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(fetchMySegments, storage, readiness, settings, matchingKey) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMySegments), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
|
|
12
12
|
}
|
|
13
13
|
exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
|
|
@@ -4,15 +4,13 @@ exports.mySegmentsUpdaterFactory = void 0;
|
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
|
-
var constants_3 = require("../../streaming/constants");
|
|
8
7
|
/**
|
|
9
8
|
* factory of MySegments updater, a task that:
|
|
10
9
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
11
10
|
* - updates `mySegmentsCache`
|
|
12
11
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
13
12
|
*/
|
|
14
|
-
function mySegmentsUpdaterFactory(log, mySegmentsFetcher,
|
|
15
|
-
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
13
|
+
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
16
14
|
var readyOnAlreadyExistentState = true;
|
|
17
15
|
var startingUp = true;
|
|
18
16
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -24,27 +22,36 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
24
22
|
// @TODO if allowing pluggable storages, handle async execution
|
|
25
23
|
function updateSegments(segmentsData) {
|
|
26
24
|
var shouldNotifyUpdate;
|
|
27
|
-
if (segmentsData
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
segments.resetSegments(segmentsData);
|
|
25
|
+
if (Array.isArray(segmentsData)) {
|
|
26
|
+
// Update the list of segment names available
|
|
27
|
+
shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
|
|
31
28
|
}
|
|
32
29
|
else {
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
// Add/Delete the segment
|
|
31
|
+
var name_1 = segmentsData.name, add = segmentsData.add;
|
|
32
|
+
if (mySegmentsCache.isInSegment(name_1) !== add) {
|
|
33
|
+
shouldNotifyUpdate = true;
|
|
34
|
+
if (add)
|
|
35
|
+
mySegmentsCache.addToSegment(name_1);
|
|
36
|
+
else
|
|
37
|
+
mySegmentsCache.removeFromSegment(name_1);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
shouldNotifyUpdate = false;
|
|
41
|
+
}
|
|
35
42
|
}
|
|
36
43
|
// Notify update if required
|
|
37
|
-
if (
|
|
44
|
+
if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
38
45
|
readyOnAlreadyExistentState = false;
|
|
39
46
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
|
-
function _mySegmentsUpdater(retry, segmentsData, noCache
|
|
49
|
+
function _mySegmentsUpdater(retry, segmentsData, noCache) {
|
|
43
50
|
var updaterPromise = segmentsData ?
|
|
44
51
|
// If segmentsData is provided, there is no need to fetch mySegments
|
|
45
52
|
new Promise(function (res) { updateSegments(segmentsData); res(true); }) :
|
|
46
53
|
// If not provided, fetch mySegments
|
|
47
|
-
mySegmentsFetcher(matchingKey, noCache,
|
|
54
|
+
mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(function (segments) {
|
|
48
55
|
// Only when we have downloaded segments completely, we should not keep retrying anymore
|
|
49
56
|
startingUp = false;
|
|
50
57
|
updateSegments(segments);
|
|
@@ -71,10 +78,9 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
71
78
|
* (2) an object with a segment name and action (true: add, or false: delete) to update the storage,
|
|
72
79
|
* (3) or `undefined`, for which the updater will fetch mySegments in order to sync the storage.
|
|
73
80
|
* @param {boolean | undefined} noCache true to revalidate data to fetch
|
|
74
|
-
* @param {boolean | undefined} till query param to bypass CDN requests
|
|
75
81
|
*/
|
|
76
|
-
return function mySegmentsUpdater(segmentsData, noCache
|
|
77
|
-
return _mySegmentsUpdater(0, segmentsData, noCache
|
|
82
|
+
return function mySegmentsUpdater(segmentsData, noCache) {
|
|
83
|
+
return _mySegmentsUpdater(0, segmentsData, noCache);
|
|
78
84
|
};
|
|
79
85
|
}
|
|
80
86
|
exports.mySegmentsUpdaterFactory = mySegmentsUpdaterFactory;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.segmentChangesUpdaterFactory = void 0;
|
|
4
|
+
var lang_1 = require("../../../utils/lang");
|
|
4
5
|
var constants_1 = require("../../../readiness/constants");
|
|
5
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
|
+
var thenable_1 = require("../../../utils/promise/thenable");
|
|
6
8
|
/**
|
|
7
9
|
* Factory of SegmentChanges updater, a task that:
|
|
8
10
|
* - fetches segment changes using `segmentChangesFetcher`
|
|
@@ -21,16 +23,27 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
21
23
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
22
24
|
return sincePromise.then(function (since) {
|
|
23
25
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
if (fetchOnlyNew && since !== undefined)
|
|
27
|
+
return -1;
|
|
28
|
+
return segmentChangesFetcher(since || -1, segmentName, noCache, till).then(function (changes) {
|
|
29
|
+
var changeNumber = -1;
|
|
30
|
+
var results = [];
|
|
31
|
+
changes.forEach(function (x) {
|
|
32
|
+
if (x.added.length > 0)
|
|
33
|
+
results.push(segments.addToSegment(segmentName, x.added));
|
|
34
|
+
if (x.removed.length > 0)
|
|
35
|
+
results.push(segments.removeFromSegment(segmentName, x.removed));
|
|
36
|
+
if (x.added.length > 0 || x.removed.length > 0) {
|
|
37
|
+
results.push(segments.setChangeNumber(segmentName, x.till));
|
|
38
|
+
changeNumber = x.till;
|
|
39
|
+
}
|
|
40
|
+
log.debug(constants_2.LOG_PREFIX_SYNC_SEGMENTS + "Processed " + segmentName + " with till = " + x.till + ". Added: " + x.added.length + ". Removed: " + x.removed.length);
|
|
33
41
|
});
|
|
42
|
+
// If at least one storage operation result is a promise, join all in a single promise.
|
|
43
|
+
if (results.some(function (result) { return (0, thenable_1.thenable)(result); }))
|
|
44
|
+
return Promise.all(results).then(function () { return changeNumber; });
|
|
45
|
+
return changeNumber;
|
|
46
|
+
});
|
|
34
47
|
});
|
|
35
48
|
}
|
|
36
49
|
/**
|
|
@@ -49,11 +62,14 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
49
62
|
// If not a segment name provided, read list of available segments names to be updated.
|
|
50
63
|
var segmentsPromise = Promise.resolve(segmentName ? [segmentName] : segments.getRegisteredSegments());
|
|
51
64
|
return segmentsPromise.then(function (segmentNames) {
|
|
52
|
-
// Async fetchers
|
|
53
|
-
var updaters =
|
|
65
|
+
// Async fetchers are collected here.
|
|
66
|
+
var updaters = [];
|
|
67
|
+
for (var index = 0; index < segmentNames.length; index++) {
|
|
68
|
+
updaters.push(updateSegment(segmentNames[index], noCache, till, fetchOnlyNew));
|
|
69
|
+
}
|
|
54
70
|
return Promise.all(updaters).then(function (shouldUpdateFlags) {
|
|
55
71
|
// if at least one segment fetch succeeded, mark segments ready
|
|
56
|
-
if (
|
|
72
|
+
if ((0, lang_1.findIndex)(shouldUpdateFlags, function (v) { return v !== -1; }) !== -1 || readyOnAlreadyExistentState) {
|
|
57
73
|
readyOnAlreadyExistentState = false;
|
|
58
74
|
if (readiness)
|
|
59
75
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
@@ -14,7 +14,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
14
14
|
var registeredSegments = Promise.resolve(segments.getRegisteredSegments());
|
|
15
15
|
return registeredSegments.then(function (segmentNames) {
|
|
16
16
|
return Promise.all(segmentNames.map(function (segmentName) { return segments.getChangeNumber(segmentName); }))
|
|
17
|
-
.then(function (changeNumbers) { return changeNumbers.every(function (changeNumber) { return changeNumber !==
|
|
17
|
+
.then(function (changeNumbers) { return changeNumbers.every(function (changeNumber) { return changeNumber !== undefined; }); });
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -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 MY_SEGMENTS_CHANGES. It is undefined for server-side API.
|
|
17
17
|
*/
|
|
18
18
|
return function authenticate(userKeys) {
|
|
19
19
|
return fetchAuth(userKeys)
|
|
@@ -68,18 +68,20 @@ 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.MEMBERSHIPS_LS_UPDATE:
|
|
78
|
+
case constants_1.MY_SEGMENTS_UPDATE_V2:
|
|
80
79
|
case constants_1.SPLIT_KILL:
|
|
81
80
|
pushEmitter.emit(parsedData.type, parsedData);
|
|
82
81
|
break;
|
|
82
|
+
case constants_1.MY_SEGMENTS_UPDATE:
|
|
83
|
+
pushEmitter.emit(parsedData.type, parsedData, channel);
|
|
84
|
+
break;
|
|
83
85
|
/* occupancy & control events, handled by NotificationManagerKeeper */
|
|
84
86
|
case constants_1.OCCUPANCY:
|
|
85
87
|
notificationKeeper.handleOccupancyEvent(parsedData.metrics.publishers, channel, timestamp);
|