Skip to content

Commit ba89b3b

Browse files
authored
Merge pull request #270 from splitio/development
Prepare release v1.11.0
2 parents 54e1d51 + 50cd611 commit ba89b3b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1312
-129
lines changed

CHANGES.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
1.11.0 (November 3, 2023)
2+
- Added support for Flag Sets on the SDK, which enables grouping feature flags and interacting with the group rather than individually (more details in our documentation):
3+
- Added new variations of the get treatment methods to support evaluating flags in given flag set/s.
4+
- getTreatmentsByFlagSet and getTreatmentsByFlagSets
5+
- getTreatmentsWithConfigByFlagSets and getTreatmentsWithConfigByFlagSets
6+
- Added a new optional Split Filter configuration option. This allows the SDK and Split services to only synchronize the flags in the specified flag sets, avoiding unused or unwanted flags from being synced on the SDK instance, bringing all the benefits from a reduced payload.
7+
- Note: Only applicable when the SDK is in charge of the rollout data synchronization. When not applicable, the SDK will log a warning on init.
8+
- Added `sets` property to the `SplitView` object returned by the `split` and `splits` methods of the SDK manager to expose flag sets on flag views.
9+
- Bugfixing - Fixed SDK key validation in NodeJS to ensure the SDK_READY_TIMED_OUT event is emitted when a client-side type SDK key is provided instead of a server-side one (Related to issue https://github.com/splitio/javascript-client/issues/768).
10+
111
1.10.0 (October 20, 2023)
212
- Added `defaultTreatment` property to the `SplitView` object returned by the `split` and `splits` methods of the SDK manager (Related to issue https://github.com/splitio/javascript-commons/issues/225).
313
- Updated log warning message to include the feature flag name when `getTreatment` method is called and the SDK client is not ready.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@splitsoftware/splitio-commons",
3-
"version": "1.10.0",
3+
"version": "1.11.0",
44
"description": "Split Javascript SDK common components",
55
"main": "cjs/index.js",
66
"module": "esm/index.js",

src/__tests__/mocks/fetchSpecificSplits.ts

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ const valuesExamples = [
1010
['p0', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8', 'p9', 'p10', 'p11', 'p12', 'p13', 'p14', 'p15', 'p16', 'p17', 'p18', 'p19', 'p20', 'p21', 'p22', 'p23', 'p24', 'p25', 'p26', 'p27', 'p28', 'p29', 'p30', 'p31', 'p32', 'p33', 'p34', 'p35', 'p36', 'p37', 'p38', 'p39', 'p40', 'p41', 'p42', 'p43', 'p44', 'p45', 'p46', 'p47', 'p48', 'p49', 'p50'],
1111
['__ш', '__a', '%', '%25', ' __ш ', '% '], // to test that we order before encoding: '__a' < '__ш' but encodeURIComponent('__a') > encodeURIComponent('__ш')
1212
['%', '%25', '__a', '__ш'], // [7] ordered and deduplicated
13+
// flagSets examples
14+
[' set_1','set_3 ',' set_a ','set_2','set_c','set_b'], // [9] trim
15+
['set_1','set_2','set_3','set_a','set_b','set_c'], // [10] sanitized [9]
16+
['set_ 1','set _3','3set_a','_set_2','seT_c','set_B','set_1234567890_1234567890_234567890_1234567890_1234567890','set_a','set_2'], // [11] lowercase & regexp
17+
['3set_a','set_2','set_a','set_b','set_c'], // [12] sanitized [11]
18+
['set_2','set_a','SET_2','set_a','set_b','set_B','set_1','set_3!'], // [13] dedupe, dedupe with case sensitive
19+
['set_1','set_2','set_a','set_b'], // [14] sanitized [13]
1320
];
1421

1522
export const splitFilters: SplitIO.SplitFilter[][] = [
@@ -41,39 +48,79 @@ export const splitFilters: SplitIO.SplitFilter[][] = [
4148
],
4249
[
4350
{ type: 'byName', values: valuesExamples[7] }
44-
]
51+
],
52+
// FlagSet filters
53+
[ // [6]
54+
{ type: 'byPrefix', values: valuesExamples[1] },
55+
{ type: 'bySet', values: valuesExamples[9] },
56+
{ type: 'byName', values: valuesExamples[1] }
57+
],
58+
[ // [7]
59+
{ type: 'bySet', values: valuesExamples[11] },
60+
{ type: 'byPrefix', values: [] },
61+
{ type: 'byName', values: valuesExamples[6] }
62+
],
63+
[ // [8]
64+
{ type: 'byPrefix', values: [] },
65+
{ type: 'byName', values: valuesExamples[6] },
66+
{ type: 'bySet', values: valuesExamples[13] }
67+
],
4568
];
4669

4770
// each entry corresponds to the queryString or exception message of each splitFilters entry
4871
export const queryStrings = [
49-
'&names=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc',
50-
'&prefixes=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc',
51-
'&names=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc&prefixes=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc',
52-
"400 unique values can be specified at most for 'byName' filter. You passed 401. Please consider reducing the amount or using other filter.",
53-
"50 unique values can be specified at most for 'byPrefix' filter. You passed 51. Please consider reducing the amount or using other filter.",
54-
'&names=%25,%2525,__a,__%D1%88',
72+
'&names=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc', // [0]
73+
'&prefixes=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc', // [1]
74+
'&names=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc&prefixes=abc%C8%A3,abc%C8%A3asd,ausgef%C3%BCllt,%C8%A3abc', // [2]
75+
"400 unique values can be specified at most for 'byName' filter. You passed 401. Please consider reducing the amount or using other filter.", // [3]
76+
"50 unique values can be specified at most for 'byPrefix' filter. You passed 51. Please consider reducing the amount or using other filter.", // [4]
77+
'&names=%25,%2525,__a,__%D1%88', // [5]
78+
// FlagSet filters
79+
'&sets=set_1,set_2,set_3,set_a,set_b,set_c', // [6]
80+
'&sets=3set_a,set_2,set_a,set_b,set_c', // [7]
81+
'&sets=set_1,set_2,set_a,set_b', // [8]
5582
];
5683

5784
// each entry corresponds to a `groupedFilter` object returned by `validateSplitFilter` for each `splitFilters` input.
5885
// `groupedFilter` contains valid, unique and ordered values per filter type.
5986
// An `undefined` value means that `validateSplitFilter` throws an exception which message value is at `queryStrings`.
6087
export const groupedFilters = [
61-
{
88+
{ // [0]
89+
bySet: [],
6290
byName: valuesExamples[2],
6391
byPrefix: []
6492
},
65-
{
93+
{ // [1]
94+
bySet: [],
6695
byName: [],
6796
byPrefix: valuesExamples[2]
6897
},
69-
{
98+
{ // [2]
99+
bySet: [],
70100
byName: valuesExamples[2],
71101
byPrefix: valuesExamples[2]
72102
},
73-
undefined,
74-
undefined,
75-
{
103+
undefined, // [3]
104+
undefined, // [4]
105+
{ // [5]
106+
bySet: [],
76107
byName: valuesExamples[8],
77108
byPrefix: []
78-
}
109+
},
110+
// FlagSet filters
111+
{ // [6]
112+
byName: [],
113+
bySet: valuesExamples[10],
114+
byPrefix: []
115+
},
116+
{ // [7]
117+
byName: [],
118+
bySet: valuesExamples[12],
119+
byPrefix: []
120+
},
121+
{ // [8]
122+
byName: [],
123+
bySet: valuesExamples[14],
124+
byPrefix: []
125+
},
79126
];

src/dtos/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ export interface ISplit {
163163
trafficAllocationSeed?: number
164164
configurations?: {
165165
[treatmentName: string]: string
166-
}
166+
},
167+
sets?: string[]
167168
}
168169

169170
// Split definition used in offline mode
@@ -208,5 +209,5 @@ export interface IMetadata {
208209
export type ISplitFiltersValidation = {
209210
queryString: string | null,
210211
groupedFilters: Record<SplitIO.SplitFilterType, string[]>,
211-
validFilters: SplitIO.SplitFilter[]
212+
validFilters: SplitIO.SplitFilter[],
212213
};

src/evaluator/__tests__/evaluate-features.spec.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// @ts-nocheck
2-
import { evaluateFeatures } from '../index';
2+
import { evaluateFeatures, evaluateFeaturesByFlagSets } from '../index';
33
import * as LabelsConstants from '../../utils/labels';
44
import { loggerMock } from '../../logger/__tests__/sdkLogger.mock';
5+
import { _Set } from '../../utils/lang/sets';
6+
import { returnSetsUnion } from '../../utils/lang/sets';
57

68
const splitsMock = {
79
regular: { 'changeNumber': 1487277320548, 'trafficAllocationSeed': 1667452163, 'trafficAllocation': 100, 'trafficTypeName': 'user', 'name': 'always-on', 'seed': 1684183541, 'configurations': {}, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'off', 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': '' }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': { 'segmentName': '' }, 'unaryNumericMatcherData': { 'dataType': '', 'value': 0 }, 'whitelistMatcherData': { 'whitelist': null }, 'betweenMatcherData': { 'dataType': '', 'start': 0, 'end': 0 } }] }, 'partitions': [{ 'treatment': 'on', 'size': 100 }, { 'treatment': 'off', 'size': 0 }], 'label': 'in segment all' }] },
@@ -14,6 +16,11 @@ const splitsMock = {
1416
trafficAlocation1WithConfig: { 'changeNumber': 1487277320548, 'trafficAllocationSeed': -1667452163, 'trafficAllocation': 1, 'trafficTypeName': 'user', 'name': 'always-on6', 'seed': 1684183541, 'configurations': { 'off': "{color:'black'}" }, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'off', 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': '' }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': { 'segmentName': '' }, 'unaryNumericMatcherData': { 'dataType': '', 'value': 0 }, 'whitelistMatcherData': { 'whitelist': null }, 'betweenMatcherData': { 'dataType': '', 'start': 0, 'end': 0 } }] }, 'partitions': [{ 'treatment': 'on', 'size': 100 }, { 'treatment': 'off', 'size': 0 }], 'label': 'in segment all' }] }
1517
};
1618

19+
const flagSetsMock = {
20+
reg_and_config: new _Set(['regular', 'config']),
21+
arch_and_killed: new _Set(['killed', 'archived']),
22+
};
23+
1724
const mockStorage = {
1825
splits: {
1926
getSplit(name) {
@@ -29,6 +36,16 @@ const mockStorage = {
2936
});
3037

3138
return splits;
39+
},
40+
getNamesByFlagSets(flagSets) {
41+
let toReturn = new _Set([]);
42+
flagSets.forEach(flagset => {
43+
const featureFlagNames = flagSetsMock[flagset];
44+
if (featureFlagNames) {
45+
toReturn = returnSetsUnion(toReturn, featureFlagNames);
46+
}
47+
});
48+
return toReturn;
3249
}
3350
}
3451
};
@@ -105,3 +122,57 @@ test('EVALUATOR - Multiple evaluations at once / should return right labels, tre
105122
// If the split is retrieved but is not in split (out of Traffic Allocation), we should get the right evaluation result, label and config.
106123

107124
});
125+
126+
test('EVALUATOR - Multiple evaluations at once by flag sets / should return right labels, treatments and configs if storage returns without errors.', async function () {
127+
128+
const expectedOutput = {
129+
config: {
130+
treatment: 'on', label: 'in segment all',
131+
config: '{color:\'black\'}', changeNumber: 1487277320548
132+
},
133+
not_existent_split: {
134+
treatment: 'control', label: LabelsConstants.SPLIT_NOT_FOUND, config: null
135+
},
136+
};
137+
138+
const getResultsByFlagsets = (flagSets: string[]) => {
139+
return evaluateFeaturesByFlagSets(
140+
loggerMock,
141+
'fake-key',
142+
flagSets,
143+
null,
144+
mockStorage,
145+
);
146+
};
147+
148+
149+
150+
let multipleEvaluationAtOnceByFlagSets = await getResultsByFlagsets(['reg_and_config', 'arch_and_killed']);
151+
152+
// assert evaluationWithConfig
153+
expect(multipleEvaluationAtOnceByFlagSets['config']).toEqual(expectedOutput['config']); // If the split is retrieved successfully we should get the right evaluation result, label and config.
154+
// @todo assert flag set not found - for input validations
155+
156+
// assert regular
157+
expect(multipleEvaluationAtOnceByFlagSets['regular']).toEqual({ ...expectedOutput['config'], config: null }); // If the split is retrieved successfully we should get the right evaluation result, label and config. If Split has no config it should have config equal null.
158+
// assert killed
159+
expect(multipleEvaluationAtOnceByFlagSets['killed']).toEqual({ ...expectedOutput['config'], treatment: 'off', config: null, label: LabelsConstants.SPLIT_KILLED });
160+
// 'If the split is retrieved but is killed, we should get the right evaluation result, label and config.
161+
162+
// assert archived
163+
expect(multipleEvaluationAtOnceByFlagSets['archived']).toEqual({ ...expectedOutput['config'], treatment: 'control', label: LabelsConstants.SPLIT_ARCHIVED, config: null });
164+
// If the split is retrieved but is archived, we should get the right evaluation result, label and config.
165+
166+
// assert not_existent_split not in evaluation if it is not related to defined flag sets
167+
expect(multipleEvaluationAtOnceByFlagSets['not_existent_split']).toEqual(undefined);
168+
169+
multipleEvaluationAtOnceByFlagSets = await getResultsByFlagsets([]);
170+
expect(multipleEvaluationAtOnceByFlagSets).toEqual({});
171+
172+
multipleEvaluationAtOnceByFlagSets = await getResultsByFlagsets(['reg_and_config']);
173+
expect(multipleEvaluationAtOnceByFlagSets['config']).toEqual(expectedOutput['config']);
174+
expect(multipleEvaluationAtOnceByFlagSets['regular']).toEqual({ ...expectedOutput['config'], config: null });
175+
expect(multipleEvaluationAtOnceByFlagSets['killed']).toEqual(undefined);
176+
expect(multipleEvaluationAtOnceByFlagSets['archived']).toEqual(undefined);
177+
178+
});

src/evaluator/index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { IStorageAsync, IStorageSync } from '../storages/types';
77
import { IEvaluationResult } from './types';
88
import { SplitIO } from '../types';
99
import { ILogger } from '../logger/types';
10+
import { ISet, setToArray } from '../utils/lang/sets';
1011

1112
const treatmentException = {
1213
treatment: CONTROL,
@@ -87,6 +88,32 @@ export function evaluateFeatures(
8788
getEvaluations(log, splitNames, parsedSplits, key, attributes, storage);
8889
}
8990

91+
export function evaluateFeaturesByFlagSets(
92+
log: ILogger,
93+
key: SplitIO.SplitKey,
94+
flagSets: string[],
95+
attributes: SplitIO.Attributes | undefined,
96+
storage: IStorageSync | IStorageAsync,
97+
): MaybeThenable<Record<string, IEvaluationResult>> {
98+
let storedFlagNames: MaybeThenable<ISet<string>>;
99+
100+
// get features by flag sets
101+
try {
102+
storedFlagNames = storage.splits.getNamesByFlagSets(flagSets);
103+
} catch (e) {
104+
// return empty evaluations
105+
return {};
106+
}
107+
108+
// evaluate related features
109+
return thenable(storedFlagNames) ?
110+
storedFlagNames.then((splitNames) => evaluateFeatures(log, key, setToArray(splitNames), attributes, storage))
111+
.catch(() => {
112+
return {};
113+
}) :
114+
evaluateFeatures(log, key, setToArray(storedFlagNames), attributes, storage);
115+
}
116+
90117
function getEvaluation(
91118
log: ILogger,
92119
splitJSON: ISplit | null,

src/evaluator/matchers/__tests__/dependency.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { IStorageSync } from '../../../storages/types';
66
import { loggerMock } from '../../../logger/__tests__/sdkLogger.mock';
77
import { ISplit } from '../../../dtos/types';
88

9-
const ALWAYS_ON_SPLIT = { 'trafficTypeName': 'user', 'name': 'always-on', 'trafficAllocation': 100, 'trafficAllocationSeed': 1012950810, 'seed': -725161385, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'off', 'changeNumber': 1494364996459, 'algo': 2, 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': null }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': null, 'whitelistMatcherData': null, 'unaryNumericMatcherData': null, 'betweenMatcherData': null }] }, 'partitions': [{ 'treatment': 'on', 'size': 100 }, { 'treatment': 'off', 'size': 0 }], 'label': 'in segment all' }] } as ISplit;
10-
const ALWAYS_OFF_SPLIT = { 'trafficTypeName': 'user', 'name': 'always-off', 'trafficAllocation': 100, 'trafficAllocationSeed': -331690370, 'seed': 403891040, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'on', 'changeNumber': 1494365020316, 'algo': 2, 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': null }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': null, 'whitelistMatcherData': null, 'unaryNumericMatcherData': null, 'betweenMatcherData': null }] }, 'partitions': [{ 'treatment': 'on', 'size': 0 }, { 'treatment': 'off', 'size': 100 }], 'label': 'in segment all' }] } as ISplit;
9+
const ALWAYS_ON_SPLIT = { 'trafficTypeName': 'user', 'name': 'always-on', 'trafficAllocation': 100, 'trafficAllocationSeed': 1012950810, 'seed': -725161385, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'off', 'changeNumber': 1494364996459, 'algo': 2, 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': null }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': null, 'whitelistMatcherData': null, 'unaryNumericMatcherData': null, 'betweenMatcherData': null }] }, 'partitions': [{ 'treatment': 'on', 'size': 100 }, { 'treatment': 'off', 'size': 0 }], 'label': 'in segment all' }], 'sets':[] } as ISplit;
10+
const ALWAYS_OFF_SPLIT = { 'trafficTypeName': 'user', 'name': 'always-off', 'trafficAllocation': 100, 'trafficAllocationSeed': -331690370, 'seed': 403891040, 'status': 'ACTIVE', 'killed': false, 'defaultTreatment': 'on', 'changeNumber': 1494365020316, 'algo': 2, 'conditions': [{ 'conditionType': 'ROLLOUT', 'matcherGroup': { 'combiner': 'AND', 'matchers': [{ 'keySelector': { 'trafficType': 'user', 'attribute': null }, 'matcherType': 'ALL_KEYS', 'negate': false, 'userDefinedSegmentMatcherData': null, 'whitelistMatcherData': null, 'unaryNumericMatcherData': null, 'betweenMatcherData': null }] }, 'partitions': [{ 'treatment': 'on', 'size': 0 }, { 'treatment': 'off', 'size': 100 }], 'label': 'in segment all' }], 'sets':[] } as ISplit;
1111

1212
const STORED_SPLITS: Record<string, ISplit> = {
1313
'always-on': ALWAYS_ON_SPLIT,

src/logger/constants.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,14 @@ export const WARN_NOT_EXISTENT_SPLIT = 215;
9191
export const WARN_LOWERCASE_TRAFFIC_TYPE = 216;
9292
export const WARN_NOT_EXISTENT_TT = 217;
9393
export const WARN_INTEGRATION_INVALID = 218;
94-
export const WARN_SPLITS_FILTER_IGNORED = 219;
9594
export const WARN_SPLITS_FILTER_INVALID = 220;
9695
export const WARN_SPLITS_FILTER_EMPTY = 221;
9796
export const WARN_SDK_KEY = 222;
9897
export const STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 223;
9998
export const STREAMING_PARSING_SPLIT_UPDATE = 224;
99+
export const WARN_SPLITS_FILTER_INVALID_SET = 225;
100+
export const WARN_SPLITS_FILTER_LOWERCASE_SET = 226;
101+
export const WARN_FLAGSET_NOT_CONFIGURED = 227;
100102

101103
export const ERROR_ENGINE_COMBINER_IFELSEIF = 300;
102104
export const ERROR_LOGLEVEL_INVALID = 301;
@@ -125,6 +127,8 @@ export const ERROR_LOCALHOST_MODULE_REQUIRED = 323;
125127
export const ERROR_STORAGE_INVALID = 324;
126128
export const ERROR_NOT_BOOLEAN = 325;
127129
export const ERROR_MIN_CONFIG_PARAM = 326;
130+
export const ERROR_TOO_MANY_SETS = 327;
131+
export const ERROR_SETS_FILTER_EXCLUSIVE = 328;
128132

129133
// Log prefixes (a.k.a. tags or categories)
130134
export const LOG_PREFIX_SETTINGS = 'settings';

src/logger/messages/error.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ export const codesError: [number, string][] = [
3434
[c.ERROR_LOCALHOST_MODULE_REQUIRED, c.LOG_PREFIX_SETTINGS + ': an invalid value was received for "sync.localhostMode" config. A valid entity should be provided for localhost mode.'],
3535
[c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS+': the provided storage is invalid.%s Falling back into default MEMORY storage'],
3636
[c.ERROR_MIN_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': the provided "%s" config param is lower than allowed. Setting to the minimum value %s seconds'],
37+
[c.ERROR_TOO_MANY_SETS, c.LOG_PREFIX_SETTINGS + ': the amount of flag sets provided are big causing uri length error.'],
38+
[c.ERROR_SETS_FILTER_EXCLUSIVE, c.LOG_PREFIX_SETTINGS+': the Set filter is exclusive and cannot be used simultaneously with names or prefix filters. Ignoring names and prefixes.'],
3739
];

0 commit comments

Comments
 (0)