@splitsoftware/splitio-commons 1.13.2-rc.6 → 1.13.2-rc.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.txt +3 -1
- package/cjs/evaluator/index.js +1 -1
- package/cjs/evaluator/matchers/all.js +3 -1
- package/cjs/evaluator/matchers/between.js +3 -1
- package/cjs/evaluator/matchers/boolean.js +3 -1
- package/cjs/evaluator/matchers/cont_all.js +3 -1
- package/cjs/evaluator/matchers/cont_any.js +3 -1
- package/cjs/evaluator/matchers/cont_str.js +3 -1
- package/cjs/evaluator/matchers/dependency.js +1 -1
- package/cjs/evaluator/matchers/eq.js +3 -1
- package/cjs/evaluator/matchers/eq_set.js +3 -1
- package/cjs/evaluator/matchers/ew.js +3 -1
- package/cjs/evaluator/matchers/gte.js +3 -1
- package/cjs/evaluator/matchers/index.js +1 -1
- package/cjs/evaluator/matchers/lte.js +3 -1
- package/cjs/evaluator/matchers/part_of.js +3 -1
- package/cjs/evaluator/matchers/segment.js +6 -1
- package/cjs/evaluator/matchers/semver_between.js +1 -1
- package/cjs/evaluator/matchers/semver_eq.js +1 -1
- package/cjs/evaluator/matchers/semver_gte.js +1 -1
- package/cjs/evaluator/matchers/semver_inlist.js +2 -2
- package/cjs/evaluator/matchers/semver_lte.js +1 -1
- package/cjs/evaluator/matchers/string.js +3 -1
- package/cjs/evaluator/matchers/sw.js +3 -1
- package/cjs/evaluator/matchers/whitelist.js +3 -1
- package/cjs/evaluator/matchersTransform/index.js +1 -0
- package/cjs/evaluator/matchersTransform/whitelist.js +1 -1
- package/cjs/evaluator/parser/index.js +10 -18
- package/cjs/logger/constants.js +19 -4
- package/cjs/logger/messages/debug.js +19 -4
- package/cjs/logger/messages/error.js +1 -1
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/services/splitApi.js +5 -5
- package/cjs/storages/KeyBuilder.js +3 -2
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
- package/cjs/storages/pluggable/index.js +1 -1
- package/cjs/utils/constants/index.js +2 -1
- package/cjs/utils/labels/index.js +1 -1
- package/esm/evaluator/index.js +1 -1
- package/esm/evaluator/matchers/all.js +3 -1
- package/esm/evaluator/matchers/between.js +3 -1
- package/esm/evaluator/matchers/boolean.js +3 -1
- package/esm/evaluator/matchers/cont_all.js +3 -1
- package/esm/evaluator/matchers/cont_any.js +3 -1
- package/esm/evaluator/matchers/cont_str.js +3 -1
- package/esm/evaluator/matchers/dependency.js +1 -1
- package/esm/evaluator/matchers/eq.js +3 -1
- package/esm/evaluator/matchers/eq_set.js +3 -1
- package/esm/evaluator/matchers/ew.js +3 -1
- package/esm/evaluator/matchers/gte.js +3 -1
- package/esm/evaluator/matchers/index.js +1 -1
- package/esm/evaluator/matchers/lte.js +3 -1
- package/esm/evaluator/matchers/part_of.js +3 -1
- package/esm/evaluator/matchers/segment.js +6 -1
- package/esm/evaluator/matchers/semver_between.js +1 -1
- package/esm/evaluator/matchers/semver_eq.js +1 -1
- package/esm/evaluator/matchers/semver_gte.js +1 -1
- package/esm/evaluator/matchers/semver_inlist.js +2 -2
- package/esm/evaluator/matchers/semver_lte.js +1 -1
- package/esm/evaluator/matchers/string.js +3 -1
- package/esm/evaluator/matchers/sw.js +3 -1
- package/esm/evaluator/matchers/whitelist.js +3 -1
- package/esm/evaluator/matchersTransform/index.js +1 -0
- package/esm/evaluator/matchersTransform/whitelist.js +1 -1
- package/esm/evaluator/parser/index.js +11 -19
- package/esm/logger/constants.js +16 -1
- package/esm/logger/messages/debug.js +19 -4
- package/esm/logger/messages/error.js +1 -1
- package/esm/logger/messages/warn.js +1 -1
- package/esm/services/splitApi.js +6 -6
- package/esm/storages/KeyBuilder.js +3 -2
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
- package/esm/storages/pluggable/index.js +1 -1
- package/esm/utils/constants/index.js +1 -0
- package/esm/utils/labels/index.js +1 -1
- package/package.json +1 -1
- package/src/evaluator/index.ts +1 -1
- package/src/evaluator/matchers/all.ts +5 -1
- package/src/evaluator/matchers/between.ts +7 -3
- package/src/evaluator/matchers/boolean.ts +6 -2
- package/src/evaluator/matchers/cont_all.ts +5 -1
- package/src/evaluator/matchers/cont_any.ts +5 -1
- package/src/evaluator/matchers/cont_str.ts +6 -2
- package/src/evaluator/matchers/dependency.ts +1 -1
- package/src/evaluator/matchers/eq.ts +6 -2
- package/src/evaluator/matchers/eq_set.ts +5 -1
- package/src/evaluator/matchers/ew.ts +6 -2
- package/src/evaluator/matchers/gte.ts +6 -2
- package/src/evaluator/matchers/index.ts +1 -1
- package/src/evaluator/matchers/lte.ts +6 -2
- package/src/evaluator/matchers/part_of.ts +5 -1
- package/src/evaluator/matchers/segment.ts +8 -1
- package/src/evaluator/matchers/semver_between.ts +2 -1
- package/src/evaluator/matchers/semver_eq.ts +2 -1
- package/src/evaluator/matchers/semver_gte.ts +2 -1
- package/src/evaluator/matchers/semver_inlist.ts +3 -3
- package/src/evaluator/matchers/semver_lte.ts +2 -1
- package/src/evaluator/matchers/string.ts +6 -1
- package/src/evaluator/matchers/sw.ts +6 -2
- package/src/evaluator/matchers/whitelist.ts +5 -1
- package/src/evaluator/matchersTransform/index.ts +2 -1
- package/src/evaluator/matchersTransform/whitelist.ts +1 -1
- package/src/evaluator/parser/index.ts +8 -13
- package/src/evaluator/types.ts +1 -0
- package/src/logger/constants.ts +16 -1
- package/src/logger/messages/debug.ts +19 -4
- package/src/logger/messages/error.ts +1 -1
- package/src/logger/messages/warn.ts +1 -1
- package/src/services/splitApi.ts +5 -6
- package/src/storages/KeyBuilder.ts +3 -2
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
- package/src/storages/pluggable/index.ts +1 -1
- package/src/utils/constants/index.ts +2 -0
- package/src/utils/labels/index.ts +1 -1
- package/types/evaluator/matchers/all.d.ts +2 -1
- package/types/evaluator/matchers/between.d.ts +2 -1
- package/types/evaluator/matchers/boolean.d.ts +2 -1
- package/types/evaluator/matchers/cont_all.d.ts +2 -1
- package/types/evaluator/matchers/cont_any.d.ts +2 -1
- package/types/evaluator/matchers/cont_str.d.ts +2 -1
- package/types/evaluator/matchers/dependency.d.ts +1 -1
- package/types/evaluator/matchers/eq.d.ts +2 -1
- package/types/evaluator/matchers/eq_set.d.ts +2 -1
- package/types/evaluator/matchers/ew.d.ts +2 -1
- package/types/evaluator/matchers/gte.d.ts +2 -1
- package/types/evaluator/matchers/lte.d.ts +2 -1
- package/types/evaluator/matchers/part_of.d.ts +2 -1
- package/types/evaluator/matchers/segment.d.ts +2 -1
- package/types/evaluator/matchers/semver_between.d.ts +2 -1
- package/types/evaluator/matchers/semver_eq.d.ts +2 -1
- package/types/evaluator/matchers/semver_gte.d.ts +2 -1
- package/types/evaluator/matchers/semver_inlist.d.ts +2 -1
- package/types/evaluator/matchers/semver_lte.d.ts +2 -1
- package/types/evaluator/matchers/string.d.ts +2 -1
- package/types/evaluator/matchers/sw.d.ts +2 -1
- package/types/evaluator/matchers/whitelist.d.ts +2 -1
- package/types/evaluator/matchersTransform/set.d.ts +2 -2
- package/types/evaluator/matchersTransform/whitelist.d.ts +1 -1
- package/types/evaluator/types.d.ts +1 -0
- package/types/logger/constants.d.ts +16 -1
- package/types/storages/KeyBuilder.d.ts +1 -1
- package/types/trackers/impressionObserver/utils.d.ts +1 -1
- package/types/utils/constants/index.d.ts +1 -0
- package/types/utils/labels/index.d.ts +1 -1
- package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
- package/types/evaluator/matchersTransform/string.d.ts +0 -7
- package/types/sdkClient/identity.d.ts +0 -6
- package/types/storages/AbstractSplitsCache.d.ts +0 -46
- package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
- package/types/utils/inputValidation/sdkKey.d.ts +0 -7
- package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
- /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { ENGINE_MATCHER_BOOLEAN } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
|
|
4
|
+
export function booleanMatcherContext(log: ILogger, ruleAttr: boolean) {
|
|
3
5
|
return function booleanMatcher(runtimeAttr: boolean): boolean {
|
|
4
|
-
|
|
6
|
+
let booleanMatches = ruleAttr === runtimeAttr;
|
|
7
|
+
|
|
8
|
+
log.debug(ENGINE_MATCHER_BOOLEAN, [ruleAttr, runtimeAttr]);
|
|
5
9
|
|
|
6
10
|
return booleanMatches;
|
|
7
11
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { ENGINE_MATCHER_CONTAINS_ALL } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
1
3
|
import { findIndex } from '../../utils/lang';
|
|
2
4
|
|
|
3
|
-
export function containsAllSetMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function containsAllSetMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function containsAllMatcher(runtimeAttr: string[]): boolean {
|
|
5
7
|
let containsAll = true;
|
|
6
8
|
|
|
@@ -13,6 +15,8 @@ export function containsAllSetMatcherContext(ruleAttr: string[]) {
|
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
|
|
18
|
+
log.debug(ENGINE_MATCHER_CONTAINS_ALL, [runtimeAttr, ruleAttr, containsAll]);
|
|
19
|
+
|
|
16
20
|
return containsAll;
|
|
17
21
|
};
|
|
18
22
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { ENGINE_MATCHER_CONTAINS_ANY } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
1
3
|
import { findIndex } from '../../utils/lang';
|
|
2
4
|
|
|
3
|
-
export function containsAnySetMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function containsAnySetMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function containsAnyMatcher(runtimeAttr: string[]): boolean {
|
|
5
7
|
let containsAny = false;
|
|
6
8
|
|
|
@@ -8,6 +10,8 @@ export function containsAnySetMatcherContext(ruleAttr: string[]) {
|
|
|
8
10
|
if (findIndex(runtimeAttr, e => e === ruleAttr[i]) >= 0) containsAny = true;
|
|
9
11
|
}
|
|
10
12
|
|
|
13
|
+
log.debug(ENGINE_MATCHER_CONTAINS_ANY, [runtimeAttr, ruleAttr, containsAny]);
|
|
14
|
+
|
|
11
15
|
return containsAny;
|
|
12
16
|
};
|
|
13
17
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { isString } from '../../utils/lang';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
import { ENGINE_MATCHER_CONTAINS_STRING } from '../../logger/constants';
|
|
2
4
|
|
|
3
|
-
export function containsStringMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function containsStringMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function containsStringMatcher(runtimeAttr: string): boolean {
|
|
5
|
-
|
|
7
|
+
let contains = ruleAttr.some(e => isString(runtimeAttr) && runtimeAttr.indexOf(e) > -1);
|
|
8
|
+
|
|
9
|
+
log.debug(ENGINE_MATCHER_CONTAINS_STRING, [runtimeAttr, ruleAttr, contains]);
|
|
6
10
|
|
|
7
11
|
return contains;
|
|
8
12
|
};
|
|
@@ -5,7 +5,7 @@ import { thenable } from '../../utils/promise/thenable';
|
|
|
5
5
|
import { IDependencyMatcherValue, IEvaluation, ISplitEvaluator } from '../types';
|
|
6
6
|
import { ENGINE_MATCHER_DEPENDENCY, ENGINE_MATCHER_DEPENDENCY_PRE } from '../../logger/constants';
|
|
7
7
|
|
|
8
|
-
export function dependencyMatcherContext({ split, treatments }: IDependencyMatcherData, storage: IStorageSync | IStorageAsync
|
|
8
|
+
export function dependencyMatcherContext(log: ILogger, { split, treatments }: IDependencyMatcherData, storage: IStorageSync | IStorageAsync) {
|
|
9
9
|
|
|
10
10
|
function checkTreatment(evaluation: IEvaluation, acceptableTreatments: string[], parentName: string) {
|
|
11
11
|
let matches = false;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { ENGINE_MATCHER_EQUAL } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
|
|
4
|
+
export function equalToMatcherContext(log: ILogger, ruleAttr: number) {
|
|
3
5
|
return function equalToMatcher(runtimeAttr: number): boolean {
|
|
4
|
-
|
|
6
|
+
let isEqual = runtimeAttr === ruleAttr;
|
|
7
|
+
|
|
8
|
+
log.debug(ENGINE_MATCHER_EQUAL, [runtimeAttr, ruleAttr, isEqual]);
|
|
5
9
|
|
|
6
10
|
return isEqual;
|
|
7
11
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { ENGINE_MATCHER_EQUAL_TO_SET } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
1
3
|
import { findIndex } from '../../utils/lang';
|
|
2
4
|
|
|
3
|
-
export function equalToSetMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function equalToSetMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function equalToSetMatcher(runtimeAttr: string[]): boolean {
|
|
5
7
|
// Length being the same is the first condition.
|
|
6
8
|
let isEqual = runtimeAttr.length === ruleAttr.length;
|
|
@@ -10,6 +12,8 @@ export function equalToSetMatcherContext(ruleAttr: string[]) {
|
|
|
10
12
|
if (findIndex(ruleAttr, e => e === runtimeAttr[i]) < 0) isEqual = false;
|
|
11
13
|
}
|
|
12
14
|
|
|
15
|
+
log.debug(ENGINE_MATCHER_EQUAL_TO_SET, [runtimeAttr, ruleAttr, isEqual]);
|
|
16
|
+
|
|
13
17
|
return isEqual;
|
|
14
18
|
};
|
|
15
19
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { ENGINE_MATCHER_ENDS_WITH } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
1
3
|
import { endsWith } from '../../utils/lang';
|
|
2
4
|
|
|
3
|
-
export function endsWithMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function endsWithMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function endsWithMatcher(runtimeAttr: string): boolean {
|
|
5
|
-
|
|
7
|
+
let strEndsWith = ruleAttr.some(e => endsWith(runtimeAttr, e));
|
|
8
|
+
|
|
9
|
+
log.debug(ENGINE_MATCHER_ENDS_WITH, [runtimeAttr, ruleAttr, strEndsWith]);
|
|
6
10
|
|
|
7
11
|
return strEndsWith;
|
|
8
12
|
};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { ENGINE_MATCHER_GREATER } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
|
|
4
|
+
export function greaterThanEqualMatcherContext(log: ILogger, ruleAttr: number) {
|
|
3
5
|
return function greaterThanEqualMatcher(runtimeAttr: number): boolean {
|
|
4
|
-
|
|
6
|
+
let isGreaterThanEqual = runtimeAttr >= ruleAttr;
|
|
7
|
+
|
|
8
|
+
log.debug(ENGINE_MATCHER_GREATER, [runtimeAttr, ruleAttr, isGreaterThanEqual]);
|
|
5
9
|
|
|
6
10
|
return isGreaterThanEqual;
|
|
7
11
|
};
|
|
@@ -61,6 +61,6 @@ export function matcherFactory(log: ILogger, matcherDto: IMatcherDto, storage?:
|
|
|
61
61
|
|
|
62
62
|
let matcherFn;
|
|
63
63
|
// @ts-ignore
|
|
64
|
-
if (matchers[type]) matcherFn = matchers[type](value, storage
|
|
64
|
+
if (matchers[type]) matcherFn = matchers[type](log, value, storage); // There is no index-out-of-bound exception in JavaScript
|
|
65
65
|
return matcherFn;
|
|
66
66
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { ENGINE_MATCHER_LESS } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
|
|
4
|
+
export function lessThanEqualMatcherContext(log: ILogger, ruleAttr: number) {
|
|
3
5
|
return function lessThanEqualMatcher(runtimeAttr: number): boolean {
|
|
4
|
-
|
|
6
|
+
let isLessThanEqual = runtimeAttr <= ruleAttr;
|
|
7
|
+
|
|
8
|
+
log.debug(ENGINE_MATCHER_LESS, [runtimeAttr, ruleAttr, isLessThanEqual]);
|
|
5
9
|
|
|
6
10
|
return isLessThanEqual;
|
|
7
11
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { findIndex } from '../../utils/lang';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
import { ENGINE_MATCHER_PART_OF } from '../../logger/constants';
|
|
2
4
|
|
|
3
|
-
export function partOfSetMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function partOfSetMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function partOfMatcher(runtimeAttr: string[]): boolean {
|
|
5
7
|
// To be part of the length should be minor or equal.
|
|
6
8
|
let isPartOf = runtimeAttr.length <= ruleAttr.length;
|
|
@@ -10,6 +12,8 @@ export function partOfSetMatcherContext(ruleAttr: string[]) {
|
|
|
10
12
|
if (findIndex(ruleAttr, e => e === runtimeAttr[i]) < 0) isPartOf = false;
|
|
11
13
|
}
|
|
12
14
|
|
|
15
|
+
log.debug(ENGINE_MATCHER_PART_OF, [runtimeAttr, ruleAttr, isPartOf]);
|
|
16
|
+
|
|
13
17
|
return isPartOf;
|
|
14
18
|
};
|
|
15
19
|
}
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { MaybeThenable } from '../../dtos/types';
|
|
2
2
|
import { ISegmentsCacheBase } from '../../storages/types';
|
|
3
|
+
import { ILogger } from '../../logger/types';
|
|
3
4
|
import { thenable } from '../../utils/promise/thenable';
|
|
5
|
+
import { ENGINE_MATCHER_SEGMENT } from '../../logger/constants';
|
|
4
6
|
|
|
5
|
-
export function segmentMatcherContext(segmentName: string, storage: { segments: ISegmentsCacheBase }) {
|
|
7
|
+
export function segmentMatcherContext(log: ILogger, segmentName: string, storage: { segments: ISegmentsCacheBase }) {
|
|
6
8
|
|
|
7
9
|
return function segmentMatcher(key: string): MaybeThenable<boolean> {
|
|
8
10
|
const isInSegment = storage.segments.isInSegment(segmentName, key);
|
|
9
11
|
|
|
10
12
|
if (thenable(isInSegment)) {
|
|
11
13
|
isInSegment.then(result => {
|
|
14
|
+
log.debug(ENGINE_MATCHER_SEGMENT, [segmentName, key, isInSegment]);
|
|
15
|
+
|
|
12
16
|
return result;
|
|
13
17
|
});
|
|
18
|
+
} else {
|
|
19
|
+
log.debug(ENGINE_MATCHER_SEGMENT, [segmentName, key, isInSegment]);
|
|
14
20
|
}
|
|
15
21
|
|
|
16
22
|
return isInSegment;
|
|
17
23
|
};
|
|
24
|
+
|
|
18
25
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { IBetweenStringMatcherData } from '../../dtos/types';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
import { Semver } from '../../utils/Semver';
|
|
3
4
|
|
|
4
|
-
export function betweenSemverMatcherContext(ruleAttr: IBetweenStringMatcherData) {
|
|
5
|
+
export function betweenSemverMatcherContext(log: ILogger, ruleAttr: IBetweenStringMatcherData) {
|
|
5
6
|
const startSemver = new Semver(ruleAttr.start);
|
|
6
7
|
const endSemver = new Semver(ruleAttr.end);
|
|
7
8
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
1
2
|
import { Semver } from '../../utils/Semver';
|
|
2
3
|
|
|
3
|
-
export function equalToSemverMatcherContext(ruleAttr: string) {
|
|
4
|
+
export function equalToSemverMatcherContext(log: ILogger, ruleAttr: string) {
|
|
4
5
|
const ruleSemver = new Semver(ruleAttr);
|
|
5
6
|
|
|
6
7
|
return function equalToSemverMatcher(runtimeAttr: string): boolean {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
1
2
|
import { Semver } from '../../utils/Semver';
|
|
2
3
|
|
|
3
|
-
export function greaterThanEqualToSemverMatcherContext(ruleAttr: string) {
|
|
4
|
+
export function greaterThanEqualToSemverMatcherContext(log: ILogger, ruleAttr: string) {
|
|
4
5
|
const ruleSemver = new Semver(ruleAttr);
|
|
5
6
|
|
|
6
7
|
return function greaterThanEqualToSemverMatcher(runtimeAttr: string): boolean {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { _Set } from '../../utils/lang/sets';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
2
3
|
import { Semver } from '../../utils/Semver';
|
|
3
4
|
|
|
4
|
-
export function inListSemverMatcherContext(ruleAttr: string[]) {
|
|
5
|
-
// @TODO
|
|
5
|
+
export function inListSemverMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
6
|
+
// @TODO ruleAttr validation should be done at the `parser` or `matchersTransform` level to reuse for all matchers
|
|
6
7
|
if (!ruleAttr || ruleAttr.length === 0) throw new Error('whitelistMatcherData is required for IN_LIST_SEMVER matcher type');
|
|
7
8
|
|
|
8
9
|
const listOfSemvers = new _Set(ruleAttr.map((version) => new Semver(version).version));
|
|
9
10
|
|
|
10
11
|
return function inListSemverMatcher(runtimeAttr: string): boolean {
|
|
11
12
|
const runtimeSemver = new Semver(runtimeAttr).version;
|
|
12
|
-
|
|
13
13
|
const isInList = listOfSemvers.has(runtimeSemver);
|
|
14
14
|
|
|
15
15
|
return isInList;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
1
2
|
import { Semver } from '../../utils/Semver';
|
|
2
3
|
|
|
3
|
-
export function lessThanEqualToSemverMatcherContext(ruleAttr: string) {
|
|
4
|
+
export function lessThanEqualToSemverMatcherContext(log: ILogger, ruleAttr: string) {
|
|
4
5
|
const ruleSemver = new Semver(ruleAttr);
|
|
5
6
|
|
|
6
7
|
return function lessThanEqualToSemverMatcher(runtimeAttr: string): boolean {
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import { ENGINE_MATCHER_STRING } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
|
|
4
|
+
export function stringMatcherContext(log: ILogger, ruleAttr: string) {
|
|
2
5
|
const regex = new RegExp(ruleAttr);
|
|
3
6
|
|
|
4
7
|
return function stringMatcher(runtimeAttr: string): boolean {
|
|
5
8
|
const regexMatches = regex.test(runtimeAttr);
|
|
6
9
|
|
|
10
|
+
log.debug(ENGINE_MATCHER_STRING, [runtimeAttr, ruleAttr, regexMatches ? 'yes' : 'no']);
|
|
11
|
+
|
|
7
12
|
return regexMatches;
|
|
8
13
|
};
|
|
9
14
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { ENGINE_MATCHER_STARTS_WITH } from '../../logger/constants';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
1
3
|
import { startsWith } from '../../utils/lang';
|
|
2
4
|
|
|
3
|
-
export function startsWithMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function startsWithMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
return function startsWithMatcher(runtimeAttr: string): boolean {
|
|
5
|
-
|
|
7
|
+
let matches = ruleAttr.some(e => startsWith(runtimeAttr, e));
|
|
8
|
+
|
|
9
|
+
log.debug(ENGINE_MATCHER_STARTS_WITH, [runtimeAttr, ruleAttr, matches]);
|
|
6
10
|
|
|
7
11
|
return matches;
|
|
8
12
|
};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { _Set } from '../../utils/lang/sets';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
import { ENGINE_MATCHER_WHITELIST } from '../../logger/constants';
|
|
2
4
|
|
|
3
|
-
export function whitelistMatcherContext(ruleAttr: string[]) {
|
|
5
|
+
export function whitelistMatcherContext(log: ILogger, ruleAttr: string[]) {
|
|
4
6
|
const whitelistSet = new _Set(ruleAttr);
|
|
5
7
|
|
|
6
8
|
return function whitelistMatcher(runtimeAttr: string): boolean {
|
|
7
9
|
const isInWhitelist = whitelistSet.has(runtimeAttr);
|
|
8
10
|
|
|
11
|
+
log.debug(ENGINE_MATCHER_WHITELIST, [runtimeAttr, ruleAttr.join(','), isInWhitelist]);
|
|
12
|
+
|
|
9
13
|
return isInWhitelist;
|
|
10
14
|
};
|
|
11
15
|
}
|
|
@@ -31,7 +31,7 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
|
|
|
31
31
|
let type = matcherTypesMapper(matcherType);
|
|
32
32
|
// As default input data type we use string (even for ALL_KEYS)
|
|
33
33
|
let dataType = matcherDataTypes.STRING;
|
|
34
|
-
let value
|
|
34
|
+
let value = undefined;
|
|
35
35
|
|
|
36
36
|
if (type === matcherTypes.IN_SEGMENT) {
|
|
37
37
|
value = segmentTransform(userDefinedSegmentMatcherData as IInSegmentMatcherData);
|
|
@@ -98,6 +98,7 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
|
|
|
98
98
|
attribute, // attribute over we should do the matching, undefined means 'use the key'
|
|
99
99
|
negate, // should we negate the result?
|
|
100
100
|
type, // which kind of matcher we should evaluate
|
|
101
|
+
name: matcherType,// name of the matcher for logging purposes
|
|
101
102
|
value, // metadata used for the matching
|
|
102
103
|
dataType // runtime input data type
|
|
103
104
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ISplitMatcher } from '../../dtos/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Extract whitelist
|
|
4
|
+
* Extract whitelist array.
|
|
5
5
|
*/
|
|
6
6
|
export function whitelistTransform(whitelistObject: ISplitMatcher['whitelistMatcherData']) {
|
|
7
7
|
return whitelistObject && whitelistObject.whitelist;
|
|
@@ -11,7 +11,7 @@ import { ISplitCondition, MaybeThenable } from '../../dtos/types';
|
|
|
11
11
|
import { IStorageAsync, IStorageSync } from '../../storages/types';
|
|
12
12
|
import { SplitIO } from '../../types';
|
|
13
13
|
import { ILogger } from '../../logger/types';
|
|
14
|
-
import { ENGINE_MATCHER_ERROR
|
|
14
|
+
import { ENGINE_MATCHER_ERROR } from '../../logger/constants';
|
|
15
15
|
|
|
16
16
|
export function parser(log: ILogger, conditions: ISplitCondition[], storage: IStorageSync | IStorageAsync): IEvaluator {
|
|
17
17
|
let predicates = [];
|
|
@@ -28,12 +28,12 @@ export function parser(log: ILogger, conditions: ISplitCondition[], storage: ISt
|
|
|
28
28
|
const matchers = matchersTransform(matcherGroup.matchers);
|
|
29
29
|
|
|
30
30
|
// create a set of pure functions from the matcher's dto
|
|
31
|
-
const expressions = matchers.map((matcherDto: IMatcherDto
|
|
31
|
+
const expressions = matchers.map((matcherDto: IMatcherDto) => {
|
|
32
32
|
let matcher: ReturnType<typeof matcherFactory>;
|
|
33
33
|
try {
|
|
34
34
|
matcher = matcherFactory(log, matcherDto, storage);
|
|
35
35
|
} catch (error) {
|
|
36
|
-
log.error(ENGINE_MATCHER_ERROR, [
|
|
36
|
+
log.error(ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
// Evaluator function.
|
|
@@ -45,19 +45,14 @@ export function parser(log: ILogger, conditions: ISplitCondition[], storage: ISt
|
|
|
45
45
|
try {
|
|
46
46
|
result = matcher(value, splitEvaluator);
|
|
47
47
|
} catch (error) {
|
|
48
|
-
|
|
49
|
-
log.error(ENGINE_MATCHER_ERROR, [matcherGroup.matchers[index].matcherType, error]);
|
|
48
|
+
log.error(ENGINE_MATCHER_ERROR, [matcherDto.name, error]);
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return thenable(result) ?
|
|
59
|
-
result.then(handleResult) :
|
|
60
|
-
handleResult(result);
|
|
52
|
+
if (thenable(result)) { // @ts-ignore
|
|
53
|
+
return result.then(res => Boolean(res ^ matcherDto.negate));
|
|
54
|
+
} // @ts-ignore
|
|
55
|
+
return Boolean(result ^ matcherDto.negate);
|
|
61
56
|
};
|
|
62
57
|
});
|
|
63
58
|
|
package/src/evaluator/types.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface IDependencyMatcherValue {
|
|
|
10
10
|
|
|
11
11
|
export interface IMatcherDto {
|
|
12
12
|
type: number
|
|
13
|
+
name: string
|
|
13
14
|
value?: string | number | boolean | string[] | IDependencyMatcherData | IBetweenMatcherData | IBetweenStringMatcherData | null
|
|
14
15
|
|
|
15
16
|
attribute: string | null
|
package/src/logger/constants.ts
CHANGED
|
@@ -9,8 +9,24 @@ export const ENGINE_COMBINER_AND = 0;
|
|
|
9
9
|
export const ENGINE_COMBINER_IFELSEIF = 1;
|
|
10
10
|
export const ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = 2;
|
|
11
11
|
export const ENGINE_BUCKET = 3;
|
|
12
|
+
export const ENGINE_MATCHER_ALL = 4;
|
|
13
|
+
export const ENGINE_MATCHER_BETWEEN = 5;
|
|
14
|
+
export const ENGINE_MATCHER_BOOLEAN = 6;
|
|
15
|
+
export const ENGINE_MATCHER_CONTAINS_ALL = 7;
|
|
16
|
+
export const ENGINE_MATCHER_CONTAINS_ANY = 8;
|
|
17
|
+
export const ENGINE_MATCHER_CONTAINS_STRING = 9;
|
|
12
18
|
export const ENGINE_MATCHER_DEPENDENCY = 10;
|
|
13
19
|
export const ENGINE_MATCHER_DEPENDENCY_PRE = 11;
|
|
20
|
+
export const ENGINE_MATCHER_EQUAL = 12;
|
|
21
|
+
export const ENGINE_MATCHER_EQUAL_TO_SET = 13;
|
|
22
|
+
export const ENGINE_MATCHER_ENDS_WITH = 14;
|
|
23
|
+
export const ENGINE_MATCHER_GREATER = 15;
|
|
24
|
+
export const ENGINE_MATCHER_LESS = 16;
|
|
25
|
+
export const ENGINE_MATCHER_PART_OF = 17;
|
|
26
|
+
export const ENGINE_MATCHER_SEGMENT = 18;
|
|
27
|
+
export const ENGINE_MATCHER_STRING = 19;
|
|
28
|
+
export const ENGINE_MATCHER_STARTS_WITH = 21;
|
|
29
|
+
export const ENGINE_MATCHER_WHITELIST = 22;
|
|
14
30
|
export const ENGINE_VALUE = 23;
|
|
15
31
|
export const ENGINE_SANITIZE = 24;
|
|
16
32
|
export const CLEANUP_REGISTERING = 25;
|
|
@@ -28,7 +44,6 @@ export const SYNC_TASK_START = 36;
|
|
|
28
44
|
export const SYNC_TASK_EXECUTE = 37;
|
|
29
45
|
export const SYNC_TASK_STOP = 38;
|
|
30
46
|
export const SETTINGS_SPLITS_FILTER = 39;
|
|
31
|
-
export const ENGINE_MATCHER_RESULT = 40;
|
|
32
47
|
|
|
33
48
|
export const CLIENT_READY_FROM_CACHE = 100;
|
|
34
49
|
export const CLIENT_READY = 101;
|
|
@@ -7,11 +7,26 @@ export const codesDebug: [number, string][] = codesInfo.concat([
|
|
|
7
7
|
[c.ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Treatment found: %s'],
|
|
8
8
|
[c.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT, c.LOG_PREFIX_ENGINE_COMBINER + 'All predicates evaluated, no treatment found.'],
|
|
9
9
|
[c.ENGINE_BUCKET, c.LOG_PREFIX_ENGINE + ': using algo "murmur" bucket %s for key %s using seed %s - treatment %s'],
|
|
10
|
-
[c.
|
|
10
|
+
[c.ENGINE_MATCHER_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[allMatcher] is always true'],
|
|
11
|
+
[c.ENGINE_MATCHER_BETWEEN, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenMatcher] is %s between %s and %s? %s'],
|
|
12
|
+
[c.ENGINE_MATCHER_BOOLEAN, c.LOG_PREFIX_ENGINE_MATCHER + '[booleanMatcher] %s === %s'],
|
|
13
|
+
[c.ENGINE_MATCHER_CONTAINS_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAllMatcher] %s contains all elements of %s? %s'],
|
|
14
|
+
[c.ENGINE_MATCHER_CONTAINS_ANY, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAnyMatcher] %s contains at least an element of %s? %s'],
|
|
15
|
+
[c.ENGINE_MATCHER_CONTAINS_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[containsStringMatcher] %s contains %s? %s'],
|
|
16
|
+
[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.'],
|
|
11
17
|
[c.ENGINE_MATCHER_DEPENDENCY_PRE, c.LOG_PREFIX_ENGINE_MATCHER + '[dependencyMatcher] will evaluate parent feature flag: "%s" with key: %s %s'],
|
|
12
|
-
[c.
|
|
13
|
-
[c.
|
|
14
|
-
[c.
|
|
18
|
+
[c.ENGINE_MATCHER_EQUAL, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToMatcher] is %s equal to %s? %s'],
|
|
19
|
+
[c.ENGINE_MATCHER_EQUAL_TO_SET, c.LOG_PREFIX_ENGINE_MATCHER + '[equalToSetMatcher] is %s equal to set %s? %s'],
|
|
20
|
+
[c.ENGINE_MATCHER_ENDS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[endsWithMatcher] %s ends with %s? %s'],
|
|
21
|
+
[c.ENGINE_MATCHER_GREATER, c.LOG_PREFIX_ENGINE_MATCHER + '[greaterThanEqualMatcher] is %s greater than %s? %s'],
|
|
22
|
+
[c.ENGINE_MATCHER_LESS, c.LOG_PREFIX_ENGINE_MATCHER + '[lessThanEqualMatcher] is %s less than %s? %s'],
|
|
23
|
+
[c.ENGINE_MATCHER_PART_OF, c.LOG_PREFIX_ENGINE_MATCHER + '[partOfMatcher] %s is part of %s? %s'],
|
|
24
|
+
[c.ENGINE_MATCHER_SEGMENT, c.LOG_PREFIX_ENGINE_MATCHER + '[segmentMatcher] evaluated %s / %s => %s'],
|
|
25
|
+
[c.ENGINE_MATCHER_STRING, c.LOG_PREFIX_ENGINE_MATCHER + '[stringMatcher] does %s matches with %s? %s'],
|
|
26
|
+
[c.ENGINE_MATCHER_STARTS_WITH, c.LOG_PREFIX_ENGINE_MATCHER + '[startsWithMatcher] %s starts with %s? %s'],
|
|
27
|
+
[c.ENGINE_MATCHER_WHITELIST, c.LOG_PREFIX_ENGINE_MATCHER + '[whitelistMatcher] evaluated %s in [%s] => %s'],
|
|
28
|
+
[c.ENGINE_VALUE, c.LOG_PREFIX_ENGINE_VALUE + 'Extracted attribute [%s], [%s] will be used for matching.'],
|
|
29
|
+
[c.ENGINE_SANITIZE, c.LOG_PREFIX_ENGINE + ':sanitize: Attempted to sanitize [%s] which should be of type [%s]. Sanitized and processed value => [%s]'],
|
|
15
30
|
// SDK
|
|
16
31
|
[c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
|
|
17
32
|
[c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
|
|
@@ -2,7 +2,7 @@ import * as c from '../constants';
|
|
|
2
2
|
|
|
3
3
|
export const codesError: [number, string][] = [
|
|
4
4
|
// evaluator
|
|
5
|
-
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported
|
|
5
|
+
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid feature flag, no valid rules or unsupported targeting rule type found'],
|
|
6
6
|
[c.ENGINE_MATCHER_ERROR, c.LOG_PREFIX_ENGINE_MATCHER + '[%s] %s'],
|
|
7
7
|
// SDK
|
|
8
8
|
[c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
|
|
@@ -4,7 +4,7 @@ import { codesError } from './error';
|
|
|
4
4
|
export const codesWarn: [number, string][] = codesError.concat([
|
|
5
5
|
// evaluator
|
|
6
6
|
[c.ENGINE_VALUE_INVALID, c.LOG_PREFIX_ENGINE_VALUE + 'Value %s doesn\'t match with expected type.'],
|
|
7
|
-
[c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute
|
|
7
|
+
[c.ENGINE_VALUE_NO_ATTRIBUTES, c.LOG_PREFIX_ENGINE_VALUE + 'Defined attribute [%s], no attributes received.'],
|
|
8
8
|
// synchronizer
|
|
9
9
|
[c.SYNC_MYSEGMENTS_FETCH_RETRY, c.LOG_PREFIX_SYNC_MYSEGMENTS + 'Retrying download of segments #%s. Reason: %s'],
|
|
10
10
|
[c.SYNC_SPLITS_FETCH_FAILS, c.LOG_PREFIX_SYNC_SPLITS + 'Error while doing fetch of feature flags. %s'],
|
package/src/services/splitApi.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { splitHttpClientFactory } from './splitHttpClient';
|
|
|
4
4
|
import { ISplitApi } from './types';
|
|
5
5
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
6
6
|
import { ITelemetryTracker } from '../trackers/types';
|
|
7
|
-
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
|
|
7
|
+
import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT, FLAGS_SPEC } from '../utils/constants';
|
|
8
8
|
import { ERROR_TOO_MANY_SETS } from '../logger/constants';
|
|
9
9
|
|
|
10
10
|
const noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
|
|
@@ -44,17 +44,16 @@ export function splitApiFactory(
|
|
|
44
44
|
},
|
|
45
45
|
|
|
46
46
|
fetchAuth(userMatchingKeys?: string[]) {
|
|
47
|
-
let url = `${urls.auth}/v2/auth`;
|
|
48
|
-
if (userMatchingKeys) { //
|
|
47
|
+
let url = `${urls.auth}/v2/auth?s=${FLAGS_SPEC}`;
|
|
48
|
+
if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side
|
|
49
49
|
const queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&');
|
|
50
|
-
if (queryParams)
|
|
51
|
-
url += '?' + queryParams;
|
|
50
|
+
if (queryParams) url += '&' + queryParams;
|
|
52
51
|
}
|
|
53
52
|
return splitHttpClient(url, undefined, telemetryTracker.trackHttp(TOKEN));
|
|
54
53
|
},
|
|
55
54
|
|
|
56
55
|
fetchSplitChanges(since: number, noCache?: boolean, till?: number) {
|
|
57
|
-
const url = `${urls.sdk}/splitChanges?since=${since}${till ? '&till=' + till : ''}${filterQueryString || ''}`;
|
|
56
|
+
const url = `${urls.sdk}/splitChanges?s=${FLAGS_SPEC}&since=${since}${till ? '&till=' + till : ''}${filterQueryString || ''}`;
|
|
58
57
|
return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SPLITS))
|
|
59
58
|
.catch((err) => {
|
|
60
59
|
if (err.statusCode === 414) settings.log.error(ERROR_TOO_MANY_SETS);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ISettings } from '../types';
|
|
2
|
+
import { FLAGS_SPEC } from '../utils/constants';
|
|
2
3
|
import { startsWith } from '../utils/lang';
|
|
3
4
|
import { hash } from '../utils/murmur3/murmur3';
|
|
4
5
|
|
|
@@ -81,9 +82,9 @@ export class KeyBuilder {
|
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
/**
|
|
84
|
-
* Generates a murmur32 hash based on the authorization key
|
|
85
|
+
* Generates a murmur32 hash based on the authorization key, the feature flags filter query, and version of SplitChanges API.
|
|
85
86
|
* The hash is in hexadecimal format (8 characters max, 32 bits).
|
|
86
87
|
*/
|
|
87
88
|
export function getStorageHash(settings: ISettings) {
|
|
88
|
-
return hash(`${settings.core.authorizationKey}::${settings.sync.__splitFiltersValidation.queryString}`).toString(16);
|
|
89
|
+
return hash(`${settings.core.authorizationKey}::${settings.sync.__splitFiltersValidation.queryString}::${FLAGS_SPEC}`).toString(16);
|
|
89
90
|
}
|
|
@@ -146,7 +146,7 @@ export class SplitsCacheInLocal extends AbstractSplitsCacheSync {
|
|
|
146
146
|
|
|
147
147
|
// when using a new split query, we must update it at the store
|
|
148
148
|
if (this.updateNewFilter) {
|
|
149
|
-
this.log.info(LOG_PREFIX + 'SDK key or
|
|
149
|
+
this.log.info(LOG_PREFIX + 'SDK key, flags filter criteria or flags spec version was modified. Updating cache');
|
|
150
150
|
const storageHashKey = this.keys.buildHashKey();
|
|
151
151
|
try {
|
|
152
152
|
localStorage.setItem(storageHashKey, this.storageHash);
|
|
@@ -96,7 +96,7 @@ export function PluggableStorage(options: PluggableStorageOptions): IStorageAsyn
|
|
|
96
96
|
return wrapper.get(keys.buildHashKey()).then((hash) => {
|
|
97
97
|
const currentHash = getStorageHash(settings);
|
|
98
98
|
if (hash !== currentHash) {
|
|
99
|
-
log.info(LOG_PREFIX + 'Storage HASH has changed (SDK key or
|
|
99
|
+
log.info(LOG_PREFIX + 'Storage HASH has changed (SDK key, flags filter criteria or flags spec version was modified). Clearing cache');
|
|
100
100
|
return wrapper.getKeysByPrefix(`${keys.prefix}.`).then(storageKeys => {
|
|
101
101
|
return Promise.all(storageKeys.map(storageKey => wrapper.del(storageKey)));
|
|
102
102
|
}).then(() => wrapper.set(keys.buildHashKey(), currentHash));
|
|
@@ -5,4 +5,4 @@ export const SDK_NOT_READY = 'not ready';
|
|
|
5
5
|
export const EXCEPTION = 'exception';
|
|
6
6
|
export const SPLIT_ARCHIVED = 'archived';
|
|
7
7
|
export const NOT_IN_SPLIT = 'not in split';
|
|
8
|
-
export const UNSUPPORTED_MATCHER_TYPE = 'unsupported
|
|
8
|
+
export const UNSUPPORTED_MATCHER_TYPE = 'targeting rule type unsupported by sdk';
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
2
|
+
export declare function allMatcherContext(log: ILogger): (runtimeAttr: string) => boolean;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { IBetweenMatcherData } from '../../dtos/types';
|
|
2
|
-
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
export declare function betweenMatcherContext(log: ILogger, ruleVO: IBetweenMatcherData): (runtimeAttr: number) => boolean;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
2
|
+
export declare function booleanMatcherContext(log: ILogger, ruleAttr: boolean): (runtimeAttr: boolean) => boolean;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
2
|
+
export declare function containsAllSetMatcherContext(log: ILogger, ruleAttr: string[]): (runtimeAttr: string[]) => boolean;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
2
|
+
export declare function containsAnySetMatcherContext(log: ILogger, ruleAttr: string[]): (runtimeAttr: string[]) => boolean;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger } from '../../logger/types';
|
|
2
|
+
export declare function containsStringMatcherContext(log: ILogger, ruleAttr: string[]): (runtimeAttr: string) => boolean;
|