@splitsoftware/splitio-commons 3.0.0-rc.0 → 3.0.0-rc.1
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 +8 -3
- package/cjs/evaluator/index.js +11 -11
- package/cjs/logger/constants.js +4 -4
- package/cjs/logger/messages/warn.js +0 -1
- package/cjs/readiness/constants.js +4 -4
- package/cjs/readiness/readinessManager.js +22 -22
- package/cjs/readiness/sdkReadinessManager.js +0 -16
- package/cjs/sdkClient/sdkLifecycle.js +2 -1
- package/cjs/sdkClient/trackMethod.js +2 -2
- package/cjs/sdkFactory/index.js +5 -5
- package/cjs/sdkManager/index.js +2 -2
- package/cjs/services/authProvider.js +67 -0
- package/cjs/services/secureSplitHttpClient.js +39 -0
- package/cjs/services/splitApi.js +7 -2
- package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
- package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
- package/cjs/storages/KeyBuilder.js +6 -6
- package/cjs/storages/KeyBuilderCS.js +5 -5
- package/cjs/storages/KeyBuilderSS.js +2 -2
- package/cjs/storages/getRolloutPlan.js +3 -3
- package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +194 -0
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +9 -9
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +121 -0
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +4 -4
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +3 -3
- package/cjs/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +77 -77
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +212 -0
- package/cjs/storages/pluggable/index.js +2 -2
- package/cjs/storages/setRolloutPlan.js +5 -5
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +7 -7
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +1 -1
- package/cjs/sync/polling/updaters/definitionChangesUpdater.js +8 -8
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -1
- package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +15 -15
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/pushManager.js +13 -13
- package/cjs/sync/submitters/telemetrySubmitter.js +1 -2
- package/cjs/sync/syncManagerOnline.js +4 -4
- package/cjs/utils/Backoff.js +20 -0
- package/cjs/utils/lang/sets.js +4 -4
- package/cjs/utils/settingsValidation/url.js +1 -1
- package/esm/evaluator/index.js +11 -11
- package/esm/logger/constants.js +1 -1
- package/esm/logger/messages/warn.js +0 -1
- package/esm/readiness/constants.js +3 -3
- package/esm/readiness/readinessManager.js +23 -23
- package/esm/readiness/sdkReadinessManager.js +1 -17
- package/esm/sdkClient/sdkLifecycle.js +2 -1
- package/esm/sdkClient/trackMethod.js +2 -2
- package/esm/sdkFactory/index.js +6 -6
- package/esm/sdkManager/index.js +2 -2
- package/esm/services/authProvider.js +63 -0
- package/esm/services/secureSplitHttpClient.js +35 -0
- package/esm/services/splitApi.js +7 -2
- package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
- package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
- package/esm/storages/KeyBuilder.js +6 -6
- package/esm/storages/KeyBuilderCS.js +5 -5
- package/esm/storages/KeyBuilderSS.js +2 -2
- package/esm/storages/getRolloutPlan.js +3 -3
- package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +191 -0
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +6 -6
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +118 -0
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +3 -3
- package/esm/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +76 -76
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +209 -0
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/storages/setRolloutPlan.js +5 -5
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +1 -1
- package/esm/sync/polling/pollingManagerCS.js +4 -4
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +1 -1
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +9 -9
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +1 -1
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
- package/esm/sync/streaming/SSEHandler/index.js +2 -2
- package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +14 -14
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/pushManager.js +14 -14
- package/esm/sync/submitters/telemetrySubmitter.js +1 -2
- package/esm/sync/syncManagerOnline.js +3 -3
- package/esm/utils/Backoff.js +20 -0
- package/esm/utils/lang/sets.js +4 -4
- package/esm/utils/settingsValidation/url.js +1 -1
- package/package.json +1 -1
- package/src/dtos/types.ts +2 -2
- package/src/evaluator/index.ts +11 -11
- package/src/logger/constants.ts +1 -1
- package/src/logger/messages/warn.ts +0 -1
- package/src/readiness/constants.ts +3 -3
- package/src/readiness/readinessManager.ts +22 -22
- package/src/readiness/sdkReadinessManager.ts +1 -16
- package/src/readiness/types.ts +10 -16
- package/src/sdkClient/sdkLifecycle.ts +2 -1
- package/src/sdkClient/trackMethod.ts +2 -2
- package/src/sdkFactory/index.ts +5 -5
- package/src/sdkManager/index.ts +6 -6
- package/src/services/authProvider.ts +86 -0
- package/src/services/secureSplitHttpClient.ts +44 -0
- package/src/services/splitApi.ts +9 -3
- package/src/services/types.ts +4 -0
- package/src/storages/AbstractDefinitionsCacheAsync.ts +63 -0
- package/src/storages/AbstractDefinitionsCacheSync.ts +95 -0
- package/src/storages/KeyBuilder.ts +6 -6
- package/src/storages/KeyBuilderCS.ts +6 -6
- package/src/storages/KeyBuilderSS.ts +2 -2
- package/src/storages/getRolloutPlan.ts +3 -3
- package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +234 -0
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +6 -6
- package/src/storages/inLocalStorage/index.ts +6 -6
- package/src/storages/inLocalStorage/validateCache.ts +4 -4
- package/src/storages/inMemory/DefinitionsCacheInMemory.ts +130 -0
- package/src/storages/inMemory/InMemoryStorage.ts +4 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -5
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +1 -1
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +3 -3
- package/src/storages/inRedis/{SplitsCacheInRedis.ts → DefinitionsCacheInRedis.ts} +67 -67
- package/src/storages/inRedis/index.ts +2 -2
- package/src/storages/pluggable/DefinitionsCachePluggable.ts +230 -0
- package/src/storages/pluggable/index.ts +2 -2
- package/src/storages/setRolloutPlan.ts +7 -7
- package/src/storages/types.ts +19 -19
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +8 -8
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +3 -3
- package/src/sync/polling/pollingManagerCS.ts +4 -4
- package/src/sync/polling/syncTasks/definitionsSyncTask.ts +1 -1
- package/src/sync/polling/types.ts +1 -1
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +11 -11
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +1 -1
- package/src/sync/streaming/AuthClient/index.ts +2 -2
- package/src/sync/streaming/AuthClient/types.ts +14 -11
- package/src/sync/streaming/SSEClient/index.ts +2 -2
- package/src/sync/streaming/SSEClient/types.ts +2 -2
- package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +2 -2
- package/src/sync/streaming/SSEHandler/index.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.ts → DefinitionsUpdateWorker.ts} +16 -16
- package/src/sync/streaming/constants.ts +2 -2
- package/src/sync/streaming/pushManager.ts +16 -16
- package/src/sync/streaming/types.ts +2 -2
- package/src/sync/submitters/telemetrySubmitter.ts +1 -2
- package/src/sync/syncManagerOnline.ts +3 -3
- package/src/utils/Backoff.ts +21 -0
- package/src/utils/inputValidation/trafficTypeExistence.ts +2 -2
- package/src/utils/jwt/types.ts +1 -1
- package/src/utils/lang/sets.ts +4 -2
- package/src/utils/settingsValidation/url.ts +1 -1
- package/types/splitio.d.ts +23 -5
- package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
- package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
- package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
- package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
- package/esm/storages/AbstractSplitsCacheSync.js +0 -71
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
- package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
- package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
- package/src/storages/AbstractSplitsCacheAsync.ts +0 -63
- package/src/storages/AbstractSplitsCacheSync.ts +0 -95
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +0 -234
- package/src/storages/inMemory/SplitsCacheInMemory.ts +0 -130
- package/src/storages/pluggable/SplitsCachePluggable.ts +0 -230
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PluggableStorage = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var KeyBuilderSS_1 = require("../KeyBuilderSS");
|
|
6
|
-
var
|
|
6
|
+
var DefinitionsCachePluggable_1 = require("./DefinitionsCachePluggable");
|
|
7
7
|
var SegmentsCachePluggable_1 = require("./SegmentsCachePluggable");
|
|
8
8
|
var ImpressionsCachePluggable_1 = require("./ImpressionsCachePluggable");
|
|
9
9
|
var EventsCachePluggable_1 = require("./EventsCachePluggable");
|
|
@@ -106,7 +106,7 @@ function PluggableStorage(options) {
|
|
|
106
106
|
return e; // Propagate error for shared clients
|
|
107
107
|
});
|
|
108
108
|
return {
|
|
109
|
-
|
|
109
|
+
definitions: new DefinitionsCachePluggable_1.DefinitionsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
110
110
|
rbSegments: new RBSegmentsCachePluggable_1.RBSegmentsCachePluggable(log, keys, wrapper),
|
|
111
111
|
segments: new SegmentsCachePluggable_1.SegmentsCachePluggable(log, keys, wrapper),
|
|
112
112
|
impressions: isPartialConsumer ? new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize) : new ImpressionsCachePluggable_1.ImpressionsCachePluggable(log, keys.buildImpressionsKey(), wrapper, metadata),
|
|
@@ -24,16 +24,16 @@ exports.validateRolloutPlan = validateRolloutPlan;
|
|
|
24
24
|
* Otherwise, the storage is handled as a server-side storage (segments is an instance of SegmentsCache).
|
|
25
25
|
*/
|
|
26
26
|
function setRolloutPlan(log, rolloutPlan, storage, matchingKey) {
|
|
27
|
-
var
|
|
27
|
+
var definitions = storage.definitions, rbSegments = storage.rbSegments, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
28
28
|
var _a = rolloutPlan.splitChanges, ff = _a.ff, rbs = _a.rbs;
|
|
29
29
|
log.debug("storage: set feature flags and segments".concat(matchingKey ? " for key ".concat(matchingKey) : ''));
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
if (definitions && ff) {
|
|
31
|
+
definitions.clear();
|
|
32
|
+
definitions.update(ff.d || [], [], ff.t);
|
|
33
33
|
}
|
|
34
34
|
if (rbSegments && rbs) {
|
|
35
35
|
rbSegments.clear();
|
|
36
|
-
rbSegments.update(rbs.d, [], rbs.t);
|
|
36
|
+
rbSegments.update(rbs.d || [], [], rbs.t);
|
|
37
37
|
}
|
|
38
38
|
var segmentChanges = rolloutPlan.segmentChanges;
|
|
39
39
|
if (matchingKey) { // add memberships data (client-side)
|
|
@@ -10,7 +10,7 @@ var constants_3 = require("../../../logger/constants");
|
|
|
10
10
|
* Offline equivalent of `splitChangesUpdaterFactory`
|
|
11
11
|
*/
|
|
12
12
|
function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
13
|
-
var log = settings.log,
|
|
13
|
+
var log = settings.log, definitions = storage.definitions;
|
|
14
14
|
var startingUp = true;
|
|
15
15
|
return function objectUpdater() {
|
|
16
16
|
var splits = [];
|
|
@@ -39,16 +39,16 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
return Promise.all([
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
definitions.clear(),
|
|
43
|
+
definitions.update(splits, [], Date.now())
|
|
44
44
|
]).then(function () {
|
|
45
|
-
readiness.
|
|
45
|
+
readiness.definitions.emit(constants_2.SDK_DEFINITIONS_ARRIVED, { type: constants_2.FLAGS_UPDATE, names: [] });
|
|
46
46
|
if (startingUp) {
|
|
47
47
|
startingUp = false;
|
|
48
48
|
Promise.resolve(storage.validateCache ? storage.validateCache() : { initialCacheLoad: true /* Fallback: assume initial load when validateCache doesn't exist */ }).then(function (cacheMetadata) {
|
|
49
49
|
// Emits SDK_READY_FROM_CACHE
|
|
50
50
|
if (!cacheMetadata.initialCacheLoad) {
|
|
51
|
-
readiness.
|
|
51
|
+
readiness.definitions.emit(constants_2.SDK_DEFINITIONS_CACHE_LOADED, cacheMetadata);
|
|
52
52
|
}
|
|
53
53
|
// Emits SDK_READY
|
|
54
54
|
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED, { type: constants_2.SEGMENTS_UPDATE, names: [] });
|
|
@@ -61,7 +61,7 @@ function splitChangesFetcherFactory(params) {
|
|
|
61
61
|
lastProxyCheckTimestamp = undefined;
|
|
62
62
|
return splitChangesFetcher(-1, undefined, undefined, -1)
|
|
63
63
|
.then(function (splitChangesResponse) {
|
|
64
|
-
return Promise.all([storage.
|
|
64
|
+
return Promise.all([storage.definitions.clear(), storage.rbSegments.clear()])
|
|
65
65
|
.then(function () { return splitChangesResponse; });
|
|
66
66
|
});
|
|
67
67
|
}
|
|
@@ -7,7 +7,7 @@ var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
|
|
|
7
7
|
var key_1 = require("../../utils/key");
|
|
8
8
|
var constants_1 = require("../../readiness/constants");
|
|
9
9
|
var constants_2 = require("../../logger/constants");
|
|
10
|
-
var
|
|
10
|
+
var AbstractDefinitionsCacheSync_1 = require("../../storages/AbstractDefinitionsCacheSync");
|
|
11
11
|
/**
|
|
12
12
|
* Expose start / stop mechanism for polling data from services.
|
|
13
13
|
* For client-side API with multiple clients.
|
|
@@ -32,10 +32,10 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
// smart pausing
|
|
35
|
-
readiness.
|
|
35
|
+
readiness.definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, function () {
|
|
36
36
|
if (!definitionsSyncTask.isRunning())
|
|
37
37
|
return; // noop if not doing polling
|
|
38
|
-
var usingSegments = (0,
|
|
38
|
+
var usingSegments = (0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage);
|
|
39
39
|
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
|
|
40
40
|
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
|
|
41
41
|
if (usingSegments) {
|
|
@@ -50,13 +50,13 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
50
50
|
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
51
51
|
// smart ready
|
|
52
52
|
function smartReady(metadata) {
|
|
53
|
-
if (!readiness.isReady() && !(0,
|
|
53
|
+
if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
54
54
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
|
|
55
55
|
}
|
|
56
|
-
if (!(0,
|
|
56
|
+
if (!(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
57
57
|
setTimeout(smartReady, 0);
|
|
58
58
|
else
|
|
59
|
-
readiness.
|
|
59
|
+
readiness.definitions.once(constants_1.SDK_DEFINITIONS_ARRIVED, smartReady);
|
|
60
60
|
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
61
61
|
return mySegmentsSyncTask;
|
|
62
62
|
}
|
|
@@ -67,7 +67,7 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
67
67
|
start: function () {
|
|
68
68
|
log.info(constants_2.POLLING_START);
|
|
69
69
|
definitionsSyncTask.start();
|
|
70
|
-
if ((0,
|
|
70
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
71
71
|
startMySegmentsSyncTasks();
|
|
72
72
|
},
|
|
73
73
|
// Stop periodic fetching (polling)
|
|
@@ -7,6 +7,6 @@ var definitionChangesUpdater_1 = require("../updaters/definitionChangesUpdater")
|
|
|
7
7
|
* Creates a sync task that periodically executes a `definitionChangesUpdater` task
|
|
8
8
|
*/
|
|
9
9
|
function definitionsSyncTaskFactory(definitionChangesFetcher, storage, readiness, settings, isClientSide) {
|
|
10
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, definitionChangesUpdater_1.definitionChangesUpdaterFactory)(settings.log, definitionChangesFetcher, storage, settings.sync.__splitFiltersValidation, readiness.
|
|
10
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, definitionChangesUpdater_1.definitionChangesUpdaterFactory)(settings.log, definitionChangesFetcher, storage, settings.sync.__splitFiltersValidation, readiness.definitions, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'definitionChangesUpdater');
|
|
11
11
|
}
|
|
12
12
|
exports.definitionsSyncTaskFactory = definitionsSyncTaskFactory;
|
|
@@ -106,10 +106,10 @@ function convertInstantUpdateToDefinitionChanges(instantUpdate) {
|
|
|
106
106
|
* @param requestTimeoutBeforeReady - How long the updater will wait for the request to timeout. Default 0, i.e., never timeout.
|
|
107
107
|
* @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` or `/configs` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
|
|
108
108
|
*/
|
|
109
|
-
function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage, splitFiltersValidation,
|
|
109
|
+
function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage, splitFiltersValidation, definitionsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, isClientSide) {
|
|
110
110
|
if (requestTimeoutBeforeReady === void 0) { requestTimeoutBeforeReady = 0; }
|
|
111
111
|
if (retriesOnFailureBeforeReady === void 0) { retriesOnFailureBeforeReady = 0; }
|
|
112
|
-
var
|
|
112
|
+
var definitions = storage.definitions, rbSegments = storage.rbSegments, segments = storage.segments;
|
|
113
113
|
var startingUp = true;
|
|
114
114
|
/** timeout decorator for `definitionChangesFetcher` promise */
|
|
115
115
|
function _promiseDecorator(promise) {
|
|
@@ -151,7 +151,7 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
151
151
|
var _a = computeMutation(definitionChanges.d, usedSegments, splitFiltersValidation), added = _a.added, removed = _a.removed, names = _a.names;
|
|
152
152
|
updatedDefinitions = names;
|
|
153
153
|
log.debug(constants_2.SYNC_UPDATE, [definitionChangesFetcher.type, added.length, removed.length]);
|
|
154
|
-
ffUpdate =
|
|
154
|
+
ffUpdate = definitions.update(added, removed, definitionChanges.d.till);
|
|
155
155
|
}
|
|
156
156
|
var rbsUpdate = false;
|
|
157
157
|
if (definitionChanges.rbs) {
|
|
@@ -167,9 +167,9 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
167
167
|
if (storage.save)
|
|
168
168
|
storage.save();
|
|
169
169
|
startingUp = false;
|
|
170
|
-
if (
|
|
171
|
-
// To emit
|
|
172
|
-
return Promise.resolve(!
|
|
170
|
+
if (definitionsEventEmitter) {
|
|
171
|
+
// To emit SDK_DEFINITIONS_ARRIVED for server-side SDK, we must check that all registered segments have been fetched
|
|
172
|
+
return Promise.resolve(!definitionsEventEmitter.definitionsArrived || ((ffChanged || rbsChanged) && (isClientSide || checkAllSegmentsExist(segments))))
|
|
173
173
|
.catch(function () { return false; } /** noop. just to handle a possible `checkAllSegmentsExist` rejection, before emitting SDK event */)
|
|
174
174
|
.then(function (emitSplitsArrivedEvent) {
|
|
175
175
|
// emit SDK events
|
|
@@ -178,7 +178,7 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
178
178
|
type: updatedDefinitions.length > 0 ? definitionChangesFetcher.type === 'configs' ? constants_1.CONFIGS_UPDATE : constants_1.FLAGS_UPDATE : constants_1.SEGMENTS_UPDATE,
|
|
179
179
|
names: updatedDefinitions.length > 0 ? updatedDefinitions : []
|
|
180
180
|
};
|
|
181
|
-
|
|
181
|
+
definitionsEventEmitter.emit(constants_1.SDK_DEFINITIONS_ARRIVED, metadata);
|
|
182
182
|
}
|
|
183
183
|
return true;
|
|
184
184
|
});
|
|
@@ -200,7 +200,7 @@ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage,
|
|
|
200
200
|
});
|
|
201
201
|
}
|
|
202
202
|
// `getChangeNumber` never rejects or throws error
|
|
203
|
-
return Promise.all([
|
|
203
|
+
return Promise.all([definitions.getChangeNumber(), rbSegments.getChangeNumber()]).then(_definitionChangesUpdater);
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
exports.definitionChangesUpdaterFactory = definitionChangesUpdaterFactory;
|
|
@@ -5,7 +5,7 @@ var timeout_1 = require("../../../utils/promise/timeout");
|
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
7
|
var constants_3 = require("../../streaming/constants");
|
|
8
|
-
var
|
|
8
|
+
var AbstractDefinitionsCacheSync_1 = require("../../../storages/AbstractDefinitionsCacheSync");
|
|
9
9
|
/**
|
|
10
10
|
* factory of MySegments updater, a task that:
|
|
11
11
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
@@ -37,7 +37,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
37
37
|
if (storage.save)
|
|
38
38
|
storage.save();
|
|
39
39
|
// Notify update if required
|
|
40
|
-
if ((0,
|
|
40
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage) && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
41
41
|
readyOnAlreadyExistentState = false;
|
|
42
42
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED, { type: constants_1.SEGMENTS_UPDATE, names: [] });
|
|
43
43
|
}
|
|
@@ -73,7 +73,7 @@ function notificationKeeperFactory(pushEmitter, telemetryTracker) {
|
|
|
73
73
|
c.cTime = timestamp;
|
|
74
74
|
if (controlType === constants_2.ControlType.STREAMING_DISABLED) {
|
|
75
75
|
telemetryTracker.streamingEvent(constants_1.STREAMING_STATUS, constants_1.DISABLED);
|
|
76
|
-
pushEmitter.emit(constants_2.
|
|
76
|
+
pushEmitter.emit(constants_2.PUSH_NON_RETRYABLE_ERROR);
|
|
77
77
|
}
|
|
78
78
|
else if (hasPublishers) {
|
|
79
79
|
if (controlType === constants_2.ControlType.STREAMING_PAUSED && hasResumed) {
|
|
@@ -51,7 +51,7 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
|
|
|
51
51
|
pushEmitter.emit(constants_1.PUSH_RETRYABLE_ERROR);
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
|
-
pushEmitter.emit(constants_1.
|
|
54
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
57
|
/* NotificationProcessor */
|
package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.DefinitionsUpdateWorker = void 0;
|
|
4
4
|
var constants_1 = require("../../../logger/constants");
|
|
5
5
|
var constants_2 = require("../../../readiness/constants");
|
|
6
6
|
var Backoff_1 = require("../../../utils/Backoff");
|
|
@@ -9,19 +9,19 @@ var constants_4 = require("../constants");
|
|
|
9
9
|
var parseUtils_1 = require("../parseUtils");
|
|
10
10
|
var constants_5 = require("./constants");
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* DefinitionsUpdateWorker factory
|
|
13
13
|
*/
|
|
14
|
-
function
|
|
15
|
-
var ff =
|
|
16
|
-
var rbs =
|
|
17
|
-
function
|
|
14
|
+
function DefinitionsUpdateWorker(log, storage, definitionsSyncTask, definitionsEventEmitter, telemetryTracker, segmentsSyncTask) {
|
|
15
|
+
var ff = DefinitionsUpdateWorker(storage.definitions);
|
|
16
|
+
var rbs = DefinitionsUpdateWorker(storage.rbSegments);
|
|
17
|
+
function DefinitionsUpdateWorker(cache) {
|
|
18
18
|
var maxChangeNumber = -1;
|
|
19
19
|
var handleNewEvent = false;
|
|
20
20
|
var isHandlingEvent;
|
|
21
21
|
var cdnBypass;
|
|
22
22
|
var instantUpdate;
|
|
23
|
-
var backoff = new Backoff_1.Backoff(
|
|
24
|
-
function
|
|
23
|
+
var backoff = new Backoff_1.Backoff(__handleDefinitionUpdateCall, constants_5.FETCH_BACKOFF_BASE, constants_5.FETCH_BACKOFF_MAX_WAIT);
|
|
24
|
+
function __handleDefinitionUpdateCall() {
|
|
25
25
|
isHandlingEvent = true;
|
|
26
26
|
if (maxChangeNumber > cache.getChangeNumber()) {
|
|
27
27
|
handleNewEvent = false;
|
|
@@ -30,7 +30,7 @@ function SplitsUpdateWorker(log, storage, definitionsSyncTask, splitsEventEmitte
|
|
|
30
30
|
if (!isHandlingEvent)
|
|
31
31
|
return; // halt if `stop` has been called
|
|
32
32
|
if (handleNewEvent) {
|
|
33
|
-
|
|
33
|
+
__handleDefinitionUpdateCall();
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
if (instantUpdate)
|
|
@@ -55,7 +55,7 @@ function SplitsUpdateWorker(log, storage, definitionsSyncTask, splitsEventEmitte
|
|
|
55
55
|
else {
|
|
56
56
|
backoff.reset();
|
|
57
57
|
cdnBypass = true;
|
|
58
|
-
|
|
58
|
+
__handleDefinitionUpdateCall();
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
});
|
|
@@ -83,7 +83,7 @@ function SplitsUpdateWorker(log, storage, definitionsSyncTask, splitsEventEmitte
|
|
|
83
83
|
instantUpdate = { payload: payload, changeNumber: changeNumber, type: type };
|
|
84
84
|
}
|
|
85
85
|
if (backoff.timeoutID || !isHandlingEvent)
|
|
86
|
-
|
|
86
|
+
__handleDefinitionUpdateCall();
|
|
87
87
|
backoff.reset();
|
|
88
88
|
},
|
|
89
89
|
stop: function () {
|
|
@@ -118,11 +118,11 @@ function SplitsUpdateWorker(log, storage, definitionsSyncTask, splitsEventEmitte
|
|
|
118
118
|
* @param splitName - name of split to kill
|
|
119
119
|
* @param defaultTreatment - default treatment value
|
|
120
120
|
*/
|
|
121
|
-
|
|
121
|
+
killDefinition: function (_a) {
|
|
122
122
|
var changeNumber = _a.changeNumber, splitName = _a.splitName, defaultTreatment = _a.defaultTreatment;
|
|
123
|
-
if (storage.
|
|
123
|
+
if (storage.definitions.killLocally(splitName, defaultTreatment, changeNumber)) {
|
|
124
124
|
// trigger an SDK_UPDATE if Split was killed locally
|
|
125
|
-
|
|
125
|
+
definitionsEventEmitter.emit(constants_2.SDK_DEFINITIONS_ARRIVED, true);
|
|
126
126
|
}
|
|
127
127
|
// queues the SplitChanges fetch (only if changeNumber is newer)
|
|
128
128
|
ff.put({ changeNumber: changeNumber });
|
|
@@ -133,4 +133,4 @@ function SplitsUpdateWorker(log, storage, definitionsSyncTask, splitsEventEmitte
|
|
|
133
133
|
}
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
-
exports.
|
|
136
|
+
exports.DefinitionsUpdateWorker = DefinitionsUpdateWorker;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.
|
|
3
|
+
exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.RB_SEGMENT_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NON_RETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
|
|
4
4
|
// time for refresh token
|
|
5
5
|
exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
6
6
|
// Internal SDK events, subscribed by SyncManager and PushManager
|
|
@@ -8,7 +8,7 @@ exports.SECONDS_BEFORE_EXPIRATION = 600;
|
|
|
8
8
|
* emitted on SSE and Authenticate non-recoverable errors, STREAMING_DISABLED control notification and authentication with pushEnabled false
|
|
9
9
|
* triggers `handleNonRetryableError` call
|
|
10
10
|
*/
|
|
11
|
-
exports.
|
|
11
|
+
exports.PUSH_NON_RETRYABLE_ERROR = 'PUSH_NON_RETRYABLE_ERROR';
|
|
12
12
|
/**
|
|
13
13
|
* emitted on SSE and Authenticate recoverable errors
|
|
14
14
|
* triggers `handleRetryableError` call
|
|
@@ -20,7 +20,7 @@ exports.PUSH_RETRYABLE_ERROR = 'PUSH_RETRYABLE_ERROR';
|
|
|
20
20
|
*/
|
|
21
21
|
exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
|
|
22
22
|
/**
|
|
23
|
-
* emitted on STREAMING_PAUSED control notification, OCCUPANCY equal to 0,
|
|
23
|
+
* emitted on STREAMING_PAUSED control notification, OCCUPANCY equal to 0, PUSH_NON_RETRYABLE_ERROR and PUSH_RETRYABLE_ERROR events.
|
|
24
24
|
* triggers `startPolling` and `stopWorkers` calls
|
|
25
25
|
*/
|
|
26
26
|
exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
|
|
@@ -6,7 +6,7 @@ var Backoff_1 = require("../../utils/Backoff");
|
|
|
6
6
|
var SSEHandler_1 = require("./SSEHandler");
|
|
7
7
|
var MySegmentsUpdateWorker_1 = require("./UpdateWorkers/MySegmentsUpdateWorker");
|
|
8
8
|
var SegmentsUpdateWorker_1 = require("./UpdateWorkers/SegmentsUpdateWorker");
|
|
9
|
-
var
|
|
9
|
+
var DefinitionsUpdateWorker_1 = require("./UpdateWorkers/DefinitionsUpdateWorker");
|
|
10
10
|
var AuthClient_1 = require("./AuthClient");
|
|
11
11
|
var lang_1 = require("../../utils/lang");
|
|
12
12
|
var SSEClient_1 = require("./SSEClient");
|
|
@@ -45,8 +45,8 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
45
45
|
// init workers
|
|
46
46
|
// MySegmentsUpdateWorker (client-side) are initiated in `add` method
|
|
47
47
|
var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
|
|
48
|
-
// For server-side we pass the segmentsSyncTask, used by
|
|
49
|
-
var
|
|
48
|
+
// For server-side we pass the segmentsSyncTask, used by DefinitionsUpdateWorker to fetch new segments
|
|
49
|
+
var definitionsUpdateWorker = (0, DefinitionsUpdateWorker_1.DefinitionsUpdateWorker)(log, storage, pollingManager.definitionsSyncTask, readiness.definitions, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
|
|
50
50
|
// [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
|
|
51
51
|
var userKeyHashes = {};
|
|
52
52
|
// [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
|
|
@@ -54,10 +54,10 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
54
54
|
var clients = {};
|
|
55
55
|
// [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
|
|
56
56
|
var connectForNewClient = false;
|
|
57
|
-
// flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a
|
|
57
|
+
// flag that indicates if `stop/disconnectPush` was called, either by the SyncManager, when the client is destroyed, or due to a PUSH_NON_RETRYABLE_ERROR error.
|
|
58
58
|
// It is used to halt the `connectPush` process if it was in progress.
|
|
59
59
|
var disconnected;
|
|
60
|
-
// flag that indicates a
|
|
60
|
+
// flag that indicates a PUSH_NON_RETRYABLE_ERROR, condition with which starting pushManager again is ignored.
|
|
61
61
|
// true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
|
|
62
62
|
var disabled; // `disabled` implies `disconnected === true`
|
|
63
63
|
/** PushManager functions related to initialization */
|
|
@@ -96,11 +96,11 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
96
96
|
authenticate(userKeys).then(function (authData) {
|
|
97
97
|
if (disconnected)
|
|
98
98
|
return;
|
|
99
|
-
// 'pushEnabled: false' is handled as a
|
|
99
|
+
// 'pushEnabled: false' is handled as a PUSH_NON_RETRYABLE_ERROR instead of PUSH_SUBSYSTEM_DOWN, in order to
|
|
100
100
|
// close the sseClient in case the org has been bloqued while the instance was connected to streaming
|
|
101
101
|
if (!authData.pushEnabled) {
|
|
102
102
|
log.info(constants_2.STREAMING_DISABLED);
|
|
103
|
-
pushEmitter.emit(constants_1.
|
|
103
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
106
|
// [Only for client-side] don't open SSE connection if a new shared client was added, since it means that a new authentication is taking place
|
|
@@ -115,7 +115,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
115
115
|
// Handle 4XX HTTP errors: 401 (invalid SDK Key) or 400 (using incorrect SDK Key, i.e., client-side SDK Key on server-side)
|
|
116
116
|
if (error.statusCode >= 400 && error.statusCode < 500) {
|
|
117
117
|
telemetryTracker.streamingEvent(constants_3.AUTH_REJECTION);
|
|
118
|
-
pushEmitter.emit(constants_1.
|
|
118
|
+
pushEmitter.emit(constants_1.PUSH_NON_RETRYABLE_ERROR);
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
// Handle other HTTP and network errors as recoverable errors
|
|
@@ -139,7 +139,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
139
139
|
}
|
|
140
140
|
// cancel scheduled fetch retries of Splits, Segments, and MySegments Update Workers
|
|
141
141
|
function stopWorkers() {
|
|
142
|
-
|
|
142
|
+
definitionsUpdateWorker.stop();
|
|
143
143
|
if (userKey)
|
|
144
144
|
(0, lang_1.forOwn)(clients, function (_a) {
|
|
145
145
|
var worker = _a.worker;
|
|
@@ -155,7 +155,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
155
155
|
connectPushRetryBackoff.reset();
|
|
156
156
|
});
|
|
157
157
|
/** Fallback to polling without retry due to: STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE and Authentication errors */
|
|
158
|
-
pushEmitter.on(constants_1.
|
|
158
|
+
pushEmitter.on(constants_1.PUSH_NON_RETRYABLE_ERROR, function handleNonRetryableError() {
|
|
159
159
|
disabled = true;
|
|
160
160
|
// Note: `stopWorkers` is been called twice, but it is not harmful
|
|
161
161
|
disconnectPush();
|
|
@@ -181,9 +181,9 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
181
181
|
connectPush();
|
|
182
182
|
});
|
|
183
183
|
/** Functions related to synchronization (Queues and Workers in the spec) */
|
|
184
|
-
pushEmitter.on(constants_1.SPLIT_KILL,
|
|
185
|
-
pushEmitter.on(constants_1.SPLIT_UPDATE,
|
|
186
|
-
pushEmitter.on(constants_1.RB_SEGMENT_UPDATE,
|
|
184
|
+
pushEmitter.on(constants_1.SPLIT_KILL, definitionsUpdateWorker.killDefinition);
|
|
185
|
+
pushEmitter.on(constants_1.SPLIT_UPDATE, definitionsUpdateWorker.put);
|
|
186
|
+
pushEmitter.on(constants_1.RB_SEGMENT_UPDATE, definitionsUpdateWorker.put);
|
|
187
187
|
function handleMySegmentsUpdate(parsedData) {
|
|
188
188
|
switch (parsedData.u) {
|
|
189
189
|
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
@@ -107,13 +107,12 @@ function telemetrySubmitterFactory(params) {
|
|
|
107
107
|
var telemetry = params.storage.telemetry, now = params.platform.now;
|
|
108
108
|
if (!telemetry || !now)
|
|
109
109
|
return; // No submitter created if telemetry cache is not defined
|
|
110
|
-
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate, splitApi = params.splitApi, readiness = params.readiness
|
|
110
|
+
var settings = params.settings, _a = params.settings, log = _a.log, telemetryRefreshRate = _a.scheduler.telemetryRefreshRate, splitApi = params.splitApi, readiness = params.readiness;
|
|
111
111
|
var stopTimer = (0, timer_1.timer)(now);
|
|
112
112
|
var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log, splitApi.postMetricsUsage, telemetry, telemetryRefreshRate, undefined, 0, true), telemetryRefreshRate);
|
|
113
113
|
readiness.gate.once(constants_2.SDK_READY_FROM_CACHE, function () {
|
|
114
114
|
telemetry.recordTimeUntilReadyFromCache(stopTimer());
|
|
115
115
|
});
|
|
116
|
-
sdkReadinessManager.incInternalReadyCbCount();
|
|
117
116
|
readiness.gate.once(constants_2.SDK_READY, function () {
|
|
118
117
|
telemetry.recordTimeUntilReady(stopTimer());
|
|
119
118
|
// Post config data when the SDK is ready and if the telemetry submitter was started
|
|
@@ -7,7 +7,7 @@ var constants_2 = require("../logger/constants");
|
|
|
7
7
|
var consent_1 = require("../consent");
|
|
8
8
|
var constants_3 = require("../utils/constants");
|
|
9
9
|
var constants_4 = require("../readiness/constants");
|
|
10
|
-
var
|
|
10
|
+
var AbstractDefinitionsCacheSync_1 = require("../storages/AbstractDefinitionsCacheSync");
|
|
11
11
|
var splitChangesFetcher_1 = require("./polling/fetchers/splitChangesFetcher");
|
|
12
12
|
/**
|
|
13
13
|
* Online SyncManager factory.
|
|
@@ -80,7 +80,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, def
|
|
|
80
80
|
if (startFirstTime) {
|
|
81
81
|
// Emits SDK_READY_FROM_CACHE
|
|
82
82
|
if (!cacheMetadata.initialCacheLoad) {
|
|
83
|
-
readiness.
|
|
83
|
+
readiness.definitions.emit(constants_4.SDK_DEFINITIONS_CACHE_LOADED, cacheMetadata);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
// start syncing splits and segments
|
|
@@ -139,7 +139,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, def
|
|
|
139
139
|
if (pushManager) {
|
|
140
140
|
if (pollingManager.isRunning()) {
|
|
141
141
|
// if doing polling, we must start the periodic fetch of data
|
|
142
|
-
if ((0,
|
|
142
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
143
143
|
mySegmentsSyncTask.start();
|
|
144
144
|
}
|
|
145
145
|
else {
|
|
@@ -149,7 +149,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, def
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
else {
|
|
152
|
-
if ((0,
|
|
152
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
153
153
|
mySegmentsSyncTask.start();
|
|
154
154
|
}
|
|
155
155
|
}
|
package/cjs/utils/Backoff.js
CHANGED
|
@@ -27,6 +27,26 @@ var Backoff = /** @class */ (function () {
|
|
|
27
27
|
this.attempts++;
|
|
28
28
|
return delayInMillis;
|
|
29
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Schedule a delayed call to `cb`
|
|
32
|
+
* @returns a promise that resolves/rejects with the result of the `cb` function, which must return a promise.
|
|
33
|
+
*/
|
|
34
|
+
Backoff.prototype.scheduleCallAsync = function () {
|
|
35
|
+
var _this = this;
|
|
36
|
+
var delayInMillis = Math.min(this.baseMillis * Math.pow(2, this.attempts), this.maxMillis);
|
|
37
|
+
if (this.timeoutID)
|
|
38
|
+
clearTimeout(this.timeoutID);
|
|
39
|
+
this.attempts++;
|
|
40
|
+
return new Promise(function (resolve, reject) {
|
|
41
|
+
_this.timeoutID = setTimeout(function () {
|
|
42
|
+
_this.timeoutID = undefined;
|
|
43
|
+
_this.cb().then(resolve, reject);
|
|
44
|
+
}, delayInMillis);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Reset the backoff attempts
|
|
49
|
+
*/
|
|
30
50
|
Backoff.prototype.reset = function () {
|
|
31
51
|
this.attempts = 0;
|
|
32
52
|
if (this.timeoutID) {
|
package/cjs/utils/lang/sets.js
CHANGED
|
@@ -15,9 +15,9 @@ function returnSetsUnion(set, set2) {
|
|
|
15
15
|
return new Set(setToArray(set).concat(setToArray(set2)));
|
|
16
16
|
}
|
|
17
17
|
exports.returnSetsUnion = returnSetsUnion;
|
|
18
|
-
function returnDifference(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return
|
|
18
|
+
function returnDifference(list1, list2) {
|
|
19
|
+
list1 = list1 || [];
|
|
20
|
+
list2 = list2 || [];
|
|
21
|
+
return list1.filter(function (item) { return list2.indexOf(item) === -1; });
|
|
22
22
|
}
|
|
23
23
|
exports.returnDifference = returnDifference;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.url = void 0;
|
|
4
4
|
var telemetryEndpointMatcher = /^\/v1\/metrics\/(config|usage)/;
|
|
5
5
|
var eventsEndpointMatcher = /^\/(testImpressions|metrics|events)/;
|
|
6
|
-
var authEndpointMatcher = /^\/v2\/auth/;
|
|
6
|
+
var authEndpointMatcher = /^\/(v2|v3)\/auth/;
|
|
7
7
|
var streamingEndpointMatcher = /^\/(sse|event-stream)/;
|
|
8
8
|
/**
|
|
9
9
|
* Get URL based on a given target (path).
|
package/esm/evaluator/index.js
CHANGED
|
@@ -24,15 +24,15 @@ function treatmentsException(definitionNames) {
|
|
|
24
24
|
export function evaluateFeature(log, key, definitionName, attributes, storage, options) {
|
|
25
25
|
var definition;
|
|
26
26
|
try {
|
|
27
|
-
definition = storage.
|
|
27
|
+
definition = storage.definitions.get(definitionName);
|
|
28
28
|
}
|
|
29
29
|
catch (e) {
|
|
30
|
-
// Exception on sync
|
|
30
|
+
// Exception on sync storage. Not possible ATM with InMemory and InLocal storages.
|
|
31
31
|
return EVALUATION_EXCEPTION;
|
|
32
32
|
}
|
|
33
33
|
if (thenable(definition)) {
|
|
34
34
|
return definition.then(function (definition) { return getEvaluation(log, key, definition, attributes, storage, options); }).catch(
|
|
35
|
-
// Exception on async
|
|
35
|
+
// Exception on async storage. For example, when the storage is redis or
|
|
36
36
|
// pluggable and there is a connection issue and we can't retrieve the split to be evaluated
|
|
37
37
|
function () { return EVALUATION_EXCEPTION; });
|
|
38
38
|
}
|
|
@@ -41,16 +41,16 @@ export function evaluateFeature(log, key, definitionName, attributes, storage, o
|
|
|
41
41
|
export function evaluateFeatures(log, key, definitionNames, attributes, storage, options) {
|
|
42
42
|
var definitions;
|
|
43
43
|
try {
|
|
44
|
-
definitions = storage.
|
|
44
|
+
definitions = storage.definitions.getMany(definitionNames);
|
|
45
45
|
}
|
|
46
46
|
catch (e) {
|
|
47
|
-
// Exception on sync
|
|
47
|
+
// Exception on sync storage. Not possible ATM with InMemory and InLocal storages.
|
|
48
48
|
return treatmentsException(definitionNames);
|
|
49
49
|
}
|
|
50
50
|
return thenable(definitions) ?
|
|
51
51
|
definitions.then(function (definitions) { return getEvaluations(log, key, definitionNames, definitions, attributes, storage, options); })
|
|
52
52
|
.catch(function () {
|
|
53
|
-
// Exception on async
|
|
53
|
+
// Exception on async storage. For example, when the storage is redis or
|
|
54
54
|
// pluggable and there is a connection issue and we can't retrieve the split to be evaluated
|
|
55
55
|
return treatmentsException(definitionNames);
|
|
56
56
|
}) :
|
|
@@ -75,7 +75,7 @@ export function evaluateFeaturesByFlagSets(log, key, flagSets, attributes, stora
|
|
|
75
75
|
}
|
|
76
76
|
// get features by flag sets
|
|
77
77
|
try {
|
|
78
|
-
storedFlagNames = storage.
|
|
78
|
+
storedFlagNames = storage.definitions.getNamesBySets(flagSets);
|
|
79
79
|
}
|
|
80
80
|
catch (e) {
|
|
81
81
|
// return empty evaluations
|
|
@@ -93,7 +93,7 @@ function getEvaluation(log, key, definition, attributes, storage, options) {
|
|
|
93
93
|
if (definition) {
|
|
94
94
|
var split = engineParser(log, definition, storage);
|
|
95
95
|
var evaluation = split.getTreatment(key, attributes, evaluateFeature);
|
|
96
|
-
// If the storage is async and the evaluated
|
|
96
|
+
// If the storage is async and the evaluated definition uses segments or dependencies, evaluation is thenable
|
|
97
97
|
if (thenable(evaluation)) {
|
|
98
98
|
return evaluation.then(function (result) {
|
|
99
99
|
result.changeNumber = definition.changeNumber;
|
|
@@ -113,11 +113,11 @@ function getEvaluation(log, key, definition, attributes, storage, options) {
|
|
|
113
113
|
}
|
|
114
114
|
return EVALUATION_DEFINITION_NOT_FOUND;
|
|
115
115
|
}
|
|
116
|
-
function getEvaluations(log, key, definitionNames,
|
|
116
|
+
function getEvaluations(log, key, definitionNames, definitions, attributes, storage, options) {
|
|
117
117
|
var result = {};
|
|
118
118
|
var thenables = [];
|
|
119
119
|
definitionNames.forEach(function (definitionName) {
|
|
120
|
-
var evaluation = getEvaluation(log, key,
|
|
120
|
+
var evaluation = getEvaluation(log, key, definitions[definitionName], attributes, storage, options);
|
|
121
121
|
if (thenable(evaluation)) {
|
|
122
122
|
thenables.push(evaluation.then(function (res) {
|
|
123
123
|
result[definitionName] = res;
|
|
@@ -132,7 +132,7 @@ function getEvaluations(log, key, definitionNames, splits, attributes, storage,
|
|
|
132
132
|
export function evaluateDefaultTreatment(definitionName, storage) {
|
|
133
133
|
var definition;
|
|
134
134
|
try {
|
|
135
|
-
definition = storage.
|
|
135
|
+
definition = storage.definitions.get(definitionName);
|
|
136
136
|
}
|
|
137
137
|
catch (e) {
|
|
138
138
|
return EVALUATION_EXCEPTION;
|