@splitsoftware/splitio-commons 1.17.0 → 1.17.1-rc.0

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 (165) hide show
  1. package/CHANGES.txt +6 -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 +4 -1
  6. package/cjs/evaluator/matchersTransform/segment.js +3 -1
  7. package/cjs/logger/constants.js +2 -2
  8. package/cjs/logger/messages/info.js +1 -1
  9. package/cjs/logger/messages/warn.js +1 -1
  10. package/cjs/readiness/readinessManager.js +5 -6
  11. package/cjs/readiness/sdkReadinessManager.js +5 -6
  12. package/cjs/sdkClient/sdkClientMethodCS.js +2 -2
  13. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +2 -2
  14. package/cjs/sdkFactory/index.js +1 -1
  15. package/cjs/services/splitApi.js +5 -5
  16. package/cjs/storages/AbstractSegmentsCacheSync.js +41 -12
  17. package/cjs/storages/AbstractSplitsCacheSync.js +2 -1
  18. package/cjs/storages/KeyBuilderCS.js +23 -5
  19. package/cjs/storages/dataLoader.js +1 -1
  20. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
  21. package/cjs/storages/inLocalStorage/index.js +6 -2
  22. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -0
  23. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
  24. package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
  25. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +7 -10
  26. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  27. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +5 -8
  28. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  29. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  30. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  31. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +15 -21
  32. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  33. package/cjs/sync/streaming/SSEHandler/index.js +3 -5
  34. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +107 -48
  35. package/cjs/sync/streaming/constants.js +3 -3
  36. package/cjs/sync/streaming/parseUtils.js +14 -9
  37. package/cjs/sync/streaming/pushManager.js +69 -67
  38. package/cjs/utils/constants/index.js +5 -4
  39. package/cjs/utils/settingsValidation/index.js +2 -1
  40. package/esm/evaluator/matchers/index.js +3 -1
  41. package/esm/evaluator/matchers/large_segment.js +12 -0
  42. package/esm/evaluator/matchers/matcherTypes.js +1 -0
  43. package/esm/evaluator/matchersTransform/index.js +4 -1
  44. package/esm/evaluator/matchersTransform/segment.js +3 -1
  45. package/esm/logger/constants.js +1 -1
  46. package/esm/logger/messages/info.js +1 -1
  47. package/esm/logger/messages/warn.js +1 -1
  48. package/esm/readiness/readinessManager.js +5 -6
  49. package/esm/readiness/sdkReadinessManager.js +5 -6
  50. package/esm/sdkClient/sdkClientMethodCS.js +2 -2
  51. package/esm/sdkClient/sdkClientMethodCSWithTT.js +2 -2
  52. package/esm/sdkFactory/index.js +1 -1
  53. package/esm/services/splitApi.js +6 -6
  54. package/esm/storages/AbstractSegmentsCacheSync.js +41 -12
  55. package/esm/storages/AbstractSplitsCacheSync.js +3 -2
  56. package/esm/storages/KeyBuilderCS.js +21 -4
  57. package/esm/storages/dataLoader.js +1 -1
  58. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
  59. package/esm/storages/inLocalStorage/index.js +7 -3
  60. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -0
  61. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
  62. package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
  63. package/esm/storages/inMemory/TelemetryCacheInMemory.js +7 -10
  64. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  65. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +5 -8
  66. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  67. package/esm/sync/polling/pollingManagerCS.js +1 -1
  68. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  69. package/esm/sync/polling/updaters/mySegmentsUpdater.js +15 -21
  70. package/esm/sync/streaming/AuthClient/index.js +1 -1
  71. package/esm/sync/streaming/SSEHandler/index.js +4 -6
  72. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +108 -49
  73. package/esm/sync/streaming/constants.js +2 -2
  74. package/esm/sync/streaming/parseUtils.js +12 -8
  75. package/esm/sync/streaming/pushManager.js +72 -70
  76. package/esm/utils/constants/index.js +3 -2
  77. package/esm/utils/settingsValidation/index.js +2 -1
  78. package/package.json +1 -1
  79. package/src/dtos/types.ts +21 -7
  80. package/src/evaluator/matchers/index.ts +2 -0
  81. package/src/evaluator/matchers/large_segment.ts +18 -0
  82. package/src/evaluator/matchers/matcherTypes.ts +1 -0
  83. package/src/evaluator/matchersTransform/index.ts +4 -1
  84. package/src/evaluator/matchersTransform/segment.ts +5 -3
  85. package/src/logger/constants.ts +1 -1
  86. package/src/logger/messages/info.ts +1 -1
  87. package/src/logger/messages/warn.ts +1 -1
  88. package/src/readiness/readinessManager.ts +7 -5
  89. package/src/readiness/sdkReadinessManager.ts +7 -7
  90. package/src/readiness/types.ts +2 -2
  91. package/src/sdkClient/sdkClientMethodCS.ts +2 -2
  92. package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -2
  93. package/src/sdkFactory/index.ts +1 -1
  94. package/src/services/splitApi.ts +7 -7
  95. package/src/services/splitHttpClient.ts +1 -1
  96. package/src/services/types.ts +2 -2
  97. package/src/storages/AbstractSegmentsCacheSync.ts +53 -12
  98. package/src/storages/AbstractSplitsCacheSync.ts +4 -3
  99. package/src/storages/KeyBuilderCS.ts +34 -5
  100. package/src/storages/dataLoader.ts +1 -1
  101. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +29 -59
  102. package/src/storages/inLocalStorage/index.ts +8 -4
  103. package/src/storages/inMemory/InMemoryStorageCS.ts +5 -0
  104. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +10 -44
  105. package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -8
  106. package/src/storages/inMemory/TelemetryCacheInMemory.ts +7 -11
  107. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  108. package/src/storages/types.ts +11 -7
  109. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +8 -10
  110. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  111. package/src/sync/polling/fetchers/types.ts +3 -2
  112. package/src/sync/polling/pollingManagerCS.ts +4 -4
  113. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +4 -5
  114. package/src/sync/polling/types.ts +7 -6
  115. package/src/sync/polling/updaters/mySegmentsUpdater.ts +19 -22
  116. package/src/sync/streaming/AuthClient/index.ts +1 -1
  117. package/src/sync/streaming/SSEClient/index.ts +4 -6
  118. package/src/sync/streaming/SSEHandler/index.ts +5 -8
  119. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  120. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +116 -49
  121. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  122. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  123. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  124. package/src/sync/streaming/constants.ts +2 -2
  125. package/src/sync/streaming/parseUtils.ts +19 -11
  126. package/src/sync/streaming/pushManager.ts +73 -72
  127. package/src/sync/streaming/types.ts +10 -10
  128. package/src/sync/submitters/types.ts +8 -5
  129. package/src/utils/constants/index.ts +3 -2
  130. package/src/utils/settingsValidation/index.ts +3 -2
  131. package/src/utils/settingsValidation/types.ts +1 -1
  132. package/types/dtos/types.d.ts +18 -7
  133. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  134. package/types/logger/constants.d.ts +1 -1
  135. package/types/readiness/readinessManager.d.ts +2 -2
  136. package/types/readiness/sdkReadinessManager.d.ts +2 -3
  137. package/types/readiness/types.d.ts +2 -2
  138. package/types/services/splitApi.d.ts +1 -1
  139. package/types/services/splitHttpClient.d.ts +1 -1
  140. package/types/services/types.d.ts +2 -2
  141. package/types/storages/AbstractSegmentsCacheSync.d.ts +9 -11
  142. package/types/storages/AbstractSplitsCacheSync.d.ts +1 -1
  143. package/types/storages/KeyBuilderCS.d.ts +9 -2
  144. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +4 -14
  145. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -9
  146. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
  147. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +4 -6
  148. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  149. package/types/storages/types.d.ts +7 -5
  150. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  151. package/types/sync/polling/fetchers/types.d.ts +2 -2
  152. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  153. package/types/sync/polling/types.d.ts +7 -4
  154. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -3
  155. package/types/sync/streaming/SSEHandler/types.d.ts +16 -14
  156. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +4 -2
  157. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +2 -1
  158. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +3 -2
  159. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  160. package/types/sync/streaming/constants.d.ts +2 -2
  161. package/types/sync/streaming/parseUtils.d.ts +4 -5
  162. package/types/sync/streaming/types.d.ts +8 -8
  163. package/types/sync/submitters/types.d.ts +7 -4
  164. package/types/utils/constants/index.d.ts +3 -2
  165. package/types/utils/settingsValidation/types.d.ts +1 -1
@@ -48,10 +48,10 @@ function pushManagerFactory(params, pollingManager) {
48
48
  var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
49
49
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
50
50
  var splitsUpdateWorker = (0, SplitsUpdateWorker_1.SplitsUpdateWorker)(log, storage.splits, pollingManager.splitsSyncTask, readiness.splits, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
51
- // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
51
+ // [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
52
52
  var userKeyHashes = {};
53
53
  // [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
54
- // Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
54
+ // Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
55
55
  var clients = {};
56
56
  // [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
57
57
  var connectForNewClient = false;
@@ -198,77 +198,76 @@ function pushManagerFactory(params, pollingManager) {
198
198
  }
199
199
  splitsUpdateWorker.put(parsedData);
200
200
  });
201
- if (userKey) {
202
- pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
203
- var userKeyHash = channel.split('_')[2];
204
- var userKey = userKeyHashes[userKeyHash];
205
- if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
206
- clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
207
- }
208
- });
209
- pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
210
- switch (parsedData.u) {
211
- case types_1.UpdateStrategy.BoundedFetchRequest: {
212
- var bitmap_1;
213
- try {
214
- bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
215
- }
216
- catch (e) {
217
- log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
218
- break;
219
- }
220
- (0, lang_1.forOwn)(clients, function (_a) {
221
- var hash64 = _a.hash64, worker = _a.worker;
222
- if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
223
- worker.put(parsedData.changeNumber); // fetch mySegments
224
- }
225
- });
226
- return;
201
+ function handleMySegmentsUpdate(parsedData) {
202
+ switch (parsedData.u) {
203
+ case types_1.UpdateStrategy.BoundedFetchRequest: {
204
+ var bitmap_1;
205
+ try {
206
+ bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
227
207
  }
228
- case types_1.UpdateStrategy.KeyList: {
229
- var keyList = void 0, added_1, removed_1;
230
- try {
231
- keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
232
- added_1 = new sets_1._Set(keyList.a);
233
- removed_1 = new sets_1._Set(keyList.r);
234
- }
235
- catch (e) {
236
- log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
237
- break;
238
- }
239
- (0, lang_1.forOwn)(clients, function (_a) {
240
- var hash64 = _a.hash64, worker = _a.worker;
241
- var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
242
- if (add !== undefined) {
243
- worker.put(parsedData.changeNumber, {
244
- name: parsedData.segmentName,
245
- add: add
246
- });
247
- }
248
- });
249
- return;
208
+ catch (e) {
209
+ log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
210
+ break;
250
211
  }
251
- case types_1.UpdateStrategy.SegmentRemoval:
252
- if (!parsedData.segmentName) {
253
- log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
254
- break;
212
+ (0, lang_1.forOwn)(clients, function (_a, matchingKey) {
213
+ var hash64 = _a.hash64, worker = _a.worker;
214
+ if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
215
+ worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
255
216
  }
256
- (0, lang_1.forOwn)(clients, function (_a) {
257
- var worker = _a.worker;
258
- return worker.put(parsedData.changeNumber, {
259
- name: parsedData.segmentName,
260
- add: false
217
+ });
218
+ return;
219
+ }
220
+ case types_1.UpdateStrategy.KeyList: {
221
+ var keyList = void 0, added_1, removed_1;
222
+ try {
223
+ keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
224
+ added_1 = new sets_1._Set(keyList.a);
225
+ removed_1 = new sets_1._Set(keyList.r);
226
+ }
227
+ catch (e) {
228
+ log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
229
+ break;
230
+ }
231
+ if (!parsedData.n || !parsedData.n.length) {
232
+ log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', 'No segment name was provided']);
233
+ break;
234
+ }
235
+ (0, lang_1.forOwn)(clients, function (_a) {
236
+ var hash64 = _a.hash64, worker = _a.worker;
237
+ var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
238
+ if (add !== undefined) {
239
+ worker.put(parsedData, {
240
+ added: add ? [parsedData.n[0]] : [],
241
+ removed: add ? [] : [parsedData.n[0]]
261
242
  });
262
- });
263
- return;
243
+ }
244
+ });
245
+ return;
264
246
  }
265
- // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
266
- (0, lang_1.forOwn)(clients, function (_a) {
267
- var worker = _a.worker;
268
- worker.put(parsedData.changeNumber);
269
- });
247
+ case types_1.UpdateStrategy.SegmentRemoval:
248
+ if (!parsedData.n || !parsedData.n.length) {
249
+ log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
250
+ break;
251
+ }
252
+ (0, lang_1.forOwn)(clients, function (_a) {
253
+ var worker = _a.worker;
254
+ worker.put(parsedData, {
255
+ added: [],
256
+ removed: parsedData.n
257
+ });
258
+ });
259
+ return;
260
+ }
261
+ // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
262
+ (0, lang_1.forOwn)(clients, function (_a, matchingKey) {
263
+ var worker = _a.worker;
264
+ worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
270
265
  });
271
266
  }
267
+ if (userKey) {
268
+ pushEmitter.on(constants_1.MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
269
+ pushEmitter.on(constants_1.MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
270
+ }
272
271
  else {
273
272
  pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
274
273
  }
@@ -303,7 +302,10 @@ function pushManagerFactory(params, pollingManager) {
303
302
  var hash = (0, AuthClient_1.hashUserKey)(userKey);
304
303
  if (!userKeyHashes[hash]) {
305
304
  userKeyHashes[hash] = userKey;
306
- clients[userKey] = { hash64: (0, murmur3_64_1.hash64)(userKey), worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker) };
305
+ clients[userKey] = {
306
+ hash64: (0, murmur3_64_1.hash64)(userKey),
307
+ worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
308
+ };
307
309
  connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
308
310
  // Reconnects in case of a new client.
309
311
  // Run in next event-loop cycle to save authentication calls
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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.IN_SEGMENT = exports.FLAG_SPEC_VERSION = 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;
3
+ exports.MEMBERSHIPS = 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.IN_LARGE_SEGMENT = exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = 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 = {
@@ -64,7 +64,7 @@ exports.EVENTS = 'ev';
64
64
  exports.TELEMETRY = 'te';
65
65
  exports.TOKEN = 'to';
66
66
  exports.SEGMENT = 'se';
67
- exports.MY_SEGMENT = 'ms';
67
+ exports.MEMBERSHIPS = 'ms';
68
68
  exports.TREATMENT = 't';
69
69
  exports.TREATMENTS = 'ts';
70
70
  exports.TREATMENT_WITH_CONFIG = 'tc';
@@ -90,6 +90,7 @@ exports.NON_REQUESTED = 1;
90
90
  exports.DISABLED = 0;
91
91
  exports.ENABLED = 1;
92
92
  exports.PAUSED = 2;
93
- exports.FLAG_SPEC_VERSION = '1.1';
93
+ exports.FLAG_SPEC_VERSION = '1.2';
94
94
  // Matcher types
95
95
  exports.IN_SEGMENT = 'IN_SEGMENT';
96
+ exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
@@ -186,10 +186,11 @@ function settingsValidation(config, validationParams) {
186
186
  var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, sync.splitFilters, withDefaults.mode);
187
187
  sync.splitFilters = splitFiltersValidation.validFilters;
188
188
  sync.__splitFiltersValidation = splitFiltersValidation;
189
+ // ensure a valid flag spec version
189
190
  sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : constants_1.FLAG_SPEC_VERSION;
190
191
  // ensure a valid user consent value
191
192
  // @ts-ignore, modify readonly prop
192
- withDefaults.userConsent = consent(withDefaults);
193
+ withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
193
194
  return withDefaults;
194
195
  }
195
196
  exports.settingsValidation = settingsValidation;
@@ -1,5 +1,6 @@
1
1
  import { allMatcherContext } from './all';
2
2
  import { segmentMatcherContext } from './segment';
3
+ import { largeSegmentMatcherContext } from './large_segment';
3
4
  import { whitelistMatcherContext } from './whitelist';
4
5
  import { equalToMatcherContext } from './eq';
5
6
  import { greaterThanEqualMatcherContext } from './gte';
@@ -43,7 +44,8 @@ var matchers = [
43
44
  greaterThanEqualToSemverMatcherContext,
44
45
  lessThanEqualToSemverMatcherContext,
45
46
  betweenSemverMatcherContext,
46
- inListSemverMatcherContext, // IN_LIST_SEMVER: 22
47
+ inListSemverMatcherContext,
48
+ largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
47
49
  ];
48
50
  /**
49
51
  * Matcher factory.
@@ -0,0 +1,12 @@
1
+ import { thenable } from '../../utils/promise/thenable';
2
+ export function largeSegmentMatcherContext(largeSegmentName, storage) {
3
+ return function largeSegmentMatcher(key) {
4
+ var isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;
5
+ if (thenable(isInLargeSegment)) {
6
+ isInLargeSegment.then(function (result) {
7
+ return result;
8
+ });
9
+ }
10
+ return isInLargeSegment;
11
+ };
12
+ }
@@ -22,6 +22,7 @@ export var matcherTypes = {
22
22
  LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
23
23
  BETWEEN_SEMVER: 21,
24
24
  IN_LIST_SEMVER: 22,
25
+ IN_LARGE_SEGMENT: 23,
25
26
  };
26
27
  export var matcherDataTypes = {
27
28
  BOOLEAN: 'BOOLEAN',
@@ -9,7 +9,7 @@ import { zeroSinceHH, zeroSinceSS } from '../convertions';
9
9
  */
10
10
  export function matchersTransform(matchers) {
11
11
  var parsedMatchers = matchers.map(function (matcher) {
12
- 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;
12
+ var matcherType = matcher.matcherType, negate = matcher.negate, keySelector = matcher.keySelector, userDefinedSegmentMatcherData = matcher.userDefinedSegmentMatcherData, userDefinedLargeSegmentMatcherData = matcher.userDefinedLargeSegmentMatcherData, 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;
13
13
  var attribute = keySelector && keySelector.attribute;
14
14
  var type = matcherTypesMapper(matcherType);
15
15
  // As default input data type we use string (even for ALL_KEYS)
@@ -18,6 +18,9 @@ export function matchersTransform(matchers) {
18
18
  if (type === matcherTypes.IN_SEGMENT) {
19
19
  value = segmentTransform(userDefinedSegmentMatcherData);
20
20
  }
21
+ else if (type === matcherTypes.IN_LARGE_SEGMENT) {
22
+ value = segmentTransform(userDefinedLargeSegmentMatcherData);
23
+ }
21
24
  else if (type === matcherTypes.EQUAL_TO) {
22
25
  value = numericTransform(unaryNumericMatcherData);
23
26
  dataType = matcherDataTypes.NUMBER;
@@ -2,5 +2,7 @@
2
2
  * Extract segment name as a plain string.
3
3
  */
4
4
  export function segmentTransform(segment) {
5
- return segment ? segment.segmentName : undefined;
5
+ return segment ?
6
+ segment.segmentName || segment.largeSegmentName :
7
+ undefined;
6
8
  }
@@ -77,7 +77,7 @@ export var WARN_SPLITS_FILTER_IGNORED = 219;
77
77
  export var WARN_SPLITS_FILTER_INVALID = 220;
78
78
  export var WARN_SPLITS_FILTER_EMPTY = 221;
79
79
  export var WARN_SDK_KEY = 222;
80
- export var STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = 223;
80
+ export var STREAMING_PARSING_MEMBERSHIPS_UPDATE = 223;
81
81
  export var STREAMING_PARSING_SPLIT_UPDATE = 224;
82
82
  export var WARN_INVALID_FLAGSET = 225;
83
83
  export var WARN_LOWERCASE_FLAGSET = 226;
@@ -20,7 +20,7 @@ export var codesInfo = codesWarn.concat([
20
20
  [c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
21
21
  [c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
22
22
  [c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of feature flags #%s. Reason: %s'],
23
- [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
23
+ [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and resetting timer.'],
24
24
  [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
25
25
  [c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
26
26
  [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
@@ -30,7 +30,7 @@ export var codesWarn = codesError.concat([
30
30
  [c.WARN_SPLITS_FILTER_INVALID, c.LOG_PREFIX_SETTINGS + ': feature flag filter at position %s is invalid. It must be an object with a valid filter type ("bySet", "byName" or "byPrefix") and a list of "values".'],
31
31
  [c.WARN_SPLITS_FILTER_EMPTY, c.LOG_PREFIX_SETTINGS + ': feature flag filter configuration must be a non-empty array of filter objects.'],
32
32
  [c.WARN_SDK_KEY, c.LOG_PREFIX_SETTINGS + ': You already have %s. We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'],
33
- [c.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching MySegments due to an error processing %s notification: %s'],
33
+ [c.STREAMING_PARSING_MEMBERSHIPS_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching Memberships due to an error processing %s notification: %s'],
34
34
  [c.STREAMING_PARSING_SPLIT_UPDATE, c.LOG_PREFIX_SYNC_STREAMING + 'Fetching SplitChanges due to an error processing SPLIT_UPDATE notification: %s'],
35
35
  [c.WARN_INVALID_FLAGSET, '%s: you passed %s, flag set must adhere to the regular expressions %s. This means a flag set must start with a letter or number, be in lowercase, alphanumeric and have a max length of 50 characters. %s was discarded.'],
36
36
  [c.WARN_LOWERCASE_FLAGSET, '%s: flag set %s should be all lowercase - converting string to lowercase.'],
@@ -6,7 +6,7 @@ function splitsEventEmitterFactory(EventEmitter) {
6
6
  splitsCacheLoaded: false,
7
7
  });
8
8
  // `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
9
- // - `/mySegments` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
9
+ // - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
10
10
  // - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
11
11
  splitsEventEmitter.on(SDK_SPLITS_ARRIVED, function (isSplitKill) { if (!isSplitKill)
12
12
  splitsEventEmitter.splitsArrived = true; });
@@ -23,9 +23,9 @@ function segmentsEventEmitterFactory(EventEmitter) {
23
23
  /**
24
24
  * Factory of readiness manager, which handles the ready / update event propagation.
25
25
  */
26
- export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
27
- if (readyTimeout === void 0) { readyTimeout = 0; }
26
+ export function readinessManagerFactory(EventEmitter, settings, splits) {
28
27
  if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
28
+ var readyTimeout = settings.startup.readyTimeout;
29
29
  var segments = segmentsEventEmitterFactory(EventEmitter);
30
30
  var gate = new EventEmitter();
31
31
  var lastUpdate = 0;
@@ -103,10 +103,9 @@ export function readinessManagerFactory(EventEmitter, readyTimeout, splits) {
103
103
  splits: splits,
104
104
  segments: segments,
105
105
  gate: gate,
106
- shared: function (readyTimeout) {
107
- if (readyTimeout === void 0) { readyTimeout = 0; }
106
+ shared: function () {
108
107
  refCount++;
109
- return readinessManagerFactory(EventEmitter, readyTimeout, splits);
108
+ return readinessManagerFactory(EventEmitter, settings, splits);
110
109
  },
111
110
  // @TODO review/remove next methods when non-recoverable errors are reworked
112
111
  // Called on consumer mode, when storage fails to connect
@@ -12,9 +12,9 @@ var REMOVE_LISTENER_EVENT = 'removeListener';
12
12
  * @param readyTimeout time in millis to emit SDK_READY_TIME_OUT event
13
13
  * @param readinessManager optional readinessManager to use. only used internally for `shared` method
14
14
  */
15
- export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager) {
16
- if (readyTimeout === void 0) { readyTimeout = 0; }
17
- if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, readyTimeout); }
15
+ export function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
16
+ if (readinessManager === void 0) { readinessManager = readinessManagerFactory(EventEmitter, settings); }
17
+ var log = settings.log;
18
18
  /** Ready callback warning */
19
19
  var internalReadyCbCount = 0;
20
20
  var readyCbCount = 0;
@@ -57,9 +57,8 @@ export function sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, read
57
57
  }
58
58
  return {
59
59
  readinessManager: readinessManager,
60
- shared: function (readyTimeout) {
61
- if (readyTimeout === void 0) { readyTimeout = 0; }
62
- return sdkReadinessManagerFactory(log, EventEmitter, readyTimeout, readinessManager.shared(readyTimeout));
60
+ shared: function () {
61
+ return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
63
62
  },
64
63
  incInternalReadyCbCount: function () {
65
64
  internalReadyCbCount++;
@@ -14,7 +14,7 @@ function buildInstanceId(key) {
14
14
  * Therefore, clients don't have a bound TT for the track method.
15
15
  */
16
16
  export function sdkClientMethodCSFactory(params) {
17
- var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
17
+ var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log;
18
18
  var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
19
19
  var parsedDefaultKey = keyParser(key);
20
20
  var defaultInstanceId = buildInstanceId(parsedDefaultKey);
@@ -34,7 +34,7 @@ export function sdkClientMethodCSFactory(params) {
34
34
  var instanceId = buildInstanceId(validKey);
35
35
  if (!clientInstances[instanceId]) {
36
36
  var matchingKey = getMatching(validKey);
37
- var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
37
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared();
38
38
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
39
39
  if (err) {
40
40
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -16,7 +16,7 @@ function buildInstanceId(key, trafficType) {
16
16
  * (default client) or the client method (shared clients).
17
17
  */
18
18
  export function sdkClientMethodCSFactory(params) {
19
- 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;
19
+ 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;
20
20
  var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key, trafficType);
21
21
  var parsedDefaultKey = keyParser(key);
22
22
  var defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
@@ -43,7 +43,7 @@ export function sdkClientMethodCSFactory(params) {
43
43
  var instanceId = buildInstanceId(validKey, validTrafficType);
44
44
  if (!clientInstances[instanceId]) {
45
45
  var matchingKey = getMatching(validKey);
46
- var sharedSdkReadiness_1 = sdkReadinessManager.shared(readyTimeout);
46
+ var sharedSdkReadiness_1 = sdkReadinessManager.shared();
47
47
  var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) {
48
48
  if (err) {
49
49
  sharedSdkReadiness_1.readinessManager.timeout();
@@ -22,7 +22,7 @@ export function sdkFactory(params) {
22
22
  // On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
23
23
  // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
24
24
  validateAndTrackApiKey(log, settings.core.authorizationKey);
25
- var sdkReadinessManager = sdkReadinessManagerFactory(log, platform.EventEmitter, settings.startup.readyTimeout);
25
+ var sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
26
26
  var readiness = sdkReadinessManager.readinessManager;
27
27
  var storage = storageFactory({
28
28
  settings: settings,
@@ -1,6 +1,6 @@
1
1
  import { splitHttpClientFactory } from './splitHttpClient';
2
2
  import { objectAssign } from '../utils/lang/objectAssign';
3
- import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MY_SEGMENT } from '../utils/constants';
3
+ import { SPLITS, IMPRESSIONS, IMPRESSIONS_COUNT, EVENTS, TELEMETRY, TOKEN, SEGMENT, MEMBERSHIPS } from '../utils/constants';
4
4
  import { ERROR_TOO_MANY_SETS } from '../logger/constants';
5
5
  var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
6
6
  function userKeyToQueryParam(userKey) {
@@ -51,15 +51,15 @@ export function splitApiFactory(settings, platform, telemetryTracker) {
51
51
  var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : '');
52
52
  return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(SEGMENT));
53
53
  },
54
- fetchMySegments: function (userMatchingKey, noCache) {
54
+ fetchMemberships: function (userMatchingKey, noCache, till) {
55
55
  /**
56
56
  * URI encoding of user keys in order to:
57
- * - avoid 400 responses (due to URI malformed). E.g.: '/api/mySegments/%'
58
- * - avoid 404 responses. E.g.: '/api/mySegments/foo/bar'
57
+ * - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%'
58
+ * - avoid 404 responses. E.g.: '/api/memberships/foo/bar'
59
59
  * - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
60
60
  */
61
- var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
62
- return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MY_SEGMENT));
61
+ var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey) + (till ? '?till=' + till : '');
62
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(MEMBERSHIPS));
63
63
  },
64
64
  /**
65
65
  * Post events.
@@ -6,25 +6,54 @@ var AbstractSegmentsCacheSync = /** @class */ (function () {
6
6
  function AbstractSegmentsCacheSync() {
7
7
  }
8
8
  /**
9
- * For server-side synchronizer: add the given list of segments to the cache, with an empty list of keys. The segments that already exist are not modified.
10
- * For client-side synchronizer: the method is not used.
11
- */
12
- AbstractSegmentsCacheSync.prototype.registerSegments = function (names) { return false; };
13
- /**
14
- * For server-side synchronizer: set the change number of `name` segment.
15
- * For client-side synchronizer: the method is not used.
9
+ * clear the cache.
16
10
  */
17
- AbstractSegmentsCacheSync.prototype.setChangeNumber = function (name, changeNumber) { return true; };
11
+ AbstractSegmentsCacheSync.prototype.clear = function () {
12
+ this.resetSegments({});
13
+ };
18
14
  /**
19
- * For server-side synchronizer: get the change number of `name` segment.
15
+ * For server-side synchronizer: add the given list of segments to the cache, with an empty list of keys. The segments that already exist are not modified.
20
16
  * For client-side synchronizer: the method is not used.
21
17
  */
22
- AbstractSegmentsCacheSync.prototype.getChangeNumber = function (name) { return -1; };
18
+ AbstractSegmentsCacheSync.prototype.registerSegments = function (names) { return false; };
23
19
  /**
24
20
  * For server-side synchronizer: the method is not used.
25
- * For client-side synchronizer: reset the cache with the given list of segments.
21
+ * For client-side synchronizer: it resets or updates the cache.
26
22
  */
27
- AbstractSegmentsCacheSync.prototype.resetSegments = function (names) { return true; };
23
+ AbstractSegmentsCacheSync.prototype.resetSegments = function (segmentsData) {
24
+ var _this = this;
25
+ this.setChangeNumber(undefined, segmentsData.cn);
26
+ var _a = segmentsData, added = _a.added, removed = _a.removed;
27
+ if (added && removed) {
28
+ var isDiff_1 = false;
29
+ added.forEach(function (segment) {
30
+ isDiff_1 = _this.addToSegment(segment) || isDiff_1;
31
+ });
32
+ removed.forEach(function (segment) {
33
+ isDiff_1 = _this.removeFromSegment(segment) || isDiff_1;
34
+ });
35
+ return isDiff_1;
36
+ }
37
+ var names = (segmentsData.k || []).map(function (s) { return s.n; }).sort();
38
+ var storedSegmentKeys = this.getRegisteredSegments().sort();
39
+ // Extreme fast => everything is empty
40
+ if (!names.length && !storedSegmentKeys.length)
41
+ return false;
42
+ var index = 0;
43
+ while (index < names.length && index < storedSegmentKeys.length && names[index] === storedSegmentKeys[index])
44
+ index++;
45
+ // Quick path => no changes
46
+ if (index === names.length && index === storedSegmentKeys.length)
47
+ return false;
48
+ // Slowest path => add and/or remove segments
49
+ for (var removeIndex = index; removeIndex < storedSegmentKeys.length; removeIndex++) {
50
+ this.removeFromSegment(storedSegmentKeys[removeIndex]);
51
+ }
52
+ for (var addIndex = index; addIndex < names.length; addIndex++) {
53
+ this.addToSegment(names[addIndex]);
54
+ }
55
+ return true;
56
+ };
28
57
  return AbstractSegmentsCacheSync;
29
58
  }());
30
59
  export { AbstractSegmentsCacheSync };
@@ -1,5 +1,5 @@
1
1
  import { objectAssign } from '../utils/lang/objectAssign';
2
- import { IN_SEGMENT } from '../utils/constants';
2
+ import { IN_SEGMENT, IN_LARGE_SEGMENT } from '../utils/constants';
3
3
  /**
4
4
  * This class provides a skeletal implementation of the ISplitsCacheSync interface
5
5
  * to minimize the effort required to implement this interface.
@@ -67,7 +67,8 @@ export function usesSegments(split) {
67
67
  for (var i = 0; i < conditions.length; i++) {
68
68
  var matchers = conditions[i].matcherGroup.matchers;
69
69
  for (var j = 0; j < matchers.length; j++) {
70
- if (matchers[j].matcherType === IN_SEGMENT)
70
+ var matcher = matchers[j].matcherType;
71
+ if (matcher === IN_SEGMENT || matcher === IN_LARGE_SEGMENT)
71
72
  return true;
72
73
  }
73
74
  }
@@ -21,10 +21,6 @@ var KeyBuilderCS = /** @class */ (function (_super) {
21
21
  return builtSegmentKeyName.substr(prefix.length);
22
22
  };
23
23
  // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
24
- KeyBuilderCS.prototype.buildOldSegmentNameKey = function (segmentName) {
25
- return this.matchingKey + "." + this.prefix + ".segment." + segmentName;
26
- };
27
- // @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
28
24
  KeyBuilderCS.prototype.extractOldSegmentKey = function (builtSegmentKeyName) {
29
25
  var prefix = this.matchingKey + "." + this.prefix + ".segment.";
30
26
  if (startsWith(builtSegmentKeyName, prefix))
@@ -36,6 +32,27 @@ var KeyBuilderCS = /** @class */ (function (_super) {
36
32
  KeyBuilderCS.prototype.isSplitsCacheKey = function (key) {
37
33
  return this.regexSplitsCacheKey.test(key);
38
34
  };
35
+ KeyBuilderCS.prototype.buildTillKey = function () {
36
+ return this.prefix + "." + this.matchingKey + ".segments.till";
37
+ };
39
38
  return KeyBuilderCS;
40
39
  }(KeyBuilder));
41
40
  export { KeyBuilderCS };
41
+ export 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 (startsWith(builtSegmentKeyName, p))
49
+ return builtSegmentKeyName.substr(p.length);
50
+ },
51
+ extractOldSegmentKey: function () {
52
+ return undefined;
53
+ },
54
+ buildTillKey: function () {
55
+ return prefix + "." + matchingKey + ".largeSegments.till";
56
+ }
57
+ };
58
+ }
@@ -42,6 +42,6 @@ export function dataLoaderFactory(preloadedData) {
42
42
  return Array.isArray(userIds) && userIds.indexOf(userId) > -1;
43
43
  });
44
44
  }
45
- storage.segments.resetSegments(mySegmentsData);
45
+ storage.segments.resetSegments({ k: mySegmentsData.map(function (s) { return ({ n: s }); }) });
46
46
  };
47
47
  }