@splitsoftware/splitio-commons 3.1.1-rc.10 → 3.1.1-rc.12
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 +3 -0
- package/cjs/evaluator/condition/index.js +2 -2
- package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/cjs/evaluator/index.js +81 -71
- package/cjs/listeners/browser.js +2 -1
- package/cjs/listeners/node.js +4 -4
- package/cjs/logger/constants.js +15 -20
- package/cjs/logger/messages/debug.js +5 -6
- package/cjs/logger/messages/error.js +3 -3
- package/cjs/logger/messages/info.js +3 -4
- package/cjs/logger/messages/warn.js +6 -7
- package/cjs/platform/browser.js +15 -0
- package/cjs/platform/getEventSource/browser.js +8 -0
- package/cjs/platform/getEventSource/eventsource.js +480 -0
- package/cjs/platform/getEventSource/node.js +26 -0
- package/cjs/platform/getFetch/browser.js +9 -0
- package/cjs/platform/getFetch/node.js +27 -0
- package/cjs/platform/getOptions/node.js +25 -0
- package/cjs/platform/node.js +17 -0
- package/cjs/presets/serverSide.js +2 -2
- package/cjs/readiness/constants.js +5 -4
- package/cjs/readiness/readinessManager.js +23 -23
- package/cjs/readiness/sdkReadinessManager.js +1 -17
- package/cjs/sdkClient/client.js +24 -50
- package/cjs/sdkClient/clientInputValidation.js +6 -17
- package/cjs/sdkClient/sdkClient.js +3 -60
- package/cjs/sdkClient/sdkLifecycle.js +74 -0
- package/cjs/sdkClient/trackMethod.js +56 -0
- package/cjs/sdkFactory/index.js +11 -15
- package/cjs/sdkManager/index.js +5 -5
- package/cjs/services/authProvider.js +80 -0
- package/cjs/services/decorateHeaders.js +2 -1
- package/cjs/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +15 -16
- package/cjs/services/secureSplitHttpClient.js +36 -0
- package/cjs/services/serviceApi.js +147 -0
- package/cjs/services/splitApi.js +24 -10
- package/cjs/services/splitHttpClient.js +3 -5
- 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 +195 -0
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +12 -11
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +122 -0
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +7 -6
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +79 -77
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +4 -2
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +214 -0
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +4 -2
- package/cjs/storages/pluggable/index.js +2 -2
- package/cjs/storages/setRolloutPlan.js +4 -4
- package/cjs/storages/utils.js +1 -0
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
- package/cjs/sync/polling/pollingManagerCS.js +86 -81
- package/cjs/sync/polling/pollingManagerSS.js +44 -36
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +13 -0
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
- package/cjs/sync/polling/updaters/definitionChangesUpdater.js +207 -0
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +2 -1
- package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +19 -20
- package/cjs/sync/streaming/constants.js +4 -3
- package/cjs/sync/streaming/parseUtils.js +14 -14
- package/cjs/sync/streaming/pushManager.js +22 -26
- package/cjs/sync/submitters/eventsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionsSubmitter.js +5 -4
- package/cjs/sync/submitters/telemetrySubmitter.js +3 -4
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/cjs/sync/syncManagerOnline.js +5 -5
- package/cjs/utils/Backoff.js +35 -3
- package/cjs/utils/EventEmitter.js +391 -0
- package/cjs/utils/filter/bloomFilter.js +37 -0
- package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
- package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
- package/cjs/utils/inputValidation/definitions.js +25 -0
- package/cjs/utils/inputValidation/index.js +7 -7
- package/cjs/utils/inputValidation/isOperational.js +4 -4
- package/cjs/utils/inputValidation/target.js +22 -0
- package/cjs/utils/labels/index.js +3 -3
- package/cjs/utils/settingsValidation/index.js +2 -0
- package/cjs/utils/settingsValidation/splitFilters.js +3 -3
- package/cjs/utils/settingsValidation/url.js +6 -2
- package/esm/evaluator/condition/index.js +2 -2
- package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/esm/evaluator/index.js +80 -71
- package/esm/listeners/browser.js +2 -1
- package/esm/listeners/node.js +4 -4
- package/esm/logger/constants.js +12 -17
- package/esm/logger/messages/debug.js +5 -6
- package/esm/logger/messages/error.js +3 -3
- package/esm/logger/messages/info.js +3 -4
- package/esm/logger/messages/warn.js +6 -7
- package/esm/platform/browser.js +12 -0
- package/esm/platform/getEventSource/browser.js +4 -0
- package/esm/platform/getEventSource/eventsource.js +480 -0
- package/esm/platform/getEventSource/node.js +20 -0
- package/esm/platform/getFetch/browser.js +5 -0
- package/esm/platform/getFetch/node.js +22 -0
- package/esm/platform/getOptions/node.js +20 -0
- package/esm/platform/node.js +14 -0
- package/esm/presets/serverSide.js +2 -2
- package/esm/readiness/constants.js +4 -3
- package/esm/readiness/readinessManager.js +24 -24
- package/esm/readiness/sdkReadinessManager.js +2 -18
- package/esm/sdkClient/client.js +23 -50
- package/esm/sdkClient/clientInputValidation.js +8 -19
- package/esm/sdkClient/sdkClient.js +3 -60
- package/esm/sdkClient/sdkLifecycle.js +70 -0
- package/esm/sdkClient/trackMethod.js +52 -0
- package/esm/sdkFactory/index.js +12 -16
- package/esm/sdkManager/index.js +6 -6
- package/esm/services/authProvider.js +76 -0
- package/esm/services/decorateHeaders.js +2 -1
- package/esm/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +13 -13
- package/esm/services/secureSplitHttpClient.js +32 -0
- package/esm/services/serviceApi.js +143 -0
- package/esm/services/splitApi.js +24 -10
- package/esm/services/splitHttpClient.js +3 -5
- 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 +192 -0
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +9 -8
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +119 -0
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +4 -3
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/esm/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +78 -76
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +4 -2
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +211 -0
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +4 -2
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/storages/setRolloutPlan.js +4 -4
- package/esm/storages/utils.js +1 -0
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
- package/esm/sync/polling/pollingManagerCS.js +87 -82
- package/esm/sync/polling/pollingManagerSS.js +44 -36
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +9 -0
- package/esm/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +201 -0
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
- package/esm/sync/streaming/SSEHandler/index.js +3 -2
- package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +19 -20
- package/esm/sync/streaming/constants.js +3 -2
- package/esm/sync/streaming/parseUtils.js +11 -11
- package/esm/sync/streaming/pushManager.js +24 -28
- package/esm/sync/submitters/eventsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionsSubmitter.js +5 -4
- package/esm/sync/submitters/telemetrySubmitter.js +3 -4
- package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/esm/sync/syncManagerOnline.js +4 -4
- package/esm/utils/Backoff.js +35 -3
- package/esm/utils/EventEmitter.js +387 -0
- package/esm/utils/filter/bloomFilter.js +33 -0
- package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
- package/esm/utils/inputValidation/definitionExistence.js +15 -0
- package/esm/utils/inputValidation/definitions.js +21 -0
- package/esm/utils/inputValidation/index.js +3 -3
- package/esm/utils/inputValidation/isOperational.js +4 -4
- package/esm/utils/inputValidation/target.js +18 -0
- package/esm/utils/labels/index.js +2 -2
- package/esm/utils/settingsValidation/index.js +2 -0
- package/esm/utils/settingsValidation/splitFilters.js +3 -3
- package/esm/utils/settingsValidation/url.js +6 -2
- package/package.json +1 -1
- package/src/dtos/types.ts +4 -4
- package/src/services/authProvider.ts +2 -2
- package/src/{sync/streaming/AuthClient/index.ts → services/fetchAuth.ts} +3 -4
- package/src/services/splitApi.ts +1 -1
- package/src/services/types.ts +21 -4
- package/src/storages/AbstractDefinitionsCacheAsync.ts +3 -3
- package/src/storages/AbstractDefinitionsCacheSync.ts +2 -2
- package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +2 -2
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +3 -3
- package/src/storages/inMemory/DefinitionsCacheInMemory.ts +2 -2
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +2 -2
- package/src/storages/inRedis/DefinitionsCacheInRedis.ts +6 -4
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +7 -5
- package/src/storages/pluggable/DefinitionsCachePluggable.ts +4 -2
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +5 -3
- package/src/storages/types.ts +6 -6
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +5 -5
- package/src/sync/polling/types.ts +22 -1
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +26 -20
- package/src/sync/streaming/SSEClient/index.ts +1 -1
- package/src/sync/streaming/SSEClient/types.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/DefinitionsUpdateWorker.ts +15 -11
- package/src/sync/streaming/UpdateWorkers/types.ts +6 -0
- package/src/sync/streaming/parseUtils.ts +3 -4
- package/src/sync/streaming/pushManager.ts +4 -3
- 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/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +0 -200
- package/cjs/sync/streaming/AuthClient/types.js +0 -2
- package/cjs/utils/inputValidation/splits.js +0 -25
- 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/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
- package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -194
- package/esm/sync/streaming/AuthClient/types.js +0 -1
- package/esm/utils/inputValidation/splitExistence.js +0 -15
- package/esm/utils/inputValidation/splits.js +0 -21
- package/src/sync/streaming/AuthClient/types.ts +0 -19
|
@@ -34,7 +34,7 @@ var RBSegmentsCachePluggable = /** @class */ (function () {
|
|
|
34
34
|
return _this.wrapper.set(key, stringifiedNewRBSegment).then(function () { return true; });
|
|
35
35
|
})),
|
|
36
36
|
Promise.all(toRemove.map(function (toRemove) {
|
|
37
|
-
var key = _this.keys.buildRBSegmentKey(toRemove
|
|
37
|
+
var key = _this.keys.buildRBSegmentKey(toRemove);
|
|
38
38
|
return _this.wrapper.del(key);
|
|
39
39
|
}))
|
|
40
40
|
]).then(function (_a) {
|
|
@@ -43,7 +43,9 @@ var RBSegmentsCachePluggable = /** @class */ (function () {
|
|
|
43
43
|
});
|
|
44
44
|
};
|
|
45
45
|
RBSegmentsCachePluggable.prototype.setChangeNumber = function (changeNumber) {
|
|
46
|
-
|
|
46
|
+
if (changeNumber !== undefined) {
|
|
47
|
+
return this.wrapper.set(this.keys.buildRBSegmentsTillKey(), changeNumber + '');
|
|
48
|
+
}
|
|
47
49
|
};
|
|
48
50
|
RBSegmentsCachePluggable.prototype.getChangeNumber = function () {
|
|
49
51
|
var _this = this;
|
|
@@ -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,12 +24,12 @@ 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();
|
package/cjs/storages/utils.js
CHANGED
|
@@ -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: [] });
|
|
@@ -10,16 +10,25 @@ var PROXY_CHECK_INTERVAL_MILLIS_SS = 24 * PROXY_CHECK_INTERVAL_MILLIS_CS; // 24
|
|
|
10
10
|
function sdkEndpointOverridden(settings) {
|
|
11
11
|
return settings.urls.sdk !== settingsValidation_1.base.urls.sdk;
|
|
12
12
|
}
|
|
13
|
+
function isSplitChangesLegacyResponse(data) {
|
|
14
|
+
return data.splits != null;
|
|
15
|
+
}
|
|
16
|
+
function partitionByStatus(items, till, since) {
|
|
17
|
+
var updated = [], removed = [];
|
|
18
|
+
items.forEach(function (item) { return item.status === 'ARCHIVED' ? removed.push(item.name) : updated.push(item); });
|
|
19
|
+
return { updated: updated, removed: removed, till: till, since: since !== null && since !== void 0 ? since : undefined };
|
|
20
|
+
}
|
|
13
21
|
/**
|
|
14
22
|
* Factory of SplitChanges fetcher.
|
|
15
23
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
16
24
|
*/
|
|
17
25
|
// @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
|
|
18
|
-
function splitChangesFetcherFactory(
|
|
26
|
+
function splitChangesFetcherFactory(params) {
|
|
27
|
+
var fetchSplitChanges = params.serviceApi.fetchSplitChanges, settings = params.settings, storage = params.storage;
|
|
19
28
|
var log = settings.log;
|
|
20
29
|
var PROXY_CHECK_INTERVAL_MILLIS = (0, key_1.checkIfServerSide)(settings) ? PROXY_CHECK_INTERVAL_MILLIS_SS : PROXY_CHECK_INTERVAL_MILLIS_CS;
|
|
21
30
|
var lastProxyCheckTimestamp;
|
|
22
|
-
|
|
31
|
+
function splitChangesFetcher(since, noCache, till, rbSince,
|
|
23
32
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
24
33
|
decorator) {
|
|
25
34
|
// Recheck proxy
|
|
@@ -30,7 +39,7 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
|
30
39
|
.catch(function (err) {
|
|
31
40
|
// Handle proxy error with spec 1.3
|
|
32
41
|
if ((!err.statusCode || err.statusCode === 400) && sdkEndpointOverridden(settings) && settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION) {
|
|
33
|
-
log.error(constants_2.
|
|
42
|
+
log.error(constants_2.LOG_PREFIX_SYNC + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
|
|
34
43
|
lastProxyCheckTimestamp = Date.now();
|
|
35
44
|
settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
|
|
36
45
|
return fetchSplitChanges(since, noCache, till); // retry request without rbSince
|
|
@@ -43,27 +52,27 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
|
43
52
|
.then(function (resp) { return resp.json(); })
|
|
44
53
|
.then(function (data) {
|
|
45
54
|
// Using flag spec version 1.2 or below
|
|
46
|
-
if (data
|
|
47
|
-
return {
|
|
48
|
-
ff: {
|
|
49
|
-
d: data.splits,
|
|
50
|
-
s: data.since,
|
|
51
|
-
t: data.till
|
|
52
|
-
}
|
|
53
|
-
};
|
|
55
|
+
if (isSplitChangesLegacyResponse(data)) {
|
|
56
|
+
return { d: partitionByStatus(data.splits || [], data.till, data.since) };
|
|
54
57
|
}
|
|
55
58
|
// Proxy recovery
|
|
56
59
|
if (lastProxyCheckTimestamp) {
|
|
57
|
-
log.info(constants_2.
|
|
60
|
+
log.info(constants_2.LOG_PREFIX_SYNC + 'Proxy error recovered');
|
|
58
61
|
lastProxyCheckTimestamp = undefined;
|
|
59
62
|
return splitChangesFetcher(-1, undefined, undefined, -1)
|
|
60
63
|
.then(function (splitChangesResponse) {
|
|
61
|
-
return Promise.all([storage.
|
|
64
|
+
return Promise.all([storage.definitions.clear(), storage.rbSegments.clear()])
|
|
62
65
|
.then(function () { return splitChangesResponse; });
|
|
63
66
|
});
|
|
64
67
|
}
|
|
65
|
-
|
|
68
|
+
var ff = data.ff, rbs = data.rbs;
|
|
69
|
+
return {
|
|
70
|
+
d: (ff === null || ff === void 0 ? void 0 : ff.d) ? partitionByStatus(ff.d, ff.t, ff.s) : undefined,
|
|
71
|
+
rbs: (rbs === null || rbs === void 0 ? void 0 : rbs.d) ? partitionByStatus(rbs.d, rbs.t, rbs.s) : undefined,
|
|
72
|
+
};
|
|
66
73
|
});
|
|
67
|
-
}
|
|
74
|
+
}
|
|
75
|
+
splitChangesFetcher.type = 'feature flags';
|
|
76
|
+
return splitChangesFetcher;
|
|
68
77
|
}
|
|
69
78
|
exports.splitChangesFetcherFactory = splitChangesFetcherFactory;
|
|
@@ -3,98 +3,103 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.pollingManagerCSFactory = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
5
|
var mySegmentsSyncTask_1 = require("./syncTasks/mySegmentsSyncTask");
|
|
6
|
-
var
|
|
6
|
+
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
|
+
var splitChangesFetcher_1 = require("./fetchers/splitChangesFetcher");
|
|
11
12
|
/**
|
|
12
13
|
* Expose start / stop mechanism for polling data from services.
|
|
13
14
|
* For client-side API with multiple clients.
|
|
14
15
|
*/
|
|
15
|
-
function pollingManagerCSFactory(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
(0,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (mySegmentsSyncTask.isRunning())
|
|
31
|
-
mySegmentsSyncTask.stop();
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
// smart pausing
|
|
35
|
-
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
36
|
-
if (!splitsSyncTask.isRunning())
|
|
37
|
-
return; // noop if not doing polling
|
|
38
|
-
var usingSegments = (0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage);
|
|
39
|
-
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
|
|
40
|
-
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
|
|
41
|
-
if (usingSegments) {
|
|
42
|
-
startMySegmentsSyncTasks();
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
stopMySegmentsSyncTasks();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
function add(matchingKey, readiness, storage) {
|
|
50
|
-
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
51
|
-
// smart ready
|
|
52
|
-
function smartReady(metadata) {
|
|
53
|
-
if (!readiness.isReady() && !(0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
|
|
54
|
-
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
|
|
16
|
+
function pollingManagerCSFactory(definitionFetcherFactory) {
|
|
17
|
+
if (definitionFetcherFactory === void 0) { definitionFetcherFactory = splitChangesFetcher_1.splitChangesFetcherFactory; }
|
|
18
|
+
return function (params) {
|
|
19
|
+
var serviceApi = params.serviceApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
20
|
+
var log = settings.log;
|
|
21
|
+
var definitionChangesFetcher = definitionFetcherFactory(params);
|
|
22
|
+
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings);
|
|
23
|
+
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
24
|
+
var mySegmentsSyncTasks = {};
|
|
25
|
+
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
26
|
+
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
|
|
27
|
+
function startMySegmentsSyncTasks() {
|
|
28
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
29
|
+
mySegmentsSyncTask.start();
|
|
30
|
+
});
|
|
55
31
|
}
|
|
56
|
-
|
|
57
|
-
setTimeout(smartReady, 0);
|
|
58
|
-
else
|
|
59
|
-
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
60
|
-
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
61
|
-
return mySegmentsSyncTask;
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
splitsSyncTask: splitsSyncTask,
|
|
65
|
-
segmentsSyncTask: mySegmentsSyncTask,
|
|
66
|
-
// Start periodic fetching (polling)
|
|
67
|
-
start: function () {
|
|
68
|
-
log.info(constants_2.POLLING_START);
|
|
69
|
-
splitsSyncTask.start();
|
|
70
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
|
|
71
|
-
startMySegmentsSyncTasks();
|
|
72
|
-
},
|
|
73
|
-
// Stop periodic fetching (polling)
|
|
74
|
-
stop: function () {
|
|
75
|
-
log.info(constants_2.POLLING_STOP);
|
|
76
|
-
if (splitsSyncTask.isRunning())
|
|
77
|
-
splitsSyncTask.stop();
|
|
78
|
-
stopMySegmentsSyncTasks();
|
|
79
|
-
},
|
|
80
|
-
// Used by SyncManager to know if running in polling mode.
|
|
81
|
-
isRunning: splitsSyncTask.isRunning,
|
|
82
|
-
// fetch splits and segments
|
|
83
|
-
syncAll: function () {
|
|
84
|
-
var promises = [splitsSyncTask.execute()];
|
|
32
|
+
function stopMySegmentsSyncTasks() {
|
|
85
33
|
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
86
|
-
|
|
34
|
+
if (mySegmentsSyncTask.isRunning())
|
|
35
|
+
mySegmentsSyncTask.stop();
|
|
87
36
|
});
|
|
88
|
-
return Promise.all(promises);
|
|
89
|
-
},
|
|
90
|
-
// Support for handling mySegments sync of multiple clients
|
|
91
|
-
add: add,
|
|
92
|
-
remove: function (matchingKey) {
|
|
93
|
-
delete mySegmentsSyncTasks[matchingKey];
|
|
94
|
-
},
|
|
95
|
-
get: function (matchingKey) {
|
|
96
|
-
return mySegmentsSyncTasks[matchingKey];
|
|
97
37
|
}
|
|
38
|
+
// smart pausing
|
|
39
|
+
readiness.definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, function () {
|
|
40
|
+
if (!definitionsSyncTask.isRunning())
|
|
41
|
+
return; // noop if not doing polling
|
|
42
|
+
var usingSegments = (0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage);
|
|
43
|
+
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
|
|
44
|
+
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
|
|
45
|
+
if (usingSegments) {
|
|
46
|
+
startMySegmentsSyncTasks();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
stopMySegmentsSyncTasks();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
function add(matchingKey, readiness, storage) {
|
|
54
|
+
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(serviceApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
55
|
+
// smart ready
|
|
56
|
+
function smartReady(metadata) {
|
|
57
|
+
if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
58
|
+
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
|
|
59
|
+
}
|
|
60
|
+
if (!(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
61
|
+
setTimeout(smartReady, 0);
|
|
62
|
+
else
|
|
63
|
+
readiness.definitions.once(constants_1.SDK_DEFINITIONS_ARRIVED, smartReady);
|
|
64
|
+
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
65
|
+
return mySegmentsSyncTask;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
definitionsSyncTask: definitionsSyncTask,
|
|
69
|
+
segmentsSyncTask: mySegmentsSyncTask,
|
|
70
|
+
// Start periodic fetching (polling)
|
|
71
|
+
start: function () {
|
|
72
|
+
log.info(constants_2.POLLING_START);
|
|
73
|
+
definitionsSyncTask.start();
|
|
74
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
75
|
+
startMySegmentsSyncTasks();
|
|
76
|
+
},
|
|
77
|
+
// Stop periodic fetching (polling)
|
|
78
|
+
stop: function () {
|
|
79
|
+
log.info(constants_2.POLLING_STOP);
|
|
80
|
+
if (definitionsSyncTask.isRunning())
|
|
81
|
+
definitionsSyncTask.stop();
|
|
82
|
+
stopMySegmentsSyncTasks();
|
|
83
|
+
},
|
|
84
|
+
// Used by SyncManager to know if running in polling mode.
|
|
85
|
+
isRunning: definitionsSyncTask.isRunning,
|
|
86
|
+
// fetch definitions and segments
|
|
87
|
+
syncAll: function () {
|
|
88
|
+
var promises = [definitionsSyncTask.execute()];
|
|
89
|
+
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
90
|
+
promises.push(mySegmentsSyncTask.execute());
|
|
91
|
+
});
|
|
92
|
+
return Promise.all(promises);
|
|
93
|
+
},
|
|
94
|
+
// Support for handling mySegments sync of multiple clients
|
|
95
|
+
add: add,
|
|
96
|
+
remove: function (matchingKey) {
|
|
97
|
+
delete mySegmentsSyncTasks[matchingKey];
|
|
98
|
+
},
|
|
99
|
+
get: function (matchingKey) {
|
|
100
|
+
return mySegmentsSyncTasks[matchingKey];
|
|
101
|
+
}
|
|
102
|
+
};
|
|
98
103
|
};
|
|
99
104
|
}
|
|
100
105
|
exports.pollingManagerCSFactory = pollingManagerCSFactory;
|
|
@@ -1,49 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
|
-
var
|
|
4
|
+
var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
6
|
var constants_1 = require("../../logger/constants");
|
|
7
|
+
var segmentChangesFetcher_1 = require("./fetchers/segmentChangesFetcher");
|
|
8
|
+
var splitChangesFetcher_1 = require("./fetchers/splitChangesFetcher");
|
|
7
9
|
/**
|
|
8
10
|
* Expose start / stop mechanism for pulling data from services.
|
|
9
11
|
*/
|
|
10
|
-
function pollingManagerSSFactory(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
function pollingManagerSSFactory(definitionFetcherFactory, segmentFetcherFactory) {
|
|
13
|
+
if (definitionFetcherFactory === void 0) { definitionFetcherFactory = splitChangesFetcher_1.splitChangesFetcherFactory; }
|
|
14
|
+
if (segmentFetcherFactory === void 0) { segmentFetcherFactory = function (params) { return (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(params.serviceApi.fetchSegmentChanges); }; }
|
|
15
|
+
return function (params) {
|
|
16
|
+
var storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
|
+
var log = settings.log;
|
|
18
|
+
var definitionChangesFetcher = definitionFetcherFactory(params);
|
|
19
|
+
var segmentChangesFetcher = segmentFetcherFactory(params);
|
|
20
|
+
var segmentsSyncTask = (0, segmentsSyncTask_1.segmentsSyncTaskFactory)(segmentChangesFetcher, storage, readiness, settings);
|
|
21
|
+
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings, segmentsSyncTask);
|
|
22
|
+
return {
|
|
23
|
+
definitionsSyncTask: definitionsSyncTask,
|
|
24
|
+
segmentsSyncTask: segmentsSyncTask,
|
|
25
|
+
// Start periodic fetching (polling)
|
|
26
|
+
start: function () {
|
|
27
|
+
log.info(constants_1.POLLING_START);
|
|
28
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "".concat(definitionChangesFetcher.type, " will be refreshed each ").concat(settings.scheduler.featuresRefreshRate, " millis"));
|
|
29
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "segments will be refreshed each ".concat(settings.scheduler.segmentsRefreshRate, " millis"));
|
|
30
|
+
var startingUp = definitionsSyncTask.start();
|
|
31
|
+
if (startingUp) {
|
|
32
|
+
startingUp.then(function () {
|
|
33
|
+
if (definitionsSyncTask.isRunning())
|
|
34
|
+
segmentsSyncTask.start();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
// Stop periodic fetching (polling)
|
|
39
|
+
stop: function () {
|
|
40
|
+
log.info(constants_1.POLLING_STOP);
|
|
41
|
+
if (definitionsSyncTask.isRunning())
|
|
42
|
+
definitionsSyncTask.stop();
|
|
43
|
+
if (segmentsSyncTask.isRunning())
|
|
44
|
+
segmentsSyncTask.stop();
|
|
45
|
+
},
|
|
46
|
+
// Used by SyncManager to know if running in polling mode.
|
|
47
|
+
isRunning: definitionsSyncTask.isRunning,
|
|
48
|
+
syncAll: function () {
|
|
49
|
+
// fetch definitions and segments. There is no need to catch this promise (`DefinitionChangesUpdater` is always resolved with a boolean value)
|
|
50
|
+
return definitionsSyncTask.execute().then(function () {
|
|
51
|
+
return segmentsSyncTask.execute();
|
|
28
52
|
});
|
|
29
53
|
}
|
|
30
|
-
}
|
|
31
|
-
// Stop periodic fetching (polling)
|
|
32
|
-
stop: function () {
|
|
33
|
-
log.info(constants_1.POLLING_STOP);
|
|
34
|
-
if (splitsSyncTask.isRunning())
|
|
35
|
-
splitsSyncTask.stop();
|
|
36
|
-
if (segmentsSyncTask.isRunning())
|
|
37
|
-
segmentsSyncTask.stop();
|
|
38
|
-
},
|
|
39
|
-
// Used by SyncManager to know if running in polling mode.
|
|
40
|
-
isRunning: splitsSyncTask.isRunning,
|
|
41
|
-
syncAll: function () {
|
|
42
|
-
// fetch splits and segments. There is no need to catch this promise (`SplitChangesUpdater` is always resolved with a boolean value)
|
|
43
|
-
return splitsSyncTask.execute().then(function () {
|
|
44
|
-
return segmentsSyncTask.execute();
|
|
45
|
-
});
|
|
46
|
-
}
|
|
54
|
+
};
|
|
47
55
|
};
|
|
48
56
|
}
|
|
49
57
|
exports.pollingManagerSSFactory = pollingManagerSSFactory;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.definitionsSyncTaskFactory = void 0;
|
|
4
|
+
var syncTask_1 = require("../../syncTask");
|
|
5
|
+
var definitionChangesUpdater_1 = require("../updaters/definitionChangesUpdater");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a sync task that periodically executes a `definitionChangesUpdater` task
|
|
8
|
+
*/
|
|
9
|
+
function definitionsSyncTaskFactory(definitionChangesFetcher, storage, readiness, settings, segmentsSyncTask // undefined for client-side
|
|
10
|
+
) {
|
|
11
|
+
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, segmentsSyncTask), settings.scheduler.featuresRefreshRate, 'definitionChangesUpdater');
|
|
12
|
+
}
|
|
13
|
+
exports.definitionsSyncTaskFactory = definitionsSyncTaskFactory;
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.segmentsSyncTaskFactory = void 0;
|
|
4
4
|
var syncTask_1 = require("../../syncTask");
|
|
5
|
-
var segmentChangesFetcher_1 = require("../fetchers/segmentChangesFetcher");
|
|
6
5
|
var segmentChangesUpdater_1 = require("../updaters/segmentChangesUpdater");
|
|
7
6
|
/**
|
|
8
7
|
* Creates a sync task that periodically executes a `segmentChangesUpdater` task
|
|
9
8
|
*/
|
|
10
|
-
function segmentsSyncTaskFactory(
|
|
11
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log,
|
|
9
|
+
function segmentsSyncTaskFactory(segmentChangesFetcher, storage, readiness, settings) {
|
|
10
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log, segmentChangesFetcher, storage.segments, readiness, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'segmentChangesUpdater');
|
|
12
11
|
}
|
|
13
12
|
exports.segmentsSyncTaskFactory = segmentsSyncTaskFactory;
|