@splitsoftware/splitio-commons 1.13.2-rc.0 → 1.13.2-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 +4 -3
- package/cjs/evaluator/Engine.js +5 -6
- package/cjs/evaluator/combiners/ifelseif.js +3 -4
- package/cjs/evaluator/condition/index.js +2 -3
- package/cjs/evaluator/index.js +4 -5
- package/cjs/evaluator/matchers/all.js +1 -3
- package/cjs/evaluator/matchers/between.js +1 -3
- package/cjs/evaluator/matchers/boolean.js +1 -3
- package/cjs/evaluator/matchers/cont_all.js +1 -3
- package/cjs/evaluator/matchers/cont_any.js +1 -3
- package/cjs/evaluator/matchers/cont_str.js +1 -3
- package/cjs/evaluator/matchers/dependency.js +1 -1
- package/cjs/evaluator/matchers/eq.js +1 -3
- package/cjs/evaluator/matchers/eq_set.js +1 -3
- package/cjs/evaluator/matchers/ew.js +1 -3
- package/cjs/evaluator/matchers/gte.js +3 -5
- package/cjs/evaluator/matchers/index.js +12 -2
- package/cjs/evaluator/matchers/lte.js +3 -5
- package/cjs/evaluator/matchers/matcherTypes.js +6 -1
- package/cjs/evaluator/matchers/part_of.js +1 -3
- package/cjs/evaluator/matchers/segment.js +1 -6
- package/cjs/evaluator/matchers/semver_between.js +14 -0
- package/cjs/evaluator/matchers/semver_eq.js +13 -0
- package/cjs/evaluator/matchers/semver_gte.js +13 -0
- package/cjs/evaluator/matchers/semver_inlist.js +17 -0
- package/cjs/evaluator/matchers/semver_lte.js +13 -0
- package/cjs/evaluator/matchers/string.js +3 -12
- package/cjs/evaluator/matchers/sw.js +1 -3
- package/cjs/evaluator/matchers/whitelist.js +3 -4
- package/cjs/evaluator/matchersTransform/index.js +21 -16
- package/cjs/evaluator/matchersTransform/whitelist.js +2 -3
- package/cjs/evaluator/parser/index.js +24 -9
- package/cjs/logger/constants.js +5 -20
- package/cjs/logger/index.js +8 -1
- package/cjs/logger/messages/debug.js +5 -21
- package/cjs/logger/messages/error.js +2 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/sdkClient/sdkClient.js +1 -6
- package/cjs/services/splitApi.js +5 -5
- package/cjs/storages/KeyBuilder.js +2 -1
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
- package/cjs/storages/pluggable/index.js +1 -1
- package/cjs/utils/Semver.js +103 -0
- package/cjs/utils/constants/index.js +2 -1
- package/cjs/utils/labels/index.js +1 -1
- package/cjs/utils/settingsValidation/index.js +1 -1
- package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/esm/evaluator/Engine.js +5 -5
- package/esm/evaluator/combiners/ifelseif.js +3 -3
- package/esm/evaluator/condition/index.js +2 -2
- package/esm/evaluator/index.js +4 -4
- package/esm/evaluator/matchers/all.js +1 -3
- package/esm/evaluator/matchers/between.js +1 -3
- package/esm/evaluator/matchers/boolean.js +1 -3
- package/esm/evaluator/matchers/cont_all.js +1 -3
- package/esm/evaluator/matchers/cont_any.js +1 -3
- package/esm/evaluator/matchers/cont_str.js +1 -3
- package/esm/evaluator/matchers/dependency.js +1 -1
- package/esm/evaluator/matchers/eq.js +1 -3
- package/esm/evaluator/matchers/eq_set.js +1 -3
- package/esm/evaluator/matchers/ew.js +1 -3
- package/esm/evaluator/matchers/gte.js +3 -5
- package/esm/evaluator/matchers/index.js +12 -2
- package/esm/evaluator/matchers/lte.js +3 -5
- package/esm/evaluator/matchers/matcherTypes.js +6 -1
- package/esm/evaluator/matchers/part_of.js +1 -3
- package/esm/evaluator/matchers/segment.js +1 -6
- package/esm/evaluator/matchers/semver_between.js +10 -0
- package/esm/evaluator/matchers/semver_eq.js +9 -0
- package/esm/evaluator/matchers/semver_gte.js +9 -0
- package/esm/evaluator/matchers/semver_inlist.js +13 -0
- package/esm/evaluator/matchers/semver_lte.js +9 -0
- package/esm/evaluator/matchers/string.js +3 -12
- package/esm/evaluator/matchers/sw.js +1 -3
- package/esm/evaluator/matchers/whitelist.js +4 -5
- package/esm/evaluator/matchersTransform/index.js +21 -16
- package/esm/evaluator/matchersTransform/whitelist.js +2 -3
- package/esm/evaluator/parser/index.js +24 -9
- package/esm/logger/constants.js +2 -17
- package/esm/logger/index.js +9 -2
- package/esm/logger/messages/debug.js +5 -21
- package/esm/logger/messages/error.js +2 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/sdkClient/sdkClient.js +1 -6
- package/esm/services/splitApi.js +6 -6
- package/esm/storages/KeyBuilder.js +2 -1
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
- package/esm/storages/pluggable/index.js +1 -1
- package/esm/utils/Semver.js +100 -0
- package/esm/utils/constants/index.js +1 -0
- package/esm/utils/labels/index.js +1 -1
- package/esm/utils/settingsValidation/index.js +1 -1
- package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/package.json +1 -2
- package/src/dtos/types.ts +34 -1
- package/src/evaluator/Engine.ts +5 -6
- package/src/evaluator/combiners/ifelseif.ts +3 -3
- package/src/evaluator/condition/index.ts +2 -2
- package/src/evaluator/index.ts +4 -4
- package/src/evaluator/matchers/all.ts +1 -5
- package/src/evaluator/matchers/between.ts +3 -7
- package/src/evaluator/matchers/boolean.ts +2 -6
- package/src/evaluator/matchers/cont_all.ts +1 -5
- package/src/evaluator/matchers/cont_any.ts +1 -5
- package/src/evaluator/matchers/cont_str.ts +2 -6
- package/src/evaluator/matchers/dependency.ts +1 -1
- package/src/evaluator/matchers/eq.ts +2 -6
- package/src/evaluator/matchers/eq_set.ts +1 -5
- package/src/evaluator/matchers/ew.ts +2 -6
- package/src/evaluator/matchers/gte.ts +3 -7
- package/src/evaluator/matchers/index.ts +29 -19
- package/src/evaluator/matchers/lte.ts +3 -7
- package/src/evaluator/matchers/matcherTypes.ts +6 -1
- package/src/evaluator/matchers/part_of.ts +1 -5
- package/src/evaluator/matchers/segment.ts +1 -8
- package/src/evaluator/matchers/semver_between.ts +15 -0
- package/src/evaluator/matchers/semver_eq.ts +13 -0
- package/src/evaluator/matchers/semver_gte.ts +13 -0
- package/src/evaluator/matchers/semver_inlist.ts +17 -0
- package/src/evaluator/matchers/semver_lte.ts +13 -0
- package/src/evaluator/matchers/string.ts +3 -16
- package/src/evaluator/matchers/sw.ts +2 -6
- package/src/evaluator/matchers/whitelist.ts +5 -7
- package/src/evaluator/matchersTransform/index.ts +31 -23
- package/src/evaluator/matchersTransform/whitelist.ts +4 -5
- package/src/evaluator/parser/index.ts +25 -10
- package/src/evaluator/types.ts +3 -3
- package/src/logger/constants.ts +2 -17
- package/src/logger/index.ts +8 -2
- package/src/logger/messages/debug.ts +5 -21
- package/src/logger/messages/error.ts +2 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/sdkClient/sdkClient.ts +1 -8
- package/src/services/splitApi.ts +5 -6
- package/src/storages/KeyBuilder.ts +2 -1
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
- package/src/storages/pluggable/index.ts +1 -1
- package/src/types.ts +3 -3
- package/src/utils/Semver.ts +111 -0
- package/src/utils/constants/index.ts +2 -0
- package/src/utils/labels/index.ts +1 -1
- package/src/utils/settingsValidation/index.ts +1 -1
- package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
- package/types/dtos/types.d.ts +26 -1
- package/types/evaluator/matchers/all.d.ts +1 -2
- package/types/evaluator/matchers/between.d.ts +1 -2
- package/types/evaluator/matchers/boolean.d.ts +1 -2
- package/types/evaluator/matchers/cont_all.d.ts +1 -2
- package/types/evaluator/matchers/cont_any.d.ts +1 -2
- package/types/evaluator/matchers/cont_str.d.ts +1 -2
- package/types/evaluator/matchers/dependency.d.ts +1 -1
- package/types/evaluator/matchers/eq.d.ts +1 -2
- package/types/evaluator/matchers/eq_set.d.ts +1 -2
- package/types/evaluator/matchers/ew.d.ts +1 -2
- package/types/evaluator/matchers/gte.d.ts +1 -2
- package/types/evaluator/matchers/lte.d.ts +1 -2
- package/types/evaluator/matchers/part_of.d.ts +1 -2
- package/types/evaluator/matchers/segment.d.ts +1 -2
- package/types/evaluator/matchers/sember_inlist.d.ts +3 -0
- package/types/evaluator/matchers/semver_between.d.ts +2 -0
- package/types/evaluator/matchers/semver_eq.d.ts +1 -0
- package/types/evaluator/matchers/semver_gte.d.ts +1 -0
- package/types/evaluator/matchers/semver_inlist.d.ts +1 -0
- package/types/evaluator/matchers/semver_lte.d.ts +1 -0
- package/types/evaluator/matchers/string.d.ts +1 -2
- package/types/evaluator/matchers/sw.d.ts +1 -2
- package/types/evaluator/matchers/whitelist.d.ts +1 -3
- package/types/evaluator/matchersTransform/set.d.ts +2 -2
- package/types/evaluator/matchersTransform/string.d.ts +7 -0
- package/types/evaluator/matchersTransform/whitelist.d.ts +3 -3
- package/types/evaluator/types.d.ts +3 -3
- package/types/logger/constants.d.ts +2 -17
- package/types/types.d.ts +3 -3
- package/types/utils/constants/index.d.ts +1 -0
- package/types/utils/labels/index.d.ts +1 -1
- package/types/utils/semVer.d.ts +15 -0
- package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +8 -0
- package/cjs/evaluator/matchersTransform/set.js +0 -10
- package/esm/evaluator/matchersTransform/set.js +0 -6
- package/src/evaluator/matchersTransform/set.ts +0 -8
|
@@ -5,7 +5,6 @@ var lang_1 = require("../../utils/lang");
|
|
|
5
5
|
var matcherTypes_1 = require("../matchers/matcherTypes");
|
|
6
6
|
var segment_1 = require("./segment");
|
|
7
7
|
var whitelist_1 = require("./whitelist");
|
|
8
|
-
var set_1 = require("./set");
|
|
9
8
|
var unaryNumeric_1 = require("./unaryNumeric");
|
|
10
9
|
var convertions_1 = require("../convertions");
|
|
11
10
|
/**
|
|
@@ -13,37 +12,34 @@ var convertions_1 = require("../convertions");
|
|
|
13
12
|
*/
|
|
14
13
|
function matchersTransform(matchers) {
|
|
15
14
|
var parsedMatchers = matchers.map(function (matcher) {
|
|
16
|
-
var matcherType = matcher.matcherType
|
|
15
|
+
var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, whitelistMatcherData = matcher.whitelistMatcherData, /* whitelistObject, provided by 'WHITELIST', 'IN_LIST_SEMVER', set and string matchers */ unaryNumericMatcherData = matcher.unaryNumericMatcherData, betweenMatcherData = matcher.betweenMatcherData, dependencyMatcherData = matcher.dependencyMatcherData, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData, betweenStringMatcherData = matcher.betweenStringMatcherData;
|
|
17
16
|
var attribute = keySelector && keySelector.attribute;
|
|
18
17
|
var type = (0, matcherTypes_1.matcherTypesMapper)(matcherType);
|
|
19
18
|
// As default input data type we use string (even for ALL_KEYS)
|
|
20
19
|
var dataType = matcherTypes_1.matcherDataTypes.STRING;
|
|
21
20
|
var value = undefined;
|
|
22
21
|
if (type === matcherTypes_1.matcherTypes.IN_SEGMENT) {
|
|
23
|
-
value = (0, segment_1.segmentTransform)(
|
|
24
|
-
}
|
|
25
|
-
else if (type === matcherTypes_1.matcherTypes.WHITELIST) {
|
|
26
|
-
value = (0, whitelist_1.whitelistTransform)(whitelistObject);
|
|
22
|
+
value = (0, segment_1.segmentTransform)(userDefinedSegmentMatcherData);
|
|
27
23
|
}
|
|
28
24
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO) {
|
|
29
|
-
value = (0, unaryNumeric_1.numericTransform)(
|
|
25
|
+
value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
|
|
30
26
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
31
|
-
if (
|
|
27
|
+
if (unaryNumericMatcherData.dataType === 'DATETIME') {
|
|
32
28
|
value = (0, convertions_1.zeroSinceHH)(value);
|
|
33
29
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
34
30
|
}
|
|
35
31
|
}
|
|
36
32
|
else if (type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO ||
|
|
37
33
|
type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO) {
|
|
38
|
-
value = (0, unaryNumeric_1.numericTransform)(
|
|
34
|
+
value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
|
|
39
35
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
40
|
-
if (
|
|
36
|
+
if (unaryNumericMatcherData.dataType === 'DATETIME') {
|
|
41
37
|
value = (0, convertions_1.zeroSinceSS)(value);
|
|
42
38
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
41
|
else if (type === matcherTypes_1.matcherTypes.BETWEEN) {
|
|
46
|
-
value =
|
|
42
|
+
value = betweenMatcherData;
|
|
47
43
|
dataType = matcherTypes_1.matcherDataTypes.NUMBER;
|
|
48
44
|
if (value.dataType === 'DATETIME') {
|
|
49
45
|
value.start = (0, convertions_1.zeroSinceSS)(value.start);
|
|
@@ -51,33 +47,42 @@ function matchersTransform(matchers) {
|
|
|
51
47
|
dataType = matcherTypes_1.matcherDataTypes.DATETIME;
|
|
52
48
|
}
|
|
53
49
|
}
|
|
50
|
+
else if (type === matcherTypes_1.matcherTypes.BETWEEN_SEMVER) {
|
|
51
|
+
value = betweenStringMatcherData;
|
|
52
|
+
}
|
|
54
53
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_SET ||
|
|
55
54
|
type === matcherTypes_1.matcherTypes.CONTAINS_ANY_OF_SET ||
|
|
56
55
|
type === matcherTypes_1.matcherTypes.CONTAINS_ALL_OF_SET ||
|
|
57
56
|
type === matcherTypes_1.matcherTypes.PART_OF_SET) {
|
|
58
|
-
value = (0,
|
|
57
|
+
value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
|
|
59
58
|
dataType = matcherTypes_1.matcherDataTypes.SET;
|
|
60
59
|
}
|
|
61
|
-
else if (type === matcherTypes_1.matcherTypes.
|
|
60
|
+
else if (type === matcherTypes_1.matcherTypes.WHITELIST ||
|
|
61
|
+
type === matcherTypes_1.matcherTypes.IN_LIST_SEMVER ||
|
|
62
|
+
type === matcherTypes_1.matcherTypes.STARTS_WITH ||
|
|
62
63
|
type === matcherTypes_1.matcherTypes.ENDS_WITH ||
|
|
63
64
|
type === matcherTypes_1.matcherTypes.CONTAINS_STRING) {
|
|
64
|
-
value = (0,
|
|
65
|
+
value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
|
|
65
66
|
}
|
|
66
67
|
else if (type === matcherTypes_1.matcherTypes.IN_SPLIT_TREATMENT) {
|
|
67
|
-
value =
|
|
68
|
+
value = dependencyMatcherData;
|
|
68
69
|
dataType = matcherTypes_1.matcherDataTypes.NOT_SPECIFIED;
|
|
69
70
|
}
|
|
70
71
|
else if (type === matcherTypes_1.matcherTypes.EQUAL_TO_BOOLEAN) {
|
|
71
72
|
dataType = matcherTypes_1.matcherDataTypes.BOOLEAN;
|
|
72
73
|
value = booleanMatcherData;
|
|
73
74
|
}
|
|
74
|
-
else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING
|
|
75
|
+
else if (type === matcherTypes_1.matcherTypes.MATCHES_STRING ||
|
|
76
|
+
type === matcherTypes_1.matcherTypes.EQUAL_TO_SEMVER ||
|
|
77
|
+
type === matcherTypes_1.matcherTypes.GREATER_THAN_OR_EQUAL_TO_SEMVER ||
|
|
78
|
+
type === matcherTypes_1.matcherTypes.LESS_THAN_OR_EQUAL_TO_SEMVER) {
|
|
75
79
|
value = stringMatcherData;
|
|
76
80
|
}
|
|
77
81
|
return {
|
|
78
82
|
attribute: attribute,
|
|
79
83
|
negate: negate,
|
|
80
84
|
type: type,
|
|
85
|
+
name: matcherType,
|
|
81
86
|
value: value,
|
|
82
87
|
dataType: dataType // runtime input data type
|
|
83
88
|
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.whitelistTransform = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
4
|
/**
|
|
6
|
-
* Extract whitelist
|
|
5
|
+
* Extract whitelist array.
|
|
7
6
|
*/
|
|
8
7
|
function whitelistTransform(whitelistObject) {
|
|
9
|
-
return
|
|
8
|
+
return whitelistObject && whitelistObject.whitelist;
|
|
10
9
|
}
|
|
11
10
|
exports.whitelistTransform = whitelistTransform;
|
|
@@ -9,6 +9,7 @@ var condition_1 = require("../condition");
|
|
|
9
9
|
var ifelseif_1 = require("../combiners/ifelseif");
|
|
10
10
|
var and_1 = require("../combiners/and");
|
|
11
11
|
var thenable_1 = require("../../utils/promise/thenable");
|
|
12
|
+
var constants_1 = require("../../logger/constants");
|
|
12
13
|
function parser(log, conditions, storage) {
|
|
13
14
|
var predicates = [];
|
|
14
15
|
for (var i = 0; i < conditions.length; i++) {
|
|
@@ -17,21 +18,35 @@ function parser(log, conditions, storage) {
|
|
|
17
18
|
var matchers = (0, matchersTransform_1.matchersTransform)(matcherGroup.matchers);
|
|
18
19
|
// create a set of pure functions from the matcher's dto
|
|
19
20
|
var expressions = matchers.map(function (matcherDto) {
|
|
20
|
-
var matcher
|
|
21
|
+
var matcher;
|
|
22
|
+
try {
|
|
23
|
+
matcher = (0, matchers_1.matcherFactory)(log, matcherDto, storage);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
log.error(constants_1.ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
|
|
27
|
+
}
|
|
21
28
|
// Evaluator function.
|
|
22
29
|
return function (key, attributes, splitEvaluator) {
|
|
23
30
|
var value = (0, value_1.sanitizeValue)(log, key, matcherDto, attributes);
|
|
24
|
-
var result =
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
var result = false;
|
|
32
|
+
if (value !== undefined && matcher) {
|
|
33
|
+
try {
|
|
34
|
+
result = matcher(value, splitEvaluator);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
log.error(constants_1.ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
|
|
38
|
+
}
|
|
28
39
|
}
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
function handleResult(result) {
|
|
41
|
+
log.debug(constants_1.ENGINE_MATCHER_RESULT, [matcherDto.name, result, matcherDto.value, value]); // @ts-ignore
|
|
42
|
+
return Boolean(result ^ matcherDto.negate);
|
|
43
|
+
}
|
|
44
|
+
return (0, thenable_1.thenable)(result) ?
|
|
45
|
+
result.then(handleResult) :
|
|
46
|
+
handleResult(result);
|
|
31
47
|
};
|
|
32
48
|
});
|
|
33
|
-
// if matcher's factory can't
|
|
34
|
-
// will be empty
|
|
49
|
+
// if matcher's factory can't instantiate the matchers, the expressions array will be empty
|
|
35
50
|
if (expressions.length === 0) {
|
|
36
51
|
// reset any data collected during parsing
|
|
37
52
|
predicates = [];
|
package/cjs/logger/constants.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
5
|
-
exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP =
|
|
3
|
+
exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.ENGINE_MATCHER_RESULT = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
|
|
4
|
+
exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.WARN_FLAGSET_WITHOUT_FLAGS = exports.WARN_FLAGSET_NOT_CONFIGURED = exports.WARN_LOWERCASE_FLAGSET = exports.WARN_INVALID_FLAGSET = exports.STREAMING_PARSING_SPLIT_UPDATE = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_SDK_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = exports.ENGINE_VALUE_NO_ATTRIBUTES = void 0;
|
|
5
|
+
exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_UNIQUE_KEYS_TRACKER = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ENGINE_MATCHER_ERROR = exports.ERROR_SETS_FILTER_EXCLUSIVE = exports.ERROR_TOO_MANY_SETS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = void 0;
|
|
6
6
|
/**
|
|
7
7
|
* Message codes used to trim string log messages from commons and client-side API modules,
|
|
8
8
|
* in order to reduce the minimal SDK size for Browser and eventually other client-side environments.
|
|
@@ -14,25 +14,8 @@ exports.ENGINE_COMBINER_AND = 0;
|
|
|
14
14
|
exports.ENGINE_COMBINER_IFELSEIF = 1;
|
|
15
15
|
exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = 2;
|
|
16
16
|
exports.ENGINE_BUCKET = 3;
|
|
17
|
-
exports.ENGINE_MATCHER_ALL = 4;
|
|
18
|
-
exports.ENGINE_MATCHER_BETWEEN = 5;
|
|
19
|
-
exports.ENGINE_MATCHER_BOOLEAN = 6;
|
|
20
|
-
exports.ENGINE_MATCHER_CONTAINS_ALL = 7;
|
|
21
|
-
exports.ENGINE_MATCHER_CONTAINS_ANY = 8;
|
|
22
|
-
exports.ENGINE_MATCHER_CONTAINS_STRING = 9;
|
|
23
17
|
exports.ENGINE_MATCHER_DEPENDENCY = 10;
|
|
24
18
|
exports.ENGINE_MATCHER_DEPENDENCY_PRE = 11;
|
|
25
|
-
exports.ENGINE_MATCHER_EQUAL = 12;
|
|
26
|
-
exports.ENGINE_MATCHER_EQUAL_TO_SET = 13;
|
|
27
|
-
exports.ENGINE_MATCHER_ENDS_WITH = 14;
|
|
28
|
-
exports.ENGINE_MATCHER_GREATER = 15;
|
|
29
|
-
exports.ENGINE_MATCHER_LESS = 16;
|
|
30
|
-
exports.ENGINE_MATCHER_PART_OF = 17;
|
|
31
|
-
exports.ENGINE_MATCHER_SEGMENT = 18;
|
|
32
|
-
exports.ENGINE_MATCHER_STRING = 19;
|
|
33
|
-
exports.ENGINE_MATCHER_STRING_INVALID = 20;
|
|
34
|
-
exports.ENGINE_MATCHER_STARTS_WITH = 21;
|
|
35
|
-
exports.ENGINE_MATCHER_WHITELIST = 22;
|
|
36
19
|
exports.ENGINE_VALUE = 23;
|
|
37
20
|
exports.ENGINE_SANITIZE = 24;
|
|
38
21
|
exports.CLEANUP_REGISTERING = 25;
|
|
@@ -50,6 +33,7 @@ exports.SYNC_TASK_START = 36;
|
|
|
50
33
|
exports.SYNC_TASK_EXECUTE = 37;
|
|
51
34
|
exports.SYNC_TASK_STOP = 38;
|
|
52
35
|
exports.SETTINGS_SPLITS_FILTER = 39;
|
|
36
|
+
exports.ENGINE_MATCHER_RESULT = 40;
|
|
53
37
|
exports.CLIENT_READY_FROM_CACHE = 100;
|
|
54
38
|
exports.CLIENT_READY = 101;
|
|
55
39
|
exports.IMPRESSION = 102;
|
|
@@ -133,6 +117,7 @@ exports.ERROR_NOT_BOOLEAN = 325;
|
|
|
133
117
|
exports.ERROR_MIN_CONFIG_PARAM = 326;
|
|
134
118
|
exports.ERROR_TOO_MANY_SETS = 327;
|
|
135
119
|
exports.ERROR_SETS_FILTER_EXCLUSIVE = 328;
|
|
120
|
+
exports.ENGINE_MATCHER_ERROR = 329;
|
|
136
121
|
// Log prefixes (a.k.a. tags or categories)
|
|
137
122
|
exports.LOG_PREFIX_SETTINGS = 'settings';
|
|
138
123
|
exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
|
package/cjs/logger/index.js
CHANGED
|
@@ -28,7 +28,14 @@ function _sprintf(format, args) {
|
|
|
28
28
|
if (args === void 0) { args = []; }
|
|
29
29
|
var i = 0;
|
|
30
30
|
return format.replace(/%s/g, function () {
|
|
31
|
-
|
|
31
|
+
var arg = args[i++];
|
|
32
|
+
if ((0, lang_1.isObject)(arg) || Array.isArray(arg)) {
|
|
33
|
+
try {
|
|
34
|
+
arg = JSON.stringify(arg);
|
|
35
|
+
}
|
|
36
|
+
catch (e) { /* empty */ }
|
|
37
|
+
}
|
|
38
|
+
return arg;
|
|
32
39
|
});
|
|
33
40
|
}
|
|
34
41
|
exports._sprintf = _sprintf;
|
|
@@ -10,27 +10,11 @@ exports.codesDebug = info_1.codesInfo.concat([
|
|
|
10
10
|
[c.ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Treatment found: %s'],
|
|
11
11
|
[c.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT, c.LOG_PREFIX_ENGINE_COMBINER + 'All predicates evaluated, no treatment found.'],
|
|
12
12
|
[c.ENGINE_BUCKET, c.LOG_PREFIX_ENGINE + ': using algo "murmur" bucket %s for key %s using seed %s - treatment %s'],
|
|
13
|
-
[c.
|
|
14
|
-
[c.
|
|
15
|
-
[c.
|
|
16
|
-
[c.
|
|
17
|
-
[c.
|
|
18
|
-
[c.ENGINE_MATCHER_CONTAINS_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[containsStringMatcher] %s contains %s? %s'],
|
|
19
|
-
[c.ENGINE_MATCHER_DEPENDENCY, c.LOG_PREFIX_ENGINE_MATCHER + '[dependencyMatcher] parent feature flag "%s" evaluated to "%s" with label "%s". %s evaluated treatment is part of [%s] ? %s.'],
|
|
20
|
-
[c.ENGINE_MATCHER_DEPENDENCY_PRE, c.LOG_PREFIX_ENGINE_MATCHER + '[dependencyMatcher] will evaluate parent feature flag: "%s" with key: %s %s'],
|
|
21
|
-
[c.ENGINE_MATCHER_EQUAL, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToMatcher] is %s equal to %s? %s'],
|
|
22
|
-
[c.ENGINE_MATCHER_EQUAL_TO_SET, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSetMatcher] is %s equal to set %s? %s'],
|
|
23
|
-
[c.ENGINE_MATCHER_ENDS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[endsWithMatcher] %s ends with %s? %s'],
|
|
24
|
-
[c.ENGINE_MATCHER_GREATER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualMatcher] is %s greater than %s? %s'],
|
|
25
|
-
[c.ENGINE_MATCHER_LESS, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualMatcher] is %s less than %s? %s'],
|
|
26
|
-
[c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
|
|
27
|
-
[c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
|
|
28
|
-
[c.ENGINE_MATCHER_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] does %s matches with %s? %s'],
|
|
29
|
-
[c.ENGINE_MATCHER_STRING_INVALID, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] %s is an invalid regex'],
|
|
30
|
-
[c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
|
|
31
|
-
[c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
|
|
32
|
-
[c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
|
|
33
|
-
[c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
|
|
13
|
+
[c.ENGINE_MATCHER_DEPENDENCY, c.LOG_PREFIX_ENGINE_MATCHER + '[IN_SPLIT_TREATMENT] parent feature flag "%s" evaluated to "%s" with label "%s". %s evaluated treatment is part of %s ? %s.'],
|
|
14
|
+
[c.ENGINE_MATCHER_DEPENDENCY_PRE, c.LOG_PREFIX_ENGINE_MATCHER + '[IN_SPLIT_TREATMENT] will evaluate parent feature flag: "%s" with key: %s %s'],
|
|
15
|
+
[c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute `%s`. %s will be used for matching.'],
|
|
16
|
+
[c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize %s which should be of type %s. Sanitized and processed value => %s'],
|
|
17
|
+
[c.ENGINE_MATCHER_RESULT, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] Result: %s. Rule value: %s. Evaluation value: %s'],
|
|
34
18
|
// SDK
|
|
35
19
|
[c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
|
|
36
20
|
[c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
|
|
@@ -5,7 +5,8 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var c = (0, tslib_1.__importStar)(require("../constants"));
|
|
6
6
|
exports.codesError = [
|
|
7
7
|
// evaluator
|
|
8
|
-
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules found'],
|
|
8
|
+
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported targeting rule type found'],
|
|
9
|
+
[c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
|
|
9
10
|
// SDK
|
|
10
11
|
[c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
|
|
11
12
|
[c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'],
|
|
@@ -7,7 +7,7 @@ var error_1 = require("./error");
|
|
|
7
7
|
exports.codesWarn = error_1.codesError.concat([
|
|
8
8
|
// evaluator
|
|
9
9
|
[c.ENGINE_VALUE_INVALID, c.LOG_PREFIX_ENGINE_VALUE + 'Value %s doesn\'t match with expected type.'],
|
|
10
|
-
[c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute
|
|
10
|
+
[c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute `%s`. No attributes received.'],
|
|
11
11
|
// synchronizer
|
|
12
12
|
[c.SYNC_MYSEGMENTS_FETCH_RETRY, c.LOG_PREFIX_SYNC_MYSEGMENTS + 'Retrying download of segments #%s. Reason: %s'],
|
|
13
13
|
[c.SYNC_SPLITS_FETCH_FAILS, c.LOG_PREFIX_SYNC_SPLITS + 'Error while doing fetch of feature flags. %s'],
|
|
@@ -31,8 +31,6 @@ function sdkClientFactory(params, isSharedClient) {
|
|
|
31
31
|
function __flush() {
|
|
32
32
|
return syncManager ? syncManager.flush() : Promise.resolve();
|
|
33
33
|
}
|
|
34
|
-
// Same promise if `destroy` is called multiple times
|
|
35
|
-
var destroyPromise;
|
|
36
34
|
return (0, objectAssign_1.objectAssign)(
|
|
37
35
|
// Proto-linkage of the readiness Event Emitter
|
|
38
36
|
Object.create(sdkReadinessManager.sdkStatus),
|
|
@@ -45,8 +43,6 @@ function sdkClientFactory(params, isSharedClient) {
|
|
|
45
43
|
return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
|
|
46
44
|
},
|
|
47
45
|
destroy: function () {
|
|
48
|
-
if (destroyPromise)
|
|
49
|
-
return destroyPromise;
|
|
50
46
|
// Mark the SDK as destroyed immediately
|
|
51
47
|
sdkReadinessManager.readinessManager.destroy();
|
|
52
48
|
// For main client, release the SDK Key and record stat before flushing data
|
|
@@ -56,7 +52,7 @@ function sdkClientFactory(params, isSharedClient) {
|
|
|
56
52
|
}
|
|
57
53
|
// Stop background jobs
|
|
58
54
|
syncManager && syncManager.stop();
|
|
59
|
-
|
|
55
|
+
return __flush().then(function () {
|
|
60
56
|
// Cleanup event listeners
|
|
61
57
|
signalListener && signalListener.stop();
|
|
62
58
|
// @TODO stop only if last client is destroyed
|
|
@@ -65,7 +61,6 @@ function sdkClientFactory(params, isSharedClient) {
|
|
|
65
61
|
// Cleanup storage
|
|
66
62
|
return storage.destroy();
|
|
67
63
|
});
|
|
68
|
-
return destroyPromise;
|
|
69
64
|
}
|
|
70
65
|
});
|
|
71
66
|
}
|
package/cjs/services/splitApi.js
CHANGED
|
@@ -32,16 +32,16 @@ function splitApiFactory(settings, platform, telemetryTracker) {
|
|
|
32
32
|
return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; });
|
|
33
33
|
},
|
|
34
34
|
fetchAuth: function (userMatchingKeys) {
|
|
35
|
-
var url = urls.auth + "/v2/auth";
|
|
36
|
-
if (userMatchingKeys) { //
|
|
35
|
+
var url = urls.auth + "/v2/auth?s=" + constants_1.FLAGS_SPEC;
|
|
36
|
+
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
37
37
|
var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
38
|
-
if (queryParams)
|
|
39
|
-
url += '
|
|
38
|
+
if (queryParams)
|
|
39
|
+
url += '&' + queryParams;
|
|
40
40
|
}
|
|
41
41
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
|
|
42
42
|
},
|
|
43
43
|
fetchSplitChanges: function (since, noCache, till) {
|
|
44
|
-
var url = urls.sdk + "/splitChanges?
|
|
44
|
+
var url = urls.sdk + "/splitChanges?s=" + constants_1.FLAGS_SPEC + "&since=" + since + (filterQueryString || '') + (till ? '&till=' + till : '');
|
|
45
45
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS))
|
|
46
46
|
.catch(function (err) {
|
|
47
47
|
if (err.statusCode === 414)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getStorageHash = exports.KeyBuilder = exports.validatePrefix = void 0;
|
|
4
|
+
var constants_1 = require("../utils/constants");
|
|
4
5
|
var lang_1 = require("../utils/lang");
|
|
5
6
|
var murmur3_1 = require("../utils/murmur3/murmur3");
|
|
6
7
|
var everythingAtTheEnd = /[^.]+$/;
|
|
@@ -70,6 +71,6 @@ exports.KeyBuilder = KeyBuilder;
|
|
|
70
71
|
* The hash is in hexadecimal format (8 characters max, 32 bits).
|
|
71
72
|
*/
|
|
72
73
|
function getStorageHash(settings) {
|
|
73
|
-
return (0, murmur3_1.hash)(settings.core.authorizationKey + "::" + settings.sync.__splitFiltersValidation.queryString + "::
|
|
74
|
+
return (0, murmur3_1.hash)(settings.core.authorizationKey + "::" + settings.sync.__splitFiltersValidation.queryString + "::" + constants_1.FLAGS_SPEC).toString(16);
|
|
74
75
|
}
|
|
75
76
|
exports.getStorageHash = getStorageHash;
|
|
@@ -126,7 +126,7 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
|
126
126
|
SplitsCacheInLocal.prototype.setChangeNumber = function (changeNumber) {
|
|
127
127
|
// when using a new split query, we must update it at the store
|
|
128
128
|
if (this.updateNewFilter) {
|
|
129
|
-
this.log.info(constants_1.LOG_PREFIX + 'SDK key or
|
|
129
|
+
this.log.info(constants_1.LOG_PREFIX + 'SDK key, flags filter criteria or flags spec version was modified. Updating cache');
|
|
130
130
|
var storageHashKey = this.keys.buildHashKey();
|
|
131
131
|
try {
|
|
132
132
|
localStorage.setItem(storageHashKey, this.storageHash);
|
|
@@ -82,7 +82,7 @@ function PluggableStorage(options) {
|
|
|
82
82
|
return wrapper.get(keys.buildHashKey()).then(function (hash) {
|
|
83
83
|
var currentHash = (0, KeyBuilder_1.getStorageHash)(settings);
|
|
84
84
|
if (hash !== currentHash) {
|
|
85
|
-
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key or
|
|
85
|
+
log.info(constants_2.LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
86
86
|
return wrapper.getKeysByPrefix(keys.prefix + ".").then(function (storageKeys) {
|
|
87
87
|
return Promise.all(storageKeys.map(function (storageKey) { return wrapper.del(storageKey); }));
|
|
88
88
|
}).then(function () { return wrapper.set(keys.buildHashKey(), currentHash); });
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Semver = void 0;
|
|
4
|
+
var lang_1 = require("../utils/lang");
|
|
5
|
+
var NUMERIC_IDENTIFIER_REGEX = /^[0-9]+$/;
|
|
6
|
+
var METADATA_DELIMITER = '+';
|
|
7
|
+
var PRERELEASE_DELIMITER = '-';
|
|
8
|
+
var VALUE_DELIMITER = '.';
|
|
9
|
+
/**
|
|
10
|
+
* Compares two strings. If both strings are numeric identifiers, they are compared numerically. Otherwise, they are compared lexicographically.
|
|
11
|
+
* This could be implemented using `a.localeCompare(b, undefined, { numeric: true })` but locale options are not broadly supported.
|
|
12
|
+
*/
|
|
13
|
+
function compareStrings(a, b) {
|
|
14
|
+
if (NUMERIC_IDENTIFIER_REGEX.test(a) && NUMERIC_IDENTIFIER_REGEX.test(b)) {
|
|
15
|
+
var result = a.length - b.length;
|
|
16
|
+
if (result !== 0) {
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
21
|
+
}
|
|
22
|
+
// Sanitizes a numeric identifier by removing leading zeros
|
|
23
|
+
function sanitizeNumericIdentifier(value) {
|
|
24
|
+
return value.replace(/^0+(?=\d)/, '');
|
|
25
|
+
}
|
|
26
|
+
function throwError(version) {
|
|
27
|
+
throw new Error('Unable to convert to Semver, incorrect format: ' + version);
|
|
28
|
+
}
|
|
29
|
+
var Semver = /** @class */ (function () {
|
|
30
|
+
function Semver(version) {
|
|
31
|
+
if (!(0, lang_1.isString)(version))
|
|
32
|
+
throwError(version);
|
|
33
|
+
// Separate metadata if exists
|
|
34
|
+
var index = version.indexOf(METADATA_DELIMITER);
|
|
35
|
+
var _a = index === -1 ? [version] : [version.slice(0, index), version.slice(index + 1)], vWithoutMetadata = _a[0], metadata = _a[1];
|
|
36
|
+
if (metadata === '')
|
|
37
|
+
throwError(version);
|
|
38
|
+
// Set pre-release versions if exists
|
|
39
|
+
index = vWithoutMetadata.indexOf(PRERELEASE_DELIMITER);
|
|
40
|
+
if (index === -1) {
|
|
41
|
+
this._isStable = true;
|
|
42
|
+
this._preRelease = [];
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this._isStable = false;
|
|
46
|
+
this._preRelease = vWithoutMetadata.slice(index + 1).split(VALUE_DELIMITER).map(function (value) {
|
|
47
|
+
if (!value)
|
|
48
|
+
throwError(version);
|
|
49
|
+
return NUMERIC_IDENTIFIER_REGEX.test(value) ?
|
|
50
|
+
sanitizeNumericIdentifier(value) :
|
|
51
|
+
value;
|
|
52
|
+
});
|
|
53
|
+
vWithoutMetadata = vWithoutMetadata.slice(0, index);
|
|
54
|
+
}
|
|
55
|
+
// Set major, minor, and patch versions
|
|
56
|
+
var vParts = vWithoutMetadata.split(VALUE_DELIMITER).map(function (value) {
|
|
57
|
+
if (!value || !NUMERIC_IDENTIFIER_REGEX.test(value))
|
|
58
|
+
throwError(version);
|
|
59
|
+
return sanitizeNumericIdentifier(value);
|
|
60
|
+
});
|
|
61
|
+
if (vParts.length !== 3)
|
|
62
|
+
throwError(version);
|
|
63
|
+
this._major = vParts[0];
|
|
64
|
+
this._minor = vParts[1];
|
|
65
|
+
this._patch = vParts[2];
|
|
66
|
+
// Set version string
|
|
67
|
+
this.version = vParts.join(VALUE_DELIMITER);
|
|
68
|
+
if (this._preRelease.length)
|
|
69
|
+
this.version += PRERELEASE_DELIMITER + this._preRelease.join(VALUE_DELIMITER);
|
|
70
|
+
if (metadata)
|
|
71
|
+
this.version += METADATA_DELIMITER + metadata;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Precedence comparision between 2 Semver objects.
|
|
75
|
+
*
|
|
76
|
+
* @return `0` if `this === toCompare`, `-1` if `this < toCompare`, and `1` if `this > toCompare`
|
|
77
|
+
*/
|
|
78
|
+
Semver.prototype.compare = function (toCompare) {
|
|
79
|
+
if (this.version === toCompare.version)
|
|
80
|
+
return 0;
|
|
81
|
+
var result = compareStrings(this._major, toCompare._major);
|
|
82
|
+
if (result !== 0)
|
|
83
|
+
return result;
|
|
84
|
+
result = compareStrings(this._minor, toCompare._minor);
|
|
85
|
+
if (result !== 0)
|
|
86
|
+
return result;
|
|
87
|
+
result = compareStrings(this._patch, toCompare._patch);
|
|
88
|
+
if (result !== 0)
|
|
89
|
+
return result;
|
|
90
|
+
if (!this._isStable && toCompare._isStable)
|
|
91
|
+
return -1;
|
|
92
|
+
if (this._isStable && !toCompare._isStable)
|
|
93
|
+
return 1;
|
|
94
|
+
for (var i = 0, length_1 = Math.min(this._preRelease.length, toCompare._preRelease.length); i < length_1; i++) {
|
|
95
|
+
var result_1 = compareStrings(this._preRelease[i], toCompare._preRelease[i]);
|
|
96
|
+
if (result_1 !== 0)
|
|
97
|
+
return result_1;
|
|
98
|
+
}
|
|
99
|
+
return this._preRelease.length - toCompare._preRelease.length;
|
|
100
|
+
};
|
|
101
|
+
return Semver;
|
|
102
|
+
}());
|
|
103
|
+
exports.Semver = Semver;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
|
-
exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
4
|
+
exports.FLAGS_SPEC = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
|
|
5
5
|
// Special treatments
|
|
6
6
|
exports.CONTROL = 'control';
|
|
7
7
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -90,3 +90,4 @@ exports.NON_REQUESTED = 1;
|
|
|
90
90
|
exports.DISABLED = 0;
|
|
91
91
|
exports.ENABLED = 1;
|
|
92
92
|
exports.PAUSED = 2;
|
|
93
|
+
exports.FLAGS_SPEC = '1.1';
|
|
@@ -8,4 +8,4 @@ exports.SDK_NOT_READY = 'not ready';
|
|
|
8
8
|
exports.EXCEPTION = 'exception';
|
|
9
9
|
exports.SPLIT_ARCHIVED = 'archived';
|
|
10
10
|
exports.NOT_IN_SPLIT = 'not in split';
|
|
11
|
-
exports.UNSUPPORTED_MATCHER_TYPE = 'unsupported
|
|
11
|
+
exports.UNSUPPORTED_MATCHER_TYPE = 'targeting rule type unsupported by sdk';
|
|
@@ -57,7 +57,7 @@ exports.base = {
|
|
|
57
57
|
// Telemetry Server
|
|
58
58
|
telemetry: 'https://telemetry.split.io/api',
|
|
59
59
|
},
|
|
60
|
-
// Defines which kind of storage we should
|
|
60
|
+
// Defines which kind of storage we should instantiate.
|
|
61
61
|
storage: undefined,
|
|
62
62
|
// Defines if the logs are enabled, SDK wide.
|
|
63
63
|
debug: undefined,
|
|
@@ -4,7 +4,7 @@ exports.validateLogger = void 0;
|
|
|
4
4
|
var logger_1 = require("../../../logger");
|
|
5
5
|
var commons_1 = require("./commons");
|
|
6
6
|
function isLogger(log) {
|
|
7
|
-
return log && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
|
|
7
|
+
return log !== null && typeof log === 'object' && typeof log.debug === 'function' && typeof log.info === 'function' && typeof log.warn === 'function' && typeof log.error === 'function' && typeof log.setLogLevel === 'function';
|
|
8
8
|
}
|
|
9
9
|
// By default it starts disabled.
|
|
10
10
|
var initialLogLevel = logger_1.LogLevels.NONE;
|
package/esm/evaluator/Engine.js
CHANGED
|
@@ -2,12 +2,12 @@ import { get } from '../utils/lang';
|
|
|
2
2
|
import { parser } from './parser';
|
|
3
3
|
import { keyParser } from '../utils/key';
|
|
4
4
|
import { thenable } from '../utils/promise/thenable';
|
|
5
|
-
import
|
|
5
|
+
import { EXCEPTION, NO_CONDITION_MATCH, SPLIT_ARCHIVED, SPLIT_KILLED } from '../utils/labels';
|
|
6
6
|
import { CONTROL } from '../utils/constants';
|
|
7
7
|
function evaluationResult(result, defaultTreatment) {
|
|
8
8
|
return {
|
|
9
9
|
treatment: get(result, 'treatment', defaultTreatment),
|
|
10
|
-
label: get(result, 'label',
|
|
10
|
+
label: get(result, 'label', NO_CONDITION_MATCH)
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
13
|
var Engine = /** @class */ (function () {
|
|
@@ -38,16 +38,16 @@ var Engine = /** @class */ (function () {
|
|
|
38
38
|
catch (err) {
|
|
39
39
|
return {
|
|
40
40
|
treatment: CONTROL,
|
|
41
|
-
label:
|
|
41
|
+
label: EXCEPTION
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
if (this.isGarbage()) {
|
|
45
45
|
treatment = CONTROL;
|
|
46
|
-
label =
|
|
46
|
+
label = SPLIT_ARCHIVED;
|
|
47
47
|
}
|
|
48
48
|
else if (killed) {
|
|
49
49
|
treatment = defaultTreatment;
|
|
50
|
-
label =
|
|
50
|
+
label = SPLIT_KILLED;
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
53
53
|
var evaluation = this.evaluator(parsedKey, seed, trafficAllocation, trafficAllocationSeed, attributes, splitEvaluator);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { findIndex } from '../../utils/lang';
|
|
2
2
|
import { thenable } from '../../utils/promise/thenable';
|
|
3
|
-
import
|
|
3
|
+
import { UNSUPPORTED_MATCHER_TYPE } from '../../utils/labels';
|
|
4
4
|
import { CONTROL } from '../../utils/constants';
|
|
5
5
|
import { ENGINE_COMBINER_IFELSEIF, ENGINE_COMBINER_IFELSEIF_NO_TREATMENT, ERROR_ENGINE_COMBINER_IFELSEIF } from '../../logger/constants';
|
|
6
6
|
export function ifElseIfCombinerContext(log, predicates) {
|
|
@@ -8,7 +8,7 @@ export function ifElseIfCombinerContext(log, predicates) {
|
|
|
8
8
|
log.error(ERROR_ENGINE_COMBINER_IFELSEIF);
|
|
9
9
|
return {
|
|
10
10
|
treatment: CONTROL,
|
|
11
|
-
label:
|
|
11
|
+
label: UNSUPPORTED_MATCHER_TYPE
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
function computeTreatment(predicateResults) {
|
|
@@ -35,7 +35,7 @@ export function ifElseIfCombinerContext(log, predicates) {
|
|
|
35
35
|
return computeTreatment(predicateResults);
|
|
36
36
|
}
|
|
37
37
|
// if there is none predicates, then there was an error in parsing phase
|
|
38
|
-
if (!Array.isArray(predicates) ||
|
|
38
|
+
if (!Array.isArray(predicates) || predicates.length === 0) {
|
|
39
39
|
return unexpectedInputHandler;
|
|
40
40
|
}
|
|
41
41
|
else {
|