@splitsoftware/splitio-commons 3.1.1-rc.1 → 3.1.1-rc.10
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 +10 -1
- package/cjs/evaluator/condition/index.js +2 -2
- package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
- package/cjs/evaluator/index.js +71 -76
- package/cjs/listeners/browser.js +1 -2
- package/cjs/listeners/node.js +4 -4
- package/cjs/logger/constants.js +20 -15
- package/cjs/logger/messages/debug.js +6 -5
- package/cjs/logger/messages/error.js +3 -3
- package/cjs/logger/messages/info.js +4 -3
- package/cjs/logger/messages/warn.js +7 -6
- package/cjs/presets/serverSide.js +2 -2
- package/cjs/readiness/constants.js +4 -5
- package/cjs/readiness/readinessManager.js +23 -23
- package/cjs/readiness/sdkReadinessManager.js +17 -1
- package/cjs/sdkClient/client.js +51 -27
- package/cjs/sdkClient/clientInputValidation.js +17 -6
- package/cjs/sdkClient/sdkClient.js +60 -3
- package/cjs/sdkFactory/index.js +15 -11
- package/cjs/sdkManager/index.js +5 -5
- package/cjs/services/decorateHeaders.js +1 -2
- package/cjs/services/splitApi.js +1 -14
- package/cjs/services/splitHttpClient.js +5 -3
- package/cjs/storages/AbstractSplitsCacheAsync.js +51 -0
- package/cjs/storages/AbstractSplitsCacheSync.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/MySegmentsCacheInLocal.js +2 -1
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +194 -0
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +121 -0
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RedisAdapter.js +8 -5
- package/cjs/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +77 -77
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/SplitsCachePluggable.js +212 -0
- package/cjs/storages/pluggable/index.js +2 -2
- package/cjs/storages/setRolloutPlan.js +4 -4
- package/cjs/storages/utils.js +0 -1
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +15 -24
- package/cjs/sync/polling/pollingManagerCS.js +20 -20
- package/cjs/sync/polling/pollingManagerSS.js +15 -15
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +13 -0
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
- package/cjs/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
- package/cjs/sync/streaming/AuthClient/index.js +1 -1
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -1
- package/cjs/sync/streaming/UpdateWorkers/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +19 -16
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +11 -11
- package/cjs/sync/streaming/pushManager.js +16 -16
- package/cjs/sync/submitters/eventsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/cjs/sync/submitters/impressionsSubmitter.js +4 -5
- package/cjs/sync/submitters/telemetrySubmitter.js +4 -3
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/cjs/sync/syncManagerOnline.js +7 -12
- package/cjs/utils/Backoff.js +0 -20
- package/cjs/utils/inputValidation/index.js +7 -7
- package/cjs/utils/inputValidation/isOperational.js +4 -4
- package/cjs/utils/inputValidation/{definition.js → split.js} +10 -10
- package/cjs/utils/inputValidation/{definitionExistence.js → splitExistence.js} +6 -6
- package/cjs/utils/inputValidation/splits.js +25 -0
- package/cjs/utils/labels/index.js +3 -3
- package/cjs/utils/settingsValidation/index.js +0 -2
- package/cjs/utils/settingsValidation/splitFilters.js +3 -3
- package/cjs/utils/settingsValidation/url.js +2 -6
- package/esm/evaluator/condition/index.js +2 -2
- package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +8 -5
- package/esm/evaluator/index.js +71 -75
- package/esm/listeners/browser.js +1 -2
- package/esm/listeners/node.js +4 -4
- package/esm/logger/constants.js +17 -12
- package/esm/logger/messages/debug.js +6 -5
- package/esm/logger/messages/error.js +3 -3
- package/esm/logger/messages/info.js +4 -3
- package/esm/logger/messages/warn.js +7 -6
- package/esm/presets/serverSide.js +2 -2
- package/esm/readiness/constants.js +3 -4
- package/esm/readiness/readinessManager.js +24 -24
- package/esm/readiness/sdkReadinessManager.js +18 -2
- package/esm/sdkClient/client.js +51 -26
- package/esm/sdkClient/clientInputValidation.js +19 -8
- package/esm/sdkClient/sdkClient.js +60 -3
- package/esm/sdkFactory/index.js +16 -12
- package/esm/sdkManager/index.js +6 -6
- package/esm/services/decorateHeaders.js +1 -2
- package/esm/services/splitApi.js +1 -14
- package/esm/services/splitHttpClient.js +5 -3
- package/esm/storages/AbstractSplitsCacheAsync.js +48 -0
- package/esm/storages/AbstractSplitsCacheSync.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/MySegmentsCacheInLocal.js +2 -1
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +191 -0
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/SplitsCacheInMemory.js +118 -0
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/RedisAdapter.js +8 -5
- package/esm/storages/inRedis/{DefinitionsCacheInRedis.js → SplitsCacheInRedis.js} +76 -76
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/esm/storages/pluggable/SplitsCachePluggable.js +209 -0
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/storages/setRolloutPlan.js +4 -4
- package/esm/storages/utils.js +0 -1
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +16 -25
- package/esm/sync/polling/pollingManagerCS.js +17 -17
- package/esm/sync/polling/pollingManagerSS.js +15 -15
- package/esm/sync/polling/syncTasks/segmentsSyncTask.js +3 -2
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +9 -0
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
- package/esm/sync/polling/updaters/{definitionChangesUpdater.js → splitChangesUpdater.js} +68 -65
- package/esm/sync/streaming/AuthClient/index.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/{DefinitionsUpdateWorker.js → SplitsUpdateWorker.js} +18 -15
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +9 -9
- package/esm/sync/streaming/pushManager.js +18 -18
- package/esm/sync/submitters/eventsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
- package/esm/sync/submitters/impressionsSubmitter.js +4 -5
- package/esm/sync/submitters/telemetrySubmitter.js +4 -3
- package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
- package/esm/sync/syncManagerOnline.js +6 -11
- package/esm/utils/Backoff.js +0 -20
- package/esm/utils/inputValidation/index.js +3 -3
- package/esm/utils/inputValidation/isOperational.js +4 -4
- package/esm/utils/inputValidation/{definition.js → split.js} +8 -8
- package/esm/utils/inputValidation/splitExistence.js +15 -0
- package/esm/utils/inputValidation/splits.js +21 -0
- package/esm/utils/labels/index.js +2 -2
- package/esm/utils/settingsValidation/index.js +0 -2
- package/esm/utils/settingsValidation/splitFilters.js +3 -3
- package/esm/utils/settingsValidation/url.js +2 -6
- package/package.json +6 -7
- package/src/dtos/types.ts +1 -1
- package/src/evaluator/index.ts +11 -5
- package/src/evaluator/types.ts +1 -0
- package/src/presets/serverSide.ts +3 -3
- package/src/sdkClient/client.ts +3 -4
- package/src/sdkClient/sdkLifecycle.ts +3 -0
- package/src/services/authProvider.ts +41 -19
- package/src/services/secureSplitHttpClient.ts +10 -18
- package/src/services/serviceApi.ts +27 -24
- package/src/services/splitApi.ts +10 -9
- package/src/services/types.ts +5 -4
- package/src/storages/inRedis/RedisAdapter.ts +8 -5
- package/src/sync/polling/pollingManagerCS.ts +80 -78
- package/src/sync/polling/pollingManagerSS.ts +49 -45
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +3 -3
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/streaming/AuthClient/index.ts +14 -15
- package/src/sync/streaming/AuthClient/types.ts +9 -13
- package/src/sync/streaming/SSEClient/index.ts +2 -2
- package/src/sync/streaming/SSEClient/types.ts +2 -2
- package/src/sync/streaming/SSEHandler/index.ts +2 -1
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/constants.ts +1 -0
- package/src/sync/streaming/pushManager.ts +32 -42
- package/src/sync/streaming/types.ts +3 -2
- package/src/sync/submitters/impressionsSubmitter.ts +3 -3
- package/src/sync/submitters/types.ts +2 -2
- package/src/sync/syncManagerOnline.ts +2 -8
- package/src/utils/Backoff.ts +16 -4
- package/types/splitio.d.ts +5 -4
- package/cjs/platform/browser.js +0 -15
- package/cjs/platform/getEventSource/browser.js +0 -8
- package/cjs/platform/getEventSource/eventsource.js +0 -480
- package/cjs/platform/getEventSource/node.js +0 -26
- package/cjs/platform/getFetch/browser.js +0 -9
- package/cjs/platform/getFetch/node.js +0 -27
- package/cjs/platform/getOptions/node.js +0 -25
- package/cjs/platform/node.js +0 -17
- package/cjs/sdkClient/sdkLifecycle.js +0 -72
- package/cjs/sdkClient/trackMethod.js +0 -56
- package/cjs/services/authProvider.js +0 -67
- package/cjs/services/secureSplitHttpClient.js +0 -39
- package/cjs/services/serviceApi.js +0 -145
- package/cjs/storages/AbstractDefinitionsCacheAsync.js +0 -51
- package/cjs/storages/AbstractDefinitionsCacheSync.js +0 -76
- package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -194
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +0 -121
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +0 -212
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +0 -13
- package/cjs/utils/EventEmitter.js +0 -391
- package/cjs/utils/filter/bloomFilter.js +0 -37
- package/cjs/utils/inputValidation/definitions.js +0 -25
- package/cjs/utils/inputValidation/target.js +0 -22
- package/esm/platform/browser.js +0 -12
- package/esm/platform/getEventSource/browser.js +0 -4
- package/esm/platform/getEventSource/eventsource.js +0 -480
- package/esm/platform/getEventSource/node.js +0 -20
- package/esm/platform/getFetch/browser.js +0 -5
- package/esm/platform/getFetch/node.js +0 -22
- package/esm/platform/getOptions/node.js +0 -20
- package/esm/platform/node.js +0 -14
- package/esm/sdkClient/sdkLifecycle.js +0 -68
- package/esm/sdkClient/trackMethod.js +0 -52
- package/esm/services/authProvider.js +0 -63
- package/esm/services/secureSplitHttpClient.js +0 -35
- package/esm/services/serviceApi.js +0 -141
- package/esm/storages/AbstractDefinitionsCacheAsync.js +0 -48
- package/esm/storages/AbstractDefinitionsCacheSync.js +0 -71
- package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +0 -191
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +0 -118
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +0 -209
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +0 -9
- package/esm/utils/EventEmitter.js +0 -387
- package/esm/utils/filter/bloomFilter.js +0 -33
- package/esm/utils/inputValidation/definitionExistence.js +0 -15
- package/esm/utils/inputValidation/definitions.js +0 -21
- package/esm/utils/inputValidation/target.js +0 -18
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SplitsCachePluggable = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var lang_1 = require("../../utils/lang");
|
|
6
|
+
var constants_1 = require("./constants");
|
|
7
|
+
var AbstractSplitsCacheAsync_1 = require("../AbstractSplitsCacheAsync");
|
|
8
|
+
var sets_1 = require("../../utils/lang/sets");
|
|
9
|
+
/**
|
|
10
|
+
* ISplitsCacheAsync implementation for pluggable storages.
|
|
11
|
+
*/
|
|
12
|
+
var SplitsCachePluggable = /** @class */ (function (_super) {
|
|
13
|
+
tslib_1.__extends(SplitsCachePluggable, _super);
|
|
14
|
+
/**
|
|
15
|
+
* Create a SplitsCache that uses a storage wrapper.
|
|
16
|
+
* @param log - Logger instance.
|
|
17
|
+
* @param keys - Key builder.
|
|
18
|
+
* @param wrapper - Adapted wrapper storage.
|
|
19
|
+
*/
|
|
20
|
+
function SplitsCachePluggable(log, keys, wrapper, splitFiltersValidation) {
|
|
21
|
+
var _this = _super.call(this) || this;
|
|
22
|
+
_this.log = log;
|
|
23
|
+
_this.keys = keys;
|
|
24
|
+
_this.wrapper = wrapper;
|
|
25
|
+
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
26
|
+
return _this;
|
|
27
|
+
}
|
|
28
|
+
SplitsCachePluggable.prototype._decrementCounts = function (split) {
|
|
29
|
+
var _this = this;
|
|
30
|
+
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
31
|
+
return this.wrapper.decr(ttKey).then(function (count) {
|
|
32
|
+
if (count === 0)
|
|
33
|
+
return _this.wrapper.del(ttKey);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
SplitsCachePluggable.prototype._incrementCounts = function (split) {
|
|
37
|
+
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
38
|
+
return this.wrapper.incr(ttKey);
|
|
39
|
+
};
|
|
40
|
+
SplitsCachePluggable.prototype._updateFlagSets = function (featureFlagName, flagSetsOfRemovedFlag, flagSetsOfAddedFlag) {
|
|
41
|
+
var _this = this;
|
|
42
|
+
var removeFromFlagSets = (0, sets_1.returnDifference)(flagSetsOfRemovedFlag, flagSetsOfAddedFlag);
|
|
43
|
+
var addToFlagSets = (0, sets_1.returnDifference)(flagSetsOfAddedFlag, flagSetsOfRemovedFlag);
|
|
44
|
+
if (this.flagSetsFilter.length > 0) {
|
|
45
|
+
addToFlagSets = addToFlagSets.filter(function (flagSet) {
|
|
46
|
+
return _this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === flagSet; });
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
var items = [featureFlagName];
|
|
50
|
+
return Promise.all(tslib_1.__spreadArray(tslib_1.__spreadArray([], removeFromFlagSets.map(function (flagSetName) { return _this.wrapper.removeItems(_this.keys.buildFlagSetKey(flagSetName), items); }), true), addToFlagSets.map(function (flagSetName) { return _this.wrapper.addItems(_this.keys.buildFlagSetKey(flagSetName), items); }), true));
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Add a given split.
|
|
54
|
+
* The returned promise is resolved when the operation success
|
|
55
|
+
* or rejected if it fails (e.g., wrapper operation fails)
|
|
56
|
+
*/
|
|
57
|
+
SplitsCachePluggable.prototype.addSplit = function (split) {
|
|
58
|
+
var _this = this;
|
|
59
|
+
var name = split.name;
|
|
60
|
+
var splitKey = this.keys.buildSplitKey(name);
|
|
61
|
+
return this.wrapper.get(splitKey).then(function (splitFromStorage) {
|
|
62
|
+
// handling parsing error
|
|
63
|
+
var parsedPreviousSplit, stringifiedNewSplit;
|
|
64
|
+
try {
|
|
65
|
+
parsedPreviousSplit = splitFromStorage ? JSON.parse(splitFromStorage) : undefined;
|
|
66
|
+
stringifiedNewSplit = JSON.stringify(split);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
throw new Error('Error parsing feature flag definition: ' + e);
|
|
70
|
+
}
|
|
71
|
+
return _this.wrapper.set(splitKey, stringifiedNewSplit).then(function () {
|
|
72
|
+
// avoid unnecessary increment/decrement operations
|
|
73
|
+
if (parsedPreviousSplit && parsedPreviousSplit.trafficTypeName === split.trafficTypeName)
|
|
74
|
+
return;
|
|
75
|
+
// update traffic type counts
|
|
76
|
+
return _this._incrementCounts(split).then(function () {
|
|
77
|
+
if (parsedPreviousSplit)
|
|
78
|
+
return _this._decrementCounts(parsedPreviousSplit);
|
|
79
|
+
});
|
|
80
|
+
}).then(function () { return _this._updateFlagSets(name, parsedPreviousSplit && parsedPreviousSplit.sets, split.sets); });
|
|
81
|
+
}).then(function () { return true; });
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Remove a given split.
|
|
85
|
+
* The returned promise is resolved when the operation success, with a boolean indicating if the split existed or not.
|
|
86
|
+
* or rejected if it fails (e.g., wrapper operation fails).
|
|
87
|
+
*/
|
|
88
|
+
SplitsCachePluggable.prototype.removeSplit = function (name) {
|
|
89
|
+
var _this = this;
|
|
90
|
+
return this.getSplit(name).then(function (split) {
|
|
91
|
+
if (split) {
|
|
92
|
+
return _this._decrementCounts(split).then(function () { return _this._updateFlagSets(name, split.sets); });
|
|
93
|
+
}
|
|
94
|
+
}).then(function () {
|
|
95
|
+
return _this.wrapper.del(_this.keys.buildSplitKey(name));
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Get split.
|
|
100
|
+
* The returned promise is resolved with the split definition or null if it's not defined,
|
|
101
|
+
* or rejected if wrapper operation fails.
|
|
102
|
+
*/
|
|
103
|
+
SplitsCachePluggable.prototype.getSplit = function (name) {
|
|
104
|
+
return this.wrapper.get(this.keys.buildSplitKey(name))
|
|
105
|
+
.then(function (maybeSplit) { return maybeSplit && JSON.parse(maybeSplit); });
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Get list of splits.
|
|
109
|
+
* The returned promise is resolved with a map of split names to their split definition or null if it's not defined,
|
|
110
|
+
* or rejected if wrapper operation fails.
|
|
111
|
+
*/
|
|
112
|
+
SplitsCachePluggable.prototype.getSplits = function (names) {
|
|
113
|
+
var _this = this;
|
|
114
|
+
var keys = names.map(function (name) { return _this.keys.buildSplitKey(name); });
|
|
115
|
+
return this.wrapper.getMany(keys).then(function (splitDefinitions) {
|
|
116
|
+
var splits = {};
|
|
117
|
+
names.forEach(function (name, idx) {
|
|
118
|
+
var split = splitDefinitions[idx];
|
|
119
|
+
splits[name] = split && JSON.parse(split);
|
|
120
|
+
});
|
|
121
|
+
return Promise.resolve(splits);
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Get list of all split definitions.
|
|
126
|
+
* The returned promise is resolved with the list of split definitions,
|
|
127
|
+
* or rejected if wrapper operation fails.
|
|
128
|
+
*/
|
|
129
|
+
SplitsCachePluggable.prototype.getAll = function () {
|
|
130
|
+
var _this = this;
|
|
131
|
+
return this.wrapper.getKeysByPrefix(this.keys.buildSplitKeyPrefix())
|
|
132
|
+
.then(function (listOfKeys) { return _this.wrapper.getMany(listOfKeys); })
|
|
133
|
+
.then(function (splitDefinitions) { return splitDefinitions.map(function (splitDefinition) {
|
|
134
|
+
return JSON.parse(splitDefinition);
|
|
135
|
+
}); });
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Get list of split names.
|
|
139
|
+
* The returned promise is resolved with the list of split names,
|
|
140
|
+
* or rejected if wrapper operation fails.
|
|
141
|
+
*/
|
|
142
|
+
SplitsCachePluggable.prototype.getSplitNames = function () {
|
|
143
|
+
var _this = this;
|
|
144
|
+
return this.wrapper.getKeysByPrefix(this.keys.buildSplitKeyPrefix()).then(function (listOfKeys) { return listOfKeys.map(_this.keys.extractKey); });
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Get list of feature flag names related to a given list of flag set names.
|
|
148
|
+
* The returned promise is resolved with the list of feature flag names per flag set.
|
|
149
|
+
* It never rejects (If there is a wrapper error for some flag set, an empty set is returned for it).
|
|
150
|
+
*/
|
|
151
|
+
SplitsCachePluggable.prototype.getNamesByFlagSets = function (flagSets) {
|
|
152
|
+
var _this = this;
|
|
153
|
+
return Promise.all(flagSets.map(function (flagSet) {
|
|
154
|
+
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
155
|
+
return _this.wrapper.getItems(flagSetKey).catch(function () { return []; });
|
|
156
|
+
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Check traffic type existence.
|
|
160
|
+
* The returned promise is resolved with a boolean indicating whether the TT exist or not.
|
|
161
|
+
* In case of wrapper operation failures, the promise resolves with a true value, assuming that the TT might exist.
|
|
162
|
+
* It will never be rejected.
|
|
163
|
+
*/
|
|
164
|
+
SplitsCachePluggable.prototype.trafficTypeExists = function (trafficType) {
|
|
165
|
+
var _this = this;
|
|
166
|
+
// If there is a number there should be > 0, otherwise the TT is considered as not existent.
|
|
167
|
+
return this.wrapper.get(this.keys.buildTrafficTypeKey(trafficType))
|
|
168
|
+
.then(function (ttCount) {
|
|
169
|
+
if (ttCount === null)
|
|
170
|
+
return false; // if entry doesn't exist, means that TT doesn't exist
|
|
171
|
+
ttCount = parseInt(ttCount, 10);
|
|
172
|
+
if (!(0, lang_1.isFiniteNumber)(ttCount) || ttCount < 0) {
|
|
173
|
+
_this.log.info(constants_1.LOG_PREFIX + "Could not validate traffic type existence of ".concat(trafficType, " due to data corruption of some sorts."));
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
return ttCount > 0;
|
|
177
|
+
}).catch(function (e) {
|
|
178
|
+
_this.log.error(constants_1.LOG_PREFIX + "Could not validate traffic type existence of ".concat(trafficType, " due to an error: ").concat(e, "."));
|
|
179
|
+
// If there is an error, bypass the validation so the event can get tracked.
|
|
180
|
+
return true;
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* Set till number.
|
|
185
|
+
* The returned promise is resolved when the operation success,
|
|
186
|
+
* or rejected if it fails (e.g., wrapper operation fails).
|
|
187
|
+
*/
|
|
188
|
+
SplitsCachePluggable.prototype.setChangeNumber = function (changeNumber) {
|
|
189
|
+
return this.wrapper.set(this.keys.buildSplitsTillKey(), changeNumber + '');
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Get till number or -1 if it's not defined.
|
|
193
|
+
* The returned promise is resolved with the changeNumber or -1 if it doesn't exist or a wrapper operation fails.
|
|
194
|
+
* The promise will never be rejected.
|
|
195
|
+
*/
|
|
196
|
+
SplitsCachePluggable.prototype.getChangeNumber = function () {
|
|
197
|
+
var _this = this;
|
|
198
|
+
return this.wrapper.get(this.keys.buildSplitsTillKey()).then(function (value) {
|
|
199
|
+
var i = parseInt(value, 10);
|
|
200
|
+
return (0, lang_1.isNaNNumber)(i) ? -1 : i;
|
|
201
|
+
}).catch(function (e) {
|
|
202
|
+
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
203
|
+
return -1;
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
// @TODO implement if required by DataLoader or producer mode
|
|
207
|
+
SplitsCachePluggable.prototype.clear = function () {
|
|
208
|
+
return Promise.resolve(true);
|
|
209
|
+
};
|
|
210
|
+
return SplitsCachePluggable;
|
|
211
|
+
}(AbstractSplitsCacheAsync_1.AbstractSplitsCacheAsync));
|
|
212
|
+
exports.SplitsCachePluggable = SplitsCachePluggable;
|
|
@@ -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 SplitsCachePluggable_1 = require("./SplitsCachePluggable");
|
|
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
|
+
splits: new SplitsCachePluggable_1.SplitsCachePluggable(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 splits = storage.splits, 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 (splits && ff) {
|
|
31
|
+
splits.clear();
|
|
32
|
+
splits.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, splitsCache = storage.splits;
|
|
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
|
+
splitsCache.clear(),
|
|
43
|
+
splitsCache.update(splits, [], Date.now())
|
|
44
44
|
]).then(function () {
|
|
45
|
-
readiness.
|
|
45
|
+
readiness.splits.emit(constants_2.SDK_SPLITS_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.splits.emit(constants_2.SDK_SPLITS_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,25 +10,16 @@ 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 };
|
|
20
|
-
}
|
|
21
13
|
/**
|
|
22
14
|
* Factory of SplitChanges fetcher.
|
|
23
15
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
24
16
|
*/
|
|
25
17
|
// @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
|
|
26
|
-
function splitChangesFetcherFactory(
|
|
27
|
-
var fetchSplitChanges = params.serviceApi.fetchSplitChanges, settings = params.settings, storage = params.storage;
|
|
18
|
+
function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
28
19
|
var log = settings.log;
|
|
29
20
|
var PROXY_CHECK_INTERVAL_MILLIS = (0, key_1.checkIfServerSide)(settings) ? PROXY_CHECK_INTERVAL_MILLIS_SS : PROXY_CHECK_INTERVAL_MILLIS_CS;
|
|
30
21
|
var lastProxyCheckTimestamp;
|
|
31
|
-
function splitChangesFetcher(since, noCache, till, rbSince,
|
|
22
|
+
return function splitChangesFetcher(since, noCache, till, rbSince,
|
|
32
23
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
33
24
|
decorator) {
|
|
34
25
|
// Recheck proxy
|
|
@@ -39,7 +30,7 @@ function splitChangesFetcherFactory(params) {
|
|
|
39
30
|
.catch(function (err) {
|
|
40
31
|
// Handle proxy error with spec 1.3
|
|
41
32
|
if ((!err.statusCode || err.statusCode === 400) && sdkEndpointOverridden(settings) && settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION) {
|
|
42
|
-
log.error(constants_2.
|
|
33
|
+
log.error(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
|
|
43
34
|
lastProxyCheckTimestamp = Date.now();
|
|
44
35
|
settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
|
|
45
36
|
return fetchSplitChanges(since, noCache, till); // retry request without rbSince
|
|
@@ -52,27 +43,27 @@ function splitChangesFetcherFactory(params) {
|
|
|
52
43
|
.then(function (resp) { return resp.json(); })
|
|
53
44
|
.then(function (data) {
|
|
54
45
|
// Using flag spec version 1.2 or below
|
|
55
|
-
if (
|
|
56
|
-
return {
|
|
46
|
+
if (data.splits) {
|
|
47
|
+
return {
|
|
48
|
+
ff: {
|
|
49
|
+
d: data.splits,
|
|
50
|
+
s: data.since,
|
|
51
|
+
t: data.till
|
|
52
|
+
}
|
|
53
|
+
};
|
|
57
54
|
}
|
|
58
55
|
// Proxy recovery
|
|
59
56
|
if (lastProxyCheckTimestamp) {
|
|
60
|
-
log.info(constants_2.
|
|
57
|
+
log.info(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error recovered');
|
|
61
58
|
lastProxyCheckTimestamp = undefined;
|
|
62
59
|
return splitChangesFetcher(-1, undefined, undefined, -1)
|
|
63
60
|
.then(function (splitChangesResponse) {
|
|
64
|
-
return Promise.all([storage.
|
|
61
|
+
return Promise.all([storage.splits.clear(), storage.rbSegments.clear()])
|
|
65
62
|
.then(function () { return splitChangesResponse; });
|
|
66
63
|
});
|
|
67
64
|
}
|
|
68
|
-
|
|
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
|
-
};
|
|
65
|
+
return data;
|
|
73
66
|
});
|
|
74
|
-
}
|
|
75
|
-
splitChangesFetcher.type = 'feature flags';
|
|
76
|
-
return splitChangesFetcher;
|
|
67
|
+
};
|
|
77
68
|
}
|
|
78
69
|
exports.splitChangesFetcherFactory = splitChangesFetcherFactory;
|
|
@@ -3,19 +3,19 @@ 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 splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
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 AbstractSplitsCacheSync_1 = require("../../storages/AbstractSplitsCacheSync");
|
|
11
11
|
/**
|
|
12
12
|
* Expose start / stop mechanism for polling data from services.
|
|
13
13
|
* For client-side API with multiple clients.
|
|
14
14
|
*/
|
|
15
|
-
function pollingManagerCSFactory(params
|
|
16
|
-
var
|
|
15
|
+
function pollingManagerCSFactory(params) {
|
|
16
|
+
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
17
|
var log = settings.log;
|
|
18
|
-
var
|
|
18
|
+
var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
|
|
19
19
|
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
20
20
|
var mySegmentsSyncTasks = {};
|
|
21
21
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
@@ -32,10 +32,10 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
// smart pausing
|
|
35
|
-
readiness.
|
|
36
|
-
if (!
|
|
35
|
+
readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
|
|
36
|
+
if (!splitsSyncTask.isRunning())
|
|
37
37
|
return; // noop if not doing polling
|
|
38
|
-
var usingSegments = (0,
|
|
38
|
+
var usingSegments = (0, AbstractSplitsCacheSync_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) {
|
|
@@ -47,41 +47,41 @@ function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
function add(matchingKey, readiness, storage) {
|
|
50
|
-
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(
|
|
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, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
|
|
54
54
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
|
|
55
55
|
}
|
|
56
|
-
if (!(0,
|
|
56
|
+
if (!(0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
|
|
57
57
|
setTimeout(smartReady, 0);
|
|
58
58
|
else
|
|
59
|
-
readiness.
|
|
59
|
+
readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
|
|
60
60
|
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
61
61
|
return mySegmentsSyncTask;
|
|
62
62
|
}
|
|
63
63
|
return {
|
|
64
|
-
|
|
64
|
+
splitsSyncTask: splitsSyncTask,
|
|
65
65
|
segmentsSyncTask: mySegmentsSyncTask,
|
|
66
66
|
// Start periodic fetching (polling)
|
|
67
67
|
start: function () {
|
|
68
68
|
log.info(constants_2.POLLING_START);
|
|
69
|
-
|
|
70
|
-
if ((0,
|
|
69
|
+
splitsSyncTask.start();
|
|
70
|
+
if ((0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
|
|
71
71
|
startMySegmentsSyncTasks();
|
|
72
72
|
},
|
|
73
73
|
// Stop periodic fetching (polling)
|
|
74
74
|
stop: function () {
|
|
75
75
|
log.info(constants_2.POLLING_STOP);
|
|
76
|
-
if (
|
|
77
|
-
|
|
76
|
+
if (splitsSyncTask.isRunning())
|
|
77
|
+
splitsSyncTask.stop();
|
|
78
78
|
stopMySegmentsSyncTasks();
|
|
79
79
|
},
|
|
80
80
|
// Used by SyncManager to know if running in polling mode.
|
|
81
|
-
isRunning:
|
|
82
|
-
// fetch
|
|
81
|
+
isRunning: splitsSyncTask.isRunning,
|
|
82
|
+
// fetch splits and segments
|
|
83
83
|
syncAll: function () {
|
|
84
|
-
var promises = [
|
|
84
|
+
var promises = [splitsSyncTask.execute()];
|
|
85
85
|
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
86
86
|
promises.push(mySegmentsSyncTask.execute());
|
|
87
87
|
});
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
|
-
var
|
|
4
|
+
var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
6
|
var constants_1 = require("../../logger/constants");
|
|
7
7
|
/**
|
|
8
8
|
* Expose start / stop mechanism for pulling data from services.
|
|
9
9
|
*/
|
|
10
|
-
function pollingManagerSSFactory(params
|
|
11
|
-
var storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
10
|
+
function pollingManagerSSFactory(params) {
|
|
11
|
+
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
12
12
|
var log = settings.log;
|
|
13
|
-
var
|
|
14
|
-
var
|
|
13
|
+
var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings);
|
|
14
|
+
var segmentsSyncTask = (0, segmentsSyncTask_1.segmentsSyncTaskFactory)(splitApi.fetchSegmentChanges, storage, readiness, settings);
|
|
15
15
|
return {
|
|
16
|
-
|
|
16
|
+
splitsSyncTask: splitsSyncTask,
|
|
17
17
|
segmentsSyncTask: segmentsSyncTask,
|
|
18
18
|
// Start periodic fetching (polling)
|
|
19
19
|
start: function () {
|
|
20
20
|
log.info(constants_1.POLLING_START);
|
|
21
|
-
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "
|
|
22
|
-
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "
|
|
23
|
-
var startingUp =
|
|
21
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "Splits will be refreshed each ".concat(settings.scheduler.featuresRefreshRate, " millis"));
|
|
22
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "Segments will be refreshed each ".concat(settings.scheduler.segmentsRefreshRate, " millis"));
|
|
23
|
+
var startingUp = splitsSyncTask.start();
|
|
24
24
|
if (startingUp) {
|
|
25
25
|
startingUp.then(function () {
|
|
26
|
-
if (
|
|
26
|
+
if (splitsSyncTask.isRunning())
|
|
27
27
|
segmentsSyncTask.start();
|
|
28
28
|
});
|
|
29
29
|
}
|
|
@@ -31,16 +31,16 @@ function pollingManagerSSFactory(params, definitionChangesFetcher, segmentChange
|
|
|
31
31
|
// Stop periodic fetching (polling)
|
|
32
32
|
stop: function () {
|
|
33
33
|
log.info(constants_1.POLLING_STOP);
|
|
34
|
-
if (
|
|
35
|
-
|
|
34
|
+
if (splitsSyncTask.isRunning())
|
|
35
|
+
splitsSyncTask.stop();
|
|
36
36
|
if (segmentsSyncTask.isRunning())
|
|
37
37
|
segmentsSyncTask.stop();
|
|
38
38
|
},
|
|
39
39
|
// Used by SyncManager to know if running in polling mode.
|
|
40
|
-
isRunning:
|
|
40
|
+
isRunning: splitsSyncTask.isRunning,
|
|
41
41
|
syncAll: function () {
|
|
42
|
-
// fetch
|
|
43
|
-
return
|
|
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
44
|
return segmentsSyncTask.execute();
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -2,11 +2,12 @@
|
|
|
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");
|
|
5
6
|
var segmentChangesUpdater_1 = require("../updaters/segmentChangesUpdater");
|
|
6
7
|
/**
|
|
7
8
|
* Creates a sync task that periodically executes a `segmentChangesUpdater` task
|
|
8
9
|
*/
|
|
9
|
-
function segmentsSyncTaskFactory(
|
|
10
|
-
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log,
|
|
10
|
+
function segmentsSyncTaskFactory(fetchSegmentChanges, storage, readiness, settings) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log, (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(fetchSegmentChanges), storage.segments, readiness, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'segmentChangesUpdater');
|
|
11
12
|
}
|
|
12
13
|
exports.segmentsSyncTaskFactory = segmentsSyncTaskFactory;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.splitsSyncTaskFactory = void 0;
|
|
4
|
+
var syncTask_1 = require("../../syncTask");
|
|
5
|
+
var splitChangesFetcher_1 = require("../fetchers/splitChangesFetcher");
|
|
6
|
+
var splitChangesUpdater_1 = require("../updaters/splitChangesUpdater");
|
|
7
|
+
/**
|
|
8
|
+
* Creates a sync task that periodically executes a `splitChangesUpdater` task
|
|
9
|
+
*/
|
|
10
|
+
function splitsSyncTaskFactory(fetchSplitChanges, storage, readiness, settings, isClientSide) {
|
|
11
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, splitChangesUpdater_1.splitChangesUpdaterFactory)(settings.log, (0, splitChangesFetcher_1.splitChangesFetcherFactory)(fetchSplitChanges, settings, storage), storage, settings.sync.__splitFiltersValidation, readiness.splits, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'splitChangesUpdater');
|
|
12
|
+
}
|
|
13
|
+
exports.splitsSyncTaskFactory = splitsSyncTaskFactory;
|
|
@@ -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 AbstractSplitsCacheSync_1 = require("../../../storages/AbstractSplitsCacheSync");
|
|
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, AbstractSplitsCacheSync_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
|
}
|
|
@@ -56,7 +56,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
56
56
|
return updaterPromise.catch(function (error) {
|
|
57
57
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
58
58
|
retry += 1;
|
|
59
|
-
log.warn(constants_2.
|
|
59
|
+
log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
|
|
60
60
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
@@ -23,7 +23,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
23
23
|
return promise;
|
|
24
24
|
}
|
|
25
25
|
function updateSegment(segmentName, noCache, till, fetchOnlyNew, retries) {
|
|
26
|
-
log.debug("".concat(constants_2.
|
|
26
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC_SEGMENTS, "Processing segment ").concat(segmentName));
|
|
27
27
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
28
28
|
return sincePromise.then(function (since) {
|
|
29
29
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
@@ -31,14 +31,14 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
31
31
|
false :
|
|
32
32
|
segmentChangesFetcher(since || -1, segmentName, noCache, till, _promiseDecorator).then(function (changes) {
|
|
33
33
|
return Promise.all(changes.map(function (x) {
|
|
34
|
-
log.debug("".concat(constants_2.
|
|
34
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC_SEGMENTS, "Processing ").concat(segmentName, " with till = ").concat(x.till, ". Added: ").concat(x.added.length, ". Removed: ").concat(x.removed.length));
|
|
35
35
|
return segments.update(segmentName, x.added, x.removed, x.till);
|
|
36
36
|
})).then(function (updates) {
|
|
37
37
|
return updates.some(function (update) { return update; });
|
|
38
38
|
});
|
|
39
39
|
}).catch(function (error) {
|
|
40
40
|
if (retries) {
|
|
41
|
-
log.warn("".concat(constants_2.
|
|
41
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC_SEGMENTS, "Retrying fetch of segment ").concat(segmentName, " (attempt #").concat(retries, "). Reason: ").concat(error));
|
|
42
42
|
return updateSegment(segmentName, noCache, till, fetchOnlyNew, retries - 1);
|
|
43
43
|
}
|
|
44
44
|
throw error;
|
|
@@ -57,7 +57,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
57
57
|
* @param till - till target for the provided segmentName, for CDN bypass.
|
|
58
58
|
*/
|
|
59
59
|
return function segmentChangesUpdater(fetchOnlyNew, segmentName, noCache, till) {
|
|
60
|
-
log.debug("".concat(constants_2.
|
|
60
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC_SEGMENTS, "Started segments update"));
|
|
61
61
|
// If not a segment name provided, read list of available segments names to be updated.
|
|
62
62
|
var segmentsPromise = Promise.resolve(segmentName ? [segmentName] : segments.getRegisteredSegments());
|
|
63
63
|
return segmentsPromise.then(function (segmentNames) {
|
|
@@ -66,7 +66,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
66
66
|
// if at least one segment fetch succeeded, mark segments ready
|
|
67
67
|
if (shouldUpdateFlags.some(function (update) { return update; }) || readyOnAlreadyExistentState) {
|
|
68
68
|
readyOnAlreadyExistentState = false;
|
|
69
|
-
if (readiness
|
|
69
|
+
if (readiness) {
|
|
70
70
|
var metadata = {
|
|
71
71
|
type: constants_1.SEGMENTS_UPDATE,
|
|
72
72
|
names: []
|
|
@@ -87,7 +87,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
87
87
|
log.error("".concat(constants_2.LOG_PREFIX_INSTANTIATION, ": you passed a client-side type authorizationKey, please grab an SDK Key from Harness FME UI that is of type server-side."));
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
-
log.warn("".concat(constants_2.
|
|
90
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC_SEGMENTS, "Error while doing fetch of segments. ").concat(error));
|
|
91
91
|
}
|
|
92
92
|
return false;
|
|
93
93
|
});
|