@splitsoftware/splitio-commons 1.17.1-rc.3 → 2.0.0-rc.0
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 -3
- package/cjs/evaluator/index.js +2 -2
- package/cjs/evaluator/matchers/semver_inlist.js +1 -2
- package/cjs/evaluator/matchers/whitelist.js +1 -2
- package/cjs/listeners/browser.js +1 -2
- package/cjs/logger/browser/DebugLogger.js +1 -2
- package/cjs/logger/browser/ErrorLogger.js +1 -2
- package/cjs/logger/browser/InfoLogger.js +1 -2
- package/cjs/logger/browser/WarnLogger.js +1 -2
- package/cjs/logger/index.js +1 -2
- package/cjs/readiness/readinessManager.js +5 -7
- package/cjs/sdkClient/clientCS.js +5 -8
- package/cjs/sdkClient/sdkClientMethodCS.js +5 -8
- package/cjs/sdkFactory/index.js +10 -33
- package/cjs/services/decorateHeaders.js +1 -2
- package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +7 -0
- package/cjs/storages/KeyBuilderCS.js +0 -9
- package/cjs/storages/dataLoader.js +32 -64
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/cjs/storages/inLocalStorage/index.js +1 -6
- package/cjs/storages/inMemory/InMemoryStorageCS.js +4 -16
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +3 -4
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +2 -3
- package/cjs/storages/inMemory/UniqueKeysCacheInMemory.js +2 -3
- package/cjs/storages/inMemory/UniqueKeysCacheInMemoryCS.js +2 -3
- package/cjs/storages/inRedis/RedisAdapter.js +3 -4
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/TelemetryCacheInRedis.js +3 -4
- package/cjs/storages/inRedis/UniqueKeysCacheInRedis.js +1 -2
- package/cjs/storages/pluggable/SplitsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/TelemetryCachePluggable.js +6 -7
- package/cjs/storages/pluggable/UniqueKeysCachePluggable.js +1 -2
- package/cjs/storages/pluggable/inMemoryWrapper.js +7 -8
- package/cjs/storages/pluggable/index.js +32 -37
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
- package/cjs/sync/polling/pollingManagerSS.js +3 -3
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +13 -5
- package/cjs/sync/streaming/parseUtils.js +0 -1
- package/cjs/sync/streaming/pushManager.js +2 -3
- package/cjs/trackers/eventTracker.js +9 -11
- package/cjs/trackers/impressionsTracker.js +13 -15
- package/cjs/trackers/uniqueKeysTracker.js +3 -5
- package/cjs/utils/LRUCache/index.js +1 -2
- package/cjs/utils/constants/browser.js +1 -4
- package/cjs/utils/lang/index.js +6 -9
- package/cjs/utils/lang/objectAssign.js +12 -77
- package/cjs/utils/lang/sets.js +3 -110
- package/cjs/utils/settingsValidation/index.js +0 -9
- package/cjs/utils/settingsValidation/logger/builtinLogger.js +1 -2
- package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
- package/esm/evaluator/index.js +3 -3
- package/esm/evaluator/matchers/semver_inlist.js +1 -2
- package/esm/evaluator/matchers/whitelist.js +1 -2
- package/esm/listeners/browser.js +1 -2
- package/esm/logger/browser/DebugLogger.js +1 -2
- package/esm/logger/browser/ErrorLogger.js +1 -2
- package/esm/logger/browser/InfoLogger.js +1 -2
- package/esm/logger/browser/WarnLogger.js +1 -2
- package/esm/logger/index.js +1 -2
- package/esm/readiness/readinessManager.js +5 -7
- package/esm/sdkClient/clientCS.js +5 -8
- package/esm/sdkClient/sdkClientMethodCS.js +5 -8
- package/esm/sdkFactory/index.js +11 -34
- package/esm/services/decorateHeaders.js +1 -2
- package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
- package/esm/storages/AbstractSplitsCacheSync.js +7 -0
- package/esm/storages/KeyBuilderCS.js +0 -9
- package/esm/storages/dataLoader.js +30 -61
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/esm/storages/inLocalStorage/index.js +2 -7
- package/esm/storages/inMemory/InMemoryStorageCS.js +4 -16
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +3 -4
- package/esm/storages/inMemory/SplitsCacheInMemory.js +2 -3
- package/esm/storages/inMemory/UniqueKeysCacheInMemory.js +2 -3
- package/esm/storages/inMemory/UniqueKeysCacheInMemoryCS.js +2 -3
- package/esm/storages/inRedis/RedisAdapter.js +3 -4
- package/esm/storages/inRedis/SplitsCacheInRedis.js +2 -2
- package/esm/storages/inRedis/TelemetryCacheInRedis.js +3 -4
- package/esm/storages/inRedis/UniqueKeysCacheInRedis.js +1 -2
- package/esm/storages/pluggable/SplitsCachePluggable.js +2 -2
- package/esm/storages/pluggable/TelemetryCachePluggable.js +6 -7
- package/esm/storages/pluggable/UniqueKeysCachePluggable.js +1 -2
- package/esm/storages/pluggable/inMemoryWrapper.js +7 -8
- package/esm/storages/pluggable/index.js +32 -37
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
- package/esm/sync/polling/pollingManagerSS.js +3 -3
- package/esm/sync/polling/updaters/splitChangesUpdater.js +14 -6
- package/esm/sync/streaming/parseUtils.js +0 -1
- package/esm/sync/streaming/pushManager.js +2 -3
- package/esm/trackers/eventTracker.js +9 -11
- package/esm/trackers/impressionsTracker.js +13 -15
- package/esm/trackers/uniqueKeysTracker.js +3 -5
- package/esm/utils/LRUCache/index.js +1 -2
- package/esm/utils/constants/browser.js +0 -3
- package/esm/utils/lang/index.js +6 -9
- package/esm/utils/lang/objectAssign.js +12 -77
- package/esm/utils/lang/sets.js +2 -107
- package/esm/utils/settingsValidation/index.js +0 -9
- package/esm/utils/settingsValidation/logger/builtinLogger.js +1 -2
- package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
- package/package.json +2 -2
- package/src/evaluator/index.ts +5 -5
- package/src/evaluator/matchers/semver_inlist.ts +1 -2
- package/src/evaluator/matchers/whitelist.ts +1 -3
- package/src/listeners/browser.ts +1 -2
- package/src/logger/browser/DebugLogger.ts +1 -2
- package/src/logger/browser/ErrorLogger.ts +1 -2
- package/src/logger/browser/InfoLogger.ts +1 -2
- package/src/logger/browser/WarnLogger.ts +1 -2
- package/src/logger/index.ts +3 -4
- package/src/readiness/readinessManager.ts +7 -9
- package/src/readiness/types.ts +0 -1
- package/src/sdkClient/clientCS.ts +5 -8
- package/src/sdkClient/sdkClientMethodCS.ts +3 -6
- package/src/sdkFactory/index.ts +12 -37
- package/src/sdkFactory/types.ts +1 -4
- package/src/services/decorateHeaders.ts +1 -2
- package/src/storages/AbstractSplitsCacheAsync.ts +9 -2
- package/src/storages/AbstractSplitsCacheSync.ts +9 -2
- package/src/storages/KeyBuilderCS.ts +0 -13
- package/src/storages/dataLoader.ts +32 -62
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +1 -21
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +16 -8
- package/src/storages/inLocalStorage/index.ts +2 -8
- package/src/storages/inMemory/InMemoryStorageCS.ts +4 -19
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +4 -5
- package/src/storages/inMemory/SplitsCacheInMemory.ts +4 -5
- package/src/storages/inMemory/UniqueKeysCacheInMemory.ts +4 -5
- package/src/storages/inMemory/UniqueKeysCacheInMemoryCS.ts +4 -5
- package/src/storages/inRedis/RedisAdapter.ts +4 -5
- package/src/storages/inRedis/SplitsCacheInRedis.ts +3 -3
- package/src/storages/inRedis/TelemetryCacheInRedis.ts +3 -4
- package/src/storages/inRedis/UniqueKeysCacheInRedis.ts +1 -2
- package/src/storages/pluggable/SegmentsCachePluggable.ts +0 -1
- package/src/storages/pluggable/SplitsCachePluggable.ts +3 -3
- package/src/storages/pluggable/TelemetryCachePluggable.ts +6 -7
- package/src/storages/pluggable/UniqueKeysCachePluggable.ts +1 -2
- package/src/storages/pluggable/inMemoryWrapper.ts +8 -9
- package/src/storages/pluggable/index.ts +33 -38
- package/src/storages/types.ts +9 -6
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
- package/src/sync/polling/pollingManagerSS.ts +2 -3
- package/src/sync/polling/updaters/splitChangesUpdater.ts +15 -8
- package/src/sync/streaming/parseUtils.ts +0 -1
- package/src/sync/streaming/pushManager.ts +3 -4
- package/src/sync/submitters/types.ts +3 -4
- package/src/trackers/eventTracker.ts +7 -10
- package/src/trackers/impressionsTracker.ts +9 -12
- package/src/trackers/types.ts +0 -1
- package/src/trackers/uniqueKeysTracker.ts +4 -6
- package/src/types.ts +9 -18
- package/src/utils/LRUCache/index.ts +2 -3
- package/src/utils/constants/browser.ts +0 -4
- package/src/utils/lang/index.ts +6 -7
- package/src/utils/lang/objectAssign.ts +13 -92
- package/src/utils/lang/sets.ts +3 -125
- package/src/utils/settingsValidation/index.ts +0 -10
- package/src/utils/settingsValidation/logger/builtinLogger.ts +1 -2
- package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
- package/src/utils/settingsValidation/types.ts +0 -2
- package/types/logger/index.d.ts +1 -2
- package/types/readiness/types.d.ts +0 -1
- package/types/sdkClient/clientCS.d.ts +2 -3
- package/types/sdkFactory/types.d.ts +1 -3
- package/types/storages/AbstractSplitsCacheAsync.d.ts +6 -2
- package/types/storages/AbstractSplitsCacheSync.d.ts +6 -2
- package/types/storages/KeyBuilderCS.d.ts +0 -2
- package/types/storages/dataLoader.d.ts +6 -17
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +7 -2
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
- package/types/storages/inMemory/UniqueKeysCacheInMemory.d.ts +2 -3
- package/types/storages/inRedis/SplitsCacheInRedis.d.ts +1 -2
- package/types/storages/pluggable/SplitsCachePluggable.d.ts +1 -2
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -2
- package/types/storages/types.d.ts +7 -6
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -2
- package/types/sync/submitters/types.d.ts +3 -4
- 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 +9 -17
- package/types/utils/LRUCache/index.d.ts +1 -2
- package/types/utils/constants/browser.d.ts +0 -2
- package/types/utils/lang/objectAssign.d.ts +3 -0
- package/types/utils/lang/sets.d.ts +1 -61
- package/types/utils/settingsValidation/index.d.ts +0 -1
- package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
- package/types/utils/settingsValidation/types.d.ts +0 -2
- package/cjs/integrations/browser.js +0 -31
- package/cjs/integrations/ga/GaToSplit.js +0 -257
- package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +0 -14
- package/cjs/integrations/ga/SplitToGa.js +0 -123
- package/cjs/integrations/ga/SplitToGoogleAnalytics.js +0 -14
- package/cjs/integrations/ga/types.js +0 -2
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +0 -79
- package/cjs/utils/lang/maps.js +0 -96
- package/esm/integrations/browser.js +0 -27
- package/esm/integrations/ga/GaToSplit.js +0 -250
- package/esm/integrations/ga/GoogleAnalyticsToSplit.js +0 -10
- package/esm/integrations/ga/SplitToGa.js +0 -120
- package/esm/integrations/ga/SplitToGoogleAnalytics.js +0 -10
- package/esm/integrations/ga/types.js +0 -1
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +0 -75
- package/esm/utils/lang/maps.js +0 -92
- package/src/integrations/browser.ts +0 -35
- package/src/integrations/ga/GaToSplit.ts +0 -299
- package/src/integrations/ga/GoogleAnalyticsToSplit.ts +0 -14
- package/src/integrations/ga/SplitToGa.ts +0 -135
- package/src/integrations/ga/SplitToGoogleAnalytics.ts +0 -14
- package/src/integrations/ga/autoRequire.js +0 -33
- package/src/integrations/ga/types.ts +0 -153
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +0 -101
- package/src/utils/lang/maps.ts +0 -108
|
@@ -30,7 +30,7 @@ function InLocalStorage(options) {
|
|
|
30
30
|
params.settings.log.warn(constants_1.LOG_PREFIX + 'LocalStorage API is unavailable. Falling back to default MEMORY storage');
|
|
31
31
|
return (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
|
|
32
32
|
}
|
|
33
|
-
var
|
|
33
|
+
var settings = params.settings, _a = params.settings, log = _a.log, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
34
34
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
35
35
|
var keys = new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey);
|
|
36
36
|
var expirationTimestamp = Date.now() - browser_1.DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
@@ -46,11 +46,6 @@ function InLocalStorage(options) {
|
|
|
46
46
|
events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
|
|
47
47
|
telemetry: (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)(params) ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory(splits, segments) : undefined,
|
|
48
48
|
uniqueKeys: impressionsMode === constants_2.NONE ? new UniqueKeysCacheInMemoryCS_1.UniqueKeysCacheInMemoryCS() : undefined,
|
|
49
|
-
init: function () {
|
|
50
|
-
if (settings.mode === constants_2.LOCALHOST_MODE || splits.getChangeNumber() > -1) {
|
|
51
|
-
Promise.resolve().then(onReadyFromCacheCb);
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
49
|
destroy: function () {
|
|
55
50
|
var _a;
|
|
56
51
|
this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
@@ -9,15 +9,13 @@ 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 key_1 = require("../../utils/key");
|
|
13
|
-
var dataLoader_1 = require("../dataLoader");
|
|
14
12
|
/**
|
|
15
13
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
16
14
|
*
|
|
17
15
|
* @param params parameters required by EventsCacheSync
|
|
18
16
|
*/
|
|
19
17
|
function InMemoryStorageCSFactory(params) {
|
|
20
|
-
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation
|
|
18
|
+
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
21
19
|
var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
|
|
22
20
|
var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
23
21
|
var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
@@ -41,16 +39,11 @@ function InMemoryStorageCSFactory(params) {
|
|
|
41
39
|
this.uniqueKeys && this.uniqueKeys.clear();
|
|
42
40
|
},
|
|
43
41
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are unique per key)
|
|
44
|
-
shared: function (
|
|
45
|
-
var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
46
|
-
var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
|
|
47
|
-
if (preloadedData) {
|
|
48
|
-
(0, dataLoader_1.loadData)(preloadedData, { segments: segments, largeSegments: largeSegments }, matchingKey);
|
|
49
|
-
}
|
|
42
|
+
shared: function () {
|
|
50
43
|
return {
|
|
51
44
|
splits: this.splits,
|
|
52
|
-
segments:
|
|
53
|
-
largeSegments:
|
|
45
|
+
segments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
46
|
+
largeSegments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
|
|
54
47
|
impressions: this.impressions,
|
|
55
48
|
impressionCounts: this.impressionCounts,
|
|
56
49
|
events: this.events,
|
|
@@ -75,11 +68,6 @@ function InMemoryStorageCSFactory(params) {
|
|
|
75
68
|
if (storage.uniqueKeys)
|
|
76
69
|
storage.uniqueKeys.track = noopTrack;
|
|
77
70
|
}
|
|
78
|
-
if (preloadedData) {
|
|
79
|
-
(0, dataLoader_1.loadData)(preloadedData, storage, (0, key_1.getMatching)(params.settings.core.key));
|
|
80
|
-
if (splits.getChangeNumber() > -1)
|
|
81
|
-
onReadyFromCacheCb();
|
|
82
|
-
}
|
|
83
71
|
return storage;
|
|
84
72
|
}
|
|
85
73
|
exports.InMemoryStorageCSFactory = InMemoryStorageCSFactory;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SegmentsCacheInMemory = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var AbstractSegmentsCacheSync_1 = require("../AbstractSegmentsCacheSync");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
6
|
var lang_1 = require("../../utils/lang");
|
|
8
7
|
/**
|
|
9
8
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
@@ -19,14 +18,14 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
19
18
|
}
|
|
20
19
|
SegmentsCacheInMemory.prototype.addToSegment = function (name, segmentKeys) {
|
|
21
20
|
var values = this.segmentCache[name];
|
|
22
|
-
var keySet = values ? values : new
|
|
21
|
+
var keySet = values ? values : new Set();
|
|
23
22
|
segmentKeys.forEach(function (k) { return keySet.add(k); });
|
|
24
23
|
this.segmentCache[name] = keySet;
|
|
25
24
|
return true;
|
|
26
25
|
};
|
|
27
26
|
SegmentsCacheInMemory.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
28
27
|
var values = this.segmentCache[name];
|
|
29
|
-
var keySet = values ? values : new
|
|
28
|
+
var keySet = values ? values : new Set();
|
|
30
29
|
segmentKeys.forEach(function (k) { return keySet.delete(k); });
|
|
31
30
|
this.segmentCache[name] = keySet;
|
|
32
31
|
return true;
|
|
@@ -44,7 +43,7 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
44
43
|
};
|
|
45
44
|
SegmentsCacheInMemory.prototype._registerSegment = function (name) {
|
|
46
45
|
if (!this.segmentCache[name]) {
|
|
47
|
-
this.segmentCache[name] = new
|
|
46
|
+
this.segmentCache[name] = new Set();
|
|
48
47
|
}
|
|
49
48
|
return true;
|
|
50
49
|
};
|
|
@@ -4,7 +4,6 @@ exports.SplitsCacheInMemory = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
8
7
|
/**
|
|
9
8
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
10
9
|
* Supported by all JS runtimes.
|
|
@@ -95,7 +94,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
95
94
|
};
|
|
96
95
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
97
96
|
var _this = this;
|
|
98
|
-
return flagSets.map(function (flagSet) { return _this.flagSetsCache[flagSet] || new
|
|
97
|
+
return flagSets.map(function (flagSet) { return _this.flagSetsCache[flagSet] || new Set(); });
|
|
99
98
|
};
|
|
100
99
|
SplitsCacheInMemory.prototype.addToFlagSets = function (featureFlag) {
|
|
101
100
|
var _this = this;
|
|
@@ -105,7 +104,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
105
104
|
if (_this.flagSetsFilter.length > 0 && !_this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === featureFlagSet; }))
|
|
106
105
|
return;
|
|
107
106
|
if (!_this.flagSetsCache[featureFlagSet])
|
|
108
|
-
_this.flagSetsCache[featureFlagSet] = new
|
|
107
|
+
_this.flagSetsCache[featureFlagSet] = new Set([]);
|
|
109
108
|
_this.flagSetsCache[featureFlagSet].add(featureFlag.name);
|
|
110
109
|
});
|
|
111
110
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UniqueKeysCacheInMemory = exports.fromUniqueKeysCollector = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
4
|
var constants_1 = require("../inRedis/constants");
|
|
6
5
|
/**
|
|
7
6
|
* Converts `uniqueKeys` data from cache into request payload for SS.
|
|
@@ -11,7 +10,7 @@ function fromUniqueKeysCollector(uniqueKeys) {
|
|
|
11
10
|
var featureNames = Object.keys(uniqueKeys);
|
|
12
11
|
for (var i = 0; i < featureNames.length; i++) {
|
|
13
12
|
var featureName = featureNames[i];
|
|
14
|
-
var userKeys =
|
|
13
|
+
var userKeys = Array.from(uniqueKeys[featureName]);
|
|
15
14
|
var uniqueKeysPayload = {
|
|
16
15
|
f: featureName,
|
|
17
16
|
ks: userKeys
|
|
@@ -36,7 +35,7 @@ var UniqueKeysCacheInMemory = /** @class */ (function () {
|
|
|
36
35
|
*/
|
|
37
36
|
UniqueKeysCacheInMemory.prototype.track = function (userKey, featureName) {
|
|
38
37
|
if (!this.uniqueKeysTracker[featureName])
|
|
39
|
-
this.uniqueKeysTracker[featureName] = new
|
|
38
|
+
this.uniqueKeysTracker[featureName] = new Set();
|
|
40
39
|
var tracker = this.uniqueKeysTracker[featureName];
|
|
41
40
|
if (!tracker.has(userKey)) {
|
|
42
41
|
tracker.add(userKey);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UniqueKeysCacheInMemoryCS = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
4
|
var constants_1 = require("../inRedis/constants");
|
|
6
5
|
var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
7
6
|
/**
|
|
@@ -23,7 +22,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
23
22
|
*/
|
|
24
23
|
UniqueKeysCacheInMemoryCS.prototype.track = function (userKey, featureName) {
|
|
25
24
|
if (!this.uniqueKeysTracker[userKey])
|
|
26
|
-
this.uniqueKeysTracker[userKey] = new
|
|
25
|
+
this.uniqueKeysTracker[userKey] = new Set();
|
|
27
26
|
var tracker = this.uniqueKeysTracker[userKey];
|
|
28
27
|
if (!tracker.has(featureName)) {
|
|
29
28
|
tracker.add(featureName);
|
|
@@ -62,7 +61,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
62
61
|
var userKeys = Object.keys(uniqueKeys);
|
|
63
62
|
for (var k = 0; k < userKeys.length; k++) {
|
|
64
63
|
var userKey = userKeys[k];
|
|
65
|
-
var featureNames =
|
|
64
|
+
var featureNames = Array.from(uniqueKeys[userKey]);
|
|
66
65
|
var uniqueKeysPayload = {
|
|
67
66
|
k: userKey,
|
|
68
67
|
fs: featureNames
|
|
@@ -4,7 +4,6 @@ exports.RedisAdapter = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var ioredis_1 = (0, tslib_1.__importDefault)(require("ioredis"));
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
8
7
|
var thenable_1 = require("../../utils/promise/thenable");
|
|
9
8
|
var timeout_1 = require("../../utils/promise/timeout");
|
|
10
9
|
var LOG_PREFIX = 'storage:redis-adapter: ';
|
|
@@ -20,7 +19,7 @@ var DEFAULT_OPTIONS = {
|
|
|
20
19
|
var DEFAULT_LIBRARY_OPTIONS = {
|
|
21
20
|
enableOfflineQueue: false,
|
|
22
21
|
connectTimeout: DEFAULT_OPTIONS.connectionTimeout,
|
|
23
|
-
lazyConnect: false
|
|
22
|
+
lazyConnect: false
|
|
24
23
|
};
|
|
25
24
|
/**
|
|
26
25
|
* Redis adapter on top of the library of choice (written with ioredis) for some extra control.
|
|
@@ -36,7 +35,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
36
35
|
_this.log = log;
|
|
37
36
|
_this._options = options;
|
|
38
37
|
_this._notReadyCommandsQueue = [];
|
|
39
|
-
_this._runningCommands = new
|
|
38
|
+
_this._runningCommands = new Set();
|
|
40
39
|
_this._listenToEvents();
|
|
41
40
|
_this._setTimeoutWrappers();
|
|
42
41
|
_this._setDisconnectWrapper();
|
|
@@ -129,7 +128,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
129
128
|
setTimeout(function deferredDisconnect() {
|
|
130
129
|
if (instance._runningCommands.size > 0) {
|
|
131
130
|
instance.log.info(LOG_PREFIX + ("Attempting to disconnect but there are " + instance._runningCommands.size + " commands still waiting for resolution. Defering disconnection until those finish."));
|
|
132
|
-
Promise.all(
|
|
131
|
+
Promise.all(Array.from(instance._runningCommands))
|
|
133
132
|
.then(function () {
|
|
134
133
|
instance.log.debug(LOG_PREFIX + 'Pending commands finished successfully, disconnecting.');
|
|
135
134
|
originalMethod.apply(instance, params);
|
|
@@ -200,7 +200,7 @@ var SplitsCacheInRedis = /** @class */ (function (_super) {
|
|
|
200
200
|
return value;
|
|
201
201
|
_this.log.error(constants_1.LOG_PREFIX + ("Could not read result from get members of flag set " + flagSets[index] + " due to an error: " + e));
|
|
202
202
|
}); })
|
|
203
|
-
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
203
|
+
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
204
204
|
};
|
|
205
205
|
/**
|
|
206
206
|
* Check traffic type existence.
|
|
@@ -5,7 +5,6 @@ var findLatencyIndex_1 = require("../findLatencyIndex");
|
|
|
5
5
|
var telemetrySubmitter_1 = require("../../sync/submitters/telemetrySubmitter");
|
|
6
6
|
var constants_1 = require("../../utils/constants");
|
|
7
7
|
var lang_1 = require("../../utils/lang");
|
|
8
|
-
var maps_1 = require("../../utils/lang/maps");
|
|
9
8
|
var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
|
|
10
9
|
var utils_1 = require("../utils");
|
|
11
10
|
var TelemetryCacheInRedis = /** @class */ (function () {
|
|
@@ -42,7 +41,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
42
41
|
TelemetryCacheInRedis.prototype.popLatencies = function () {
|
|
43
42
|
var _this = this;
|
|
44
43
|
return this.redis.hgetall(this.keys.latencyPrefix).then(function (latencies) {
|
|
45
|
-
var result = new
|
|
44
|
+
var result = new Map();
|
|
46
45
|
Object.keys(latencies).forEach(function (field) {
|
|
47
46
|
var parsedField = (0, utils_1.parseLatencyField)(field);
|
|
48
47
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -74,7 +73,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
74
73
|
TelemetryCacheInRedis.prototype.popExceptions = function () {
|
|
75
74
|
var _this = this;
|
|
76
75
|
return this.redis.hgetall(this.keys.exceptionPrefix).then(function (exceptions) {
|
|
77
|
-
var result = new
|
|
76
|
+
var result = new Map();
|
|
78
77
|
Object.keys(exceptions).forEach(function (field) {
|
|
79
78
|
var parsedField = (0, utils_1.parseExceptionField)(field);
|
|
80
79
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -101,7 +100,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
101
100
|
TelemetryCacheInRedis.prototype.popConfigs = function () {
|
|
102
101
|
var _this = this;
|
|
103
102
|
return this.redis.hgetall(this.keys.initPrefix).then(function (configs) {
|
|
104
|
-
var result = new
|
|
103
|
+
var result = new Map();
|
|
105
104
|
Object.keys(configs).forEach(function (field) {
|
|
106
105
|
var parsedField = (0, utils_1.parseMetadata)(field);
|
|
107
106
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UniqueKeysCacheInRedis = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
6
|
var constants_1 = require("./constants");
|
|
8
7
|
var constants_2 = require("./constants");
|
|
9
8
|
var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
@@ -25,7 +24,7 @@ var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
|
25
24
|
if (!featureNames.length)
|
|
26
25
|
return Promise.resolve(false);
|
|
27
26
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
28
|
-
var featureKeys =
|
|
27
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
29
28
|
var uniqueKeysPayload = {
|
|
30
29
|
f: featureName,
|
|
31
30
|
ks: featureKeys
|
|
@@ -170,7 +170,7 @@ var SplitsCachePluggable = /** @class */ (function (_super) {
|
|
|
170
170
|
return Promise.all(flagSets.map(function (flagSet) {
|
|
171
171
|
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
172
172
|
return _this.wrapper.getItems(flagSetKey).catch(function () { return []; });
|
|
173
|
-
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
173
|
+
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
174
174
|
};
|
|
175
175
|
/**
|
|
176
176
|
* Check traffic type existence.
|
|
@@ -5,7 +5,6 @@ var findLatencyIndex_1 = require("../findLatencyIndex");
|
|
|
5
5
|
var telemetrySubmitter_1 = require("../../sync/submitters/telemetrySubmitter");
|
|
6
6
|
var constants_1 = require("../../utils/constants");
|
|
7
7
|
var lang_1 = require("../../utils/lang");
|
|
8
|
-
var maps_1 = require("../../utils/lang/maps");
|
|
9
8
|
var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
|
|
10
9
|
var utils_1 = require("../utils");
|
|
11
10
|
var TelemetryCachePluggable = /** @class */ (function () {
|
|
@@ -41,7 +40,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
41
40
|
return this.wrapper.getKeysByPrefix(this.keys.latencyPrefix).then(function (latencyKeys) {
|
|
42
41
|
return latencyKeys.length ?
|
|
43
42
|
_this.wrapper.getMany(latencyKeys).then(function (latencies) {
|
|
44
|
-
var result = new
|
|
43
|
+
var result = new Map();
|
|
45
44
|
for (var i = 0; i < latencyKeys.length; i++) {
|
|
46
45
|
var field = latencyKeys[i].split('::')[1];
|
|
47
46
|
var parsedField = (0, utils_1.parseLatencyField)(field);
|
|
@@ -68,7 +67,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
68
67
|
return Promise.all(latencyKeys.map(function (latencyKey) { return _this.wrapper.del(latencyKey); })).then(function () { return result; });
|
|
69
68
|
}) :
|
|
70
69
|
// If latencyKeys is empty, return an empty map.
|
|
71
|
-
new
|
|
70
|
+
new Map();
|
|
72
71
|
});
|
|
73
72
|
};
|
|
74
73
|
/**
|
|
@@ -80,7 +79,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
80
79
|
return this.wrapper.getKeysByPrefix(this.keys.exceptionPrefix).then(function (exceptionKeys) {
|
|
81
80
|
return exceptionKeys.length ?
|
|
82
81
|
_this.wrapper.getMany(exceptionKeys).then(function (exceptions) {
|
|
83
|
-
var result = new
|
|
82
|
+
var result = new Map();
|
|
84
83
|
for (var i = 0; i < exceptionKeys.length; i++) {
|
|
85
84
|
var field = exceptionKeys[i].split('::')[1];
|
|
86
85
|
var parsedField = (0, utils_1.parseExceptionField)(field);
|
|
@@ -102,7 +101,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
102
101
|
return Promise.all(exceptionKeys.map(function (exceptionKey) { return _this.wrapper.del(exceptionKey); })).then(function () { return result; });
|
|
103
102
|
}) :
|
|
104
103
|
// If exceptionKeys is empty, return an empty map.
|
|
105
|
-
new
|
|
104
|
+
new Map();
|
|
106
105
|
});
|
|
107
106
|
};
|
|
108
107
|
/**
|
|
@@ -114,7 +113,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
114
113
|
return this.wrapper.getKeysByPrefix(this.keys.initPrefix).then(function (configKeys) {
|
|
115
114
|
return configKeys.length ?
|
|
116
115
|
_this.wrapper.getMany(configKeys).then(function (configs) {
|
|
117
|
-
var result = new
|
|
116
|
+
var result = new Map();
|
|
118
117
|
for (var i = 0; i < configKeys.length; i++) {
|
|
119
118
|
var field = configKeys[i].split('::')[1];
|
|
120
119
|
var parsedField = (0, utils_1.parseMetadata)(field);
|
|
@@ -134,7 +133,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
134
133
|
return Promise.all(configKeys.map(function (configKey) { return _this.wrapper.del(configKey); })).then(function () { return result; });
|
|
135
134
|
}) :
|
|
136
135
|
// If configKeys is empty, return an empty map.
|
|
137
|
-
new
|
|
136
|
+
new Map();
|
|
138
137
|
});
|
|
139
138
|
};
|
|
140
139
|
return TelemetryCachePluggable;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UniqueKeysCachePluggable = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
6
|
var constants_1 = require("../inRedis/constants");
|
|
8
7
|
var constants_2 = require("./constants");
|
|
9
8
|
var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
@@ -25,7 +24,7 @@ var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
|
25
24
|
if (!featureNames.length)
|
|
26
25
|
return Promise.resolve(false);
|
|
27
26
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
28
|
-
var featureKeys =
|
|
27
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
29
28
|
var uniqueKeysPayload = {
|
|
30
29
|
f: featureName,
|
|
31
30
|
ks: featureKeys
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.inMemoryWrapperFactory = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
6
5
|
/**
|
|
7
6
|
* Creates a IPluggableStorageWrapper implementation that stores items in memory.
|
|
8
7
|
* The `_cache` property is the object were items are stored.
|
|
@@ -90,15 +89,15 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
90
89
|
var set = _cache[key];
|
|
91
90
|
if (!set)
|
|
92
91
|
return Promise.resolve(false);
|
|
93
|
-
if (set instanceof
|
|
92
|
+
if (set instanceof Set)
|
|
94
93
|
return Promise.resolve(set.has(item));
|
|
95
94
|
return Promise.reject('key is not a set');
|
|
96
95
|
},
|
|
97
96
|
addItems: function (key, items) {
|
|
98
97
|
if (!(key in _cache))
|
|
99
|
-
_cache[key] = new
|
|
98
|
+
_cache[key] = new Set();
|
|
100
99
|
var set = _cache[key];
|
|
101
|
-
if (set instanceof
|
|
100
|
+
if (set instanceof Set) {
|
|
102
101
|
items.forEach(function (item) { return set.add(item); });
|
|
103
102
|
return Promise.resolve();
|
|
104
103
|
}
|
|
@@ -106,9 +105,9 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
106
105
|
},
|
|
107
106
|
removeItems: function (key, items) {
|
|
108
107
|
if (!(key in _cache))
|
|
109
|
-
_cache[key] = new
|
|
108
|
+
_cache[key] = new Set();
|
|
110
109
|
var set = _cache[key];
|
|
111
|
-
if (set instanceof
|
|
110
|
+
if (set instanceof Set) {
|
|
112
111
|
items.forEach(function (item) { return set.delete(item); });
|
|
113
112
|
return Promise.resolve();
|
|
114
113
|
}
|
|
@@ -118,8 +117,8 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
118
117
|
var set = _cache[key];
|
|
119
118
|
if (!set)
|
|
120
119
|
return Promise.resolve([]);
|
|
121
|
-
if (set instanceof
|
|
122
|
-
return Promise.resolve(
|
|
120
|
+
if (set instanceof Set)
|
|
121
|
+
return Promise.resolve(Array.from(set));
|
|
123
122
|
return Promise.reject('key is not a set');
|
|
124
123
|
},
|
|
125
124
|
// always connects and disconnects
|
|
@@ -58,7 +58,6 @@ function PluggableStorage(options) {
|
|
|
58
58
|
var metadata = (0, utils_1.metadataBuilder)(settings);
|
|
59
59
|
var keys = new KeyBuilderSS_1.KeyBuilderSS(prefix, metadata);
|
|
60
60
|
var wrapper = (0, wrapperAdapter_1.wrapperAdapter)(log, options.wrapper);
|
|
61
|
-
var connectPromise;
|
|
62
61
|
var isSyncronizer = mode === undefined; // If mode is not defined, the synchronizer is running
|
|
63
62
|
var isPartialConsumer = mode === constants_1.CONSUMER_PARTIAL_MODE;
|
|
64
63
|
var telemetry = (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)(params) || isSyncronizer ?
|
|
@@ -76,6 +75,37 @@ function PluggableStorage(options) {
|
|
|
76
75
|
settings.core.key === undefined ? new UniqueKeysCacheInMemory_1.UniqueKeysCacheInMemory() : new UniqueKeysCacheInMemoryCS_1.UniqueKeysCacheInMemoryCS() :
|
|
77
76
|
new UniqueKeysCachePluggable_1.UniqueKeysCachePluggable(log, keys.buildUniqueKeysKey(), wrapper) :
|
|
78
77
|
undefined;
|
|
78
|
+
// Connects to wrapper and emits SDK_READY event on main client
|
|
79
|
+
var connectPromise = wrapper.connect().then(function () {
|
|
80
|
+
if (isSyncronizer) {
|
|
81
|
+
// In standalone or producer mode, clear storage if SDK key or feature flag filter has changed
|
|
82
|
+
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
83
|
+
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
84
|
+
if (hash !== currentHash) {
|
|
85
|
+
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
86
|
+
return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
|
|
87
|
+
return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
|
|
88
|
+
}).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
|
|
89
|
+
}
|
|
90
|
+
}).then(function () {
|
|
91
|
+
onReadyCb();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Start periodic flush of async storages if not running synchronizer (producer mode)
|
|
96
|
+
if (impressionCountsCache && impressionCountsCache.start)
|
|
97
|
+
impressionCountsCache.start();
|
|
98
|
+
if (uniqueKeysCache && uniqueKeysCache.start)
|
|
99
|
+
uniqueKeysCache.start();
|
|
100
|
+
if (telemetry && telemetry.recordConfig)
|
|
101
|
+
telemetry.recordConfig();
|
|
102
|
+
onReadyCb();
|
|
103
|
+
}
|
|
104
|
+
}).catch(function (e) {
|
|
105
|
+
e = e || new Error('Error connecting wrapper');
|
|
106
|
+
onReadyCb(e);
|
|
107
|
+
return e; // Propagate error for shared clients
|
|
108
|
+
});
|
|
79
109
|
return {
|
|
80
110
|
splits: new SplitsCachePluggable_1.SplitsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
81
111
|
segments: new SegmentsCachePluggable_1.SegmentsCachePluggable(log, keys, wrapper),
|
|
@@ -84,41 +114,6 @@ function PluggableStorage(options) {
|
|
|
84
114
|
events: isPartialConsumer ? promisifyEventsTrack(new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize)) : new EventsCachePluggable_1.EventsCachePluggable(log, keys.buildEventsKey(), wrapper, metadata),
|
|
85
115
|
telemetry: telemetry,
|
|
86
116
|
uniqueKeys: uniqueKeysCache,
|
|
87
|
-
init: function () {
|
|
88
|
-
if (connectPromise)
|
|
89
|
-
return connectPromise;
|
|
90
|
-
// Connects to wrapper and emits SDK_READY event on main client
|
|
91
|
-
return connectPromise = wrapper.connect().then(function () {
|
|
92
|
-
if (isSyncronizer) {
|
|
93
|
-
// In standalone or producer mode, clear storage if SDK key or feature flag filter has changed
|
|
94
|
-
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
95
|
-
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
96
|
-
if (hash !== currentHash) {
|
|
97
|
-
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
98
|
-
return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
|
|
99
|
-
return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
|
|
100
|
-
}).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
|
|
101
|
-
}
|
|
102
|
-
}).then(function () {
|
|
103
|
-
onReadyCb();
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Start periodic flush of async storages if not running synchronizer (producer mode)
|
|
108
|
-
if (impressionCountsCache && impressionCountsCache.start)
|
|
109
|
-
impressionCountsCache.start();
|
|
110
|
-
if (uniqueKeysCache && uniqueKeysCache.start)
|
|
111
|
-
uniqueKeysCache.start();
|
|
112
|
-
if (telemetry && telemetry.recordConfig)
|
|
113
|
-
telemetry.recordConfig();
|
|
114
|
-
onReadyCb();
|
|
115
|
-
}
|
|
116
|
-
}).catch(function (e) {
|
|
117
|
-
e = e || new Error('Error connecting wrapper');
|
|
118
|
-
onReadyCb(e);
|
|
119
|
-
return e; // Propagate error for shared clients
|
|
120
|
-
});
|
|
121
|
-
},
|
|
122
117
|
// Stop periodic flush and disconnect the underlying storage
|
|
123
118
|
destroy: function () {
|
|
124
119
|
return Promise.all(isSyncronizer ? [] : [
|
|
@@ -128,7 +123,7 @@ function PluggableStorage(options) {
|
|
|
128
123
|
},
|
|
129
124
|
// emits SDK_READY event on shared clients and returns a reference to the storage
|
|
130
125
|
shared: function (_, onReadyCb) {
|
|
131
|
-
|
|
126
|
+
connectPromise.then(onReadyCb);
|
|
132
127
|
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this), {
|
|
133
128
|
// no-op destroy, to disconnect the wrapper only when the main client is destroyed
|
|
134
129
|
destroy: function () { } });
|
|
@@ -46,8 +46,13 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
46
46
|
readiness.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
|
|
47
47
|
if (startingUp) {
|
|
48
48
|
startingUp = false;
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Promise.resolve(splitsCache.checkCache()).then(function (cacheReady) {
|
|
50
|
+
// Emits SDK_READY_FROM_CACHE
|
|
51
|
+
if (cacheReady)
|
|
52
|
+
readiness.splits.emit(constants_2.SDK_SPLITS_CACHE_LOADED);
|
|
53
|
+
// Emits SDK_READY
|
|
54
|
+
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
|
|
55
|
+
});
|
|
51
56
|
}
|
|
52
57
|
return true;
|
|
53
58
|
});
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
4
|
var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
|
-
var thenable_1 = require("../../utils/promise/thenable");
|
|
7
6
|
var constants_1 = require("../../logger/constants");
|
|
8
7
|
/**
|
|
9
8
|
* Expose start / stop mechanism for pulling data from services.
|
|
@@ -22,9 +21,10 @@ function pollingManagerSSFactory(params) {
|
|
|
22
21
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Splits will be refreshed each " + settings.scheduler.featuresRefreshRate + " millis"));
|
|
23
22
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Segments will be refreshed each " + settings.scheduler.segmentsRefreshRate + " millis"));
|
|
24
23
|
var startingUp = splitsSyncTask.start();
|
|
25
|
-
if (
|
|
24
|
+
if (startingUp) {
|
|
26
25
|
startingUp.then(function () {
|
|
27
|
-
|
|
26
|
+
if (splitsSyncTask.isRunning())
|
|
27
|
+
segmentsSyncTask.start();
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
},
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.splitChangesUpdaterFactory = exports.computeSplitsMutation = exports.parseSegments = void 0;
|
|
4
|
-
var sets_1 = require("../../../utils/lang/sets");
|
|
5
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
6
5
|
var constants_1 = require("../../../readiness/constants");
|
|
7
6
|
var constants_2 = require("../../../logger/constants");
|
|
@@ -23,7 +22,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
23
22
|
*/
|
|
24
23
|
function parseSegments(_a) {
|
|
25
24
|
var conditions = _a.conditions;
|
|
26
|
-
var segments = new
|
|
25
|
+
var segments = new Set();
|
|
27
26
|
for (var i = 0; i < conditions.length; i++) {
|
|
28
27
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
29
28
|
matchers.forEach(function (matcher) {
|
|
@@ -59,7 +58,7 @@ function matchFilters(featureFlag, filters) {
|
|
|
59
58
|
* Exported for testing purposes.
|
|
60
59
|
*/
|
|
61
60
|
function computeSplitsMutation(entries, filters) {
|
|
62
|
-
var segments = new
|
|
61
|
+
var segments = new Set();
|
|
63
62
|
var computed = entries.reduce(function (accum, split) {
|
|
64
63
|
if (split.status === 'ACTIVE' && matchFilters(split, filters)) {
|
|
65
64
|
accum.added.push([split.name, split]);
|
|
@@ -72,7 +71,7 @@ function computeSplitsMutation(entries, filters) {
|
|
|
72
71
|
}
|
|
73
72
|
return accum;
|
|
74
73
|
}, { added: [], removed: [], segments: [] });
|
|
75
|
-
computed.segments =
|
|
74
|
+
computed.segments = Array.from(segments);
|
|
76
75
|
return computed;
|
|
77
76
|
}
|
|
78
77
|
exports.computeSplitsMutation = computeSplitsMutation;
|
|
@@ -126,7 +125,7 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
126
125
|
function _splitChangesUpdater(since, retry) {
|
|
127
126
|
if (retry === void 0) { retry = 0; }
|
|
128
127
|
log.debug(constants_2.SYNC_SPLITS_FETCH, [since]);
|
|
129
|
-
|
|
128
|
+
var fetcherPromise = Promise.resolve(splitUpdateNotification ?
|
|
130
129
|
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
|
|
131
130
|
splitChangesFetcher(since, noCache, till, _promiseDecorator))
|
|
132
131
|
.then(function (splitChanges) {
|
|
@@ -170,6 +169,15 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
170
169
|
}
|
|
171
170
|
return false;
|
|
172
171
|
});
|
|
172
|
+
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
|
|
173
|
+
// Wrapping in a promise since checkCache can be async.
|
|
174
|
+
if (splitsEventEmitter && startingUp) {
|
|
175
|
+
Promise.resolve(splits.checkCache()).then(function (isCacheReady) {
|
|
176
|
+
if (isCacheReady)
|
|
177
|
+
splitsEventEmitter.emit(constants_1.SDK_SPLITS_CACHE_LOADED);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return fetcherPromise;
|
|
173
181
|
}
|
|
174
182
|
var sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
|
|
175
183
|
return sincePromise.then(_splitChangesUpdater);
|
|
@@ -11,7 +11,6 @@ function Uint8ArrayToString(myUint8Arr) {
|
|
|
11
11
|
}
|
|
12
12
|
function StringToUint8Array(myString) {
|
|
13
13
|
var charCodes = myString.split('').map(function (e) { return e.charCodeAt(0); });
|
|
14
|
-
// eslint-disable-next-line compat/compat
|
|
15
14
|
return new Uint8Array(charCodes);
|
|
16
15
|
}
|
|
17
16
|
/**
|