@splitsoftware/splitio-commons 1.16.0 → 1.16.1-rc.1

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 (148) hide show
  1. package/CHANGES.txt +3 -0
  2. package/cjs/evaluator/matchers/index.js +3 -1
  3. package/cjs/evaluator/matchers/large_segment.js +16 -0
  4. package/cjs/evaluator/matchers/matcherTypes.js +1 -0
  5. package/cjs/evaluator/matchersTransform/index.js +1 -1
  6. package/cjs/logger/constants.js +4 -4
  7. package/cjs/logger/messages/info.js +0 -1
  8. package/cjs/readiness/readinessManager.js +14 -10
  9. package/cjs/readiness/sdkReadinessManager.js +5 -6
  10. package/cjs/sdkClient/sdkClientMethodCS.js +3 -4
  11. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +4 -5
  12. package/cjs/sdkFactory/index.js +1 -1
  13. package/cjs/services/splitApi.js +4 -0
  14. package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
  15. package/cjs/storages/AbstractSplitsCacheSync.js +5 -5
  16. package/cjs/storages/KeyBuilder.js +3 -0
  17. package/cjs/storages/KeyBuilderCS.js +17 -5
  18. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +16 -4
  19. package/cjs/storages/inLocalStorage/index.js +6 -2
  20. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
  21. package/cjs/storages/inMemory/SplitsCacheInMemory.js +20 -11
  22. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
  23. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  24. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
  25. package/cjs/sync/polling/pollingManagerCS.js +51 -33
  26. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  27. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +5 -6
  28. package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -1
  29. package/cjs/sync/streaming/SSEHandler/index.js +1 -0
  30. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
  31. package/cjs/sync/streaming/constants.js +2 -1
  32. package/cjs/sync/streaming/pushManager.js +95 -64
  33. package/cjs/sync/submitters/telemetrySubmitter.js +2 -0
  34. package/cjs/sync/syncManagerOnline.js +24 -14
  35. package/cjs/utils/constants/index.js +5 -1
  36. package/cjs/utils/settingsValidation/index.js +9 -4
  37. package/esm/evaluator/matchers/index.js +3 -1
  38. package/esm/evaluator/matchers/large_segment.js +12 -0
  39. package/esm/evaluator/matchers/matcherTypes.js +1 -0
  40. package/esm/evaluator/matchersTransform/index.js +1 -1
  41. package/esm/logger/constants.js +1 -1
  42. package/esm/logger/messages/info.js +0 -1
  43. package/esm/readiness/readinessManager.js +14 -10
  44. package/esm/readiness/sdkReadinessManager.js +5 -6
  45. package/esm/sdkClient/sdkClientMethodCS.js +4 -5
  46. package/esm/sdkClient/sdkClientMethodCSWithTT.js +5 -6
  47. package/esm/sdkFactory/index.js +1 -1
  48. package/esm/services/splitApi.js +5 -1
  49. package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
  50. package/esm/storages/AbstractSplitsCacheSync.js +3 -3
  51. package/esm/storages/KeyBuilder.js +3 -0
  52. package/esm/storages/KeyBuilderCS.js +15 -4
  53. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +17 -5
  54. package/esm/storages/inLocalStorage/index.js +7 -3
  55. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
  56. package/esm/storages/inMemory/SplitsCacheInMemory.js +21 -12
  57. package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
  58. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  59. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -1
  60. package/esm/sync/polling/pollingManagerCS.js +52 -34
  61. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  62. package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -4
  63. package/esm/sync/polling/updaters/splitChangesUpdater.js +2 -1
  64. package/esm/sync/streaming/SSEHandler/index.js +2 -1
  65. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -5
  66. package/esm/sync/streaming/constants.js +1 -0
  67. package/esm/sync/streaming/pushManager.js +95 -65
  68. package/esm/sync/submitters/telemetrySubmitter.js +2 -0
  69. package/esm/sync/syncManagerOnline.js +25 -15
  70. package/esm/utils/constants/index.js +4 -0
  71. package/esm/utils/settingsValidation/index.js +10 -5
  72. package/package.json +1 -1
  73. package/src/dtos/types.ts +17 -7
  74. package/src/evaluator/matchers/index.ts +2 -0
  75. package/src/evaluator/matchers/large_segment.ts +18 -0
  76. package/src/evaluator/matchers/matcherTypes.ts +1 -0
  77. package/src/evaluator/matchersTransform/index.ts +1 -1
  78. package/src/logger/constants.ts +1 -1
  79. package/src/logger/messages/info.ts +0 -1
  80. package/src/readiness/readinessManager.ts +13 -9
  81. package/src/readiness/sdkReadinessManager.ts +7 -7
  82. package/src/readiness/types.ts +3 -2
  83. package/src/sdkClient/sdkClientMethodCS.ts +4 -6
  84. package/src/sdkClient/sdkClientMethodCSWithTT.ts +5 -7
  85. package/src/sdkFactory/index.ts +1 -1
  86. package/src/services/splitApi.ts +6 -1
  87. package/src/services/types.ts +1 -0
  88. package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
  89. package/src/storages/AbstractSplitsCacheSync.ts +4 -4
  90. package/src/storages/KeyBuilder.ts +3 -0
  91. package/src/storages/KeyBuilderCS.ts +25 -5
  92. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
  93. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +20 -5
  94. package/src/storages/inLocalStorage/index.ts +8 -4
  95. package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
  96. package/src/storages/inMemory/SplitsCacheInMemory.ts +15 -10
  97. package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
  98. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  99. package/src/storages/types.ts +7 -5
  100. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +6 -2
  101. package/src/sync/polling/pollingManagerCS.ts +61 -29
  102. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
  103. package/src/sync/polling/types.ts +3 -2
  104. package/src/sync/polling/updaters/mySegmentsUpdater.ts +5 -8
  105. package/src/sync/polling/updaters/splitChangesUpdater.ts +4 -3
  106. package/src/sync/streaming/SSEHandler/index.ts +2 -1
  107. package/src/sync/streaming/SSEHandler/types.ts +14 -2
  108. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -5
  109. package/src/sync/streaming/constants.ts +1 -0
  110. package/src/sync/streaming/pushManager.ts +100 -63
  111. package/src/sync/streaming/types.ts +5 -3
  112. package/src/sync/submitters/telemetrySubmitter.ts +2 -0
  113. package/src/sync/submitters/types.ts +10 -4
  114. package/src/sync/syncManagerOnline.ts +19 -11
  115. package/src/types.ts +26 -1
  116. package/src/utils/constants/index.ts +5 -0
  117. package/src/utils/settingsValidation/index.ts +11 -6
  118. package/src/utils/settingsValidation/types.ts +1 -1
  119. package/types/dtos/types.d.ts +14 -6
  120. package/types/evaluator/matchers/large_segment.d.ts +5 -0
  121. package/types/logger/constants.d.ts +1 -1
  122. package/types/readiness/readinessManager.d.ts +2 -2
  123. package/types/readiness/sdkReadinessManager.d.ts +2 -3
  124. package/types/readiness/types.d.ts +3 -2
  125. package/types/services/types.d.ts +1 -0
  126. package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
  127. package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
  128. package/types/storages/KeyBuilder.d.ts +1 -0
  129. package/types/storages/KeyBuilderCS.d.ts +7 -2
  130. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
  131. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
  132. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +3 -2
  133. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
  134. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  135. package/types/storages/types.d.ts +4 -3
  136. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -3
  137. package/types/sync/polling/types.d.ts +9 -2
  138. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
  139. package/types/sync/streaming/SSEHandler/types.d.ts +13 -2
  140. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -1
  141. package/types/sync/streaming/constants.d.ts +1 -0
  142. package/types/sync/streaming/pushManager.d.ts +2 -0
  143. package/types/sync/streaming/types.d.ts +5 -4
  144. package/types/sync/submitters/types.d.ts +9 -3
  145. package/types/types.d.ts +25 -0
  146. package/types/utils/constants/index.d.ts +3 -0
  147. package/types/utils/settingsValidation/index.d.ts +2 -0
  148. package/types/utils/settingsValidation/types.d.ts +1 -1
package/CHANGES.txt CHANGED
@@ -1,3 +1,6 @@
1
+ 1.16.1 (July 10, 2024)
2
+ - Updated some transitive dependencies for vulnerability fixes.
3
+
1
4
  1.16.0 (June 13, 2024)
2
5
  - Added the `getOptions` method to the `IPlatform` interface to allow the SDK to pass request options to the `fetch` function and `EventSource` constructor when fetching data from the Split servers. The method is optional and, if provided, it is called twice: first for the `fetch` options and then for the `EventSource` options. Useful for advanced use cases like configuring a proxy or validating HTTPS certificates in NodeJS.
3
6
  - Updated the Redis storage to lazily import the `ioredis` dependency when the storage is created. This prevents errors when the SDK is imported or bundled in a .mjs file, as `ioredis` is a CommonJS module.
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.matcherFactory = void 0;
4
4
  var all_1 = require("./all");
5
5
  var segment_1 = require("./segment");
6
+ var large_segment_1 = require("./large_segment");
6
7
  var whitelist_1 = require("./whitelist");
7
8
  var eq_1 = require("./eq");
8
9
  var gte_1 = require("./gte");
@@ -46,7 +47,8 @@ var matchers = [
46
47
  semver_gte_1.greaterThanEqualToSemverMatcherContext,
47
48
  semver_lte_1.lessThanEqualToSemverMatcherContext,
48
49
  semver_between_1.betweenSemverMatcherContext,
49
- semver_inlist_1.inListSemverMatcherContext, // IN_LIST_SEMVER: 22
50
+ semver_inlist_1.inListSemverMatcherContext,
51
+ large_segment_1.largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
50
52
  ];
51
53
  /**
52
54
  * Matcher factory.
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.largeSegmentMatcherContext = void 0;
4
+ var thenable_1 = require("../../utils/promise/thenable");
5
+ function largeSegmentMatcherContext(largeSegmentName, storage) {
6
+ return function largeSegmentMatcher(key) {
7
+ var isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
8
+ if ((0, thenable_1.thenable)(isInLargeSegment)) {
9
+ isInLargeSegment.then(function (result) {
10
+ return result;
11
+ });
12
+ }
13
+ return isInLargeSegment;
14
+ };
15
+ }
16
+ exports.largeSegmentMatcherContext = largeSegmentMatcherContext;
@@ -25,6 +25,7 @@ exports.matcherTypes = {
25
25
  LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
26
26
  BETWEEN_SEMVER: 21,
27
27
  IN_LIST_SEMVER: 22,
28
+ IN_LARGE_SEGMENT: 23,
28
29
  };
29
30
  exports.matcherDataTypes = {
30
31
  BOOLEAN: 'BOOLEAN',
@@ -18,7 +18,7 @@ function matchersTransform(matchers) {
18
18
  // As default input data type we use string (even for ALL_KEYS)
19
19
  var dataType = matcherTypes_1.matcherDataTypes.STRING;
20
20
  var value = undefined;
21
- if (type === matcherTypes_1.matcherTypes.IN_SEGMENT) {
21
+ if (type === matcherTypes_1.matcherTypes.IN_SEGMENT || type === matcherTypes_1.matcherTypes.IN_LARGE_SEGMENT) {
22
22
  value = (0, segment_1.segmentTransform)(userDefinedSegmentMatcherData);
23
23
  }
24
24
  else if (type === matcherTypes_1.matcherTypes.EQUAL_TO) {
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ 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 = exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = 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_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 = 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 = 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_CLIENT_INSTANTIATION = 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 = 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.
@@ -40,7 +40,6 @@ exports.IMPRESSION = 102;
40
40
  exports.IMPRESSION_QUEUEING = 103;
41
41
  exports.NEW_SHARED_CLIENT = 104;
42
42
  exports.NEW_FACTORY = 105;
43
- exports.POLLING_SMART_PAUSING = 106;
44
43
  exports.POLLING_START = 107;
45
44
  exports.POLLING_STOP = 108;
46
45
  exports.SYNC_SPLITS_FETCH_RETRY = 109;
@@ -121,6 +120,7 @@ exports.ENGINE_MATCHER_ERROR = 329;
121
120
  // Log prefixes (a.k.a. tags or categories)
122
121
  exports.LOG_PREFIX_SETTINGS = 'settings';
123
122
  exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
123
+ exports.LOG_PREFIX_CLIENT_INSTANTIATION = 'Client instantiation';
124
124
  exports.LOG_PREFIX_ENGINE = 'engine';
125
125
  exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE + ':combiner: ';
126
126
  exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE + ':matcher: ';
@@ -20,7 +20,6 @@ exports.codesInfo = warn_1.codesWarn.concat([
20
20
  [c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
21
21
  [c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
22
22
  // synchronizer
23
- [c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
24
23
  [c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
25
24
  [c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
26
25
  [c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
@@ -16,20 +16,20 @@ function splitsEventEmitterFactory(EventEmitter) {
16
16
  splitsEventEmitter.once(constants_1.SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
17
17
  return splitsEventEmitter;
18
18
  }
19
- function segmentsEventEmitterFactory(EventEmitter) {
20
- var segmentsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), {
21
- segmentsArrived: false
22
- });
19
+ function segmentsEventEmitterFactory(EventEmitter, segmentsArrived) {
20
+ if (segmentsArrived === void 0) { segmentsArrived = false; }
21
+ var segmentsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), { segmentsArrived: segmentsArrived });
23
22
  segmentsEventEmitter.once(constants_1.SDK_SEGMENTS_ARRIVED, function () { segmentsEventEmitter.segmentsArrived = true; });
24
23
  return segmentsEventEmitter;
25
24
  }
26
25
  /**
27
26
  * Factory of readiness manager, which handles the ready / update event propagation.
28
27
  */
29
- function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
30
- if (readyTimeout === void 0) { readyTimeout = 0; }
28
+ function readinessManagerFactory(EventEmitter, settings, splits) {
31
29
  if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
30
+ var _a = settings.startup, readyTimeout = _a.readyTimeout, waitForLargeSegments = _a.waitForLargeSegments, largeSegmentsEnabled = settings.sync.largeSegmentsEnabled;
32
31
  var segments = segmentsEventEmitterFactory(EventEmitter);
32
+ var largeSegments = largeSegmentsEnabled ? segmentsEventEmitterFactory(EventEmitter, !waitForLargeSegments) : undefined;
33
33
  var gate = new EventEmitter();
34
34
  // emit SDK_READY_FROM_CACHE
35
35
  var isReadyFromCache = false;
@@ -53,6 +53,8 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
53
53
  var isReady = false;
54
54
  splits.on(constants_1.SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
55
55
  segments.on(constants_1.SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
56
+ if (largeSegments)
57
+ largeSegments.on(constants_1.SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
56
58
  var isDestroyed = false;
57
59
  function checkIsReadyFromCache() {
58
60
  isReadyFromCache = true;
@@ -78,7 +80,7 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
78
80
  }
79
81
  }
80
82
  else {
81
- if (splits.splitsArrived && segments.segmentsArrived) {
83
+ if (splits.splitsArrived && segments.segmentsArrived && (!largeSegments || largeSegments.segmentsArrived)) {
82
84
  clearTimeout(readyTimeoutId);
83
85
  isReady = true;
84
86
  try {
@@ -95,11 +97,11 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
95
97
  return {
96
98
  splits: splits,
97
99
  segments: segments,
100
+ largeSegments: largeSegments,
98
101
  gate: gate,
99
- shared: function (readyTimeout) {
100
- if (readyTimeout === void 0) { readyTimeout = 0; }
102
+ shared: function () {
101
103
  refCount++;
102
- return readinessManagerFactory(EventEmitter, readyTimeout, splits);
104
+ return readinessManagerFactory(EventEmitter, settings, splits);
103
105
  },
104
106
  // @TODO review/remove next methods when non-recoverable errors are reworked
105
107
  // Called on consumer mode, when storage fails to connect
@@ -110,6 +112,8 @@ function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
110
112
  destroy: function () {
111
113
  isDestroyed = true;
112
114
  segments.removeAllListeners();
115
+ if (largeSegments)
116
+ largeSegments.removeAllListeners();
113
117
  gate.removeAllListeners();
114
118
  clearTimeout(readyTimeoutId);
115
119
  if (refCount > 0)
@@ -15,9 +15,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
15
15
  * @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
16
16
  * @param readinessManager optional readinessManager to use. only used internally for `shared` method
17
17
  */
18
- function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager) {
19
- if (readyTimeout === void 0) { readyTimeout = 0; }
20
- if (readinessManager === void 0) { readinessManager = (0, readinessManager_1.readinessManagerFactory)(EventEmitter, readyTimeout); }
18
+ function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
19
+ if (readinessManager === void 0) { readinessManager = (0, readinessManager_1.readinessManagerFactory)(EventEmitter, settings); }
20
+ var log = settings.log;
21
21
  /** Ready callback warning */
22
22
  var internalReadyCbCount = 0;
23
23
  var readyCbCount = 0;
@@ -60,9 +60,8 @@ function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessMa
60
60
  }
61
61
  return {
62
62
  readinessManager: readinessManager,
63
- shared: function (readyTimeout) {
64
- if (readyTimeout === void 0) { readyTimeout = 0; }
65
- return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
63
+ shared: function () {
64
+ return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
66
65
  },
67
66
  incInternalReadyCbCount: function () {
68
67
  internalReadyCbCount++;
@@ -12,13 +12,12 @@ function buildInstanceId(key) {
12
12
  // @ts-ignore
13
13
  return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-";
14
14
  }
15
- var method = 'Client instantiation';
16
15
  /**
17
16
  * Factory of client method for the client-side API variant where TT is ignored.
18
17
  * Therefore, clients don't have a bound TT for the track method.
19
18
  */
20
19
  function sdkClientMethodCSFactory(params) {
21
- var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
20
+ var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
22
21
  var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key);
23
22
  var parsedDefaultKey = (0, key_2.keyParser)(key);
24
23
  var defaultInstanceId = buildInstanceId(parsedDefaultKey);
@@ -31,14 +30,14 @@ function sdkClientMethodCSFactory(params) {
31
30
  return mainClientInstance;
32
31
  }
33
32
  // Validate the key value. The trafficType (2nd argument) is ignored
34
- var validKey = (0, key_1.validateKey)(log, key, method);
33
+ var validKey = (0, key_1.validateKey)(log, key, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
35
34
  if (validKey === false) {
36
35
  throw new Error('Shared Client needs a valid key.');
37
36
  }
38
37
  var instanceId = buildInstanceId(validKey);
39
38
  if (!clientInstances[instanceId]) {
40
39
  var matchingKey = (0, key_2.getMatching)(validKey);
41
- var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
40
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared();
42
41
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
43
42
  if (err) {
44
43
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -13,14 +13,13 @@ function buildInstanceId(key, trafficType) {
13
13
  // @ts-ignore
14
14
  return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType !== undefined ? trafficType : '');
15
15
  }
16
- var method = 'Client instantiation';
17
16
  /**
18
17
  * Factory of client method for the client-side (browser) variant of the Isomorphic JS SDK,
19
18
  * where clients can have a bound TT for the track method, which is provided via the settings
20
19
  * (default client) or the client method (shared clients).
21
20
  */
22
21
  function sdkClientMethodCSFactory(params) {
23
- var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, readyTimeout = _a.startup.readyTimeout, log = _a.log;
22
+ var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, _b = _a.core, key = _b.key, trafficType = _b.trafficType, log = _a.log;
24
23
  var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key, trafficType);
25
24
  var parsedDefaultKey = (0, key_2.keyParser)(key);
26
25
  var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
@@ -33,13 +32,13 @@ function sdkClientMethodCSFactory(params) {
33
32
  return mainClientInstance;
34
33
  }
35
34
  // Validate the key value
36
- var validKey = (0, key_1.validateKey)(log, key, "Shared " + method);
35
+ var validKey = (0, key_1.validateKey)(log, key, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
37
36
  if (validKey === false) {
38
37
  throw new Error('Shared Client needs a valid key.');
39
38
  }
40
39
  var validTrafficType;
41
40
  if (trafficType !== undefined) {
42
- validTrafficType = (0, trafficType_1.validateTrafficType)(log, trafficType, "Shared " + method);
41
+ validTrafficType = (0, trafficType_1.validateTrafficType)(log, trafficType, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION);
43
42
  if (validTrafficType === false) {
44
43
  throw new Error('Shared Client needs a valid traffic type or no traffic type at all.');
45
44
  }
@@ -47,7 +46,7 @@ function sdkClientMethodCSFactory(params) {
47
46
  var instanceId = buildInstanceId(validKey, validTrafficType);
48
47
  if (!clientInstances[instanceId]) {
49
48
  var matchingKey = (0, key_2.getMatching)(validKey);
50
- var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
49
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared();
51
50
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
52
51
  if (err) {
53
52
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -25,7 +25,7 @@ function sdkFactory(params) {
25
25
  // On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
26
26
  // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
27
27
  (0, apiKey_1.validateAndTrackApiKey)(log, settings.core.authorizationKey);
28
- var sdkReadinessManager = (0, sdkReadinessManager_1.sdkReadinessManagerFactory)(log, platform.EventEmitter, settings.startup.readyTimeout);
28
+ var sdkReadinessManager = (0, sdkReadinessManager_1.sdkReadinessManagerFactory)(platform.EventEmitter, settings);
29
29
  var readiness = sdkReadinessManager.readinessManager;
30
30
  var storage = storageFactory({
31
31
  settings: settings,
@@ -64,6 +64,10 @@ function splitApiFactory(settings, platform, telemetryTracker) {
64
64
  var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
65
65
  return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MY_SEGMENT));
66
66
  },
67
+ fetchMyLargeSegments: function (userMatchingKey, noCache) {
68
+ var url = urls.sdk + "/myLargeSegments/" + encodeURIComponent(userMatchingKey);
69
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MY_LARGE_SEGMENT));
70
+ },
67
71
  /**
68
72
  * Post events.
69
73
  *
@@ -9,9 +9,9 @@ var objectAssign_1 = require("../utils/lang/objectAssign");
9
9
  var AbstractSplitsCacheAsync = /** @class */ (function () {
10
10
  function AbstractSplitsCacheAsync() {
11
11
  }
12
- // @TODO revisit segment-related methods ('usesSegments', 'getRegisteredSegments', 'registerSegments')
12
+ // @TODO revisit segment-related methods ('usesMatcher', 'getRegisteredSegments', 'registerSegments')
13
13
  // noop, just keeping the interface. This is used by standalone client-side API only, and so only implemented by InMemory and InLocalStorage.
14
- AbstractSplitsCacheAsync.prototype.usesSegments = function () {
14
+ AbstractSplitsCacheAsync.prototype.usesMatcher = function () {
15
15
  return Promise.resolve(true);
16
16
  };
17
17
  /**
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.usesSegments = exports.AbstractSplitsCacheSync = void 0;
3
+ exports.usesMatcher = exports.AbstractSplitsCacheSync = void 0;
4
4
  var objectAssign_1 = require("../utils/lang/objectAssign");
5
5
  /**
6
6
  * This class provides a skeletal implementation of the ISplitsCacheSync interface
@@ -62,17 +62,17 @@ var AbstractSplitsCacheSync = /** @class */ (function () {
62
62
  exports.AbstractSplitsCacheSync = AbstractSplitsCacheSync;
63
63
  /**
64
64
  * Given a parsed split, it returns a boolean flagging if its conditions use segments matchers (rules & whitelists).
65
- * This util is intended to simplify the implementation of `splitsCache::usesSegments` method
65
+ * This util is intended to simplify the implementation of `splitsCache::usesMatcher` method
66
66
  */
67
- function usesSegments(split) {
67
+ function usesMatcher(split, matcherType) {
68
68
  var conditions = split.conditions || [];
69
69
  for (var i = 0; i < conditions.length; i++) {
70
70
  var matchers = conditions[i].matcherGroup.matchers;
71
71
  for (var j = 0; j < matchers.length; j++) {
72
- if (matchers[j].matcherType === 'IN_SEGMENT')
72
+ if (matchers[j].matcherType === matcherType)
73
73
  return true;
74
74
  }
75
75
  }
76
76
  return false;
77
77
  }
78
- exports.usesSegments = usesSegments;
78
+ exports.usesMatcher = usesMatcher;
@@ -40,6 +40,9 @@ var KeyBuilder = /** @class */ (function () {
40
40
  KeyBuilder.prototype.buildSplitsWithSegmentCountKey = function () {
41
41
  return this.prefix + ".splits.usingSegments";
42
42
  };
43
+ KeyBuilder.prototype.buildSplitsWithLargeSegmentCountKey = function () {
44
+ return this.prefix + ".splits.usingLargeSegments";
45
+ };
43
46
  KeyBuilder.prototype.buildSegmentNameKey = function (segmentName) {
44
47
  return this.prefix + ".segment." + segmentName;
45
48
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KeyBuilderCS = void 0;
3
+ exports.myLargeSegmentsKeyBuilder = exports.KeyBuilderCS = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var lang_1 = require("../utils/lang");
6
6
  var KeyBuilder_1 = require("./KeyBuilder");
@@ -24,10 +24,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
24
24
  return builtSegmentKeyName.substr(prefix.length);
25
25
  };
26
26
  // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
27
- KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
28
- return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
29
- };
30
- // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
31
27
  KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
32
28
  var prefix = this.matchingKey + "." + this.prefix + ".segment.";
33
29
  if ((0, lang_1.startsWith)(builtSegmentKeyName, prefix))
@@ -42,3 +38,19 @@ var KeyBuilderCS = /** @class */ (function (_super) {
42
38
  return KeyBuilderCS;
43
39
  }(KeyBuilder_1.KeyBuilder));
44
40
  exports.KeyBuilderCS = KeyBuilderCS;
41
+ function myLargeSegmentsKeyBuilder(prefix, matchingKey) {
42
+ return {
43
+ buildSegmentNameKey: function (segmentName) {
44
+ return prefix + "." + matchingKey + ".largeSegment." + segmentName;
45
+ },
46
+ extractSegmentName: function (builtSegmentKeyName) {
47
+ var p = prefix + "." + matchingKey + ".largeSegment.";
48
+ if ((0, lang_1.startsWith)(builtSegmentKeyName, p))
49
+ return builtSegmentKeyName.substr(p.length);
50
+ },
51
+ extractOldSegmentKey: function () {
52
+ return undefined;
53
+ }
54
+ };
55
+ }
56
+ exports.myLargeSegmentsKeyBuilder = myLargeSegmentsKeyBuilder;
@@ -7,6 +7,7 @@ var lang_1 = require("../../utils/lang");
7
7
  var constants_1 = require("./constants");
8
8
  var sets_1 = require("../../utils/lang/sets");
9
9
  var KeyBuilder_1 = require("../KeyBuilder");
10
+ var constants_2 = require("../../utils/constants");
10
11
  /**
11
12
  * ISplitsCacheSync implementation that stores split definitions in browser LocalStorage.
12
13
  */
@@ -40,10 +41,14 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
40
41
  if (split) {
41
42
  var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
42
43
  this._decrementCount(ttKey);
43
- if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
44
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_SEGMENT)) {
44
45
  var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
45
46
  this._decrementCount(segmentsCountKey);
46
47
  }
48
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_LARGE_SEGMENT)) {
49
+ var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
50
+ this._decrementCount(segmentsCountKey);
51
+ }
47
52
  }
48
53
  }
49
54
  catch (e) {
@@ -56,11 +61,16 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
56
61
  var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
57
62
  // @ts-expect-error
58
63
  localStorage.setItem(ttKey, (0, lang_1.toNumber)(localStorage.getItem(ttKey)) + 1);
59
- if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
64
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_SEGMENT)) {
60
65
  var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
61
66
  // @ts-expect-error
62
67
  localStorage.setItem(segmentsCountKey, (0, lang_1.toNumber)(localStorage.getItem(segmentsCountKey)) + 1);
63
68
  }
69
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_2.IN_LARGE_SEGMENT)) {
70
+ var segmentsCountKey = this.keys.buildSplitsWithLargeSegmentCountKey();
71
+ // @ts-expect-error
72
+ localStorage.setItem(segmentsCountKey, (0, lang_1.toNumber)(localStorage.getItem(segmentsCountKey)) + 1);
73
+ }
64
74
  }
65
75
  }
66
76
  catch (e) {
@@ -173,11 +183,13 @@ var SplitsCacheInLocal = /** @class */ (function (_super) {
173
183
  var ttCount = (0, lang_1.toNumber)(localStorage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
174
184
  return (0, lang_1.isFiniteNumber)(ttCount) && ttCount > 0;
175
185
  };
176
- SplitsCacheInLocal.prototype.usesSegments = function () {
186
+ SplitsCacheInLocal.prototype.usesMatcher = function (matcherType) {
177
187
  // If cache hasn't been synchronized with the cloud, assume we need them.
178
188
  if (!this.hasSync)
179
189
  return true;
180
- var storedCount = localStorage.getItem(this.keys.buildSplitsWithSegmentCountKey());
190
+ var storedCount = localStorage.getItem(matcherType === constants_2.IN_SEGMENT ?
191
+ this.keys.buildSplitsWithSegmentCountKey() :
192
+ this.keys.buildSplitsWithLargeSegmentCountKey());
181
193
  var splitsWithSegmentsCount = storedCount === null ? 0 : (0, lang_1.toNumber)(storedCount);
182
194
  if ((0, lang_1.isFiniteNumber)(splitsWithSegmentsCount)) {
183
195
  return splitsWithSegmentsCount > 0;
@@ -36,9 +36,11 @@ function InLocalStorage(options) {
36
36
  var expirationTimestamp = Date.now() - browser_1.DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
37
37
  var splits = new SplitsCacheInLocal_1.SplitsCacheInLocal(settings, keys, expirationTimestamp);
38
38
  var segments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, keys);
39
+ var largeSegments = new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey));
39
40
  return {
40
41
  splits: splits,
41
42
  segments: segments,
43
+ largeSegments: largeSegments,
42
44
  impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
43
45
  impressionCounts: impressionsMode !== constants_2.DEBUG ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
44
46
  events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
@@ -48,6 +50,7 @@ function InLocalStorage(options) {
48
50
  var _a;
49
51
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
50
52
  this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
53
+ this.largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
51
54
  this.impressions.clear();
52
55
  this.impressionCounts && this.impressionCounts.clear();
53
56
  this.events.clear();
@@ -55,10 +58,10 @@ function InLocalStorage(options) {
55
58
  },
56
59
  // When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
57
60
  shared: function (matchingKey) {
58
- var childKeysBuilder = new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey);
59
61
  return {
60
62
  splits: this.splits,
61
- segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, childKeysBuilder),
63
+ segments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, new KeyBuilderCS_1.KeyBuilderCS(prefix, matchingKey)),
64
+ largeSegments: new MySegmentsCacheInLocal_1.MySegmentsCacheInLocal(log, (0, KeyBuilderCS_1.myLargeSegmentsKeyBuilder)(prefix, matchingKey)),
62
65
  impressions: this.impressions,
63
66
  impressionCounts: this.impressionCounts,
64
67
  events: this.events,
@@ -66,6 +69,7 @@ function InLocalStorage(options) {
66
69
  destroy: function () {
67
70
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
68
71
  this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
72
+ this.largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
69
73
  }
70
74
  };
71
75
  },
@@ -18,9 +18,11 @@ function InMemoryStorageCSFactory(params) {
18
18
  var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
19
19
  var splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
20
20
  var segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
21
+ var largeSegments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
21
22
  var storage = {
22
23
  splits: splits,
23
24
  segments: segments,
25
+ largeSegments: largeSegments,
24
26
  impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(impressionsQueueSize),
25
27
  impressionCounts: impressionsMode !== constants_1.DEBUG ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
26
28
  events: new EventsCacheInMemory_1.EventsCacheInMemory(eventsQueueSize),
@@ -30,6 +32,7 @@ function InMemoryStorageCSFactory(params) {
30
32
  destroy: function () {
31
33
  this.splits.clear();
32
34
  this.segments.clear();
35
+ this.largeSegments.clear();
33
36
  this.impressions.clear();
34
37
  this.impressionCounts && this.impressionCounts.clear();
35
38
  this.events.clear();
@@ -40,6 +43,7 @@ function InMemoryStorageCSFactory(params) {
40
43
  return {
41
44
  splits: this.splits,
42
45
  segments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
46
+ largeSegments: new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory(),
43
47
  impressions: this.impressions,
44
48
  impressionCounts: this.impressionCounts,
45
49
  events: this.events,
@@ -48,6 +52,7 @@ function InMemoryStorageCSFactory(params) {
48
52
  destroy: function () {
49
53
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory(__splitFiltersValidation);
50
54
  this.segments.clear();
55
+ this.largeSegments.clear();
51
56
  }
52
57
  };
53
58
  },
@@ -5,6 +5,7 @@ var tslib_1 = require("tslib");
5
5
  var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
6
6
  var lang_1 = require("../../utils/lang");
7
7
  var sets_1 = require("../../utils/lang/sets");
8
+ var constants_1 = require("../../utils/constants");
8
9
  /**
9
10
  * Default ISplitsCacheSync implementation that stores split definitions in memory.
10
11
  * Supported by all JS runtimes.
@@ -16,7 +17,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
16
17
  _this.splitsCache = {};
17
18
  _this.ttCache = {};
18
19
  _this.changeNumber = -1;
19
- _this.splitsWithSegmentsCount = 0;
20
+ _this.segmentsCount = 0;
21
+ _this.largeSegmentsCount = 0;
20
22
  _this.flagSetsCache = {};
21
23
  _this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
22
24
  return _this;
@@ -25,7 +27,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
25
27
  this.splitsCache = {};
26
28
  this.ttCache = {};
27
29
  this.changeNumber = -1;
28
- this.splitsWithSegmentsCount = 0;
30
+ this.segmentsCount = 0;
31
+ this.largeSegmentsCount = 0;
29
32
  };
30
33
  SplitsCacheInMemory.prototype.addSplit = function (name, split) {
31
34
  var previousSplit = this.getSplit(name);
@@ -35,9 +38,11 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
35
38
  if (!this.ttCache[previousTtName])
36
39
  delete this.ttCache[previousTtName];
37
40
  this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
38
- if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit)) { // Substract from segments count for the previous version of this Split.
39
- this.splitsWithSegmentsCount--;
40
- }
41
+ // Substract from segments count for the previous version of this Split.
42
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_SEGMENT))
43
+ this.segmentsCount--;
44
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
45
+ this.largeSegmentsCount--;
41
46
  }
42
47
  if (split) {
43
48
  // Store the Split.
@@ -47,8 +52,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
47
52
  this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
48
53
  this.addToFlagSets(split);
49
54
  // Add to segments count for the new version of the Split
50
- if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
51
- this.splitsWithSegmentsCount++;
55
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
56
+ this.segmentsCount++;
57
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
58
+ this.largeSegmentsCount++;
52
59
  return true;
53
60
  }
54
61
  else {
@@ -66,8 +73,10 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
66
73
  delete this.ttCache[ttName];
67
74
  this.removeFromFlagSets(split.name, split.sets);
68
75
  // Update the segments count.
69
- if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
70
- this.splitsWithSegmentsCount--;
76
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
77
+ this.segmentsCount--;
78
+ if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
79
+ this.largeSegmentsCount--;
71
80
  return true;
72
81
  }
73
82
  else {
@@ -90,8 +99,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
90
99
  SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
91
100
  return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
92
101
  };
93
- SplitsCacheInMemory.prototype.usesSegments = function () {
94
- return this.getChangeNumber() === -1 || this.splitsWithSegmentsCount > 0;
102
+ SplitsCacheInMemory.prototype.usesMatcher = function (matcherType) {
103
+ return this.getChangeNumber() === -1 || (matcherType === constants_1.IN_SEGMENT ? this.segmentsCount > 0 : this.largeSegmentsCount > 0);
95
104
  };
96
105
  SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
97
106
  var _this = this;