@splitsoftware/splitio-commons 1.17.1-rc.2 → 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/sdkClient/clientCS.js +5 -8
- package/cjs/sdkClient/sdkClientMethodCS.js +1 -1
- package/cjs/sdkFactory/index.js +1 -3
- 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 -65
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/cjs/storages/inLocalStorage/index.js +1 -4
- 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 +2 -3
- 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/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/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/sdkClient/clientCS.js +5 -8
- package/esm/sdkClient/sdkClientMethodCS.js +1 -1
- package/esm/sdkFactory/index.js +2 -4
- 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 -62
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/esm/storages/inLocalStorage/index.js +2 -5
- 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 +2 -3
- 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/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/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/sdkClient/clientCS.ts +5 -8
- package/src/sdkClient/sdkClientMethodCS.ts +1 -1
- package/src/sdkFactory/index.ts +2 -5
- package/src/sdkFactory/types.ts +1 -1
- 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 -63
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +1 -21
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +16 -8
- package/src/storages/inLocalStorage/index.ts +2 -6
- 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 +3 -4
- 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/types.ts +9 -5
- 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/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/sdkClient/clientCS.d.ts +2 -3
- package/types/sdkFactory/types.d.ts +1 -1
- 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 -5
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -2
- package/types/sync/submitters/types.d.ts +3 -4
- 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 -76
- 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 -72
- 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 -98
- package/src/utils/lang/maps.ts +0 -108
|
@@ -2,7 +2,6 @@ import { __extends } from "tslib";
|
|
|
2
2
|
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { LOG_PREFIX } from './constants';
|
|
5
|
-
import { _Set, setToArray } from '../../utils/lang/sets';
|
|
6
5
|
import { getStorageHash } from '../KeyBuilder';
|
|
7
6
|
/**
|
|
8
7
|
* ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
|
|
@@ -183,6 +182,14 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
183
182
|
return true;
|
|
184
183
|
}
|
|
185
184
|
};
|
|
185
|
+
/**
|
|
186
|
+
* Check if the splits information is already stored in browser LocalStorage.
|
|
187
|
+
* In this function we could add more code to check if the data is valid.
|
|
188
|
+
* @override
|
|
189
|
+
*/
|
|
190
|
+
SplitsCacheInLocal.prototype.checkCache = function () {
|
|
191
|
+
return this.getChangeNumber() > -1;
|
|
192
|
+
};
|
|
186
193
|
/**
|
|
187
194
|
* Clean Splits cache if its `lastUpdated` timestamp is older than the given `expirationTimestamp`,
|
|
188
195
|
*
|
|
@@ -205,7 +212,7 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
205
212
|
// mark cache to update the new query filter on first successful splits fetch
|
|
206
213
|
this.updateNewFilter = true;
|
|
207
214
|
// if there is cache, clear it
|
|
208
|
-
if (this.
|
|
215
|
+
if (this.checkCache())
|
|
209
216
|
this.clear();
|
|
210
217
|
}
|
|
211
218
|
catch (e) {
|
|
@@ -219,7 +226,7 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
219
226
|
return flagSets.map(function (flagSet) {
|
|
220
227
|
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
221
228
|
var flagSetFromLocalStorage = localStorage.getItem(flagSetKey);
|
|
222
|
-
return new
|
|
229
|
+
return new Set(flagSetFromLocalStorage ? JSON.parse(flagSetFromLocalStorage) : []);
|
|
223
230
|
});
|
|
224
231
|
};
|
|
225
232
|
SplitsCacheInLocal.prototype.addToFlagSets = function (featureFlag) {
|
|
@@ -231,9 +238,9 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
231
238
|
return;
|
|
232
239
|
var flagSetKey = _this.keys.buildFlagSetKey(featureFlagSet);
|
|
233
240
|
var flagSetFromLocalStorage = localStorage.getItem(flagSetKey);
|
|
234
|
-
var flagSetCache = new
|
|
241
|
+
var flagSetCache = new Set(flagSetFromLocalStorage ? JSON.parse(flagSetFromLocalStorage) : []);
|
|
235
242
|
flagSetCache.add(featureFlag.name);
|
|
236
|
-
localStorage.setItem(flagSetKey, JSON.stringify(
|
|
243
|
+
localStorage.setItem(flagSetKey, JSON.stringify(Array.from(flagSetCache)));
|
|
237
244
|
});
|
|
238
245
|
};
|
|
239
246
|
SplitsCacheInLocal.prototype.removeFromFlagSets = function (featureFlagName, flagSets) {
|
|
@@ -249,13 +256,13 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
249
256
|
var flagSetFromLocalStorage = localStorage.getItem(flagSetKey);
|
|
250
257
|
if (!flagSetFromLocalStorage)
|
|
251
258
|
return;
|
|
252
|
-
var flagSetCache = new
|
|
259
|
+
var flagSetCache = new Set(JSON.parse(flagSetFromLocalStorage));
|
|
253
260
|
flagSetCache.delete(featureFlagName);
|
|
254
261
|
if (flagSetCache.size === 0) {
|
|
255
262
|
localStorage.removeItem(flagSetKey);
|
|
256
263
|
return;
|
|
257
264
|
}
|
|
258
|
-
localStorage.setItem(flagSetKey, JSON.stringify(
|
|
265
|
+
localStorage.setItem(flagSetKey, JSON.stringify(Array.from(flagSetCache)));
|
|
259
266
|
};
|
|
260
267
|
return SplitsCacheInLocal;
|
|
261
268
|
}(AbstractSplitsCacheSync));
|
|
@@ -11,7 +11,7 @@ import { SplitsCacheInMemory } from '../inMemory/SplitsCacheInMemory';
|
|
|
11
11
|
import { DEFAULT_CACHE_EXPIRATION_IN_MILLIS } from '../../utils/constants/browser';
|
|
12
12
|
import { InMemoryStorageCSFactory } from '../inMemory/InMemoryStorageCS';
|
|
13
13
|
import { LOG_PREFIX } from './constants';
|
|
14
|
-
import { DEBUG,
|
|
14
|
+
import { DEBUG, NONE, STORAGE_LOCALSTORAGE } from '../../utils/constants';
|
|
15
15
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from '../inMemory/TelemetryCacheInMemory';
|
|
16
16
|
import { UniqueKeysCacheInMemoryCS } from '../inMemory/UniqueKeysCacheInMemoryCS';
|
|
17
17
|
import { getMatching } from '../../utils/key';
|
|
@@ -27,16 +27,13 @@ export function InLocalStorage(options) {
|
|
|
27
27
|
params.settings.log.warn(LOG_PREFIX + 'LocalStorage API is unavailable. Falling back to default MEMORY storage');
|
|
28
28
|
return InMemoryStorageCSFactory(params);
|
|
29
29
|
}
|
|
30
|
-
var
|
|
30
|
+
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;
|
|
31
31
|
var matchingKey = getMatching(settings.core.key);
|
|
32
32
|
var keys = new KeyBuilderCS(prefix, matchingKey);
|
|
33
33
|
var expirationTimestamp = Date.now() - DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
|
|
34
34
|
var splits = new SplitsCacheInLocal(settings, keys, expirationTimestamp);
|
|
35
35
|
var segments = new MySegmentsCacheInLocal(log, keys);
|
|
36
36
|
var largeSegments = new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey));
|
|
37
|
-
if (settings.mode === LOCALHOST_MODE || splits.getChangeNumber() > -1) {
|
|
38
|
-
Promise.resolve().then(onReadyFromCacheCb);
|
|
39
|
-
}
|
|
40
37
|
return {
|
|
41
38
|
splits: splits,
|
|
42
39
|
segments: segments,
|
|
@@ -6,15 +6,13 @@ import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
|
|
|
6
6
|
import { DEBUG, LOCALHOST_MODE, NONE, STORAGE_MEMORY } from '../../utils/constants';
|
|
7
7
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from './TelemetryCacheInMemory';
|
|
8
8
|
import { UniqueKeysCacheInMemoryCS } from './UniqueKeysCacheInMemoryCS';
|
|
9
|
-
import { getMatching } from '../../utils/key';
|
|
10
|
-
import { loadData } from '../dataLoader';
|
|
11
9
|
/**
|
|
12
10
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
13
11
|
*
|
|
14
12
|
* @param params parameters required by EventsCacheSync
|
|
15
13
|
*/
|
|
16
14
|
export function InMemoryStorageCSFactory(params) {
|
|
17
|
-
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation
|
|
15
|
+
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
|
|
18
16
|
var splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
19
17
|
var segments = new MySegmentsCacheInMemory();
|
|
20
18
|
var largeSegments = new MySegmentsCacheInMemory();
|
|
@@ -38,16 +36,11 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
38
36
|
this.uniqueKeys && this.uniqueKeys.clear();
|
|
39
37
|
},
|
|
40
38
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are unique per key)
|
|
41
|
-
shared: function (
|
|
42
|
-
var segments = new MySegmentsCacheInMemory();
|
|
43
|
-
var largeSegments = new MySegmentsCacheInMemory();
|
|
44
|
-
if (preloadedData) {
|
|
45
|
-
loadData(preloadedData, { segments: segments, largeSegments: largeSegments }, matchingKey);
|
|
46
|
-
}
|
|
39
|
+
shared: function () {
|
|
47
40
|
return {
|
|
48
41
|
splits: this.splits,
|
|
49
|
-
segments:
|
|
50
|
-
largeSegments:
|
|
42
|
+
segments: new MySegmentsCacheInMemory(),
|
|
43
|
+
largeSegments: new MySegmentsCacheInMemory(),
|
|
51
44
|
impressions: this.impressions,
|
|
52
45
|
impressionCounts: this.impressionCounts,
|
|
53
46
|
events: this.events,
|
|
@@ -72,11 +65,6 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
72
65
|
if (storage.uniqueKeys)
|
|
73
66
|
storage.uniqueKeys.track = noopTrack;
|
|
74
67
|
}
|
|
75
|
-
if (preloadedData) {
|
|
76
|
-
loadData(preloadedData, storage, getMatching(params.settings.core.key));
|
|
77
|
-
if (splits.getChangeNumber() > -1)
|
|
78
|
-
onReadyFromCacheCb();
|
|
79
|
-
}
|
|
80
68
|
return storage;
|
|
81
69
|
}
|
|
82
70
|
InMemoryStorageCSFactory.type = STORAGE_MEMORY;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
|
|
3
|
-
import { _Set } from '../../utils/lang/sets';
|
|
4
3
|
import { isIntegerNumber } from '../../utils/lang';
|
|
5
4
|
/**
|
|
6
5
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
@@ -16,14 +15,14 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
16
15
|
}
|
|
17
16
|
SegmentsCacheInMemory.prototype.addToSegment = function (name, segmentKeys) {
|
|
18
17
|
var values = this.segmentCache[name];
|
|
19
|
-
var keySet = values ? values : new
|
|
18
|
+
var keySet = values ? values : new Set();
|
|
20
19
|
segmentKeys.forEach(function (k) { return keySet.add(k); });
|
|
21
20
|
this.segmentCache[name] = keySet;
|
|
22
21
|
return true;
|
|
23
22
|
};
|
|
24
23
|
SegmentsCacheInMemory.prototype.removeFromSegment = function (name, segmentKeys) {
|
|
25
24
|
var values = this.segmentCache[name];
|
|
26
|
-
var keySet = values ? values : new
|
|
25
|
+
var keySet = values ? values : new Set();
|
|
27
26
|
segmentKeys.forEach(function (k) { return keySet.delete(k); });
|
|
28
27
|
this.segmentCache[name] = keySet;
|
|
29
28
|
return true;
|
|
@@ -41,7 +40,7 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
|
|
|
41
40
|
};
|
|
42
41
|
SegmentsCacheInMemory.prototype._registerSegment = function (name) {
|
|
43
42
|
if (!this.segmentCache[name]) {
|
|
44
|
-
this.segmentCache[name] = new
|
|
43
|
+
this.segmentCache[name] = new Set();
|
|
45
44
|
}
|
|
46
45
|
return true;
|
|
47
46
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber } from '../../utils/lang';
|
|
4
|
-
import { _Set } from '../../utils/lang/sets';
|
|
5
4
|
/**
|
|
6
5
|
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
7
6
|
* Supported by all JS runtimes.
|
|
@@ -92,7 +91,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
92
91
|
};
|
|
93
92
|
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
94
93
|
var _this = this;
|
|
95
|
-
return flagSets.map(function (flagSet) { return _this.flagSetsCache[flagSet] || new
|
|
94
|
+
return flagSets.map(function (flagSet) { return _this.flagSetsCache[flagSet] || new Set(); });
|
|
96
95
|
};
|
|
97
96
|
SplitsCacheInMemory.prototype.addToFlagSets = function (featureFlag) {
|
|
98
97
|
var _this = this;
|
|
@@ -102,7 +101,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
|
102
101
|
if (_this.flagSetsFilter.length > 0 && !_this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === featureFlagSet; }))
|
|
103
102
|
return;
|
|
104
103
|
if (!_this.flagSetsCache[featureFlagSet])
|
|
105
|
-
_this.flagSetsCache[featureFlagSet] = new
|
|
104
|
+
_this.flagSetsCache[featureFlagSet] = new Set([]);
|
|
106
105
|
_this.flagSetsCache[featureFlagSet].add(featureFlag.name);
|
|
107
106
|
});
|
|
108
107
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { setToArray, _Set } from '../../utils/lang/sets';
|
|
2
1
|
import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
|
|
3
2
|
/**
|
|
4
3
|
* Converts `uniqueKeys` data from cache into request payload for SS.
|
|
@@ -8,7 +7,7 @@ export function fromUniqueKeysCollector(uniqueKeys) {
|
|
|
8
7
|
var featureNames = Object.keys(uniqueKeys);
|
|
9
8
|
for (var i = 0; i < featureNames.length; i++) {
|
|
10
9
|
var featureName = featureNames[i];
|
|
11
|
-
var userKeys =
|
|
10
|
+
var userKeys = Array.from(uniqueKeys[featureName]);
|
|
12
11
|
var uniqueKeysPayload = {
|
|
13
12
|
f: featureName,
|
|
14
13
|
ks: userKeys
|
|
@@ -32,7 +31,7 @@ var UniqueKeysCacheInMemory = /** @class */ (function () {
|
|
|
32
31
|
*/
|
|
33
32
|
UniqueKeysCacheInMemory.prototype.track = function (userKey, featureName) {
|
|
34
33
|
if (!this.uniqueKeysTracker[featureName])
|
|
35
|
-
this.uniqueKeysTracker[featureName] = new
|
|
34
|
+
this.uniqueKeysTracker[featureName] = new Set();
|
|
36
35
|
var tracker = this.uniqueKeysTracker[featureName];
|
|
37
36
|
if (!tracker.has(userKey)) {
|
|
38
37
|
tracker.add(userKey);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { setToArray, _Set } from '../../utils/lang/sets';
|
|
2
1
|
import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
|
|
3
2
|
var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
4
3
|
/**
|
|
@@ -20,7 +19,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
20
19
|
*/
|
|
21
20
|
UniqueKeysCacheInMemoryCS.prototype.track = function (userKey, featureName) {
|
|
22
21
|
if (!this.uniqueKeysTracker[userKey])
|
|
23
|
-
this.uniqueKeysTracker[userKey] = new
|
|
22
|
+
this.uniqueKeysTracker[userKey] = new Set();
|
|
24
23
|
var tracker = this.uniqueKeysTracker[userKey];
|
|
25
24
|
if (!tracker.has(featureName)) {
|
|
26
25
|
tracker.add(featureName);
|
|
@@ -59,7 +58,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
59
58
|
var userKeys = Object.keys(uniqueKeys);
|
|
60
59
|
for (var k = 0; k < userKeys.length; k++) {
|
|
61
60
|
var userKey = userKeys[k];
|
|
62
|
-
var featureNames =
|
|
61
|
+
var featureNames = Array.from(uniqueKeys[userKey]);
|
|
63
62
|
var uniqueKeysPayload = {
|
|
64
63
|
k: userKey,
|
|
65
64
|
fs: featureNames
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import ioredis from 'ioredis';
|
|
3
3
|
import { merge, isString } from '../../utils/lang';
|
|
4
|
-
import { _Set, setToArray } from '../../utils/lang/sets';
|
|
5
4
|
import { thenable } from '../../utils/promise/thenable';
|
|
6
5
|
import { timeout } from '../../utils/promise/timeout';
|
|
7
6
|
var LOG_PREFIX = 'storage:redis-adapter: ';
|
|
@@ -33,7 +32,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
33
32
|
_this.log = log;
|
|
34
33
|
_this._options = options;
|
|
35
34
|
_this._notReadyCommandsQueue = [];
|
|
36
|
-
_this._runningCommands = new
|
|
35
|
+
_this._runningCommands = new Set();
|
|
37
36
|
_this._listenToEvents();
|
|
38
37
|
_this._setTimeoutWrappers();
|
|
39
38
|
_this._setDisconnectWrapper();
|
|
@@ -126,7 +125,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
126
125
|
setTimeout(function deferredDisconnect() {
|
|
127
126
|
if (instance._runningCommands.size > 0) {
|
|
128
127
|
instance.log.info(LOG_PREFIX + ("Attempting to disconnect but there are " + instance._runningCommands.size + " commands still waiting for resolution. Defering disconnection until those finish."));
|
|
129
|
-
Promise.all(
|
|
128
|
+
Promise.all(Array.from(instance._runningCommands))
|
|
130
129
|
.then(function () {
|
|
131
130
|
instance.log.debug(LOG_PREFIX + 'Pending commands finished successfully, disconnecting.');
|
|
132
131
|
originalMethod.apply(instance, params);
|
|
@@ -2,7 +2,7 @@ import { __extends, __spreadArray } from "tslib";
|
|
|
2
2
|
import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
|
|
3
3
|
import { LOG_PREFIX } from './constants';
|
|
4
4
|
import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
|
|
5
|
-
import {
|
|
5
|
+
import { returnDifference } from '../../utils/lang/sets';
|
|
6
6
|
/**
|
|
7
7
|
* Discard errors for an answer of multiple operations.
|
|
8
8
|
*/
|
|
@@ -197,7 +197,7 @@ var SplitsCacheInRedis = /** @class */ (function (_super) {
|
|
|
197
197
|
return value;
|
|
198
198
|
_this.log.error(LOG_PREFIX + ("Could not read result from get members of flag set " + flagSets[index] + " due to an error: " + e));
|
|
199
199
|
}); })
|
|
200
|
-
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
200
|
+
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
201
201
|
};
|
|
202
202
|
/**
|
|
203
203
|
* Check traffic type existence.
|
|
@@ -2,7 +2,6 @@ import { findLatencyIndex } from '../findLatencyIndex';
|
|
|
2
2
|
import { getTelemetryConfigStats } from '../../sync/submitters/telemetrySubmitter';
|
|
3
3
|
import { CONSUMER_MODE, STORAGE_REDIS } from '../../utils/constants';
|
|
4
4
|
import { isNaNNumber, isString } from '../../utils/lang';
|
|
5
|
-
import { _Map } from '../../utils/lang/maps';
|
|
6
5
|
import { MAX_LATENCY_BUCKET_COUNT, newBuckets } from '../inMemory/TelemetryCacheInMemory';
|
|
7
6
|
import { parseLatencyField, parseExceptionField, parseMetadata } from '../utils';
|
|
8
7
|
var TelemetryCacheInRedis = /** @class */ (function () {
|
|
@@ -39,7 +38,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
39
38
|
TelemetryCacheInRedis.prototype.popLatencies = function () {
|
|
40
39
|
var _this = this;
|
|
41
40
|
return this.redis.hgetall(this.keys.latencyPrefix).then(function (latencies) {
|
|
42
|
-
var result = new
|
|
41
|
+
var result = new Map();
|
|
43
42
|
Object.keys(latencies).forEach(function (field) {
|
|
44
43
|
var parsedField = parseLatencyField(field);
|
|
45
44
|
if (isString(parsedField)) {
|
|
@@ -71,7 +70,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
71
70
|
TelemetryCacheInRedis.prototype.popExceptions = function () {
|
|
72
71
|
var _this = this;
|
|
73
72
|
return this.redis.hgetall(this.keys.exceptionPrefix).then(function (exceptions) {
|
|
74
|
-
var result = new
|
|
73
|
+
var result = new Map();
|
|
75
74
|
Object.keys(exceptions).forEach(function (field) {
|
|
76
75
|
var parsedField = parseExceptionField(field);
|
|
77
76
|
if (isString(parsedField)) {
|
|
@@ -98,7 +97,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
98
97
|
TelemetryCacheInRedis.prototype.popConfigs = function () {
|
|
99
98
|
var _this = this;
|
|
100
99
|
return this.redis.hgetall(this.keys.initPrefix).then(function (configs) {
|
|
101
|
-
var result = new
|
|
100
|
+
var result = new Map();
|
|
102
101
|
Object.keys(configs).forEach(function (field) {
|
|
103
102
|
var parsedField = parseMetadata(field);
|
|
104
103
|
if (isString(parsedField)) {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import { UniqueKeysCacheInMemory } from '../inMemory/UniqueKeysCacheInMemory';
|
|
3
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
4
3
|
import { DEFAULT_CACHE_SIZE, REFRESH_RATE, TTL_REFRESH } from './constants';
|
|
5
4
|
import { LOG_PREFIX } from './constants';
|
|
6
5
|
var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
@@ -22,7 +21,7 @@ var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
|
22
21
|
if (!featureNames.length)
|
|
23
22
|
return Promise.resolve(false);
|
|
24
23
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
25
|
-
var featureKeys =
|
|
24
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
26
25
|
var uniqueKeysPayload = {
|
|
27
26
|
f: featureName,
|
|
28
27
|
ks: featureKeys
|
|
@@ -2,7 +2,7 @@ import { __extends, __spreadArray } from "tslib";
|
|
|
2
2
|
import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
|
|
3
3
|
import { LOG_PREFIX } from './constants';
|
|
4
4
|
import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
|
|
5
|
-
import {
|
|
5
|
+
import { returnDifference } from '../../utils/lang/sets';
|
|
6
6
|
/**
|
|
7
7
|
* ISplitsCacheAsync implementation for pluggable storages.
|
|
8
8
|
*/
|
|
@@ -167,7 +167,7 @@ var SplitsCachePluggable = /** @class */ (function (_super) {
|
|
|
167
167
|
return Promise.all(flagSets.map(function (flagSet) {
|
|
168
168
|
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
169
169
|
return _this.wrapper.getItems(flagSetKey).catch(function () { return []; });
|
|
170
|
-
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
170
|
+
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
171
171
|
};
|
|
172
172
|
/**
|
|
173
173
|
* Check traffic type existence.
|
|
@@ -2,7 +2,6 @@ import { findLatencyIndex } from '../findLatencyIndex';
|
|
|
2
2
|
import { getTelemetryConfigStats } from '../../sync/submitters/telemetrySubmitter';
|
|
3
3
|
import { CONSUMER_MODE, STORAGE_PLUGGABLE } from '../../utils/constants';
|
|
4
4
|
import { isString, isNaNNumber } from '../../utils/lang';
|
|
5
|
-
import { _Map } from '../../utils/lang/maps';
|
|
6
5
|
import { MAX_LATENCY_BUCKET_COUNT, newBuckets } from '../inMemory/TelemetryCacheInMemory';
|
|
7
6
|
import { parseLatencyField, parseExceptionField, parseMetadata } from '../utils';
|
|
8
7
|
var TelemetryCachePluggable = /** @class */ (function () {
|
|
@@ -38,7 +37,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
38
37
|
return this.wrapper.getKeysByPrefix(this.keys.latencyPrefix).then(function (latencyKeys) {
|
|
39
38
|
return latencyKeys.length ?
|
|
40
39
|
_this.wrapper.getMany(latencyKeys).then(function (latencies) {
|
|
41
|
-
var result = new
|
|
40
|
+
var result = new Map();
|
|
42
41
|
for (var i = 0; i < latencyKeys.length; i++) {
|
|
43
42
|
var field = latencyKeys[i].split('::')[1];
|
|
44
43
|
var parsedField = parseLatencyField(field);
|
|
@@ -65,7 +64,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
65
64
|
return Promise.all(latencyKeys.map(function (latencyKey) { return _this.wrapper.del(latencyKey); })).then(function () { return result; });
|
|
66
65
|
}) :
|
|
67
66
|
// If latencyKeys is empty, return an empty map.
|
|
68
|
-
new
|
|
67
|
+
new Map();
|
|
69
68
|
});
|
|
70
69
|
};
|
|
71
70
|
/**
|
|
@@ -77,7 +76,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
77
76
|
return this.wrapper.getKeysByPrefix(this.keys.exceptionPrefix).then(function (exceptionKeys) {
|
|
78
77
|
return exceptionKeys.length ?
|
|
79
78
|
_this.wrapper.getMany(exceptionKeys).then(function (exceptions) {
|
|
80
|
-
var result = new
|
|
79
|
+
var result = new Map();
|
|
81
80
|
for (var i = 0; i < exceptionKeys.length; i++) {
|
|
82
81
|
var field = exceptionKeys[i].split('::')[1];
|
|
83
82
|
var parsedField = parseExceptionField(field);
|
|
@@ -99,7 +98,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
99
98
|
return Promise.all(exceptionKeys.map(function (exceptionKey) { return _this.wrapper.del(exceptionKey); })).then(function () { return result; });
|
|
100
99
|
}) :
|
|
101
100
|
// If exceptionKeys is empty, return an empty map.
|
|
102
|
-
new
|
|
101
|
+
new Map();
|
|
103
102
|
});
|
|
104
103
|
};
|
|
105
104
|
/**
|
|
@@ -111,7 +110,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
111
110
|
return this.wrapper.getKeysByPrefix(this.keys.initPrefix).then(function (configKeys) {
|
|
112
111
|
return configKeys.length ?
|
|
113
112
|
_this.wrapper.getMany(configKeys).then(function (configs) {
|
|
114
|
-
var result = new
|
|
113
|
+
var result = new Map();
|
|
115
114
|
for (var i = 0; i < configKeys.length; i++) {
|
|
116
115
|
var field = configKeys[i].split('::')[1];
|
|
117
116
|
var parsedField = parseMetadata(field);
|
|
@@ -131,7 +130,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
131
130
|
return Promise.all(configKeys.map(function (configKey) { return _this.wrapper.del(configKey); })).then(function () { return result; });
|
|
132
131
|
}) :
|
|
133
132
|
// If configKeys is empty, return an empty map.
|
|
134
|
-
new
|
|
133
|
+
new Map();
|
|
135
134
|
});
|
|
136
135
|
};
|
|
137
136
|
return TelemetryCachePluggable;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
2
|
import { UniqueKeysCacheInMemory } from '../inMemory/UniqueKeysCacheInMemory';
|
|
3
|
-
import { setToArray } from '../../utils/lang/sets';
|
|
4
3
|
import { DEFAULT_CACHE_SIZE, REFRESH_RATE } from '../inRedis/constants';
|
|
5
4
|
import { LOG_PREFIX } from './constants';
|
|
6
5
|
var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
@@ -22,7 +21,7 @@ var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
|
22
21
|
if (!featureNames.length)
|
|
23
22
|
return Promise.resolve(false);
|
|
24
23
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
25
|
-
var featureKeys =
|
|
24
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
26
25
|
var uniqueKeysPayload = {
|
|
27
26
|
f: featureName,
|
|
28
27
|
ks: featureKeys
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { startsWith, toNumber } from '../../utils/lang';
|
|
2
|
-
import { setToArray, _Set } from '../../utils/lang/sets';
|
|
3
2
|
/**
|
|
4
3
|
* Creates a IPluggableStorageWrapper implementation that stores items in memory.
|
|
5
4
|
* The `_cache` property is the object were items are stored.
|
|
@@ -87,15 +86,15 @@ export function inMemoryWrapperFactory(connDelay) {
|
|
|
87
86
|
var set = _cache[key];
|
|
88
87
|
if (!set)
|
|
89
88
|
return Promise.resolve(false);
|
|
90
|
-
if (set instanceof
|
|
89
|
+
if (set instanceof Set)
|
|
91
90
|
return Promise.resolve(set.has(item));
|
|
92
91
|
return Promise.reject('key is not a set');
|
|
93
92
|
},
|
|
94
93
|
addItems: function (key, items) {
|
|
95
94
|
if (!(key in _cache))
|
|
96
|
-
_cache[key] = new
|
|
95
|
+
_cache[key] = new Set();
|
|
97
96
|
var set = _cache[key];
|
|
98
|
-
if (set instanceof
|
|
97
|
+
if (set instanceof Set) {
|
|
99
98
|
items.forEach(function (item) { return set.add(item); });
|
|
100
99
|
return Promise.resolve();
|
|
101
100
|
}
|
|
@@ -103,9 +102,9 @@ export function inMemoryWrapperFactory(connDelay) {
|
|
|
103
102
|
},
|
|
104
103
|
removeItems: function (key, items) {
|
|
105
104
|
if (!(key in _cache))
|
|
106
|
-
_cache[key] = new
|
|
105
|
+
_cache[key] = new Set();
|
|
107
106
|
var set = _cache[key];
|
|
108
|
-
if (set instanceof
|
|
107
|
+
if (set instanceof Set) {
|
|
109
108
|
items.forEach(function (item) { return set.delete(item); });
|
|
110
109
|
return Promise.resolve();
|
|
111
110
|
}
|
|
@@ -115,8 +114,8 @@ export function inMemoryWrapperFactory(connDelay) {
|
|
|
115
114
|
var set = _cache[key];
|
|
116
115
|
if (!set)
|
|
117
116
|
return Promise.resolve([]);
|
|
118
|
-
if (set instanceof
|
|
119
|
-
return Promise.resolve(
|
|
117
|
+
if (set instanceof Set)
|
|
118
|
+
return Promise.resolve(Array.from(set));
|
|
120
119
|
return Promise.reject('key is not a set');
|
|
121
120
|
},
|
|
122
121
|
// always connects and disconnects
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { forOwn } from '../../../utils/lang';
|
|
2
2
|
import { syncTaskFactory } from '../../syncTask';
|
|
3
3
|
import { CONTROL } from '../../../utils/constants';
|
|
4
|
-
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
4
|
+
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
|
|
5
5
|
import { SYNC_OFFLINE_DATA, ERROR_SYNC_OFFLINE_LOADING } from '../../../logger/constants';
|
|
6
6
|
/**
|
|
7
7
|
* Offline equivalent of `splitChangesUpdaterFactory`
|
|
@@ -43,8 +43,13 @@ export function fromObjectUpdaterFactory(splitsParser, storage, readiness, setti
|
|
|
43
43
|
readiness.splits.emit(SDK_SPLITS_ARRIVED);
|
|
44
44
|
if (startingUp) {
|
|
45
45
|
startingUp = false;
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
Promise.resolve(splitsCache.checkCache()).then(function (cacheReady) {
|
|
47
|
+
// Emits SDK_READY_FROM_CACHE
|
|
48
|
+
if (cacheReady)
|
|
49
|
+
readiness.splits.emit(SDK_SPLITS_CACHE_LOADED);
|
|
50
|
+
// Emits SDK_READY
|
|
51
|
+
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
52
|
+
});
|
|
48
53
|
}
|
|
49
54
|
return true;
|
|
50
55
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
|
|
2
2
|
import { segmentsSyncTaskFactory } from './syncTasks/segmentsSyncTask';
|
|
3
|
-
import { thenable } from '../../utils/promise/thenable';
|
|
4
3
|
import { POLLING_START, POLLING_STOP, LOG_PREFIX_SYNC_POLLING } from '../../logger/constants';
|
|
5
4
|
/**
|
|
6
5
|
* Expose start / stop mechanism for pulling data from services.
|
|
@@ -19,9 +18,10 @@ export function pollingManagerSSFactory(params) {
|
|
|
19
18
|
log.debug(LOG_PREFIX_SYNC_POLLING + ("Splits will be refreshed each " + settings.scheduler.featuresRefreshRate + " millis"));
|
|
20
19
|
log.debug(LOG_PREFIX_SYNC_POLLING + ("Segments will be refreshed each " + settings.scheduler.segmentsRefreshRate + " millis"));
|
|
21
20
|
var startingUp = splitsSyncTask.start();
|
|
22
|
-
if (
|
|
21
|
+
if (startingUp) {
|
|
23
22
|
startingUp.then(function () {
|
|
24
|
-
|
|
23
|
+
if (splitsSyncTask.isRunning())
|
|
24
|
+
segmentsSyncTask.start();
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
},
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { _Set, setToArray } from '../../../utils/lang/sets';
|
|
2
1
|
import { timeout } from '../../../utils/promise/timeout';
|
|
3
|
-
import { SDK_SPLITS_ARRIVED } from '../../../readiness/constants';
|
|
2
|
+
import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
|
|
4
3
|
import { SYNC_SPLITS_FETCH, SYNC_SPLITS_NEW, SYNC_SPLITS_REMOVED, SYNC_SPLITS_SEGMENTS, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
|
|
5
4
|
import { startsWith } from '../../../utils/lang';
|
|
6
5
|
import { IN_SEGMENT } from '../../../utils/constants';
|
|
@@ -20,7 +19,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
20
19
|
*/
|
|
21
20
|
export function parseSegments(_a) {
|
|
22
21
|
var conditions = _a.conditions;
|
|
23
|
-
var segments = new
|
|
22
|
+
var segments = new Set();
|
|
24
23
|
for (var i = 0; i < conditions.length; i++) {
|
|
25
24
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
26
25
|
matchers.forEach(function (matcher) {
|
|
@@ -55,7 +54,7 @@ function matchFilters(featureFlag, filters) {
|
|
|
55
54
|
* Exported for testing purposes.
|
|
56
55
|
*/
|
|
57
56
|
export function computeSplitsMutation(entries, filters) {
|
|
58
|
-
var segments = new
|
|
57
|
+
var segments = new Set();
|
|
59
58
|
var computed = entries.reduce(function (accum, split) {
|
|
60
59
|
if (split.status === 'ACTIVE' && matchFilters(split, filters)) {
|
|
61
60
|
accum.added.push([split.name, split]);
|
|
@@ -68,7 +67,7 @@ export function computeSplitsMutation(entries, filters) {
|
|
|
68
67
|
}
|
|
69
68
|
return accum;
|
|
70
69
|
}, { added: [], removed: [], segments: [] });
|
|
71
|
-
computed.segments =
|
|
70
|
+
computed.segments = Array.from(segments);
|
|
72
71
|
return computed;
|
|
73
72
|
}
|
|
74
73
|
/**
|
|
@@ -121,7 +120,7 @@ export function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, seg
|
|
|
121
120
|
function _splitChangesUpdater(since, retry) {
|
|
122
121
|
if (retry === void 0) { retry = 0; }
|
|
123
122
|
log.debug(SYNC_SPLITS_FETCH, [since]);
|
|
124
|
-
|
|
123
|
+
var fetcherPromise = Promise.resolve(splitUpdateNotification ?
|
|
125
124
|
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
|
|
126
125
|
splitChangesFetcher(since, noCache, till, _promiseDecorator))
|
|
127
126
|
.then(function (splitChanges) {
|
|
@@ -165,6 +164,15 @@ export function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, seg
|
|
|
165
164
|
}
|
|
166
165
|
return false;
|
|
167
166
|
});
|
|
167
|
+
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
|
|
168
|
+
// Wrapping in a promise since checkCache can be async.
|
|
169
|
+
if (splitsEventEmitter && startingUp) {
|
|
170
|
+
Promise.resolve(splits.checkCache()).then(function (isCacheReady) {
|
|
171
|
+
if (isCacheReady)
|
|
172
|
+
splitsEventEmitter.emit(SDK_SPLITS_CACHE_LOADED);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return fetcherPromise;
|
|
168
176
|
}
|
|
169
177
|
var sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
|
|
170
178
|
return sincePromise.then(_splitChangesUpdater);
|
|
@@ -8,7 +8,6 @@ function Uint8ArrayToString(myUint8Arr) {
|
|
|
8
8
|
}
|
|
9
9
|
function StringToUint8Array(myString) {
|
|
10
10
|
var charCodes = myString.split('').map(function (e) { return e.charCodeAt(0); });
|
|
11
|
-
// eslint-disable-next-line compat/compat
|
|
12
11
|
return new Uint8Array(charCodes);
|
|
13
12
|
}
|
|
14
13
|
/**
|
|
@@ -12,7 +12,6 @@ import { MEMBERSHIPS_MS_UPDATE, MEMBERSHIPS_LS_UPDATE, PUSH_NONRETRYABLE_ERROR,
|
|
|
12
12
|
import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MEMBERSHIPS_UPDATE, STREAMING_PARSING_SPLIT_UPDATE } from '../../logger/constants';
|
|
13
13
|
import { UpdateStrategy } from './SSEHandler/types';
|
|
14
14
|
import { getDelay, isInBitmap, parseBitmap, parseFFUpdatePayload, parseKeyList } from './parseUtils';
|
|
15
|
-
import { _Set } from '../../utils/lang/sets';
|
|
16
15
|
import { hash64 } from '../../utils/murmur3/murmur3_64';
|
|
17
16
|
import { TOKEN_REFRESH, AUTH_REJECTION } from '../../utils/constants';
|
|
18
17
|
/**
|
|
@@ -218,8 +217,8 @@ export function pushManagerFactory(params, pollingManager) {
|
|
|
218
217
|
var keyList = void 0, added_1, removed_1;
|
|
219
218
|
try {
|
|
220
219
|
keyList = parseKeyList(parsedData.d, parsedData.c);
|
|
221
|
-
added_1 = new
|
|
222
|
-
removed_1 = new
|
|
220
|
+
added_1 = new Set(keyList.a);
|
|
221
|
+
removed_1 = new Set(keyList.r);
|
|
223
222
|
}
|
|
224
223
|
catch (e) {
|
|
225
224
|
log.warn(STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { _Map } from '../lang/maps';
|
|
2
1
|
import { LinkedList, Node } from './LinkedList';
|
|
3
2
|
var LRUCache = /** @class */ (function () {
|
|
4
3
|
function LRUCache(maxSize) {
|
|
5
4
|
this.maxLen = maxSize || 1;
|
|
6
|
-
this.items = new
|
|
5
|
+
this.items = new Map();
|
|
7
6
|
this.lru = new LinkedList();
|
|
8
7
|
}
|
|
9
8
|
LRUCache.prototype.get = function (key) {
|