@splitsoftware/splitio-commons 2.2.1-rc.1 → 2.2.1-rc.2
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 +2 -2
- package/README.md +0 -1
- package/cjs/evaluator/combiners/and.js +6 -2
- package/cjs/evaluator/combiners/ifelseif.js +6 -6
- package/cjs/evaluator/condition/index.js +5 -6
- package/cjs/evaluator/index.js +7 -7
- package/cjs/evaluator/matchers/index.js +1 -3
- package/cjs/evaluator/matchers/matcherTypes.js +0 -1
- package/cjs/evaluator/matchersTransform/index.js +0 -4
- package/cjs/evaluator/parser/index.js +2 -2
- package/cjs/evaluator/value/sanitize.js +0 -1
- package/cjs/logger/constants.js +3 -4
- package/cjs/logger/messages/debug.js +2 -3
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/services/splitApi.js +4 -3
- package/cjs/storages/AbstractSplitsCacheSync.js +2 -5
- package/cjs/storages/KeyBuilder.js +0 -9
- package/cjs/storages/KeyBuilderCS.js +0 -3
- package/cjs/storages/KeyBuilderSS.js +0 -3
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/cjs/storages/inLocalStorage/index.js +1 -5
- package/cjs/storages/inLocalStorage/validateCache.js +1 -2
- package/cjs/storages/inMemory/InMemoryStorage.js +0 -3
- package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/cjs/storages/inRedis/index.js +9 -5
- package/cjs/storages/pluggable/index.js +0 -2
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +4 -51
- package/cjs/sync/polling/pollingManagerCS.js +7 -7
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +33 -51
- package/cjs/sync/streaming/SSEHandler/index.js +0 -1
- package/cjs/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +77 -106
- package/cjs/sync/streaming/constants.js +1 -2
- package/cjs/sync/streaming/pushManager.js +16 -3
- package/cjs/sync/syncManagerOnline.js +2 -2
- package/cjs/utils/constants/index.js +2 -3
- package/esm/evaluator/combiners/and.js +6 -2
- package/esm/evaluator/combiners/ifelseif.js +7 -7
- package/esm/evaluator/condition/index.js +5 -6
- package/esm/evaluator/index.js +7 -7
- package/esm/evaluator/matchers/index.js +1 -3
- package/esm/evaluator/matchers/matcherTypes.js +0 -1
- package/esm/evaluator/matchersTransform/index.js +0 -4
- package/esm/evaluator/parser/index.js +2 -2
- package/esm/evaluator/value/sanitize.js +0 -1
- package/esm/logger/constants.js +0 -1
- package/esm/logger/messages/debug.js +2 -3
- package/esm/logger/messages/warn.js +1 -1
- package/esm/services/splitApi.js +4 -3
- package/esm/storages/AbstractSplitsCacheSync.js +2 -5
- package/esm/storages/KeyBuilder.js +0 -9
- package/esm/storages/KeyBuilderCS.js +0 -3
- package/esm/storages/KeyBuilderSS.js +0 -3
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -9
- package/esm/storages/inLocalStorage/index.js +1 -5
- package/esm/storages/inLocalStorage/validateCache.js +1 -2
- package/esm/storages/inMemory/InMemoryStorage.js +0 -3
- package/esm/storages/inMemory/InMemoryStorageCS.js +0 -4
- package/esm/storages/inRedis/index.js +9 -5
- package/esm/storages/pluggable/index.js +0 -2
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +4 -51
- package/esm/sync/polling/pollingManagerCS.js +7 -7
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -1
- package/esm/sync/polling/updaters/splitChangesUpdater.js +33 -51
- package/esm/sync/streaming/SSEHandler/index.js +1 -2
- package/esm/sync/streaming/UpdateWorkers/SplitsUpdateWorker.js +73 -102
- package/esm/sync/streaming/constants.js +0 -1
- package/esm/sync/streaming/pushManager.js +19 -6
- package/esm/sync/syncManagerOnline.js +2 -2
- package/esm/utils/constants/index.js +1 -2
- package/package.json +1 -1
- package/src/dtos/types.ts +8 -32
- package/src/evaluator/Engine.ts +1 -1
- package/src/evaluator/combiners/and.ts +4 -5
- package/src/evaluator/combiners/ifelseif.ts +9 -7
- package/src/evaluator/condition/engineUtils.ts +1 -1
- package/src/evaluator/condition/index.ts +12 -12
- package/src/evaluator/index.ts +7 -7
- package/src/evaluator/matchers/index.ts +1 -3
- package/src/evaluator/matchers/matcherTypes.ts +0 -1
- package/src/evaluator/matchersTransform/index.ts +0 -3
- package/src/evaluator/parser/index.ts +3 -3
- package/src/evaluator/types.ts +2 -2
- package/src/evaluator/value/index.ts +2 -2
- package/src/evaluator/value/sanitize.ts +4 -5
- package/src/logger/constants.ts +0 -1
- package/src/logger/messages/debug.ts +2 -3
- package/src/logger/messages/warn.ts +1 -1
- package/src/sdkManager/index.ts +1 -1
- package/src/services/splitApi.ts +4 -3
- package/src/services/types.ts +1 -1
- package/src/storages/AbstractSplitsCacheSync.ts +3 -6
- package/src/storages/KeyBuilder.ts +0 -12
- package/src/storages/KeyBuilderCS.ts +0 -4
- package/src/storages/KeyBuilderSS.ts +0 -4
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +14 -10
- package/src/storages/inLocalStorage/index.ts +1 -5
- package/src/storages/inLocalStorage/validateCache.ts +1 -3
- package/src/storages/inMemory/InMemoryStorage.ts +0 -3
- package/src/storages/inMemory/InMemoryStorageCS.ts +0 -4
- package/src/storages/inRedis/index.ts +11 -7
- package/src/storages/pluggable/index.ts +0 -2
- package/src/storages/types.ts +1 -33
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +4 -62
- package/src/sync/polling/fetchers/types.ts +0 -1
- package/src/sync/polling/pollingManagerCS.ts +7 -7
- package/src/sync/polling/syncTasks/splitsSyncTask.ts +1 -1
- package/src/sync/polling/types.ts +2 -2
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -2
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/polling/updaters/splitChangesUpdater.ts +42 -61
- package/src/sync/streaming/SSEHandler/index.ts +1 -2
- package/src/sync/streaming/SSEHandler/types.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +68 -98
- package/src/sync/streaming/constants.ts +0 -1
- package/src/sync/streaming/parseUtils.ts +2 -2
- package/src/sync/streaming/pushManager.ts +18 -6
- package/src/sync/streaming/types.ts +2 -3
- package/src/sync/syncManagerOnline.ts +2 -2
- package/src/utils/constants/index.ts +1 -2
- package/src/utils/lang/index.ts +1 -1
- package/cjs/evaluator/matchers/rbsegment.js +0 -44
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -117
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +0 -61
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +0 -64
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +0 -64
- package/esm/evaluator/matchers/rbsegment.js +0 -40
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +0 -114
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +0 -58
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +0 -61
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +0 -61
- package/src/evaluator/matchers/rbsegment.ts +0 -62
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +0 -136
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +0 -68
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +0 -79
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +0 -76
package/esm/evaluator/index.js
CHANGED
|
@@ -26,12 +26,12 @@ export function evaluateFeature(log, key, splitName, attributes, storage) {
|
|
|
26
26
|
return treatmentException;
|
|
27
27
|
}
|
|
28
28
|
if (thenable(parsedSplit)) {
|
|
29
|
-
return parsedSplit.then(function (split) { return getEvaluation(log,
|
|
29
|
+
return parsedSplit.then(function (split) { return getEvaluation(log, split, key, attributes, storage); }).catch(
|
|
30
30
|
// Exception on async `getSplit` storage. For example, when the storage is redis or
|
|
31
31
|
// pluggable and there is a connection issue and we can't retrieve the split to be evaluated
|
|
32
32
|
function () { return treatmentException; });
|
|
33
33
|
}
|
|
34
|
-
return getEvaluation(log,
|
|
34
|
+
return getEvaluation(log, parsedSplit, key, attributes, storage);
|
|
35
35
|
}
|
|
36
36
|
export function evaluateFeatures(log, key, splitNames, attributes, storage) {
|
|
37
37
|
var parsedSplits;
|
|
@@ -43,13 +43,13 @@ export function evaluateFeatures(log, key, splitNames, attributes, storage) {
|
|
|
43
43
|
return treatmentsException(splitNames);
|
|
44
44
|
}
|
|
45
45
|
return thenable(parsedSplits) ?
|
|
46
|
-
parsedSplits.then(function (splits) { return getEvaluations(log,
|
|
46
|
+
parsedSplits.then(function (splits) { return getEvaluations(log, splitNames, splits, key, attributes, storage); })
|
|
47
47
|
.catch(function () {
|
|
48
48
|
// Exception on async `getSplits` storage. For example, when the storage is redis or
|
|
49
49
|
// pluggable and there is a connection issue and we can't retrieve the split to be evaluated
|
|
50
50
|
return treatmentsException(splitNames);
|
|
51
51
|
}) :
|
|
52
|
-
getEvaluations(log,
|
|
52
|
+
getEvaluations(log, splitNames, parsedSplits, key, attributes, storage);
|
|
53
53
|
}
|
|
54
54
|
export function evaluateFeaturesByFlagSets(log, key, flagSets, attributes, storage, method) {
|
|
55
55
|
var storedFlagNames;
|
|
@@ -84,7 +84,7 @@ export function evaluateFeaturesByFlagSets(log, key, flagSets, attributes, stora
|
|
|
84
84
|
}) :
|
|
85
85
|
evaluate(storedFlagNames);
|
|
86
86
|
}
|
|
87
|
-
function getEvaluation(log,
|
|
87
|
+
function getEvaluation(log, splitJSON, key, attributes, storage) {
|
|
88
88
|
var evaluation = {
|
|
89
89
|
treatment: CONTROL,
|
|
90
90
|
label: SPLIT_NOT_FOUND,
|
|
@@ -110,11 +110,11 @@ function getEvaluation(log, key, splitJSON, attributes, storage) {
|
|
|
110
110
|
}
|
|
111
111
|
return evaluation;
|
|
112
112
|
}
|
|
113
|
-
function getEvaluations(log,
|
|
113
|
+
function getEvaluations(log, splitNames, splits, key, attributes, storage) {
|
|
114
114
|
var result = {};
|
|
115
115
|
var thenables = [];
|
|
116
116
|
splitNames.forEach(function (splitName) {
|
|
117
|
-
var evaluation = getEvaluation(log,
|
|
117
|
+
var evaluation = getEvaluation(log, splits[splitName], key, attributes, storage);
|
|
118
118
|
if (thenable(evaluation)) {
|
|
119
119
|
thenables.push(evaluation.then(function (res) {
|
|
120
120
|
result[splitName] = res;
|
|
@@ -21,7 +21,6 @@ import { greaterThanEqualToSemverMatcherContext } from './semver_gte';
|
|
|
21
21
|
import { lessThanEqualToSemverMatcherContext } from './semver_lte';
|
|
22
22
|
import { betweenSemverMatcherContext } from './semver_between';
|
|
23
23
|
import { inListSemverMatcherContext } from './semver_inlist';
|
|
24
|
-
import { ruleBasedSegmentMatcherContext } from './rbsegment';
|
|
25
24
|
var matchers = [
|
|
26
25
|
undefined,
|
|
27
26
|
allMatcherContext,
|
|
@@ -46,8 +45,7 @@ var matchers = [
|
|
|
46
45
|
lessThanEqualToSemverMatcherContext,
|
|
47
46
|
betweenSemverMatcherContext,
|
|
48
47
|
inListSemverMatcherContext,
|
|
49
|
-
largeSegmentMatcherContext,
|
|
50
|
-
ruleBasedSegmentMatcherContext // IN_RULE_BASED_SEGMENT: 24
|
|
48
|
+
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
|
|
51
49
|
];
|
|
52
50
|
/**
|
|
53
51
|
* Matcher factory.
|
|
@@ -78,10 +78,6 @@ export function matchersTransform(matchers) {
|
|
|
78
78
|
type === matcherTypes.LESS_THAN_OR_EQUAL_TO_SEMVER) {
|
|
79
79
|
value = stringMatcherData;
|
|
80
80
|
}
|
|
81
|
-
else if (type === matcherTypes.IN_RULE_BASED_SEGMENT) {
|
|
82
|
-
value = segmentTransform(userDefinedSegmentMatcherData);
|
|
83
|
-
dataType = matcherDataTypes.NOT_SPECIFIED;
|
|
84
|
-
}
|
|
85
81
|
return {
|
|
86
82
|
attribute: attribute,
|
|
87
83
|
negate: negate,
|
|
@@ -50,8 +50,8 @@ export function parser(log, conditions, storage) {
|
|
|
50
50
|
// and break the loop
|
|
51
51
|
break;
|
|
52
52
|
}
|
|
53
|
-
predicates.push(conditionContext(log, andCombinerContext(log, expressions),
|
|
53
|
+
predicates.push(conditionContext(log, andCombinerContext(log, expressions), Treatments.parse(partitions), label, conditionType));
|
|
54
54
|
}
|
|
55
|
-
//
|
|
55
|
+
// Instanciate evaluator given the set of conditions using if else if logic
|
|
56
56
|
return ifElseIfCombinerContext(log, predicates);
|
|
57
57
|
}
|
|
@@ -49,7 +49,6 @@ function getProcessingFunction(matcherTypeID, dataType) {
|
|
|
49
49
|
case matcherTypes.BETWEEN:
|
|
50
50
|
return dataType === 'DATETIME' ? zeroSinceSS : undefined;
|
|
51
51
|
case matcherTypes.IN_SPLIT_TREATMENT:
|
|
52
|
-
case matcherTypes.IN_RULE_BASED_SEGMENT:
|
|
53
52
|
return dependencyProcessor;
|
|
54
53
|
default:
|
|
55
54
|
return undefined;
|
package/esm/logger/constants.js
CHANGED
|
@@ -21,7 +21,6 @@ export var RETRIEVE_MANAGER = 29;
|
|
|
21
21
|
export var SYNC_OFFLINE_DATA = 30;
|
|
22
22
|
export var SYNC_SPLITS_FETCH = 31;
|
|
23
23
|
export var SYNC_SPLITS_UPDATE = 32;
|
|
24
|
-
export var SYNC_RBS_UPDATE = 33;
|
|
25
24
|
export var STREAMING_NEW_MESSAGE = 35;
|
|
26
25
|
export var SYNC_TASK_START = 36;
|
|
27
26
|
export var SYNC_TASK_EXECUTE = 37;
|
|
@@ -19,9 +19,8 @@ export var codesDebug = codesInfo.concat([
|
|
|
19
19
|
[c.RETRIEVE_MANAGER, 'Retrieving manager instance.'],
|
|
20
20
|
// synchronizer
|
|
21
21
|
[c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Feature flags data: \n%s'],
|
|
22
|
-
[c.SYNC_SPLITS_FETCH, c.LOG_PREFIX_SYNC_SPLITS + 'Spin up feature flags update using since = %s
|
|
23
|
-
[c.SYNC_SPLITS_UPDATE, c.LOG_PREFIX_SYNC_SPLITS + 'New feature flags %s. Removed feature flags %s.'],
|
|
24
|
-
[c.SYNC_RBS_UPDATE, c.LOG_PREFIX_SYNC_SPLITS + 'New rule-based segments %s. Removed rule-based segments %s.'],
|
|
22
|
+
[c.SYNC_SPLITS_FETCH, c.LOG_PREFIX_SYNC_SPLITS + 'Spin up feature flags update using since = %s'],
|
|
23
|
+
[c.SYNC_SPLITS_UPDATE, c.LOG_PREFIX_SYNC_SPLITS + 'New feature flags %s. Removed feature flags %s. Segment names collected %s'],
|
|
25
24
|
[c.STREAMING_NEW_MESSAGE, c.LOG_PREFIX_SYNC_STREAMING + 'New SSE message received, with data: %s.'],
|
|
26
25
|
[c.SYNC_TASK_START, c.LOG_PREFIX_SYNC + ': Starting %s. Running each %s millis'],
|
|
27
26
|
[c.SYNC_TASK_EXECUTE, c.LOG_PREFIX_SYNC + ': Running %s'],
|
|
@@ -31,7 +31,7 @@ export var codesWarn = codesError.concat([
|
|
|
31
31
|
[c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
|
|
32
32
|
[c.WARN_SDK_KEY, c.LOG_PREFIX_SETTINGS + ': You already have %s. We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'],
|
|
33
33
|
[c.STREAMING_PARSING_MEMBERSHIPS_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
|
|
34
|
-
[c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing
|
|
34
|
+
[c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing SPLIT_UPDATE notification: %s'],
|
|
35
35
|
[c.WARN_INVALID_FLAGSET, '%s: you passed %s, flag set must adhere to the regular expressions %s. This means a flag set must start with a letter or number, be in lowercase, alphanumeric and have a max length of 50 characters. %s was discarded.'],
|
|
36
36
|
[c.WARN_LOWERCASE_FLAGSET, '%s: flag set %s should be all lowercase - converting string to lowercase.'],
|
|
37
37
|
[c.WARN_FLAGSET_WITHOUT_FLAGS, '%s: you passed %s flag set that does not contain cached feature flag names. Please double check what flag sets are in use in the Split user interface.'],
|
package/esm/services/splitApi.js
CHANGED
|
@@ -17,6 +17,7 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
17
17
|
var urls = settings.urls;
|
|
18
18
|
var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
19
19
|
var SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
20
|
+
var flagSpecVersion = settings.sync.flagSpecVersion;
|
|
20
21
|
var splitHttpClient = splitHttpClientFactory(settings, platform);
|
|
21
22
|
return {
|
|
22
23
|
// @TODO throw errors if health check requests fail, to log them in the Synchronizer
|
|
@@ -29,7 +30,7 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
29
30
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
30
31
|
},
|
|
31
32
|
fetchAuth: function (userMatchingKeys) {
|
|
32
|
-
var url = urls.auth + "/v2/auth?s=" +
|
|
33
|
+
var url = urls.auth + "/v2/auth?s=" + flagSpecVersion;
|
|
33
34
|
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
34
35
|
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
35
36
|
if (queryParams)
|
|
@@ -37,8 +38,8 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
37
38
|
}
|
|
38
39
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN));
|
|
39
40
|
},
|
|
40
|
-
fetchSplitChanges: function (since, noCache, till
|
|
41
|
-
var url = urls.sdk + "/splitChanges?s=" +
|
|
41
|
+
fetchSplitChanges: function (since, noCache, till) {
|
|
42
|
+
var url = urls.sdk + "/splitChanges?s=" + flagSpecVersion + "&since=" + since + (filterQueryString || '') + (till ? '&till=' + till : '');
|
|
42
43
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SPLITS))
|
|
43
44
|
.catch(function (err) {
|
|
44
45
|
if (err.statusCode === 414)
|
|
@@ -50,8 +50,8 @@ export { AbstractSplitsCacheSync };
|
|
|
50
50
|
* Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
|
|
51
51
|
* This util is intended to simplify the implementation of `splitsCache::usesSegments` method
|
|
52
52
|
*/
|
|
53
|
-
export function usesSegments(
|
|
54
|
-
var conditions =
|
|
53
|
+
export function usesSegments(split) {
|
|
54
|
+
var conditions = split.conditions || [];
|
|
55
55
|
for (var i = 0; i < conditions.length; i++) {
|
|
56
56
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
57
57
|
for (var j = 0; j < matchers.length; j++) {
|
|
@@ -60,8 +60,5 @@ export function usesSegments(ruleEntity) {
|
|
|
60
60
|
return true;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
var excluded = ruleEntity.excluded;
|
|
64
|
-
if (excluded && excluded.segments && excluded.segments.length > 0)
|
|
65
|
-
return true;
|
|
66
63
|
return false;
|
|
67
64
|
}
|
|
@@ -24,15 +24,6 @@ var KeyBuilder = /** @class */ (function () {
|
|
|
24
24
|
KeyBuilder.prototype.buildSplitKeyPrefix = function () {
|
|
25
25
|
return this.prefix + ".split.";
|
|
26
26
|
};
|
|
27
|
-
KeyBuilder.prototype.buildRBSegmentKey = function (rbsegmentName) {
|
|
28
|
-
return this.prefix + ".rbsegment." + rbsegmentName;
|
|
29
|
-
};
|
|
30
|
-
KeyBuilder.prototype.buildRBSegmentsTillKey = function () {
|
|
31
|
-
return this.prefix + ".rbsegments.till";
|
|
32
|
-
};
|
|
33
|
-
KeyBuilder.prototype.buildRBSegmentKeyPrefix = function () {
|
|
34
|
-
return this.prefix + ".rbsegment.";
|
|
35
|
-
};
|
|
36
27
|
KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
|
|
37
28
|
return this.prefix + ".segment." + segmentName;
|
|
38
29
|
};
|
|
@@ -32,9 +32,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
|
|
|
32
32
|
KeyBuilderCS.prototype.isSplitKey = function (key) {
|
|
33
33
|
return startsWith(key, this.prefix + ".split.");
|
|
34
34
|
};
|
|
35
|
-
KeyBuilderCS.prototype.isRBSegmentKey = function (key) {
|
|
36
|
-
return startsWith(key, this.prefix + ".rbsegment.");
|
|
37
|
-
};
|
|
38
35
|
KeyBuilderCS.prototype.buildSplitsWithSegmentCountKey = function () {
|
|
39
36
|
return this.prefix + ".splits.usingSegments";
|
|
40
37
|
};
|
|
@@ -39,9 +39,6 @@ var KeyBuilderSS = /** @class */ (function (_super) {
|
|
|
39
39
|
KeyBuilderSS.prototype.searchPatternForSplitKeys = function () {
|
|
40
40
|
return this.buildSplitKeyPrefix() + "*";
|
|
41
41
|
};
|
|
42
|
-
KeyBuilderSS.prototype.searchPatternForRBSegmentKeys = function () {
|
|
43
|
-
return this.buildRBSegmentKeyPrefix() + "*";
|
|
44
|
-
};
|
|
45
42
|
/* Telemetry keys */
|
|
46
43
|
KeyBuilderSS.prototype.buildLatencyKey = function (method, bucket) {
|
|
47
44
|
return this.latencyPrefix + "::" + this.versionablePrefix + "/" + METHOD_NAMES[method] + "/" + bucket;
|
|
@@ -38,13 +38,15 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
38
38
|
};
|
|
39
39
|
SplitsCacheInLocal.prototype._incrementCounts = function (split) {
|
|
40
40
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
localStorage.setItem(ttKey, toNumber(localStorage.getItem(ttKey)) + 1);
|
|
44
|
-
if (usesSegments(split)) {
|
|
45
|
-
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
41
|
+
if (split) {
|
|
42
|
+
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
46
43
|
// @ts-expect-error
|
|
47
|
-
localStorage.setItem(
|
|
44
|
+
localStorage.setItem(ttKey, toNumber(localStorage.getItem(ttKey)) + 1);
|
|
45
|
+
if (usesSegments(split)) {
|
|
46
|
+
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
47
|
+
// @ts-expect-error
|
|
48
|
+
localStorage.setItem(segmentsCountKey, toNumber(localStorage.getItem(segmentsCountKey)) + 1);
|
|
49
|
+
}
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
52
|
catch (e) {
|
|
@@ -153,9 +155,12 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
153
155
|
return true;
|
|
154
156
|
var storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
155
157
|
var splitsWithSegmentsCount = storedCount === null ? 0 : toNumber(storedCount);
|
|
156
|
-
|
|
157
|
-
splitsWithSegmentsCount > 0
|
|
158
|
-
|
|
158
|
+
if (isFiniteNumber(splitsWithSegmentsCount)) {
|
|
159
|
+
return splitsWithSegmentsCount > 0;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
159
164
|
};
|
|
160
165
|
SplitsCacheInLocal.prototype.getNamesByFlagSets = function (flagSets) {
|
|
161
166
|
var _this = this;
|
|
@@ -5,7 +5,6 @@ import { validatePrefix } from '../KeyBuilder';
|
|
|
5
5
|
import { KeyBuilderCS, myLargeSegmentsKeyBuilder } from '../KeyBuilderCS';
|
|
6
6
|
import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
|
|
7
7
|
import { SplitsCacheInLocal } from './SplitsCacheInLocal';
|
|
8
|
-
import { RBSegmentsCacheInLocal } from './RBSegmentsCacheInLocal';
|
|
9
8
|
import { MySegmentsCacheInLocal } from './MySegmentsCacheInLocal';
|
|
10
9
|
import { InMemoryStorageCSFactory } from '../inMemory/InMemoryStorageCS';
|
|
11
10
|
import { LOG_PREFIX } from './constants';
|
|
@@ -30,12 +29,10 @@ export function InLocalStorage(options) {
|
|
|
30
29
|
var matchingKey = getMatching(settings.core.key);
|
|
31
30
|
var keys = new KeyBuilderCS(prefix, matchingKey);
|
|
32
31
|
var splits = new SplitsCacheInLocal(settings, keys);
|
|
33
|
-
var rbSegments = new RBSegmentsCacheInLocal(settings, keys);
|
|
34
32
|
var segments = new MySegmentsCacheInLocal(log, keys);
|
|
35
33
|
var largeSegments = new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey));
|
|
36
34
|
return {
|
|
37
35
|
splits: splits,
|
|
38
|
-
rbSegments: rbSegments,
|
|
39
36
|
segments: segments,
|
|
40
37
|
largeSegments: largeSegments,
|
|
41
38
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -44,14 +41,13 @@ export function InLocalStorage(options) {
|
|
|
44
41
|
telemetry: shouldRecordTelemetry(params) ? new TelemetryCacheInMemory(splits, segments) : undefined,
|
|
45
42
|
uniqueKeys: new UniqueKeysCacheInMemoryCS(),
|
|
46
43
|
validateCache: function () {
|
|
47
|
-
return validateCache(options, settings, keys, splits,
|
|
44
|
+
return validateCache(options, settings, keys, splits, segments, largeSegments);
|
|
48
45
|
},
|
|
49
46
|
destroy: function () { },
|
|
50
47
|
// When using shared instantiation with MEMORY we reuse everything but segments (they are customer per key).
|
|
51
48
|
shared: function (matchingKey) {
|
|
52
49
|
return {
|
|
53
50
|
splits: this.splits,
|
|
54
|
-
rbSegments: this.rbSegments,
|
|
55
51
|
segments: new MySegmentsCacheInLocal(log, new KeyBuilderCS(prefix, matchingKey)),
|
|
56
52
|
largeSegments: new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey)),
|
|
57
53
|
impressions: this.impressions,
|
|
@@ -54,12 +54,11 @@ function validateExpiration(options, settings, keys, currentTimestamp, isThereCa
|
|
|
54
54
|
*
|
|
55
55
|
* @returns `true` if cache is ready to be used, `false` otherwise (cache was cleared or there is no cache)
|
|
56
56
|
*/
|
|
57
|
-
export function validateCache(options, settings, keys, splits,
|
|
57
|
+
export function validateCache(options, settings, keys, splits, segments, largeSegments) {
|
|
58
58
|
var currentTimestamp = Date.now();
|
|
59
59
|
var isThereCache = splits.getChangeNumber() > -1;
|
|
60
60
|
if (validateExpiration(options, settings, keys, currentTimestamp, isThereCache)) {
|
|
61
61
|
splits.clear();
|
|
62
|
-
rbSegments.clear();
|
|
63
62
|
segments.clear();
|
|
64
63
|
largeSegments.clear();
|
|
65
64
|
// Update last clear timestamp
|
|
@@ -6,7 +6,6 @@ import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
|
|
|
6
6
|
import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
|
|
7
7
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from './TelemetryCacheInMemory';
|
|
8
8
|
import { UniqueKeysCacheInMemory } from './UniqueKeysCacheInMemory';
|
|
9
|
-
import { RBSegmentsCacheInMemory } from './RBSegmentsCacheInMemory';
|
|
10
9
|
/**
|
|
11
10
|
* InMemory storage factory for standalone server-side SplitFactory
|
|
12
11
|
*
|
|
@@ -15,11 +14,9 @@ import { RBSegmentsCacheInMemory } from './RBSegmentsCacheInMemory';
|
|
|
15
14
|
export function InMemoryStorageFactory(params) {
|
|
16
15
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
17
16
|
var splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
18
|
-
var rbSegments = new RBSegmentsCacheInMemory();
|
|
19
17
|
var segments = new SegmentsCacheInMemory();
|
|
20
18
|
var storage = {
|
|
21
19
|
splits: splits,
|
|
22
|
-
rbSegments: rbSegments,
|
|
23
20
|
segments: segments,
|
|
24
21
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
25
22
|
impressionCounts: new ImpressionCountsCacheInMemory(),
|
|
@@ -6,7 +6,6 @@ import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
|
|
|
6
6
|
import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
|
|
7
7
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from './TelemetryCacheInMemory';
|
|
8
8
|
import { UniqueKeysCacheInMemoryCS } from './UniqueKeysCacheInMemoryCS';
|
|
9
|
-
import { RBSegmentsCacheInMemory } from './RBSegmentsCacheInMemory';
|
|
10
9
|
/**
|
|
11
10
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
12
11
|
*
|
|
@@ -15,12 +14,10 @@ import { RBSegmentsCacheInMemory } from './RBSegmentsCacheInMemory';
|
|
|
15
14
|
export function InMemoryStorageCSFactory(params) {
|
|
16
15
|
var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, __splitFiltersValidation = _a.sync.__splitFiltersValidation;
|
|
17
16
|
var splits = new SplitsCacheInMemory(__splitFiltersValidation);
|
|
18
|
-
var rbSegments = new RBSegmentsCacheInMemory();
|
|
19
17
|
var segments = new MySegmentsCacheInMemory();
|
|
20
18
|
var largeSegments = new MySegmentsCacheInMemory();
|
|
21
19
|
var storage = {
|
|
22
20
|
splits: splits,
|
|
23
|
-
rbSegments: rbSegments,
|
|
24
21
|
segments: segments,
|
|
25
22
|
largeSegments: largeSegments,
|
|
26
23
|
impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
|
|
@@ -33,7 +30,6 @@ export function InMemoryStorageCSFactory(params) {
|
|
|
33
30
|
shared: function () {
|
|
34
31
|
return {
|
|
35
32
|
splits: this.splits,
|
|
36
|
-
rbSegments: this.rbSegments,
|
|
37
33
|
segments: new MySegmentsCacheInMemory(),
|
|
38
34
|
largeSegments: new MySegmentsCacheInMemory(),
|
|
39
35
|
impressions: this.impressions,
|
|
@@ -9,18 +9,23 @@ import { TelemetryCacheInRedis } from './TelemetryCacheInRedis';
|
|
|
9
9
|
import { UniqueKeysCacheInRedis } from './UniqueKeysCacheInRedis';
|
|
10
10
|
import { ImpressionCountsCacheInRedis } from './ImpressionCountsCacheInRedis';
|
|
11
11
|
import { metadataBuilder } from '../utils';
|
|
12
|
-
|
|
12
|
+
var RD;
|
|
13
|
+
try {
|
|
14
|
+
// Using `require` to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
|
|
15
|
+
// Redis storage is not supported with .mjs files.
|
|
16
|
+
RD = require('./RedisAdapter').RedisAdapter;
|
|
17
|
+
}
|
|
18
|
+
catch (error) { /* empty */ }
|
|
13
19
|
/**
|
|
14
20
|
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.js
|
|
15
21
|
* @see {@link https://www.npmjs.com/package/ioredis}
|
|
16
22
|
*/
|
|
17
23
|
export function InRedisStorage(options) {
|
|
18
24
|
if (options === void 0) { options = {}; }
|
|
19
|
-
// Lazy loading to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
|
|
20
|
-
// Redis storage is not supported with .mjs files.
|
|
21
|
-
var RD = require('./RedisAdapter').RedisAdapter;
|
|
22
25
|
var prefix = validatePrefix(options.prefix);
|
|
23
26
|
function InRedisStorageFactory(params) {
|
|
27
|
+
if (!RD)
|
|
28
|
+
throw new Error('The SDK Redis storage is not available. Your runtime environment must support CommonJS (`require`) to import the ioredis dependency.');
|
|
24
29
|
var onReadyCb = params.onReadyCb, settings = params.settings, log = params.settings.log;
|
|
25
30
|
var metadata = metadataBuilder(settings);
|
|
26
31
|
var keys = new KeyBuilderSS(prefix, metadata);
|
|
@@ -38,7 +43,6 @@ export function InRedisStorage(options) {
|
|
|
38
43
|
});
|
|
39
44
|
return {
|
|
40
45
|
splits: new SplitsCacheInRedis(log, keys, redisClient, settings.sync.__splitFiltersValidation),
|
|
41
|
-
rbSegments: new RBSegmentsCacheInRedis(log, keys, redisClient),
|
|
42
46
|
segments: new SegmentsCacheInRedis(log, keys, redisClient),
|
|
43
47
|
impressions: new ImpressionsCacheInRedis(log, keys.buildImpressionsKey(), redisClient, metadata),
|
|
44
48
|
impressionCounts: impressionCountsCache,
|
|
@@ -19,7 +19,6 @@ import { UniqueKeysCacheInMemory } from '../inMemory/UniqueKeysCacheInMemory';
|
|
|
19
19
|
import { UniqueKeysCacheInMemoryCS } from '../inMemory/UniqueKeysCacheInMemoryCS';
|
|
20
20
|
import { metadataBuilder } from '../utils';
|
|
21
21
|
import { LOG_PREFIX } from '../pluggable/constants';
|
|
22
|
-
import { RBSegmentsCachePluggable } from './RBSegmentsCachePluggable';
|
|
23
22
|
var NO_VALID_WRAPPER = 'Expecting pluggable storage `wrapper` in options, but no valid wrapper instance was provided.';
|
|
24
23
|
var NO_VALID_WRAPPER_INTERFACE = 'The provided wrapper instance doesn’t follow the expected interface. Check our docs.';
|
|
25
24
|
/**
|
|
@@ -103,7 +102,6 @@ export function PluggableStorage(options) {
|
|
|
103
102
|
});
|
|
104
103
|
return {
|
|
105
104
|
splits: new SplitsCachePluggable(log, keys, wrapper, settings.sync.__splitFiltersValidation),
|
|
106
|
-
rbSegments: new RBSegmentsCachePluggable(log, keys, wrapper),
|
|
107
105
|
segments: new SegmentsCachePluggable(log, keys, wrapper),
|
|
108
106
|
impressions: isPartialConsumer ? new ImpressionsCacheInMemory(impressionsQueueSize) : new ImpressionsCachePluggable(log, keys.buildImpressionsKey(), wrapper, metadata),
|
|
109
107
|
impressionCounts: impressionCountsCache,
|
|
@@ -1,61 +1,14 @@
|
|
|
1
|
-
import { FLAG_SPEC_VERSION } from '../../../utils/constants';
|
|
2
|
-
import { base } from '../../../utils/settingsValidation';
|
|
3
|
-
import { LOG_PREFIX_SYNC_SPLITS } from '../../../logger/constants';
|
|
4
|
-
var PROXY_CHECK_INTERVAL_MILLIS_CS = 60 * 60 * 1000; // 1 hour in Client Side
|
|
5
|
-
var PROXY_CHECK_INTERVAL_MILLIS_SS = 24 * PROXY_CHECK_INTERVAL_MILLIS_CS; // 24 hours in Server Side
|
|
6
|
-
function sdkEndpointOverriden(settings) {
|
|
7
|
-
return settings.urls.sdk !== base.urls.sdk;
|
|
8
|
-
}
|
|
9
1
|
/**
|
|
10
2
|
* Factory of SplitChanges fetcher.
|
|
11
3
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
12
4
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var log = settings.log;
|
|
16
|
-
var PROXY_CHECK_INTERVAL_MILLIS = settings.core.key !== undefined ? PROXY_CHECK_INTERVAL_MILLIS_CS : PROXY_CHECK_INTERVAL_MILLIS_SS;
|
|
17
|
-
var lastProxyCheckTimestamp;
|
|
18
|
-
return function splitChangesFetcher(since, noCache, till, rbSince,
|
|
5
|
+
export function splitChangesFetcherFactory(fetchSplitChanges) {
|
|
6
|
+
return function splitChangesFetcher(since, noCache, till,
|
|
19
7
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
20
8
|
decorator) {
|
|
21
|
-
|
|
22
|
-
if (lastProxyCheckTimestamp && (Date.now() - lastProxyCheckTimestamp) > PROXY_CHECK_INTERVAL_MILLIS) {
|
|
23
|
-
settings.sync.flagSpecVersion = FLAG_SPEC_VERSION;
|
|
24
|
-
}
|
|
25
|
-
var splitsPromise = fetchSplitChanges(since, noCache, till, settings.sync.flagSpecVersion === FLAG_SPEC_VERSION ? rbSince : undefined)
|
|
26
|
-
// Handle proxy error with spec 1.3
|
|
27
|
-
.catch(function (err) {
|
|
28
|
-
if (err.statusCode === 400 && sdkEndpointOverriden(settings) && settings.sync.flagSpecVersion === FLAG_SPEC_VERSION) {
|
|
29
|
-
log.error(LOG_PREFIX_SYNC_SPLITS + 'Proxy error detected. If you are using Split Proxy, please upgrade to latest version');
|
|
30
|
-
lastProxyCheckTimestamp = Date.now();
|
|
31
|
-
settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
|
|
32
|
-
return fetchSplitChanges(since, noCache, till); // retry request without rbSince
|
|
33
|
-
}
|
|
34
|
-
throw err;
|
|
35
|
-
});
|
|
9
|
+
var splitsPromise = fetchSplitChanges(since, noCache, till);
|
|
36
10
|
if (decorator)
|
|
37
11
|
splitsPromise = decorator(splitsPromise);
|
|
38
|
-
return splitsPromise
|
|
39
|
-
.then(function (resp) { return resp.json(); })
|
|
40
|
-
.then(function (data) {
|
|
41
|
-
// Using flag spec version 1.2
|
|
42
|
-
if (data.splits) {
|
|
43
|
-
return {
|
|
44
|
-
ff: {
|
|
45
|
-
d: data.splits,
|
|
46
|
-
s: data.since,
|
|
47
|
-
t: data.till
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// Proxy recovery
|
|
52
|
-
if (lastProxyCheckTimestamp) {
|
|
53
|
-
log.info(LOG_PREFIX_SYNC_SPLITS + 'Proxy error recovered');
|
|
54
|
-
lastProxyCheckTimestamp = undefined;
|
|
55
|
-
return Promise.all([storage.splits.clear(), storage.rbSegments.clear()])
|
|
56
|
-
.then(function () { return splitChangesFetcher(storage.splits.getChangeNumber(), undefined, undefined, storage.rbSegments.getChangeNumber()); });
|
|
57
|
-
}
|
|
58
|
-
return data;
|
|
59
|
-
});
|
|
12
|
+
return splitsPromise.then(function (resp) { return resp.json(); });
|
|
60
13
|
};
|
|
61
14
|
}
|
|
@@ -31,10 +31,10 @@ export function pollingManagerCSFactory(params) {
|
|
|
31
31
|
readiness.splits.on(SDK_SPLITS_ARRIVED, function () {
|
|
32
32
|
if (!splitsSyncTask.isRunning())
|
|
33
33
|
return; // noop if not doing polling
|
|
34
|
-
var
|
|
35
|
-
if (
|
|
36
|
-
log.info(POLLING_SMART_PAUSING, [
|
|
37
|
-
if (
|
|
34
|
+
var splitsHaveSegments = storage.splits.usesSegments();
|
|
35
|
+
if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
|
|
36
|
+
log.info(POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
|
|
37
|
+
if (splitsHaveSegments) {
|
|
38
38
|
startMySegmentsSyncTasks();
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
@@ -46,10 +46,10 @@ export function pollingManagerCSFactory(params) {
|
|
|
46
46
|
var mySegmentsSyncTask = mySegmentsSyncTaskFactory(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
47
47
|
// smart ready
|
|
48
48
|
function smartReady() {
|
|
49
|
-
if (!readiness.isReady() && !storage.splits.usesSegments()
|
|
49
|
+
if (!readiness.isReady() && !storage.splits.usesSegments())
|
|
50
50
|
readiness.segments.emit(SDK_SEGMENTS_ARRIVED);
|
|
51
51
|
}
|
|
52
|
-
if (!storage.splits.usesSegments()
|
|
52
|
+
if (!storage.splits.usesSegments())
|
|
53
53
|
setTimeout(smartReady, 0);
|
|
54
54
|
else
|
|
55
55
|
readiness.splits.once(SDK_SPLITS_ARRIVED, smartReady);
|
|
@@ -63,7 +63,7 @@ export function pollingManagerCSFactory(params) {
|
|
|
63
63
|
start: function () {
|
|
64
64
|
log.info(POLLING_START);
|
|
65
65
|
splitsSyncTask.start();
|
|
66
|
-
if (storage.splits.usesSegments()
|
|
66
|
+
if (storage.splits.usesSegments())
|
|
67
67
|
startMySegmentsSyncTasks();
|
|
68
68
|
},
|
|
69
69
|
// Stop periodic fetching (polling)
|
|
@@ -5,5 +5,5 @@ import { splitChangesUpdaterFactory } from '../updaters/splitChangesUpdater';
|
|
|
5
5
|
* Creates a sync task that periodically executes a `splitChangesUpdater` task
|
|
6
6
|
*/
|
|
7
7
|
export function splitsSyncTaskFactory(fetchSplitChanges, storage, readiness, settings, isClientSide) {
|
|
8
|
-
return syncTaskFactory(settings.log, splitChangesUpdaterFactory(settings.log, splitChangesFetcherFactory(fetchSplitChanges
|
|
8
|
+
return syncTaskFactory(settings.log, splitChangesUpdaterFactory(settings.log, splitChangesFetcherFactory(fetchSplitChanges), storage, settings.sync.__splitFiltersValidation, readiness.splits, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'splitChangesUpdater');
|
|
9
9
|
}
|
|
@@ -9,7 +9,7 @@ import { MEMBERSHIPS_LS_UPDATE } from '../../streaming/constants';
|
|
|
9
9
|
* - uses `segmentsEventEmitter` to emit events related to segments data updates
|
|
10
10
|
*/
|
|
11
11
|
export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
|
|
12
|
-
var splits = storage.splits,
|
|
12
|
+
var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
|
|
13
13
|
var readyOnAlreadyExistentState = true;
|
|
14
14
|
var startingUp = true;
|
|
15
15
|
/** timeout and telemetry decorator for `splitChangesFetcher` promise */
|
|
@@ -31,7 +31,7 @@ export function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmen
|
|
|
31
31
|
shouldNotifyUpdate = largeSegments.resetSegments(segmentsData.ls || {}) || shouldNotifyUpdate;
|
|
32
32
|
}
|
|
33
33
|
// Notify update if required
|
|
34
|
-
if (
|
|
34
|
+
if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
35
35
|
readyOnAlreadyExistentState = false;
|
|
36
36
|
segmentsEventEmitter.emit(SDK_SEGMENTS_ARRIVED);
|
|
37
37
|
}
|
|
@@ -36,7 +36,7 @@ export function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segment
|
|
|
36
36
|
* Returned promise will not be rejected.
|
|
37
37
|
*
|
|
38
38
|
* @param fetchOnlyNew - if true, only fetch the segments that not exists, i.e., which `changeNumber` is equal to -1.
|
|
39
|
-
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE
|
|
39
|
+
* This param is used by SplitUpdateWorker on server-side SDK, to fetch new registered segments on SPLIT_UPDATE notifications.
|
|
40
40
|
* @param segmentName - segment name to fetch. By passing `undefined` it fetches the list of segments registered at the storage
|
|
41
41
|
* @param noCache - true to revalidate data to fetch on a SEGMENT_UPDATE notifications.
|
|
42
42
|
* @param till - till target for the provided segmentName, for CDN bypass.
|