@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.
Files changed (180) hide show
  1. package/CHANGES.txt +4 -3
  2. package/cjs/evaluator/Engine.js +5 -6
  3. package/cjs/evaluator/combiners/ifelseif.js +3 -4
  4. package/cjs/evaluator/condition/index.js +2 -3
  5. package/cjs/evaluator/index.js +4 -5
  6. package/cjs/evaluator/matchers/all.js +1 -3
  7. package/cjs/evaluator/matchers/between.js +1 -3
  8. package/cjs/evaluator/matchers/boolean.js +1 -3
  9. package/cjs/evaluator/matchers/cont_all.js +1 -3
  10. package/cjs/evaluator/matchers/cont_any.js +1 -3
  11. package/cjs/evaluator/matchers/cont_str.js +1 -3
  12. package/cjs/evaluator/matchers/dependency.js +1 -1
  13. package/cjs/evaluator/matchers/eq.js +1 -3
  14. package/cjs/evaluator/matchers/eq_set.js +1 -3
  15. package/cjs/evaluator/matchers/ew.js +1 -3
  16. package/cjs/evaluator/matchers/gte.js +3 -5
  17. package/cjs/evaluator/matchers/index.js +12 -2
  18. package/cjs/evaluator/matchers/lte.js +3 -5
  19. package/cjs/evaluator/matchers/matcherTypes.js +6 -1
  20. package/cjs/evaluator/matchers/part_of.js +1 -3
  21. package/cjs/evaluator/matchers/segment.js +1 -6
  22. package/cjs/evaluator/matchers/semver_between.js +14 -0
  23. package/cjs/evaluator/matchers/semver_eq.js +13 -0
  24. package/cjs/evaluator/matchers/semver_gte.js +13 -0
  25. package/cjs/evaluator/matchers/semver_inlist.js +17 -0
  26. package/cjs/evaluator/matchers/semver_lte.js +13 -0
  27. package/cjs/evaluator/matchers/string.js +3 -12
  28. package/cjs/evaluator/matchers/sw.js +1 -3
  29. package/cjs/evaluator/matchers/whitelist.js +3 -4
  30. package/cjs/evaluator/matchersTransform/index.js +21 -16
  31. package/cjs/evaluator/matchersTransform/whitelist.js +2 -3
  32. package/cjs/evaluator/parser/index.js +24 -9
  33. package/cjs/logger/constants.js +5 -20
  34. package/cjs/logger/index.js +8 -1
  35. package/cjs/logger/messages/debug.js +5 -21
  36. package/cjs/logger/messages/error.js +2 -1
  37. package/cjs/logger/messages/warn.js +1 -1
  38. package/cjs/sdkClient/sdkClient.js +1 -6
  39. package/cjs/services/splitApi.js +5 -5
  40. package/cjs/storages/KeyBuilder.js +2 -1
  41. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  42. package/cjs/storages/pluggable/index.js +1 -1
  43. package/cjs/utils/Semver.js +103 -0
  44. package/cjs/utils/constants/index.js +2 -1
  45. package/cjs/utils/labels/index.js +1 -1
  46. package/cjs/utils/settingsValidation/index.js +1 -1
  47. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  48. package/esm/evaluator/Engine.js +5 -5
  49. package/esm/evaluator/combiners/ifelseif.js +3 -3
  50. package/esm/evaluator/condition/index.js +2 -2
  51. package/esm/evaluator/index.js +4 -4
  52. package/esm/evaluator/matchers/all.js +1 -3
  53. package/esm/evaluator/matchers/between.js +1 -3
  54. package/esm/evaluator/matchers/boolean.js +1 -3
  55. package/esm/evaluator/matchers/cont_all.js +1 -3
  56. package/esm/evaluator/matchers/cont_any.js +1 -3
  57. package/esm/evaluator/matchers/cont_str.js +1 -3
  58. package/esm/evaluator/matchers/dependency.js +1 -1
  59. package/esm/evaluator/matchers/eq.js +1 -3
  60. package/esm/evaluator/matchers/eq_set.js +1 -3
  61. package/esm/evaluator/matchers/ew.js +1 -3
  62. package/esm/evaluator/matchers/gte.js +3 -5
  63. package/esm/evaluator/matchers/index.js +12 -2
  64. package/esm/evaluator/matchers/lte.js +3 -5
  65. package/esm/evaluator/matchers/matcherTypes.js +6 -1
  66. package/esm/evaluator/matchers/part_of.js +1 -3
  67. package/esm/evaluator/matchers/segment.js +1 -6
  68. package/esm/evaluator/matchers/semver_between.js +10 -0
  69. package/esm/evaluator/matchers/semver_eq.js +9 -0
  70. package/esm/evaluator/matchers/semver_gte.js +9 -0
  71. package/esm/evaluator/matchers/semver_inlist.js +13 -0
  72. package/esm/evaluator/matchers/semver_lte.js +9 -0
  73. package/esm/evaluator/matchers/string.js +3 -12
  74. package/esm/evaluator/matchers/sw.js +1 -3
  75. package/esm/evaluator/matchers/whitelist.js +4 -5
  76. package/esm/evaluator/matchersTransform/index.js +21 -16
  77. package/esm/evaluator/matchersTransform/whitelist.js +2 -3
  78. package/esm/evaluator/parser/index.js +24 -9
  79. package/esm/logger/constants.js +2 -17
  80. package/esm/logger/index.js +9 -2
  81. package/esm/logger/messages/debug.js +5 -21
  82. package/esm/logger/messages/error.js +2 -1
  83. package/esm/logger/messages/warn.js +1 -1
  84. package/esm/sdkClient/sdkClient.js +1 -6
  85. package/esm/services/splitApi.js +6 -6
  86. package/esm/storages/KeyBuilder.js +2 -1
  87. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +1 -1
  88. package/esm/storages/pluggable/index.js +1 -1
  89. package/esm/utils/Semver.js +100 -0
  90. package/esm/utils/constants/index.js +1 -0
  91. package/esm/utils/labels/index.js +1 -1
  92. package/esm/utils/settingsValidation/index.js +1 -1
  93. package/esm/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  94. package/package.json +1 -2
  95. package/src/dtos/types.ts +34 -1
  96. package/src/evaluator/Engine.ts +5 -6
  97. package/src/evaluator/combiners/ifelseif.ts +3 -3
  98. package/src/evaluator/condition/index.ts +2 -2
  99. package/src/evaluator/index.ts +4 -4
  100. package/src/evaluator/matchers/all.ts +1 -5
  101. package/src/evaluator/matchers/between.ts +3 -7
  102. package/src/evaluator/matchers/boolean.ts +2 -6
  103. package/src/evaluator/matchers/cont_all.ts +1 -5
  104. package/src/evaluator/matchers/cont_any.ts +1 -5
  105. package/src/evaluator/matchers/cont_str.ts +2 -6
  106. package/src/evaluator/matchers/dependency.ts +1 -1
  107. package/src/evaluator/matchers/eq.ts +2 -6
  108. package/src/evaluator/matchers/eq_set.ts +1 -5
  109. package/src/evaluator/matchers/ew.ts +2 -6
  110. package/src/evaluator/matchers/gte.ts +3 -7
  111. package/src/evaluator/matchers/index.ts +29 -19
  112. package/src/evaluator/matchers/lte.ts +3 -7
  113. package/src/evaluator/matchers/matcherTypes.ts +6 -1
  114. package/src/evaluator/matchers/part_of.ts +1 -5
  115. package/src/evaluator/matchers/segment.ts +1 -8
  116. package/src/evaluator/matchers/semver_between.ts +15 -0
  117. package/src/evaluator/matchers/semver_eq.ts +13 -0
  118. package/src/evaluator/matchers/semver_gte.ts +13 -0
  119. package/src/evaluator/matchers/semver_inlist.ts +17 -0
  120. package/src/evaluator/matchers/semver_lte.ts +13 -0
  121. package/src/evaluator/matchers/string.ts +3 -16
  122. package/src/evaluator/matchers/sw.ts +2 -6
  123. package/src/evaluator/matchers/whitelist.ts +5 -7
  124. package/src/evaluator/matchersTransform/index.ts +31 -23
  125. package/src/evaluator/matchersTransform/whitelist.ts +4 -5
  126. package/src/evaluator/parser/index.ts +25 -10
  127. package/src/evaluator/types.ts +3 -3
  128. package/src/logger/constants.ts +2 -17
  129. package/src/logger/index.ts +8 -2
  130. package/src/logger/messages/debug.ts +5 -21
  131. package/src/logger/messages/error.ts +2 -1
  132. package/src/logger/messages/warn.ts +1 -1
  133. package/src/sdkClient/sdkClient.ts +1 -8
  134. package/src/services/splitApi.ts +5 -6
  135. package/src/storages/KeyBuilder.ts +2 -1
  136. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +1 -1
  137. package/src/storages/pluggable/index.ts +1 -1
  138. package/src/types.ts +3 -3
  139. package/src/utils/Semver.ts +111 -0
  140. package/src/utils/constants/index.ts +2 -0
  141. package/src/utils/labels/index.ts +1 -1
  142. package/src/utils/settingsValidation/index.ts +1 -1
  143. package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -1
  144. package/types/dtos/types.d.ts +26 -1
  145. package/types/evaluator/matchers/all.d.ts +1 -2
  146. package/types/evaluator/matchers/between.d.ts +1 -2
  147. package/types/evaluator/matchers/boolean.d.ts +1 -2
  148. package/types/evaluator/matchers/cont_all.d.ts +1 -2
  149. package/types/evaluator/matchers/cont_any.d.ts +1 -2
  150. package/types/evaluator/matchers/cont_str.d.ts +1 -2
  151. package/types/evaluator/matchers/dependency.d.ts +1 -1
  152. package/types/evaluator/matchers/eq.d.ts +1 -2
  153. package/types/evaluator/matchers/eq_set.d.ts +1 -2
  154. package/types/evaluator/matchers/ew.d.ts +1 -2
  155. package/types/evaluator/matchers/gte.d.ts +1 -2
  156. package/types/evaluator/matchers/lte.d.ts +1 -2
  157. package/types/evaluator/matchers/part_of.d.ts +1 -2
  158. package/types/evaluator/matchers/segment.d.ts +1 -2
  159. package/types/evaluator/matchers/sember_inlist.d.ts +3 -0
  160. package/types/evaluator/matchers/semver_between.d.ts +2 -0
  161. package/types/evaluator/matchers/semver_eq.d.ts +1 -0
  162. package/types/evaluator/matchers/semver_gte.d.ts +1 -0
  163. package/types/evaluator/matchers/semver_inlist.d.ts +1 -0
  164. package/types/evaluator/matchers/semver_lte.d.ts +1 -0
  165. package/types/evaluator/matchers/string.d.ts +1 -2
  166. package/types/evaluator/matchers/sw.d.ts +1 -2
  167. package/types/evaluator/matchers/whitelist.d.ts +1 -3
  168. package/types/evaluator/matchersTransform/set.d.ts +2 -2
  169. package/types/evaluator/matchersTransform/string.d.ts +7 -0
  170. package/types/evaluator/matchersTransform/whitelist.d.ts +3 -3
  171. package/types/evaluator/types.d.ts +3 -3
  172. package/types/logger/constants.d.ts +2 -17
  173. package/types/types.d.ts +3 -3
  174. package/types/utils/constants/index.d.ts +1 -0
  175. package/types/utils/labels/index.d.ts +1 -1
  176. package/types/utils/semVer.d.ts +15 -0
  177. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +8 -0
  178. package/cjs/evaluator/matchersTransform/set.js +0 -10
  179. package/esm/evaluator/matchersTransform/set.js +0 -6
  180. 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 /* string */, negate = matcher.negate /* boolean */, keySelector = matcher.keySelector /* keySelectorObject */, segmentObject = matcher.userDefinedSegmentMatcherData /* segmentObject */, whitelistObject = matcher.whitelistMatcherData /* whiteListObject, provided by 'WHITELIST', set and string matchers */, unaryNumericObject = matcher.unaryNumericMatcherData /* unaryNumericObject */, betweenObject = matcher.betweenMatcherData /* betweenObject */, dependencyObject = matcher.dependencyMatcherData /* dependencyObject */, booleanMatcherData = matcher.booleanMatcherData, stringMatcherData = matcher.stringMatcherData;
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)(segmentObject);
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)(unaryNumericObject);
25
+ value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
30
26
  dataType = matcherTypes_1.matcherDataTypes.NUMBER;
31
- if (unaryNumericObject.dataType === 'DATETIME') {
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)(unaryNumericObject);
34
+ value = (0, unaryNumeric_1.numericTransform)(unaryNumericMatcherData);
39
35
  dataType = matcherTypes_1.matcherDataTypes.NUMBER;
40
- if (unaryNumericObject.dataType === 'DATETIME') {
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 = betweenObject;
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, set_1.setTransform)(whitelistObject);
57
+ value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
59
58
  dataType = matcherTypes_1.matcherDataTypes.SET;
60
59
  }
61
- else if (type === matcherTypes_1.matcherTypes.STARTS_WITH ||
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, set_1.setTransform)(whitelistObject);
65
+ value = (0, whitelist_1.whitelistTransform)(whitelistMatcherData);
65
66
  }
66
67
  else if (type === matcherTypes_1.matcherTypes.IN_SPLIT_TREATMENT) {
67
- value = dependencyObject;
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 as a set. Used by 'WHITELIST' matcher.
5
+ * Extract whitelist array.
7
6
  */
8
7
  function whitelistTransform(whitelistObject) {
9
- return new sets_1._Set(whitelistObject.whitelist);
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 = (0, matchers_1.matcherFactory)(log, matcherDto, storage);
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 = value !== undefined && matcher ? matcher(value, splitEvaluator) : false;
25
- if ((0, thenable_1.thenable)(result)) {
26
- // @ts-ignore
27
- return result.then(function (res) { return Boolean(res ^ matcherDto.negate); });
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
- // @ts-ignore
30
- return Boolean(result ^ matcherDto.negate);
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 instanciate the matchers, the expressions array
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 = [];
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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.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_WHITELIST = exports.ENGINE_MATCHER_STARTS_WITH = exports.ENGINE_MATCHER_STRING_INVALID = exports.ENGINE_MATCHER_STRING = exports.ENGINE_MATCHER_SEGMENT = exports.ENGINE_MATCHER_PART_OF = exports.ENGINE_MATCHER_LESS = exports.ENGINE_MATCHER_GREATER = exports.ENGINE_MATCHER_ENDS_WITH = exports.ENGINE_MATCHER_EQUAL_TO_SET = exports.ENGINE_MATCHER_EQUAL = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_MATCHER_CONTAINS_STRING = exports.ENGINE_MATCHER_CONTAINS_ANY = exports.ENGINE_MATCHER_CONTAINS_ALL = exports.ENGINE_MATCHER_BOOLEAN = exports.ENGINE_MATCHER_BETWEEN = exports.ENGINE_MATCHER_ALL = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
4
- 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 = 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 = 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.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 = 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 = void 0;
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';
@@ -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
- return args[i++];
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.ENGINE_MATCHER_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[allMatcher] is always true'],
14
- [c.ENGINE_MATCHER_BETWEEN, c.LOG_PREFIX_ENGINE_MATCHER + '[betweenMatcher] is %s between %s and %s? %s'],
15
- [c.ENGINE_MATCHER_BOOLEAN, c.LOG_PREFIX_ENGINE_MATCHER + '[booleanMatcher] %s === %s'],
16
- [c.ENGINE_MATCHER_CONTAINS_ALL, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAllMatcher] %s contains all elements of %s? %s'],
17
- [c.ENGINE_MATCHER_CONTAINS_ANY, c.LOG_PREFIX_ENGINE_MATCHER + '[containsAnyMatcher] %s contains at least an element of %s? %s'],
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 [%s], no attributes received.'],
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
- destroyPromise = __flush().then(function () {
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
  }
@@ -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) { // accounting the possibility that `userMatchingKeys` is undefined (server-side API)
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) // accounting the possibility that `userKeys` and thus `queryParams` are empty
39
- url += '?' + queryParams;
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?v=1.0&since=" + since + (till ? '&till=' + till : '') + (filterQueryString || '');
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 + "::1.0").toString(16);
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 feature flag filter criteria was modified. Updating cache');
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 feature flag filter criteria was modified). Clearing cache');
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 matcher type';
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 instanciate.
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;
@@ -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 * as LabelsConstants from '../utils/labels';
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', LabelsConstants.NO_CONDITION_MATCH)
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: LabelsConstants.EXCEPTION
41
+ label: EXCEPTION
42
42
  };
43
43
  }
44
44
  if (this.isGarbage()) {
45
45
  treatment = CONTROL;
46
- label = LabelsConstants.SPLIT_ARCHIVED;
46
+ label = SPLIT_ARCHIVED;
47
47
  }
48
48
  else if (killed) {
49
49
  treatment = defaultTreatment;
50
- label = LabelsConstants.SPLIT_KILLED;
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 * as LabelsConstants from '../../utils/labels';
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: LabelsConstants.UNSUPPORTED_MATCHER_TYPE
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) || Array.isArray(predicates) && predicates.length === 0) {
38
+ if (!Array.isArray(predicates) || predicates.length === 0) {
39
39
  return unexpectedInputHandler;
40
40
  }
41
41
  else {