@splitsoftware/splitio-commons 2.1.1-rc.0 → 2.1.1-rc.2
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 +7 -0
- package/README.md +0 -1
- package/cjs/evaluator/combiners/and.js +6 -2
- package/cjs/evaluator/combiners/ifelseif.js +6 -6
- package/cjs/evaluator/condition/index.js +5 -6
- package/cjs/evaluator/index.js +7 -7
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +0 -4
- package/cjs/evaluator/parser/index.js +2 -2
- package/cjs/evaluator/value/sanitize.js +0 -1
- package/cjs/logger/constants.js +3 -4
- package/cjs/logger/messages/debug.js +2 -3
- package/cjs/logger/messages/error.js +1 -1
- package/cjs/logger/messages/warn.js +2 -2
- package/cjs/readiness/readinessManager.js +6 -0
- package/cjs/sdkClient/client.js +29 -19
- package/cjs/sdkClient/clientAttributesDecoration.js +19 -25
- package/cjs/sdkClient/clientInputValidation.js +28 -26
- package/cjs/services/splitApi.js +2 -2
- package/cjs/storages/AbstractSplitsCacheAsync.js +0 -7
- package/cjs/storages/AbstractSplitsCacheSync.js +2 -12
- package/cjs/storages/KeyBuilder.js +0 -9
- package/cjs/storages/KeyBuilderCS.js +4 -4
- package/cjs/storages/KeyBuilderSS.js +0 -3
- package/cjs/storages/dataLoader.js +3 -2
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +23 -76
- package/cjs/storages/inLocalStorage/index.js +5 -7
- package/cjs/storages/inLocalStorage/validateCache.js +79 -0
- package/cjs/storages/inMemory/InMemoryStorage.js +0 -3
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/cjs/storages/inRedis/index.js +0 -2
- package/cjs/storages/pluggable/index.js +2 -3
- package/cjs/storages/utils.js +1 -0
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +3 -2
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +2 -2
- package/cjs/sync/polling/pollingManagerCS.js +7 -7
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +33 -60
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +77 -106
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/pushManager.js +16 -3
- package/cjs/sync/submitters/impressionsSubmitter.js +3 -2
- package/cjs/sync/syncManagerOnline.js +10 -5
- package/cjs/trackers/strategy/strategyDebug.js +2 -0
- package/cjs/trackers/strategy/strategyOptimized.js +3 -0
- package/cjs/utils/constants/index.js +2 -3
- package/cjs/utils/inputValidation/eventProperties.js +12 -1
- package/cjs/utils/inputValidation/index.js +3 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +1 -1
- package/esm/evaluator/combiners/and.js +6 -2
- package/esm/evaluator/combiners/ifelseif.js +7 -7
- package/esm/evaluator/condition/index.js +5 -6
- package/esm/evaluator/index.js +7 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +0 -4
- package/esm/evaluator/parser/index.js +2 -2
- package/esm/evaluator/value/sanitize.js +0 -1
- package/esm/logger/constants.js +0 -1
- package/esm/logger/messages/debug.js +2 -3
- package/esm/logger/messages/error.js +1 -1
- package/esm/logger/messages/warn.js +2 -2
- package/esm/readiness/readinessManager.js +6 -0
- package/esm/sdkClient/client.js +29 -19
- package/esm/sdkClient/clientAttributesDecoration.js +19 -25
- package/esm/sdkClient/clientInputValidation.js +29 -27
- package/esm/services/splitApi.js +2 -2
- package/esm/storages/AbstractSplitsCacheAsync.js +0 -7
- package/esm/storages/AbstractSplitsCacheSync.js +2 -12
- package/esm/storages/KeyBuilder.js +0 -9
- package/esm/storages/KeyBuilderCS.js +4 -4
- package/esm/storages/KeyBuilderSS.js +0 -3
- package/esm/storages/dataLoader.js +2 -1
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +23 -76
- package/esm/storages/inLocalStorage/index.js +5 -7
- package/esm/storages/inLocalStorage/validateCache.js +75 -0
- package/esm/storages/inMemory/InMemoryStorage.js +0 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/esm/storages/inRedis/index.js +0 -2
- package/esm/storages/pluggable/index.js +2 -3
- package/esm/storages/utils.js +1 -0
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +3 -2
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +2 -2
- package/esm/sync/polling/pollingManagerCS.js +7 -7
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/esm/sync/polling/updaters/splitChangesUpdater.js +34 -61
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +73 -102
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/pushManager.js +19 -6
- package/esm/sync/submitters/impressionsSubmitter.js +3 -2
- package/esm/sync/syncManagerOnline.js +10 -5
- package/esm/trackers/strategy/strategyDebug.js +2 -0
- package/esm/trackers/strategy/strategyOptimized.js +3 -0
- package/esm/utils/constants/index.js +1 -2
- package/esm/utils/inputValidation/eventProperties.js +10 -0
- package/esm/utils/inputValidation/index.js +1 -0
- package/esm/utils/settingsValidation/storage/storageCS.js +1 -1
- package/package.json +1 -1
- package/src/dtos/types.ts +8 -32
- package/src/evaluator/Engine.ts +1 -1
- package/src/evaluator/combiners/and.ts +4 -5
- package/src/evaluator/combiners/ifelseif.ts +9 -7
- package/src/evaluator/condition/engineUtils.ts +1 -1
- package/src/evaluator/condition/index.ts +12 -12
- package/src/evaluator/index.ts +7 -7
- package/src/evaluator/matchers/index.ts +1 -3
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +0 -3
- package/src/evaluator/parser/index.ts +3 -3
- package/src/evaluator/types.ts +2 -2
- package/src/evaluator/value/index.ts +2 -2
- package/src/evaluator/value/sanitize.ts +4 -5
- package/src/logger/constants.ts +0 -1
- package/src/logger/messages/debug.ts +2 -3
- package/src/logger/messages/error.ts +1 -1
- package/src/logger/messages/warn.ts +2 -2
- package/src/readiness/readinessManager.ts +5 -0
- package/src/sdkClient/client.ts +31 -21
- package/src/sdkClient/clientAttributesDecoration.ts +20 -27
- package/src/sdkClient/clientInputValidation.ts +30 -27
- package/src/sdkManager/index.ts +1 -1
- package/src/services/splitApi.ts +2 -2
- package/src/services/types.ts +1 -1
- package/src/storages/AbstractSplitsCacheAsync.ts +0 -8
- package/src/storages/AbstractSplitsCacheSync.ts +3 -14
- package/src/storages/KeyBuilder.ts +0 -12
- package/src/storages/KeyBuilderCS.ts +5 -5
- package/src/storages/KeyBuilderSS.ts +0 -4
- package/src/storages/dataLoader.ts +3 -1
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +26 -87
- package/src/storages/inLocalStorage/index.ts +8 -12
- package/src/storages/inLocalStorage/validateCache.ts +91 -0
- package/src/storages/inMemory/InMemoryStorage.ts +0 -3
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -4
- package/src/storages/inRedis/index.ts +0 -2
- package/src/storages/pluggable/index.ts +2 -3
- package/src/storages/types.ts +2 -37
- package/src/storages/utils.ts +1 -0
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +6 -5
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +1 -2
- package/src/sync/polling/fetchers/types.ts +0 -1
- package/src/sync/polling/pollingManagerCS.ts +7 -7
- package/src/sync/polling/types.ts +2 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -2
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/polling/updaters/splitChangesUpdater.ts +43 -71
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +68 -98
- package/src/sync/streaming/constants.ts +0 -1
- package/src/sync/streaming/parseUtils.ts +2 -2
- package/src/sync/streaming/pushManager.ts +18 -6
- package/src/sync/streaming/types.ts +2 -3
- package/src/sync/submitters/impressionsSubmitter.ts +3 -2
- package/src/sync/submitters/types.ts +23 -33
- package/src/sync/syncManagerOnline.ts +11 -5
- package/src/trackers/strategy/strategyDebug.ts +2 -0
- package/src/trackers/strategy/strategyOptimized.ts +3 -0
- package/src/utils/constants/index.ts +1 -2
- package/src/utils/inputValidation/eventProperties.ts +10 -0
- package/src/utils/inputValidation/index.ts +1 -0
- package/src/utils/lang/index.ts +2 -2
- package/src/utils/settingsValidation/storage/storageCS.ts +1 -1
- package/types/splitio.d.ts +128 -36
- package/cjs/evaluator/matchers/rbsegment.js +0 -43
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -117
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +0 -61
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +0 -64
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +0 -64
- package/cjs/utils/constants/browser.js +0 -5
- package/esm/evaluator/matchers/rbsegment.js +0 -39
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -114
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +0 -58
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +0 -61
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +0 -61
- package/esm/utils/constants/browser.js +0 -2
- package/src/evaluator/matchers/rbsegment.ts +0 -61
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +0 -136
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +0 -68
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +0 -79
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +0 -76
- package/src/utils/constants/browser.ts +0 -2
package/cjs/services/splitApi.js
CHANGED
|
@@ -41,8 +41,8 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
41
41
|
}
|
|
42
42
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
|
|
43
43
|
},
|
|
44
|
-
fetchSplitChanges: function (since, noCache, till
|
|
45
|
-
var url = urls.sdk + "/splitChanges?s=" + flagSpecVersion + "&since=" + since + (
|
|
44
|
+
fetchSplitChanges: function (since, noCache, till) {
|
|
45
|
+
var url = urls.sdk + "/splitChanges?s=" + flagSpecVersion + "&since=" + since + (filterQueryString || '') + (till ? '&till=' + till : '');
|
|
46
46
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
|
47
47
|
.catch(function (err) {
|
|
48
48
|
if (err.statusCode === 414)
|
|
@@ -25,13 +25,6 @@ var AbstractSplitsCacheAsync = /** @class */ (function () {
|
|
|
25
25
|
AbstractSplitsCacheAsync.prototype.usesSegments = function () {
|
|
26
26
|
return Promise.resolve(true);
|
|
27
27
|
};
|
|
28
|
-
/**
|
|
29
|
-
* Check if the splits information is already stored in cache.
|
|
30
|
-
* Noop, just keeping the interface. This is used by client-side implementations only.
|
|
31
|
-
*/
|
|
32
|
-
AbstractSplitsCacheAsync.prototype.checkCache = function () {
|
|
33
|
-
return Promise.resolve(false);
|
|
34
|
-
};
|
|
35
28
|
/**
|
|
36
29
|
* Kill `name` split and set `defaultTreatment` and `changeNumber`.
|
|
37
30
|
* Used for SPLIT_KILL push notifications.
|
|
@@ -28,13 +28,6 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
|
|
|
28
28
|
var _this = this;
|
|
29
29
|
return this.getSplitNames().map(function (key) { return _this.getSplit(key); });
|
|
30
30
|
};
|
|
31
|
-
/**
|
|
32
|
-
* Check if the splits information is already stored in cache. This data can be preloaded.
|
|
33
|
-
* It is used as condition to emit SDK_SPLITS_CACHE_LOADED, and then SDK_READY_FROM_CACHE.
|
|
34
|
-
*/
|
|
35
|
-
AbstractSplitsCacheSync.prototype.checkCache = function () {
|
|
36
|
-
return false;
|
|
37
|
-
};
|
|
38
31
|
/**
|
|
39
32
|
* Kill `name` split and set `defaultTreatment` and `changeNumber`.
|
|
40
33
|
* Used for SPLIT_KILL push notifications.
|
|
@@ -60,8 +53,8 @@ exports.AbstractSplitsCacheSync = AbstractSplitsCacheSync;
|
|
|
60
53
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
61
54
|
* This util is intended to simplify the implementation of `splitsCache::usesSegments` method
|
|
62
55
|
*/
|
|
63
|
-
function usesSegments(
|
|
64
|
-
var conditions =
|
|
56
|
+
function usesSegments(split) {
|
|
57
|
+
var conditions = split.conditions || [];
|
|
65
58
|
for (var i = 0; i < conditions.length; i++) {
|
|
66
59
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
67
60
|
for (var j = 0; j < matchers.length; j++) {
|
|
@@ -70,9 +63,6 @@ function usesSegments(ruleEntity) {
|
|
|
70
63
|
return true;
|
|
71
64
|
}
|
|
72
65
|
}
|
|
73
|
-
var excluded = ruleEntity.excluded;
|
|
74
|
-
if (excluded && excluded.segments && excluded.segments.length > 0)
|
|
75
|
-
return true;
|
|
76
66
|
return false;
|
|
77
67
|
}
|
|
78
68
|
exports.usesSegments = usesSegments;
|
|
@@ -28,15 +28,6 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
28
28
|
KeyBuilder.prototype.buildSplitKeyPrefix = function () {
|
|
29
29
|
return this.prefix + ".split.";
|
|
30
30
|
};
|
|
31
|
-
KeyBuilder.prototype.buildRBSegmentKey = function (rbsegmentName) {
|
|
32
|
-
return this.prefix + ".rbsegment." + rbsegmentName;
|
|
33
|
-
};
|
|
34
|
-
KeyBuilder.prototype.buildRBSegmentsTillKey = function () {
|
|
35
|
-
return this.prefix + ".rbsegments.till";
|
|
36
|
-
};
|
|
37
|
-
KeyBuilder.prototype.buildRBSegmentKeyPrefix = function () {
|
|
38
|
-
return this.prefix + ".rbsegment.";
|
|
39
|
-
};
|
|
40
31
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
41
32
|
return this.prefix + ".segment." + segmentName;
|
|
42
33
|
};
|
|
@@ -9,7 +9,7 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
9
9
|
function KeyBuilderCS(prefix, matchingKey) {
|
|
10
10
|
var _this = _super.call(this, prefix) || this;
|
|
11
11
|
_this.matchingKey = matchingKey;
|
|
12
|
-
_this.regexSplitsCacheKey = new RegExp("^" + prefix + "\\.(splits?|trafficType|flagSet
|
|
12
|
+
_this.regexSplitsCacheKey = new RegExp("^" + prefix + "\\.(splits?|trafficType|flagSet)\\.");
|
|
13
13
|
return _this;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
@@ -35,12 +35,12 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
35
35
|
KeyBuilderCS.prototype.isSplitKey = function (key) {
|
|
36
36
|
return (0, lang_1.startsWith)(key, this.prefix + ".split.");
|
|
37
37
|
};
|
|
38
|
-
KeyBuilderCS.prototype.isRBSegmentKey = function (key) {
|
|
39
|
-
return (0, lang_1.startsWith)(key, this.prefix + ".rbsegment.");
|
|
40
|
-
};
|
|
41
38
|
KeyBuilderCS.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
42
39
|
return this.prefix + ".splits.usingSegments";
|
|
43
40
|
};
|
|
41
|
+
KeyBuilderCS.prototype.buildLastClear = function () {
|
|
42
|
+
return this.prefix + ".lastClear";
|
|
43
|
+
};
|
|
44
44
|
return KeyBuilderCS;
|
|
45
45
|
}(KeyBuilder_1.KeyBuilder));
|
|
46
46
|
exports.KeyBuilderCS = KeyBuilderCS;
|
|
@@ -42,9 +42,6 @@ var KeyBuilderSS = /** @class */ (function (_super) {
|
|
|
42
42
|
KeyBuilderSS.prototype.searchPatternForSplitKeys = function () {
|
|
43
43
|
return this.buildSplitKeyPrefix() + "*";
|
|
44
44
|
};
|
|
45
|
-
KeyBuilderSS.prototype.searchPatternForRBSegmentKeys = function () {
|
|
46
|
-
return this.buildRBSegmentKeyPrefix() + "*";
|
|
47
|
-
};
|
|
48
45
|
/* Telemetry keys */
|
|
49
46
|
KeyBuilderSS.prototype.buildLatencyKey = function (method, bucket) {
|
|
50
47
|
return this.latencyPrefix + "::" + this.versionablePrefix + "/" + exports.METHOD_NAMES[method] + "/" + bucket;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.dataLoaderFactory = void 0;
|
|
4
|
-
|
|
4
|
+
// This value might be eventually set via a config parameter
|
|
5
|
+
var DEFAULT_CACHE_EXPIRATION_IN_MILLIS = 864000000; // 10 days
|
|
5
6
|
/**
|
|
6
7
|
* Factory of client-side storage loader
|
|
7
8
|
*
|
|
@@ -25,7 +26,7 @@ function dataLoaderFactory(preloadedData) {
|
|
|
25
26
|
return;
|
|
26
27
|
var _a = preloadedData.lastUpdated, lastUpdated = _a === void 0 ? -1 : _a, _b = preloadedData.segmentsData, segmentsData = _b === void 0 ? {} : _b, _c = preloadedData.since, since = _c === void 0 ? -1 : _c, _d = preloadedData.splitsData, splitsData = _d === void 0 ? {} : _d;
|
|
27
28
|
var storedSince = storage.splits.getChangeNumber();
|
|
28
|
-
var expirationTimestamp = Date.now() -
|
|
29
|
+
var expirationTimestamp = Date.now() - DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
29
30
|
// Do not load data if current localStorage data is more recent,
|
|
30
31
|
// or if its `lastUpdated` timestamp is older than the given `expirationTimestamp`,
|
|
31
32
|
if (storedSince > since || lastUpdated < expirationTimestamp)
|
|
@@ -5,21 +5,17 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
7
|
var constants_1 = require("./constants");
|
|
8
|
-
var KeyBuilder_1 = require("../KeyBuilder");
|
|
9
8
|
var sets_1 = require("../../utils/lang/sets");
|
|
10
9
|
/**
|
|
11
10
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
12
11
|
*/
|
|
13
12
|
var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
14
13
|
(0, tslib_1.__extends)(SplitsCacheInLocal, _super);
|
|
15
|
-
function SplitsCacheInLocal(settings, keys
|
|
14
|
+
function SplitsCacheInLocal(settings, keys) {
|
|
16
15
|
var _this = _super.call(this) || this;
|
|
17
16
|
_this.keys = keys;
|
|
18
17
|
_this.log = settings.log;
|
|
19
|
-
_this.storageHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
20
18
|
_this.flagSetsFilter = settings.sync.__splitFiltersValidation.groupedFilters.bySet;
|
|
21
|
-
_this._checkExpiration(expirationTimestamp);
|
|
22
|
-
_this._checkFilterQuery();
|
|
23
19
|
return _this;
|
|
24
20
|
}
|
|
25
21
|
SplitsCacheInLocal.prototype._decrementCount = function (key) {
|
|
@@ -32,13 +28,11 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
32
28
|
};
|
|
33
29
|
SplitsCacheInLocal.prototype._decrementCounts = function (split) {
|
|
34
30
|
try {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
this._decrementCount(segmentsCountKey);
|
|
41
|
-
}
|
|
31
|
+
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
32
|
+
this._decrementCount(ttKey);
|
|
33
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
|
|
34
|
+
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
35
|
+
this._decrementCount(segmentsCountKey);
|
|
42
36
|
}
|
|
43
37
|
}
|
|
44
38
|
catch (e) {
|
|
@@ -47,13 +41,15 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
47
41
|
};
|
|
48
42
|
SplitsCacheInLocal.prototype._incrementCounts = function (split) {
|
|
49
43
|
try {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
localStorage.setItem(ttKey, (0, lang_1.toNumber)(localStorage.getItem(ttKey)) + 1);
|
|
53
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
|
|
54
|
-
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
44
|
+
if (split) {
|
|
45
|
+
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
55
46
|
// @ts-expect-error
|
|
56
|
-
localStorage.setItem(
|
|
47
|
+
localStorage.setItem(ttKey, (0, lang_1.toNumber)(localStorage.getItem(ttKey)) + 1);
|
|
48
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
|
|
49
|
+
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
50
|
+
// @ts-expect-error
|
|
51
|
+
localStorage.setItem(segmentsCountKey, (0, lang_1.toNumber)(localStorage.getItem(segmentsCountKey)) + 1);
|
|
52
|
+
}
|
|
57
53
|
}
|
|
58
54
|
}
|
|
59
55
|
catch (e) {
|
|
@@ -65,7 +61,6 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
65
61
|
* We cannot simply call `localStorage.clear()` since that implies removing user items from the storage.
|
|
66
62
|
*/
|
|
67
63
|
SplitsCacheInLocal.prototype.clear = function () {
|
|
68
|
-
this.log.info(constants_1.LOG_PREFIX + 'Flushing Splits data from localStorage');
|
|
69
64
|
// collect item keys
|
|
70
65
|
var len = localStorage.length;
|
|
71
66
|
var accum = [];
|
|
@@ -86,11 +81,12 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
86
81
|
var splitKey = this.keys.buildSplitKey(name_1);
|
|
87
82
|
var splitFromLocalStorage = localStorage.getItem(splitKey);
|
|
88
83
|
var previousSplit = splitFromLocalStorage ? JSON.parse(splitFromLocalStorage) : null;
|
|
84
|
+
if (previousSplit) {
|
|
85
|
+
this._decrementCounts(previousSplit);
|
|
86
|
+
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
87
|
+
}
|
|
89
88
|
localStorage.setItem(splitKey, JSON.stringify(split));
|
|
90
89
|
this._incrementCounts(split);
|
|
91
|
-
this._decrementCounts(previousSplit);
|
|
92
|
-
if (previousSplit)
|
|
93
|
-
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
94
90
|
this.addToFlagSets(split);
|
|
95
91
|
return true;
|
|
96
92
|
}
|
|
@@ -106,8 +102,7 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
106
102
|
return false;
|
|
107
103
|
localStorage.removeItem(this.keys.buildSplitKey(name));
|
|
108
104
|
this._decrementCounts(split);
|
|
109
|
-
|
|
110
|
-
this.removeFromFlagSets(split.name, split.sets);
|
|
105
|
+
this.removeFromFlagSets(split.name, split.sets);
|
|
111
106
|
return true;
|
|
112
107
|
}
|
|
113
108
|
catch (e) {
|
|
@@ -120,18 +115,6 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
120
115
|
return item && JSON.parse(item);
|
|
121
116
|
};
|
|
122
117
|
SplitsCacheInLocal.prototype.setChangeNumber = function (changeNumber) {
|
|
123
|
-
// when using a new split query, we must update it at the store
|
|
124
|
-
if (this.updateNewFilter) {
|
|
125
|
-
this.log.info(constants_1.LOG_PREFIX + 'SDK key, flags filter criteria or flags spec version was modified. Updating cache');
|
|
126
|
-
var storageHashKey = this.keys.buildHashKey();
|
|
127
|
-
try {
|
|
128
|
-
localStorage.setItem(storageHashKey, this.storageHash);
|
|
129
|
-
}
|
|
130
|
-
catch (e) {
|
|
131
|
-
this.log.error(constants_1.LOG_PREFIX + e);
|
|
132
|
-
}
|
|
133
|
-
this.updateNewFilter = false;
|
|
134
|
-
}
|
|
135
118
|
try {
|
|
136
119
|
localStorage.setItem(this.keys.buildSplitsTillKey(), changeNumber + '');
|
|
137
120
|
// update "last updated" timestamp with current time
|
|
@@ -175,48 +158,12 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
175
158
|
return true;
|
|
176
159
|
var storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
177
160
|
var splitsWithSegmentsCount = storedCount === null ? 0 : (0, lang_1.toNumber)(storedCount);
|
|
178
|
-
|
|
179
|
-
splitsWithSegmentsCount > 0
|
|
180
|
-
true;
|
|
181
|
-
};
|
|
182
|
-
/**
|
|
183
|
-
* Check if the splits information is already stored in browser LocalStorage.
|
|
184
|
-
* In this function we could add more code to check if the data is valid.
|
|
185
|
-
* @override
|
|
186
|
-
*/
|
|
187
|
-
SplitsCacheInLocal.prototype.checkCache = function () {
|
|
188
|
-
return this.getChangeNumber() > -1;
|
|
189
|
-
};
|
|
190
|
-
/**
|
|
191
|
-
* Clean Splits cache if its `lastUpdated` timestamp is older than the given `expirationTimestamp`,
|
|
192
|
-
*
|
|
193
|
-
* @param expirationTimestamp - if the value is not a number, data will not be cleaned
|
|
194
|
-
*/
|
|
195
|
-
SplitsCacheInLocal.prototype._checkExpiration = function (expirationTimestamp) {
|
|
196
|
-
var value = localStorage.getItem(this.keys.buildLastUpdatedKey());
|
|
197
|
-
if (value !== null) {
|
|
198
|
-
value = parseInt(value, 10);
|
|
199
|
-
if (!(0, lang_1.isNaNNumber)(value) && expirationTimestamp && value < expirationTimestamp)
|
|
200
|
-
this.clear();
|
|
161
|
+
if ((0, lang_1.isFiniteNumber)(splitsWithSegmentsCount)) {
|
|
162
|
+
return splitsWithSegmentsCount > 0;
|
|
201
163
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
SplitsCacheInLocal.prototype._checkFilterQuery = function () {
|
|
205
|
-
var storageHashKey = this.keys.buildHashKey();
|
|
206
|
-
var storageHash = localStorage.getItem(storageHashKey);
|
|
207
|
-
if (storageHash !== this.storageHash) {
|
|
208
|
-
try {
|
|
209
|
-
// mark cache to update the new query filter on first successful splits fetch
|
|
210
|
-
this.updateNewFilter = true;
|
|
211
|
-
// if there is cache, clear it
|
|
212
|
-
if (this.checkCache())
|
|
213
|
-
this.clear();
|
|
214
|
-
}
|
|
215
|
-
catch (e) {
|
|
216
|
-
this.log.error(constants_1.LOG_PREFIX + e);
|
|
217
|
-
}
|
|
164
|
+
else {
|
|
165
|
+
return true;
|
|
218
166
|
}
|
|
219
|
-
// if the filter didn't change, nothing is done
|
|
220
167
|
};
|
|
221
168
|
SplitsCacheInLocal.prototype.getNamesByFlagSets = function (flagSets) {
|
|
222
169
|
var _this = this;
|
|
@@ -9,14 +9,13 @@ var KeyBuilderCS_1 = require("../KeyBuilderCS");
|
|
|
9
9
|
var isLocalStorageAvailable_1 = require("../../utils/env/isLocalStorageAvailable");
|
|
10
10
|
var SplitsCacheInLocal_1 = require("./SplitsCacheInLocal");
|
|
11
11
|
var MySegmentsCacheInLocal_1 = require("./MySegmentsCacheInLocal");
|
|
12
|
-
var browser_1 = require("../../utils/constants/browser");
|
|
13
12
|
var InMemoryStorageCS_1 = require("../inMemory/InMemoryStorageCS");
|
|
14
13
|
var constants_1 = require("./constants");
|
|
15
14
|
var constants_2 = require("../../utils/constants");
|
|
16
15
|
var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
|
|
17
16
|
var UniqueKeysCacheInMemoryCS_1 = require("../inMemory/UniqueKeysCacheInMemoryCS");
|
|
18
17
|
var key_1 = require("../../utils/key");
|
|
19
|
-
var
|
|
18
|
+
var validateCache_1 = require("./validateCache");
|
|
20
19
|
/**
|
|
21
20
|
* InLocal storage factory for standalone client-side SplitFactory
|
|
22
21
|
*/
|
|
@@ -32,14 +31,11 @@ function InLocalStorage(options) {
|
|
|
32
31
|
var settings = params.settings, _a = params.settings, log = _a.log, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize;
|
|
33
32
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
34
33
|
var keys = new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey);
|
|
35
|
-
var
|
|
36
|
-
var splits = new SplitsCacheInLocal_1.SplitsCacheInLocal(settings, keys, expirationTimestamp);
|
|
37
|
-
var rbSegments = new RBSegmentsCacheInLocal_1.RBSegmentsCacheInLocal(settings, keys);
|
|
34
|
+
var splits = new SplitsCacheInLocal_1.SplitsCacheInLocal(settings, keys);
|
|
38
35
|
var segments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, keys);
|
|
39
36
|
var largeSegments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey));
|
|
40
37
|
return {
|
|
41
38
|
splits: splits,
|
|
42
|
-
rbSegments: rbSegments,
|
|
43
39
|
segments: segments,
|
|
44
40
|
largeSegments: largeSegments,
|
|
45
41
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -47,12 +43,14 @@ function InLocalStorage(options) {
|
|
|
47
43
|
events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
|
|
48
44
|
telemetry: (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)(params) ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory(splits, segments) : undefined,
|
|
49
45
|
uniqueKeys: new UniqueKeysCacheInMemoryCS_1.UniqueKeysCacheInMemoryCS(),
|
|
46
|
+
validateCache: function () {
|
|
47
|
+
return (0, validateCache_1.validateCache)(options, settings, keys, splits, segments, largeSegments);
|
|
48
|
+
},
|
|
50
49
|
destroy: function () { },
|
|
51
50
|
// When using shared instantiation with MEMORY we reuse everything but segments (they are customer per key).
|
|
52
51
|
shared: function (matchingKey) {
|
|
53
52
|
return {
|
|
54
53
|
splits: this.splits,
|
|
55
|
-
rbSegments: this.rbSegments,
|
|
56
54
|
segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey)),
|
|
57
55
|
largeSegments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey)),
|
|
58
56
|
impressions: this.impressions,
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateCache = void 0;
|
|
4
|
+
var lang_1 = require("../../utils/lang");
|
|
5
|
+
var KeyBuilder_1 = require("../KeyBuilder");
|
|
6
|
+
var constants_1 = require("./constants");
|
|
7
|
+
var DEFAULT_CACHE_EXPIRATION_IN_DAYS = 10;
|
|
8
|
+
var MILLIS_IN_A_DAY = 86400000;
|
|
9
|
+
/**
|
|
10
|
+
* Validates if cache should be cleared and sets the cache `hash` if needed.
|
|
11
|
+
*
|
|
12
|
+
* @returns `true` if cache should be cleared, `false` otherwise
|
|
13
|
+
*/
|
|
14
|
+
function validateExpiration(options, settings, keys, currentTimestamp, isThereCache) {
|
|
15
|
+
var log = settings.log;
|
|
16
|
+
// Check expiration
|
|
17
|
+
var lastUpdatedTimestamp = parseInt(localStorage.getItem(keys.buildLastUpdatedKey()), 10);
|
|
18
|
+
if (!(0, lang_1.isNaNNumber)(lastUpdatedTimestamp)) {
|
|
19
|
+
var cacheExpirationInDays = (0, lang_1.isFiniteNumber)(options.expirationDays) && options.expirationDays >= 1 ? options.expirationDays : DEFAULT_CACHE_EXPIRATION_IN_DAYS;
|
|
20
|
+
var expirationTimestamp = currentTimestamp - MILLIS_IN_A_DAY * cacheExpirationInDays;
|
|
21
|
+
if (lastUpdatedTimestamp < expirationTimestamp) {
|
|
22
|
+
log.info(constants_1.LOG_PREFIX + 'Cache expired more than ' + cacheExpirationInDays + ' days ago. Cleaning up cache');
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Check hash
|
|
27
|
+
var storageHashKey = keys.buildHashKey();
|
|
28
|
+
var storageHash = localStorage.getItem(storageHashKey);
|
|
29
|
+
var currentStorageHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
30
|
+
if (storageHash !== currentStorageHash) {
|
|
31
|
+
try {
|
|
32
|
+
localStorage.setItem(storageHashKey, currentStorageHash);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
log.error(constants_1.LOG_PREFIX + e);
|
|
36
|
+
}
|
|
37
|
+
if (isThereCache) {
|
|
38
|
+
log.info(constants_1.LOG_PREFIX + 'SDK key, flags filter criteria, or flags spec version has changed. Cleaning up cache');
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false; // No cache to clear
|
|
42
|
+
}
|
|
43
|
+
// Clear on init
|
|
44
|
+
if (options.clearOnInit) {
|
|
45
|
+
var lastClearTimestamp = parseInt(localStorage.getItem(keys.buildLastClear()), 10);
|
|
46
|
+
if ((0, lang_1.isNaNNumber)(lastClearTimestamp) || lastClearTimestamp < currentTimestamp - MILLIS_IN_A_DAY) {
|
|
47
|
+
log.info(constants_1.LOG_PREFIX + 'clearOnInit was set and cache was not cleared in the last 24 hours. Cleaning up cache');
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clean cache if:
|
|
54
|
+
* - it has expired, i.e., its `lastUpdated` timestamp is older than the given `expirationTimestamp`
|
|
55
|
+
* - its hash has changed, i.e., the SDK key, flags filter criteria or flags spec version was modified
|
|
56
|
+
* - `clearOnInit` was set and cache was not cleared in the last 24 hours
|
|
57
|
+
*
|
|
58
|
+
* @returns `true` if cache is ready to be used, `false` otherwise (cache was cleared or there is no cache)
|
|
59
|
+
*/
|
|
60
|
+
function validateCache(options, settings, keys, splits, segments, largeSegments) {
|
|
61
|
+
var currentTimestamp = Date.now();
|
|
62
|
+
var isThereCache = splits.getChangeNumber() > -1;
|
|
63
|
+
if (validateExpiration(options, settings, keys, currentTimestamp, isThereCache)) {
|
|
64
|
+
splits.clear();
|
|
65
|
+
segments.clear();
|
|
66
|
+
largeSegments.clear();
|
|
67
|
+
// Update last clear timestamp
|
|
68
|
+
try {
|
|
69
|
+
localStorage.setItem(keys.buildLastClear(), currentTimestamp + '');
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
settings.log.error(constants_1.LOG_PREFIX + e);
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// Check if ready from cache
|
|
77
|
+
return isThereCache;
|
|
78
|
+
}
|
|
79
|
+
exports.validateCache = validateCache;
|
|
@@ -9,7 +9,6 @@ var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory")
|
|
|
9
9
|
var constants_1 = require("../../utils/constants");
|
|
10
10
|
var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
|
|
11
11
|
var UniqueKeysCacheInMemory_1 = require("./UniqueKeysCacheInMemory");
|
|
12
|
-
var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
13
12
|
/**
|
|
14
13
|
* InMemory storage factory for standalone server-side SplitFactory
|
|
15
14
|
*
|
|
@@ -18,11 +17,9 @@ var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
|
18
17
|
function InMemoryStorageFactory(params) {
|
|
19
18
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
20
19
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
21
|
-
var rbSegments = new RBSegmentsCacheInMemory_1.RBSegmentsCacheInMemory();
|
|
22
20
|
var segments = new SegmentsCacheInMemory_1.SegmentsCacheInMemory();
|
|
23
21
|
var storage = {
|
|
24
22
|
splits: splits,
|
|
25
|
-
rbSegments: rbSegments,
|
|
26
23
|
segments: segments,
|
|
27
24
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
28
25
|
impressionCounts: new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory(),
|
|
@@ -9,7 +9,6 @@ var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory")
|
|
|
9
9
|
var constants_1 = require("../../utils/constants");
|
|
10
10
|
var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
|
|
11
11
|
var UniqueKeysCacheInMemoryCS_1 = require("./UniqueKeysCacheInMemoryCS");
|
|
12
|
-
var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
13
12
|
/**
|
|
14
13
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
15
14
|
*
|
|
@@ -18,12 +17,10 @@ var RBSegmentsCacheInMemory_1 = require("./RBSegmentsCacheInMemory");
|
|
|
18
17
|
function InMemoryStorageCSFactory(params) {
|
|
19
18
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
20
19
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
21
|
-
var rbSegments = new RBSegmentsCacheInMemory_1.RBSegmentsCacheInMemory();
|
|
22
20
|
var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
23
21
|
var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
24
22
|
var storage = {
|
|
25
23
|
splits: splits,
|
|
26
|
-
rbSegments: rbSegments,
|
|
27
24
|
segments: segments,
|
|
28
25
|
largeSegments: largeSegments,
|
|
29
26
|
impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -36,7 +33,6 @@ function InMemoryStorageCSFactory(params) {
|
|
|
36
33
|
shared: function () {
|
|
37
34
|
return {
|
|
38
35
|
splits: this.splits,
|
|
39
|
-
rbSegments: this.rbSegments,
|
|
40
36
|
segments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
41
37
|
largeSegments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
42
38
|
impressions: this.impressions,
|
|
@@ -12,7 +12,6 @@ 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 RBSegmentsCacheInRedis_1 = require("./RBSegmentsCacheInRedis");
|
|
16
15
|
/**
|
|
17
16
|
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.js
|
|
18
17
|
* @see {@link https://www.npmjs.com/package/ioredis}
|
|
@@ -41,7 +40,6 @@ function InRedisStorage(options) {
|
|
|
41
40
|
});
|
|
42
41
|
return {
|
|
43
42
|
splits: new SplitsCacheInRedis_1.SplitsCacheInRedis(log, keys, redisClient, settings.sync.__splitFiltersValidation),
|
|
44
|
-
rbSegments: new RBSegmentsCacheInRedis_1.RBSegmentsCacheInRedis(log, keys, redisClient),
|
|
45
43
|
segments: new SegmentsCacheInRedis_1.SegmentsCacheInRedis(log, keys, redisClient),
|
|
46
44
|
impressions: new ImpressionsCacheInRedis_1.ImpressionsCacheInRedis(log, keys.buildImpressionsKey(), redisClient, metadata),
|
|
47
45
|
impressionCounts: impressionCountsCache,
|
|
@@ -22,7 +22,6 @@ var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
|
22
22
|
var UniqueKeysCacheInMemoryCS_1 = require("../inMemory/UniqueKeysCacheInMemoryCS");
|
|
23
23
|
var utils_1 = require("../utils");
|
|
24
24
|
var constants_2 = require("../pluggable/constants");
|
|
25
|
-
var RBSegmentsCachePluggable_1 = require("./RBSegmentsCachePluggable");
|
|
26
25
|
var NO_VALID_WRAPPER = 'Expecting pluggable storage `wrapper` in options, but no valid wrapper instance was provided.';
|
|
27
26
|
var NO_VALID_WRAPPER_INTERFACE = 'The provided wrapper instance doesn’t follow the expected interface. Check our docs.';
|
|
28
27
|
/**
|
|
@@ -75,7 +74,8 @@ function PluggableStorage(options) {
|
|
|
75
74
|
// Connects to wrapper and emits SDK_READY event on main client
|
|
76
75
|
var connectPromise = wrapper.connect().then(function () {
|
|
77
76
|
if (isSynchronizer) {
|
|
78
|
-
//
|
|
77
|
+
// @TODO reuse InLocalStorage::validateCache logic
|
|
78
|
+
// In standalone or producer mode, clear storage if SDK key, flags filter criteria or flags spec version was modified
|
|
79
79
|
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
80
80
|
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
81
81
|
if (hash !== currentHash) {
|
|
@@ -105,7 +105,6 @@ function PluggableStorage(options) {
|
|
|
105
105
|
});
|
|
106
106
|
return {
|
|
107
107
|
splits: new SplitsCachePluggable_1.SplitsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
108
|
-
rbSegments: new RBSegmentsCachePluggable_1.RBSegmentsCachePluggable(log, keys, wrapper),
|
|
109
108
|
segments: new SegmentsCachePluggable_1.SegmentsCachePluggable(log, keys, wrapper),
|
|
110
109
|
impressions: isPartialConsumer ? new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize) : new ImpressionsCachePluggable_1.ImpressionsCachePluggable(log, keys.buildImpressionsKey(), wrapper, metadata),
|
|
111
110
|
impressionCounts: impressionCountsCache,
|
package/cjs/storages/utils.js
CHANGED
|
@@ -45,9 +45,10 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
45
45
|
readiness.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
|
|
46
46
|
if (startingUp) {
|
|
47
47
|
startingUp = false;
|
|
48
|
-
|
|
48
|
+
var isCacheLoaded_1 = storage.validateCache ? storage.validateCache() : false;
|
|
49
|
+
Promise.resolve().then(function () {
|
|
49
50
|
// Emits SDK_READY_FROM_CACHE
|
|
50
|
-
if (
|
|
51
|
+
if (isCacheLoaded_1)
|
|
51
52
|
readiness.splits.emit(constants_2.SDK_SPLITS_CACHE_LOADED);
|
|
52
53
|
// Emits SDK_READY
|
|
53
54
|
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
|
|
@@ -6,10 +6,10 @@ exports.splitChangesFetcherFactory = void 0;
|
|
|
6
6
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
7
7
|
*/
|
|
8
8
|
function splitChangesFetcherFactory(fetchSplitChanges) {
|
|
9
|
-
return function splitChangesFetcher(since, noCache, till,
|
|
9
|
+
return function splitChangesFetcher(since, noCache, till,
|
|
10
10
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
11
11
|
decorator) {
|
|
12
|
-
var splitsPromise = fetchSplitChanges(since, noCache, till
|
|
12
|
+
var splitsPromise = fetchSplitChanges(since, noCache, till);
|
|
13
13
|
if (decorator)
|
|
14
14
|
splitsPromise = decorator(splitsPromise);
|
|
15
15
|
return splitsPromise.then(function (resp) { return resp.json(); });
|
|
@@ -34,10 +34,10 @@ function pollingManagerCSFactory(params) {
|
|
|
34
34
|
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
35
35
|
if (!splitsSyncTask.isRunning())
|
|
36
36
|
return; // noop if not doing polling
|
|
37
|
-
var
|
|
38
|
-
if (
|
|
39
|
-
log.info(constants_2.POLLING_SMART_PAUSING, [
|
|
40
|
-
if (
|
|
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
41
|
startMySegmentsSyncTasks();
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
@@ -49,10 +49,10 @@ function pollingManagerCSFactory(params) {
|
|
|
49
49
|
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
50
50
|
// smart ready
|
|
51
51
|
function smartReady() {
|
|
52
|
-
if (!readiness.isReady() && !storage.splits.usesSegments()
|
|
52
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
53
53
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
54
54
|
}
|
|
55
|
-
if (!storage.splits.usesSegments()
|
|
55
|
+
if (!storage.splits.usesSegments())
|
|
56
56
|
setTimeout(smartReady, 0);
|
|
57
57
|
else
|
|
58
58
|
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
@@ -66,7 +66,7 @@ function pollingManagerCSFactory(params) {
|
|
|
66
66
|
start: function () {
|
|
67
67
|
log.info(constants_2.POLLING_START);
|
|
68
68
|
splitsSyncTask.start();
|
|
69
|
-
if (storage.splits.usesSegments()
|
|
69
|
+
if (storage.splits.usesSegments())
|
|
70
70
|
startMySegmentsSyncTasks();
|
|
71
71
|
},
|
|
72
72
|
// Stop periodic fetching (polling)
|
|
@@ -12,7 +12,7 @@ var constants_3 = require("../../streaming/constants");
|
|
|
12
12
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
13
13
|
*/
|
|
14
14
|
function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
15
|
-
var splits = storage.splits,
|
|
15
|
+
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
16
16
|
var readyOnAlreadyExistentState = true;
|
|
17
17
|
var startingUp = true;
|
|
18
18
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -34,7 +34,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
34
34
|
shouldNotifyUpdate = largeSegments.resetSegments(segmentsData.ls || {}) || shouldNotifyUpdate;
|
|
35
35
|
}
|
|
36
36
|
// Notify update if required
|
|
37
|
-
if (
|
|
37
|
+
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
38
38
|
readyOnAlreadyExistentState = false;
|
|
39
39
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
|
|
40
40
|
}
|
|
@@ -39,7 +39,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
39
39
|
* Returned promise will not be rejected.
|
|
40
40
|
*
|
|
41
41
|
* @param fetchOnlyNew - if true, only fetch the segments that not exists, i.e., which `changeNumber` is equal to -1.
|
|
42
|
-
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE
|
|
42
|
+
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE notifications.
|
|
43
43
|
* @param segmentName - segment name to fetch. By passing `undefined` it fetches the list of segments registered at the storage
|
|
44
44
|
* @param noCache - true to revalidate data to fetch on a SEGMENT_UPDATE notifications.
|
|
45
45
|
* @param till - till target for the provided segmentName, for CDN bypass.
|