@splitsoftware/splitio-commons 3.1.1-rc.10 → 3.1.1-rc.11

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 (208) hide show
  1. package/CHANGES.txt +2 -0
  2. package/cjs/evaluator/condition/index.js +2 -2
  3. package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  4. package/cjs/evaluator/index.js +81 -71
  5. package/cjs/listeners/browser.js +2 -1
  6. package/cjs/listeners/node.js +4 -4
  7. package/cjs/logger/constants.js +15 -20
  8. package/cjs/logger/messages/debug.js +5 -6
  9. package/cjs/logger/messages/error.js +3 -3
  10. package/cjs/logger/messages/info.js +3 -4
  11. package/cjs/logger/messages/warn.js +6 -7
  12. package/cjs/platform/browser.js +15 -0
  13. package/cjs/platform/getEventSource/browser.js +8 -0
  14. package/cjs/platform/getEventSource/eventsource.js +480 -0
  15. package/cjs/platform/getEventSource/node.js +26 -0
  16. package/cjs/platform/getFetch/browser.js +9 -0
  17. package/cjs/platform/getFetch/node.js +27 -0
  18. package/cjs/platform/getOptions/node.js +25 -0
  19. package/cjs/platform/node.js +17 -0
  20. package/cjs/presets/serverSide.js +2 -2
  21. package/cjs/readiness/constants.js +5 -4
  22. package/cjs/readiness/readinessManager.js +23 -23
  23. package/cjs/readiness/sdkReadinessManager.js +1 -17
  24. package/cjs/sdkClient/client.js +24 -50
  25. package/cjs/sdkClient/clientInputValidation.js +6 -17
  26. package/cjs/sdkClient/sdkClient.js +3 -60
  27. package/cjs/sdkClient/sdkLifecycle.js +74 -0
  28. package/cjs/sdkClient/trackMethod.js +56 -0
  29. package/cjs/sdkFactory/index.js +11 -15
  30. package/cjs/sdkManager/index.js +5 -5
  31. package/cjs/services/authProvider.js +80 -0
  32. package/cjs/services/decorateHeaders.js +2 -1
  33. package/cjs/services/secureSplitHttpClient.js +36 -0
  34. package/cjs/services/serviceApi.js +147 -0
  35. package/cjs/services/splitApi.js +24 -10
  36. package/cjs/services/splitHttpClient.js +3 -5
  37. package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
  38. package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
  39. package/cjs/storages/KeyBuilder.js +6 -6
  40. package/cjs/storages/KeyBuilderCS.js +5 -5
  41. package/cjs/storages/KeyBuilderSS.js +2 -2
  42. package/cjs/storages/getRolloutPlan.js +3 -3
  43. package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +194 -0
  44. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
  45. package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
  46. package/cjs/storages/inLocalStorage/index.js +6 -6
  47. package/cjs/storages/inLocalStorage/validateCache.js +3 -3
  48. package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +121 -0
  49. package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
  50. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
  51. package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
  52. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  53. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  54. package/cjs/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +77 -77
  55. package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  56. package/cjs/storages/inRedis/index.js +2 -2
  57. package/cjs/storages/pluggable/DefinitionsCachePluggable.js +212 -0
  58. package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  59. package/cjs/storages/pluggable/index.js +2 -2
  60. package/cjs/storages/setRolloutPlan.js +4 -4
  61. package/cjs/storages/utils.js +1 -0
  62. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
  63. package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
  64. package/cjs/sync/polling/pollingManagerCS.js +86 -81
  65. package/cjs/sync/polling/pollingManagerSS.js +44 -36
  66. package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +13 -0
  67. package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
  68. package/cjs/sync/polling/updaters/{splitChangesUpdater.js → definitionChangesUpdater.js} +66 -69
  69. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  70. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
  71. package/cjs/sync/streaming/AuthClient/index.js +13 -14
  72. package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
  73. package/cjs/sync/streaming/SSEHandler/index.js +2 -1
  74. package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +16 -19
  75. package/cjs/sync/streaming/constants.js +4 -3
  76. package/cjs/sync/streaming/parseUtils.js +11 -11
  77. package/cjs/sync/streaming/pushManager.js +20 -25
  78. package/cjs/sync/submitters/eventsSubmitter.js +1 -1
  79. package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
  80. package/cjs/sync/submitters/impressionsSubmitter.js +5 -4
  81. package/cjs/sync/submitters/telemetrySubmitter.js +3 -4
  82. package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
  83. package/cjs/sync/syncManagerOnline.js +5 -5
  84. package/cjs/utils/Backoff.js +35 -3
  85. package/cjs/utils/EventEmitter.js +391 -0
  86. package/cjs/utils/filter/bloomFilter.js +37 -0
  87. package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
  88. package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
  89. package/cjs/utils/inputValidation/definitions.js +25 -0
  90. package/cjs/utils/inputValidation/index.js +7 -7
  91. package/cjs/utils/inputValidation/isOperational.js +4 -4
  92. package/cjs/utils/inputValidation/target.js +22 -0
  93. package/cjs/utils/labels/index.js +3 -3
  94. package/cjs/utils/settingsValidation/index.js +2 -0
  95. package/cjs/utils/settingsValidation/splitFilters.js +3 -3
  96. package/cjs/utils/settingsValidation/url.js +6 -2
  97. package/esm/evaluator/condition/index.js +2 -2
  98. package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  99. package/esm/evaluator/index.js +80 -71
  100. package/esm/listeners/browser.js +2 -1
  101. package/esm/listeners/node.js +4 -4
  102. package/esm/logger/constants.js +12 -17
  103. package/esm/logger/messages/debug.js +5 -6
  104. package/esm/logger/messages/error.js +3 -3
  105. package/esm/logger/messages/info.js +3 -4
  106. package/esm/logger/messages/warn.js +6 -7
  107. package/esm/platform/browser.js +12 -0
  108. package/esm/platform/getEventSource/browser.js +4 -0
  109. package/esm/platform/getEventSource/eventsource.js +480 -0
  110. package/esm/platform/getEventSource/node.js +20 -0
  111. package/esm/platform/getFetch/browser.js +5 -0
  112. package/esm/platform/getFetch/node.js +22 -0
  113. package/esm/platform/getOptions/node.js +20 -0
  114. package/esm/platform/node.js +14 -0
  115. package/esm/presets/serverSide.js +2 -2
  116. package/esm/readiness/constants.js +4 -3
  117. package/esm/readiness/readinessManager.js +24 -24
  118. package/esm/readiness/sdkReadinessManager.js +2 -18
  119. package/esm/sdkClient/client.js +23 -50
  120. package/esm/sdkClient/clientInputValidation.js +8 -19
  121. package/esm/sdkClient/sdkClient.js +3 -60
  122. package/esm/sdkClient/sdkLifecycle.js +70 -0
  123. package/esm/sdkClient/trackMethod.js +52 -0
  124. package/esm/sdkFactory/index.js +12 -16
  125. package/esm/sdkManager/index.js +6 -6
  126. package/esm/services/authProvider.js +76 -0
  127. package/esm/services/decorateHeaders.js +2 -1
  128. package/esm/services/secureSplitHttpClient.js +32 -0
  129. package/esm/services/serviceApi.js +143 -0
  130. package/esm/services/splitApi.js +24 -10
  131. package/esm/services/splitHttpClient.js +3 -5
  132. package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
  133. package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
  134. package/esm/storages/KeyBuilder.js +6 -6
  135. package/esm/storages/KeyBuilderCS.js +5 -5
  136. package/esm/storages/KeyBuilderSS.js +2 -2
  137. package/esm/storages/getRolloutPlan.js +3 -3
  138. package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +191 -0
  139. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
  140. package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
  141. package/esm/storages/inLocalStorage/index.js +6 -6
  142. package/esm/storages/inLocalStorage/validateCache.js +3 -3
  143. package/esm/storages/inMemory/DefinitionsCacheInMemory.js +118 -0
  144. package/esm/storages/inMemory/InMemoryStorage.js +4 -4
  145. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
  146. package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
  147. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  148. package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  149. package/esm/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +76 -76
  150. package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  151. package/esm/storages/inRedis/index.js +2 -2
  152. package/esm/storages/pluggable/DefinitionsCachePluggable.js +209 -0
  153. package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  154. package/esm/storages/pluggable/index.js +2 -2
  155. package/esm/storages/setRolloutPlan.js +4 -4
  156. package/esm/storages/utils.js +1 -0
  157. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
  158. package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
  159. package/esm/sync/polling/pollingManagerCS.js +87 -82
  160. package/esm/sync/polling/pollingManagerSS.js +44 -36
  161. package/esm/sync/polling/syncTasks/definitionsSyncTask.js +9 -0
  162. package/esm/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
  163. package/esm/sync/polling/updaters/definitionChangesUpdater.js +191 -0
  164. package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  165. package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
  166. package/esm/sync/streaming/AuthClient/index.js +11 -11
  167. package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
  168. package/esm/sync/streaming/SSEHandler/index.js +3 -2
  169. package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +15 -18
  170. package/esm/sync/streaming/constants.js +3 -2
  171. package/esm/sync/streaming/parseUtils.js +9 -9
  172. package/esm/sync/streaming/pushManager.js +22 -27
  173. package/esm/sync/submitters/eventsSubmitter.js +1 -1
  174. package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
  175. package/esm/sync/submitters/impressionsSubmitter.js +5 -4
  176. package/esm/sync/submitters/telemetrySubmitter.js +3 -4
  177. package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
  178. package/esm/sync/syncManagerOnline.js +4 -4
  179. package/esm/utils/Backoff.js +35 -3
  180. package/esm/utils/EventEmitter.js +387 -0
  181. package/esm/utils/filter/bloomFilter.js +33 -0
  182. package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
  183. package/esm/utils/inputValidation/definitionExistence.js +15 -0
  184. package/esm/utils/inputValidation/definitions.js +21 -0
  185. package/esm/utils/inputValidation/index.js +3 -3
  186. package/esm/utils/inputValidation/isOperational.js +4 -4
  187. package/esm/utils/inputValidation/target.js +18 -0
  188. package/esm/utils/labels/index.js +2 -2
  189. package/esm/utils/settingsValidation/index.js +2 -0
  190. package/esm/utils/settingsValidation/splitFilters.js +3 -3
  191. package/esm/utils/settingsValidation/url.js +6 -2
  192. package/package.json +1 -1
  193. package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
  194. package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
  195. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
  196. package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
  197. package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
  198. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
  199. package/cjs/utils/inputValidation/splits.js +0 -25
  200. package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
  201. package/esm/storages/AbstractSplitsCacheSync.js +0 -71
  202. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
  203. package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
  204. package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
  205. package/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
  206. package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -194
  207. package/esm/utils/inputValidation/splitExistence.js +0 -15
  208. package/esm/utils/inputValidation/splits.js +0 -21
@@ -10,16 +10,25 @@ var PROXY_CHECK_INTERVAL_MILLIS_SS = 24 * PROXY_CHECK_INTERVAL_MILLIS_CS; // 24
10
10
  function sdkEndpointOverridden(settings) {
11
11
  return settings.urls.sdk !== settingsValidation_1.base.urls.sdk;
12
12
  }
13
+ function isSplitChangesLegacyResponse(data) {
14
+ return data.splits != null;
15
+ }
16
+ function partitionByStatus(items, till, since) {
17
+ var updated = [], removed = [];
18
+ items.forEach(function (item) { return item.status === 'ARCHIVED' ? removed.push(item.name) : updated.push(item); });
19
+ return { updated: updated, removed: removed, till: till, since: since };
20
+ }
13
21
  /**
14
22
  * Factory of SplitChanges fetcher.
15
23
  * SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
16
24
  */
17
25
  // @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
18
- function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
26
+ function splitChangesFetcherFactory(params) {
27
+ var fetchSplitChanges = params.serviceApi.fetchSplitChanges, settings = params.settings, storage = params.storage;
19
28
  var log = settings.log;
20
29
  var PROXY_CHECK_INTERVAL_MILLIS = (0, key_1.checkIfServerSide)(settings) ? PROXY_CHECK_INTERVAL_MILLIS_SS : PROXY_CHECK_INTERVAL_MILLIS_CS;
21
30
  var lastProxyCheckTimestamp;
22
- return function splitChangesFetcher(since, noCache, till, rbSince,
31
+ function splitChangesFetcher(since, noCache, till, rbSince,
23
32
  // Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
24
33
  decorator) {
25
34
  // Recheck proxy
@@ -30,7 +39,7 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
30
39
  .catch(function (err) {
31
40
  // Handle proxy error with spec 1.3
32
41
  if ((!err.statusCode || err.statusCode === 400) && sdkEndpointOverridden(settings) && settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION) {
33
- log.error(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
42
+ log.error(constants_2.LOG_PREFIX_SYNC + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
34
43
  lastProxyCheckTimestamp = Date.now();
35
44
  settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
36
45
  return fetchSplitChanges(since, noCache, till); // retry request without rbSince
@@ -43,27 +52,27 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
43
52
  .then(function (resp) { return resp.json(); })
44
53
  .then(function (data) {
45
54
  // Using flag spec version 1.2 or below
46
- if (data.splits) {
47
- return {
48
- ff: {
49
- d: data.splits,
50
- s: data.since,
51
- t: data.till
52
- }
53
- };
55
+ if (isSplitChangesLegacyResponse(data)) {
56
+ return { d: partitionByStatus(data.splits || [], data.till, data.since) };
54
57
  }
55
58
  // Proxy recovery
56
59
  if (lastProxyCheckTimestamp) {
57
- log.info(constants_2.LOG_PREFIX_SYNC_SPLITS + 'Proxy error recovered');
60
+ log.info(constants_2.LOG_PREFIX_SYNC + 'Proxy error recovered');
58
61
  lastProxyCheckTimestamp = undefined;
59
62
  return splitChangesFetcher(-1, undefined, undefined, -1)
60
63
  .then(function (splitChangesResponse) {
61
- return Promise.all([storage.splits.clear(), storage.rbSegments.clear()])
64
+ return Promise.all([storage.definitions.clear(), storage.rbSegments.clear()])
62
65
  .then(function () { return splitChangesResponse; });
63
66
  });
64
67
  }
65
- return data;
68
+ var ff = data.ff, rbs = data.rbs;
69
+ return {
70
+ d: (ff === null || ff === void 0 ? void 0 : ff.d) ? partitionByStatus(ff.d, ff.t, ff.s) : undefined,
71
+ rbs: (rbs === null || rbs === void 0 ? void 0 : rbs.d) ? partitionByStatus(rbs.d, rbs.t, rbs.s) : undefined,
72
+ };
66
73
  });
67
- };
74
+ }
75
+ splitChangesFetcher.type = 'feature flags';
76
+ return splitChangesFetcher;
68
77
  }
69
78
  exports.splitChangesFetcherFactory = splitChangesFetcherFactory;
@@ -3,98 +3,103 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pollingManagerCSFactory = void 0;
4
4
  var lang_1 = require("../../utils/lang");
5
5
  var mySegmentsSyncTask_1 = require("./syncTasks/mySegmentsSyncTask");
6
- var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
6
+ var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
7
7
  var key_1 = require("../../utils/key");
8
8
  var constants_1 = require("../../readiness/constants");
9
9
  var constants_2 = require("../../logger/constants");
10
- var AbstractSplitsCacheSync_1 = require("../../storages/AbstractSplitsCacheSync");
10
+ var AbstractDefinitionsCacheSync_1 = require("../../storages/AbstractDefinitionsCacheSync");
11
+ var splitChangesFetcher_1 = require("./fetchers/splitChangesFetcher");
11
12
  /**
12
13
  * Expose start / stop mechanism for polling data from services.
13
14
  * For client-side API with multiple clients.
14
15
  */
15
- function pollingManagerCSFactory(params) {
16
- var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
17
- var log = settings.log;
18
- var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
19
- // Map of matching keys to their corresponding MySegmentsSyncTask.
20
- var mySegmentsSyncTasks = {};
21
- var matchingKey = (0, key_1.getMatching)(settings.core.key);
22
- var mySegmentsSyncTask = add(matchingKey, readiness, storage);
23
- function startMySegmentsSyncTasks() {
24
- (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
25
- mySegmentsSyncTask.start();
26
- });
27
- }
28
- function stopMySegmentsSyncTasks() {
29
- (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
30
- if (mySegmentsSyncTask.isRunning())
31
- mySegmentsSyncTask.stop();
32
- });
33
- }
34
- // smart pausing
35
- readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
36
- if (!splitsSyncTask.isRunning())
37
- return; // noop if not doing polling
38
- var usingSegments = (0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage);
39
- if (usingSegments !== mySegmentsSyncTask.isRunning()) {
40
- log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
41
- if (usingSegments) {
42
- startMySegmentsSyncTasks();
43
- }
44
- else {
45
- stopMySegmentsSyncTasks();
46
- }
47
- }
48
- });
49
- function add(matchingKey, readiness, storage) {
50
- var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
51
- // smart ready
52
- function smartReady(metadata) {
53
- if (!readiness.isReady() && !(0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
54
- readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
16
+ function pollingManagerCSFactory(definitionFetcherFactory) {
17
+ if (definitionFetcherFactory === void 0) { definitionFetcherFactory = splitChangesFetcher_1.splitChangesFetcherFactory; }
18
+ return function (params) {
19
+ var serviceApi = params.serviceApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
20
+ var log = settings.log;
21
+ var definitionChangesFetcher = definitionFetcherFactory(params);
22
+ var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings);
23
+ // Map of matching keys to their corresponding MySegmentsSyncTask.
24
+ var mySegmentsSyncTasks = {};
25
+ var matchingKey = (0, key_1.getMatching)(settings.core.key);
26
+ var mySegmentsSyncTask = add(matchingKey, readiness, storage);
27
+ function startMySegmentsSyncTasks() {
28
+ (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
29
+ mySegmentsSyncTask.start();
30
+ });
55
31
  }
56
- if (!(0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
57
- setTimeout(smartReady, 0);
58
- else
59
- readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
60
- mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
61
- return mySegmentsSyncTask;
62
- }
63
- return {
64
- splitsSyncTask: splitsSyncTask,
65
- segmentsSyncTask: mySegmentsSyncTask,
66
- // Start periodic fetching (polling)
67
- start: function () {
68
- log.info(constants_2.POLLING_START);
69
- splitsSyncTask.start();
70
- if ((0, AbstractSplitsCacheSync_1.usesSegmentsSync)(storage))
71
- startMySegmentsSyncTasks();
72
- },
73
- // Stop periodic fetching (polling)
74
- stop: function () {
75
- log.info(constants_2.POLLING_STOP);
76
- if (splitsSyncTask.isRunning())
77
- splitsSyncTask.stop();
78
- stopMySegmentsSyncTasks();
79
- },
80
- // Used by SyncManager to know if running in polling mode.
81
- isRunning: splitsSyncTask.isRunning,
82
- // fetch splits and segments
83
- syncAll: function () {
84
- var promises = [splitsSyncTask.execute()];
32
+ function stopMySegmentsSyncTasks() {
85
33
  (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
86
- promises.push(mySegmentsSyncTask.execute());
34
+ if (mySegmentsSyncTask.isRunning())
35
+ mySegmentsSyncTask.stop();
87
36
  });
88
- return Promise.all(promises);
89
- },
90
- // Support for handling mySegments sync of multiple clients
91
- add: add,
92
- remove: function (matchingKey) {
93
- delete mySegmentsSyncTasks[matchingKey];
94
- },
95
- get: function (matchingKey) {
96
- return mySegmentsSyncTasks[matchingKey];
97
37
  }
38
+ // smart pausing
39
+ readiness.definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, function () {
40
+ if (!definitionsSyncTask.isRunning())
41
+ return; // noop if not doing polling
42
+ var usingSegments = (0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage);
43
+ if (usingSegments !== mySegmentsSyncTask.isRunning()) {
44
+ log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
45
+ if (usingSegments) {
46
+ startMySegmentsSyncTasks();
47
+ }
48
+ else {
49
+ stopMySegmentsSyncTasks();
50
+ }
51
+ }
52
+ });
53
+ function add(matchingKey, readiness, storage) {
54
+ var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(serviceApi.fetchMemberships, storage, readiness, settings, matchingKey);
55
+ // smart ready
56
+ function smartReady(metadata) {
57
+ if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
58
+ readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
59
+ }
60
+ if (!(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
61
+ setTimeout(smartReady, 0);
62
+ else
63
+ readiness.definitions.once(constants_1.SDK_DEFINITIONS_ARRIVED, smartReady);
64
+ mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
65
+ return mySegmentsSyncTask;
66
+ }
67
+ return {
68
+ definitionsSyncTask: definitionsSyncTask,
69
+ segmentsSyncTask: mySegmentsSyncTask,
70
+ // Start periodic fetching (polling)
71
+ start: function () {
72
+ log.info(constants_2.POLLING_START);
73
+ definitionsSyncTask.start();
74
+ if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
75
+ startMySegmentsSyncTasks();
76
+ },
77
+ // Stop periodic fetching (polling)
78
+ stop: function () {
79
+ log.info(constants_2.POLLING_STOP);
80
+ if (definitionsSyncTask.isRunning())
81
+ definitionsSyncTask.stop();
82
+ stopMySegmentsSyncTasks();
83
+ },
84
+ // Used by SyncManager to know if running in polling mode.
85
+ isRunning: definitionsSyncTask.isRunning,
86
+ // fetch definitions and segments
87
+ syncAll: function () {
88
+ var promises = [definitionsSyncTask.execute()];
89
+ (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
90
+ promises.push(mySegmentsSyncTask.execute());
91
+ });
92
+ return Promise.all(promises);
93
+ },
94
+ // Support for handling mySegments sync of multiple clients
95
+ add: add,
96
+ remove: function (matchingKey) {
97
+ delete mySegmentsSyncTasks[matchingKey];
98
+ },
99
+ get: function (matchingKey) {
100
+ return mySegmentsSyncTasks[matchingKey];
101
+ }
102
+ };
98
103
  };
99
104
  }
100
105
  exports.pollingManagerCSFactory = pollingManagerCSFactory;
@@ -1,49 +1,57 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pollingManagerSSFactory = void 0;
4
- var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
4
+ var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
5
5
  var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
6
6
  var constants_1 = require("../../logger/constants");
7
+ var segmentChangesFetcher_1 = require("./fetchers/segmentChangesFetcher");
8
+ var splitChangesFetcher_1 = require("./fetchers/splitChangesFetcher");
7
9
  /**
8
10
  * Expose start / stop mechanism for pulling data from services.
9
11
  */
10
- function pollingManagerSSFactory(params) {
11
- var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
12
- var log = settings.log;
13
- var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings);
14
- var segmentsSyncTask = (0, segmentsSyncTask_1.segmentsSyncTaskFactory)(splitApi.fetchSegmentChanges, storage, readiness, settings);
15
- return {
16
- splitsSyncTask: splitsSyncTask,
17
- segmentsSyncTask: segmentsSyncTask,
18
- // Start periodic fetching (polling)
19
- start: function () {
20
- log.info(constants_1.POLLING_START);
21
- log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "Splits will be refreshed each ".concat(settings.scheduler.featuresRefreshRate, " millis"));
22
- log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "Segments will be refreshed each ".concat(settings.scheduler.segmentsRefreshRate, " millis"));
23
- var startingUp = splitsSyncTask.start();
24
- if (startingUp) {
25
- startingUp.then(function () {
26
- if (splitsSyncTask.isRunning())
27
- segmentsSyncTask.start();
12
+ function pollingManagerSSFactory(definitionFetcherFactory, segmentFetcherFactory) {
13
+ if (definitionFetcherFactory === void 0) { definitionFetcherFactory = splitChangesFetcher_1.splitChangesFetcherFactory; }
14
+ if (segmentFetcherFactory === void 0) { segmentFetcherFactory = function (params) { return (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(params.serviceApi.fetchSegmentChanges); }; }
15
+ return function (params) {
16
+ var storage = params.storage, readiness = params.readiness, settings = params.settings;
17
+ var log = settings.log;
18
+ var definitionChangesFetcher = definitionFetcherFactory(params);
19
+ var segmentChangesFetcher = segmentFetcherFactory(params);
20
+ var segmentsSyncTask = (0, segmentsSyncTask_1.segmentsSyncTaskFactory)(segmentChangesFetcher, storage, readiness, settings);
21
+ var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings, segmentsSyncTask);
22
+ return {
23
+ definitionsSyncTask: definitionsSyncTask,
24
+ segmentsSyncTask: segmentsSyncTask,
25
+ // Start periodic fetching (polling)
26
+ start: function () {
27
+ log.info(constants_1.POLLING_START);
28
+ log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "".concat(definitionChangesFetcher.type, " will be refreshed each ").concat(settings.scheduler.featuresRefreshRate, " millis"));
29
+ log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "segments will be refreshed each ".concat(settings.scheduler.segmentsRefreshRate, " millis"));
30
+ var startingUp = definitionsSyncTask.start();
31
+ if (startingUp) {
32
+ startingUp.then(function () {
33
+ if (definitionsSyncTask.isRunning())
34
+ segmentsSyncTask.start();
35
+ });
36
+ }
37
+ },
38
+ // Stop periodic fetching (polling)
39
+ stop: function () {
40
+ log.info(constants_1.POLLING_STOP);
41
+ if (definitionsSyncTask.isRunning())
42
+ definitionsSyncTask.stop();
43
+ if (segmentsSyncTask.isRunning())
44
+ segmentsSyncTask.stop();
45
+ },
46
+ // Used by SyncManager to know if running in polling mode.
47
+ isRunning: definitionsSyncTask.isRunning,
48
+ syncAll: function () {
49
+ // fetch definitions and segments. There is no need to catch this promise (`DefinitionChangesUpdater` is always resolved with a boolean value)
50
+ return definitionsSyncTask.execute().then(function () {
51
+ return segmentsSyncTask.execute();
28
52
  });
29
53
  }
30
- },
31
- // Stop periodic fetching (polling)
32
- stop: function () {
33
- log.info(constants_1.POLLING_STOP);
34
- if (splitsSyncTask.isRunning())
35
- splitsSyncTask.stop();
36
- if (segmentsSyncTask.isRunning())
37
- segmentsSyncTask.stop();
38
- },
39
- // Used by SyncManager to know if running in polling mode.
40
- isRunning: splitsSyncTask.isRunning,
41
- syncAll: function () {
42
- // fetch splits and segments. There is no need to catch this promise (`SplitChangesUpdater` is always resolved with a boolean value)
43
- return splitsSyncTask.execute().then(function () {
44
- return segmentsSyncTask.execute();
45
- });
46
- }
54
+ };
47
55
  };
48
56
  }
49
57
  exports.pollingManagerSSFactory = pollingManagerSSFactory;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.definitionsSyncTaskFactory = void 0;
4
+ var syncTask_1 = require("../../syncTask");
5
+ var definitionChangesUpdater_1 = require("../updaters/definitionChangesUpdater");
6
+ /**
7
+ * Creates a sync task that periodically executes a `definitionChangesUpdater` task
8
+ */
9
+ function definitionsSyncTaskFactory(definitionChangesFetcher, storage, readiness, settings, segmentsSyncTask // undefined for client-side
10
+ ) {
11
+ return (0, syncTask_1.syncTaskFactory)(settings.log, (0, definitionChangesUpdater_1.definitionChangesUpdaterFactory)(settings.log, definitionChangesFetcher, storage, settings.sync.__splitFiltersValidation, readiness.definitions, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, segmentsSyncTask), settings.scheduler.featuresRefreshRate, 'definitionChangesUpdater');
12
+ }
13
+ exports.definitionsSyncTaskFactory = definitionsSyncTaskFactory;
@@ -2,12 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.segmentsSyncTaskFactory = void 0;
4
4
  var syncTask_1 = require("../../syncTask");
5
- var segmentChangesFetcher_1 = require("../fetchers/segmentChangesFetcher");
6
5
  var segmentChangesUpdater_1 = require("../updaters/segmentChangesUpdater");
7
6
  /**
8
7
  * Creates a sync task that periodically executes a `segmentChangesUpdater` task
9
8
  */
10
- function segmentsSyncTaskFactory(fetchSegmentChanges, storage, readiness, settings) {
11
- return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log, (0, segmentChangesFetcher_1.segmentChangesFetcherFactory)(fetchSegmentChanges), storage.segments, readiness, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'segmentChangesUpdater');
9
+ function segmentsSyncTaskFactory(segmentChangesFetcher, storage, readiness, settings) {
10
+ return (0, syncTask_1.syncTaskFactory)(settings.log, (0, segmentChangesUpdater_1.segmentChangesUpdaterFactory)(settings.log, segmentChangesFetcher, storage.segments, readiness, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady), settings.scheduler.segmentsRefreshRate, 'segmentChangesUpdater');
12
11
  }
13
12
  exports.segmentsSyncTaskFactory = segmentsSyncTaskFactory;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.splitChangesUpdaterFactory = exports.computeMutation = exports.parseSegments = void 0;
3
+ exports.definitionChangesUpdaterFactory = exports.computeMutation = exports.parseSegments = void 0;
4
4
  var timeout_1 = require("../../../utils/promise/timeout");
5
5
  var constants_1 = require("../../../readiness/constants");
6
6
  var constants_2 = require("../../../logger/constants");
@@ -8,16 +8,6 @@ var lang_1 = require("../../../utils/lang");
8
8
  var constants_3 = require("../../../utils/constants");
9
9
  var sets_1 = require("../../../utils/lang/sets");
10
10
  var constants_4 = require("../../streaming/constants");
11
- // Checks that all registered segments have been fetched (changeNumber !== -1 for every segment).
12
- // Returns a promise that could be rejected.
13
- // @TODO review together with Segments and MySegments storage APIs
14
- function checkAllSegmentsExist(segments) {
15
- var registeredSegments = Promise.resolve(segments.getRegisteredSegments());
16
- return registeredSegments.then(function (segmentNames) {
17
- return Promise.all(segmentNames.map(function (segmentName) { return segments.getChangeNumber(segmentName); }))
18
- .then(function (changeNumbers) { return changeNumbers.every(function (changeNumber) { return changeNumber !== undefined; }); });
19
- });
20
- }
21
11
  /**
22
12
  * Collect segments from a raw FF or RBS definition.
23
13
  * Exported for testing purposes.
@@ -47,111 +37,118 @@ function parseSegments(ruleEntity, matcherType) {
47
37
  }
48
38
  exports.parseSegments = parseSegments;
49
39
  /**
50
- * If there are defined filters and one feature flag doesn't match with them, its status is changed to 'ARCHIVE' to avoid storing it
40
+ * If there are defined filters and one definition doesn't match with them, its status is changed to 'ARCHIVE' to avoid storing it
51
41
  * If there is `bySet` filter, `byName` and `byPrefix` filters are ignored
52
42
  *
53
- * @param featureFlag - feature flag to be evaluated
43
+ * @param definition - definition to be evaluated
54
44
  * @param filters - splitFiltersValidation bySet | byName
55
45
  */
56
- function matchFilters(featureFlag, filters) {
46
+ function matchFilters(definition, filters) {
57
47
  var _a = filters.groupedFilters, setsFilter = _a.bySet, namesFilter = _a.byName, prefixFilter = _a.byPrefix;
58
48
  if (setsFilter.length > 0)
59
- return featureFlag.sets && featureFlag.sets.some(function (featureFlagSet) { return setsFilter.indexOf(featureFlagSet) > -1; });
49
+ return definition.sets && definition.sets.some(function (definitionSet) { return setsFilter.indexOf(definitionSet) > -1; });
60
50
  var namesFilterConfigured = namesFilter.length > 0;
61
51
  var prefixFilterConfigured = prefixFilter.length > 0;
62
52
  if (!namesFilterConfigured && !prefixFilterConfigured)
63
53
  return true;
64
- var matchNames = namesFilterConfigured && namesFilter.indexOf(featureFlag.name) > -1;
65
- var matchPrefix = prefixFilterConfigured && prefixFilter.some(function (prefix) { return (0, lang_1.startsWith)(featureFlag.name, prefix); });
54
+ var matchNames = namesFilterConfigured && namesFilter.indexOf(definition.name) > -1;
55
+ var matchPrefix = prefixFilterConfigured && prefixFilter.some(function (prefix) { return (0, lang_1.startsWith)(definition.name, prefix); });
66
56
  return matchNames || matchPrefix;
67
57
  }
68
58
  /**
69
- * Given the list of splits from /splitChanges endpoint, it returns the mutations,
70
- * i.e., an object with added splits, removed splits and used segments.
59
+ * Given the list of definitions from /splitChanges or /configs endpoint, it returns the mutations,
60
+ * i.e., an object with added definitions, removed definitions, and used segments.
71
61
  * Exported for testing purposes.
72
62
  */
73
- function computeMutation(rules, segments, filters) {
74
- return rules.reduce(function (accum, ruleEntity) {
75
- if (ruleEntity.status !== 'ARCHIVED' && (!filters || matchFilters(ruleEntity, filters))) {
76
- accum.added.push(ruleEntity);
63
+ function computeMutation(update, segments, filters) {
64
+ return update.updated.reduce(function (accum, ruleEntity) {
65
+ if (!filters || matchFilters(ruleEntity, filters)) {
66
+ accum.updated.push(ruleEntity);
77
67
  parseSegments(ruleEntity).forEach(function (segmentName) {
78
68
  segments.add(segmentName);
79
69
  });
80
70
  }
81
71
  else {
82
- accum.removed.push(ruleEntity);
72
+ accum.removed.push(ruleEntity.name);
83
73
  }
84
74
  accum.names.push(ruleEntity.name);
85
75
  return accum;
86
- }, { added: [], removed: [], names: [] });
76
+ }, { updated: [], removed: update.removed, names: update.removed.slice() });
87
77
  }
88
78
  exports.computeMutation = computeMutation;
79
+ function convertInstantUpdateToDefinitionChanges(instantUpdate) {
80
+ var payload = instantUpdate.payload, changeNumber = instantUpdate.changeNumber;
81
+ return payload.status === 'ARCHIVED' ?
82
+ { till: changeNumber, updated: [], removed: [payload.name] } :
83
+ { till: changeNumber, updated: [payload], removed: [] };
84
+ }
89
85
  /**
90
- * factory of SplitChanges updater, a task that:
91
- * - fetches split changes using `splitChangesFetcher`
92
- * - updates `splitsCache`
93
- * - uses `splitsEventEmitter` to emit events related to split data updates
86
+ * Factory of DefinitionChanges updater, a task that:
87
+ * - fetches definition changes using `definitionChangesFetcher`
88
+ * - updates definitions storage
89
+ * - uses `definitionsEventEmitter` to emit events related to definition data updates
94
90
  *
95
91
  * @param log - Logger instance
96
- * @param splitChangesFetcher - Fetcher of `/splitChanges`
97
- * @param splits - Splits storage, with sync or async methods
92
+ * @param definitionChangesFetcher - Fetcher of `/splitChanges` or `/configs`
93
+ * @param definitions - Definitions storage, with sync or async methods
98
94
  * @param segments - Segments storage, with sync or async methods
99
- * @param splitsEventEmitter - Optional readiness manager. Not required for synchronizer or producer mode.
95
+ * @param definitionsEventEmitter - Optional readiness manager. Not required for synchronizer or producer mode.
100
96
  * @param requestTimeoutBeforeReady - How long the updater will wait for the request to timeout. Default 0, i.e., never timeout.
101
- * @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
97
+ * @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` or `/configs` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
102
98
  */
103
- function splitChangesUpdaterFactory(log, splitChangesFetcher, storage, splitFiltersValidation, splitsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, isClientSide) {
99
+ function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage, splitFiltersValidation, definitionsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, segmentsSyncTask // undefined for client-side
100
+ ) {
104
101
  if (requestTimeoutBeforeReady === void 0) { requestTimeoutBeforeReady = 0; }
105
102
  if (retriesOnFailureBeforeReady === void 0) { retriesOnFailureBeforeReady = 0; }
106
- var splits = storage.splits, rbSegments = storage.rbSegments, segments = storage.segments;
103
+ var definitions = storage.definitions, rbSegments = storage.rbSegments, segments = storage.segments;
107
104
  var startingUp = true;
108
- /** timeout decorator for `splitChangesFetcher` promise */
105
+ /** timeout decorator for `definitionChangesFetcher` promise */
109
106
  function _promiseDecorator(promise) {
110
107
  if (startingUp && requestTimeoutBeforeReady)
111
108
  promise = (0, timeout_1.timeout)(requestTimeoutBeforeReady, promise);
112
109
  return promise;
113
110
  }
114
111
  /**
115
- * SplitChanges updater returns a promise that resolves with a `false` boolean value if it fails to fetch splits or synchronize them with the storage.
112
+ * DefinitionChanges updater returns a promise that resolves with a `false` boolean value if it fails to fetch definitions or synchronize them with the storage.
116
113
  * Returned promise will not be rejected.
117
114
  *
118
115
  * @param noCache - true to revalidate data to fetch
119
116
  * @param till - query param to bypass CDN requests
120
117
  */
121
- return function splitChangesUpdater(noCache, till, instantUpdate) {
118
+ return function definitionChangesUpdater(noCache, till, instantUpdate) {
122
119
  /**
123
- * @param since - current changeNumber at splitsCache
120
+ * @param since - current changeNumber at definitionsCache
124
121
  * @param retry - current number of retry attempts
125
122
  */
126
- function _splitChangesUpdater(sinces, retry) {
123
+ function _definitionChangesUpdater(sinces, retry) {
127
124
  if (retry === void 0) { retry = 0; }
128
125
  var since = sinces[0], rbSince = sinces[1];
129
- log.debug(constants_2.SYNC_SPLITS_FETCH, sinces);
126
+ log.debug(constants_2.SYNC_FETCH, [definitionChangesFetcher.type, since, rbSince]);
130
127
  return Promise.resolve(instantUpdate ?
131
- instantUpdate.type === constants_4.SPLIT_UPDATE ?
132
- // IFFU edge case: a change to a flag that adds an IN_RULE_BASED_SEGMENT matcher that is not present yet
128
+ instantUpdate.type === constants_4.RB_SEGMENT_UPDATE ?
129
+ { rbs: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
130
+ // IFFU edge case: a change to definition that adds an IN_RULE_BASED_SEGMENT matcher that is not present yet
133
131
  Promise.resolve(rbSegments.contains(parseSegments(instantUpdate.payload, constants_3.IN_RULE_BASED_SEGMENT))).then(function (contains) {
134
132
  return contains ?
135
- { ff: { d: [instantUpdate.payload], t: instantUpdate.changeNumber } } :
136
- splitChangesFetcher(since, noCache, till, rbSince, _promiseDecorator);
133
+ { d: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
134
+ definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator);
137
135
  }) :
138
- { rbs: { d: [instantUpdate.payload], t: instantUpdate.changeNumber } } :
139
- splitChangesFetcher(since, noCache, till, rbSince, _promiseDecorator))
140
- .then(function (splitChanges) {
136
+ definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator))
137
+ .then(function (definitionChanges) {
141
138
  var usedSegments = new Set();
142
- var updatedFlags = [];
139
+ var updatedDefinitions = [];
143
140
  var ffUpdate = false;
144
- if (splitChanges.ff) {
145
- var _a = computeMutation(splitChanges.ff.d || [], usedSegments, splitFiltersValidation), added = _a.added, removed = _a.removed, names = _a.names;
146
- updatedFlags = names;
147
- log.debug(constants_2.SYNC_SPLITS_UPDATE, [added.length, removed.length]);
148
- ffUpdate = splits.update(added, removed, splitChanges.ff.t);
141
+ if (definitionChanges.d) {
142
+ var _a = computeMutation(definitionChanges.d, usedSegments, splitFiltersValidation), updated = _a.updated, removed = _a.removed, names = _a.names;
143
+ updatedDefinitions = names;
144
+ log.debug(constants_2.SYNC_UPDATE, [definitionChangesFetcher.type, updated.length, removed.length]);
145
+ ffUpdate = definitions.update(updated, removed, definitionChanges.d.till);
149
146
  }
150
147
  var rbsUpdate = false;
151
- if (splitChanges.rbs) {
152
- var _b = computeMutation(splitChanges.rbs.d || [], usedSegments), added = _b.added, removed = _b.removed;
153
- log.debug(constants_2.SYNC_RBS_UPDATE, [added.length, removed.length]);
154
- rbsUpdate = rbSegments.update(added, removed, splitChanges.rbs.t);
148
+ if (definitionChanges.rbs) {
149
+ var _b = computeMutation(definitionChanges.rbs, usedSegments), updated = _b.updated, removed = _b.removed;
150
+ log.debug(constants_2.SYNC_UPDATE, ['rule-based segments', updated.length, removed.length]);
151
+ rbsUpdate = rbSegments.update(updated, removed, definitionChanges.rbs.till);
155
152
  }
156
153
  return Promise.all([ffUpdate, rbsUpdate,
157
154
  // @TODO if at least 1 segment fetch fails due to 404 and other segments are updated in the storage, SDK_UPDATE is not emitted
@@ -161,18 +158,18 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, storage, splitFilt
161
158
  if (storage.save)
162
159
  storage.save();
163
160
  startingUp = false;
164
- if (splitsEventEmitter) {
165
- // To emit SDK_SPLITS_ARRIVED for server-side SDK, we must check that all registered segments have been fetched
166
- return Promise.resolve(!splitsEventEmitter.splitsArrived || ((ffChanged || rbsChanged) && (isClientSide || checkAllSegmentsExist(segments))))
161
+ if (definitionsEventEmitter) {
162
+ // To emit SDK_DEFINITIONS_ARRIVED for server-side SDK, we must wait for all registered segments to be fetched
163
+ return Promise.resolve(!definitionsEventEmitter.definitionsArrived || ((ffChanged || rbsChanged) && (!segmentsSyncTask || segmentsSyncTask.execute(true))))
167
164
  .catch(function () { return false; } /** noop. just to handle a possible `checkAllSegmentsExist` rejection, before emitting SDK event */)
168
165
  .then(function (emitSplitsArrivedEvent) {
169
166
  // emit SDK events
170
167
  if (emitSplitsArrivedEvent) {
171
168
  var metadata = {
172
- type: updatedFlags.length > 0 ? constants_1.FLAGS_UPDATE : constants_1.SEGMENTS_UPDATE,
173
- names: updatedFlags.length > 0 ? updatedFlags : []
169
+ type: updatedDefinitions.length > 0 ? definitionChangesFetcher.type === 'configs' ? constants_1.CONFIGS_UPDATE : constants_1.FLAGS_UPDATE : constants_1.SEGMENTS_UPDATE,
170
+ names: updatedDefinitions.length > 0 ? updatedDefinitions : []
174
171
  };
175
- splitsEventEmitter.emit(constants_1.SDK_SPLITS_ARRIVED, metadata);
172
+ definitionsEventEmitter.emit(constants_1.SDK_DEFINITIONS_ARRIVED, metadata);
176
173
  }
177
174
  return true;
178
175
  });
@@ -183,18 +180,18 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, storage, splitFilt
183
180
  .catch(function (error) {
184
181
  if (startingUp && retriesOnFailureBeforeReady > retry) {
185
182
  retry += 1;
186
- log.warn(constants_2.SYNC_SPLITS_FETCH_RETRY, [retry, error]);
187
- return _splitChangesUpdater(sinces, retry);
183
+ log.warn(constants_2.SYNC_FETCH_RETRY, [definitionChangesFetcher.type, retry, error]);
184
+ return _definitionChangesUpdater(sinces, retry);
188
185
  }
189
186
  else {
190
187
  startingUp = false;
191
- log.warn(constants_2.SYNC_SPLITS_FETCH_FAILS, [error]);
188
+ log.warn(constants_2.SYNC_FETCH_FAILS, [definitionChangesFetcher.type, error]);
192
189
  }
193
190
  return false;
194
191
  });
195
192
  }
196
193
  // `getChangeNumber` never rejects or throws error
197
- return Promise.all([splits.getChangeNumber(), rbSegments.getChangeNumber()]).then(_splitChangesUpdater);
194
+ return Promise.all([definitions.getChangeNumber(), rbSegments.getChangeNumber()]).then(_definitionChangesUpdater);
198
195
  };
199
196
  }
200
- exports.splitChangesUpdaterFactory = splitChangesUpdaterFactory;
197
+ exports.definitionChangesUpdaterFactory = definitionChangesUpdaterFactory;