@splitsoftware/splitio-commons 1.16.1-rc.1 → 1.16.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 (144) hide show
  1. package/CHANGES.txt +4 -0
  2. package/cjs/logger/constants.js +5 -4
  3. package/cjs/logger/messages/info.js +2 -1
  4. package/cjs/logger/messages/warn.js +1 -1
  5. package/cjs/readiness/readinessManager.js +7 -12
  6. package/cjs/services/splitApi.js +5 -9
  7. package/cjs/storages/AbstractSegmentsCacheSync.js +41 -12
  8. package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
  9. package/cjs/storages/AbstractSplitsCacheSync.js +7 -5
  10. package/cjs/storages/KeyBuilder.js +0 -3
  11. package/cjs/storages/KeyBuilderCS.js +6 -0
  12. package/cjs/storages/dataLoader.js +1 -1
  13. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
  14. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
  15. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
  16. package/cjs/storages/inMemory/SplitsCacheInMemory.js +6 -15
  17. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +4 -11
  18. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  19. package/cjs/sync/polling/pollingManagerCS.js +33 -51
  20. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  21. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +14 -20
  22. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  23. package/cjs/sync/streaming/SSEHandler/index.js +3 -6
  24. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -9
  25. package/cjs/sync/streaming/constants.js +3 -4
  26. package/cjs/sync/streaming/parseUtils.js +14 -9
  27. package/cjs/sync/streaming/pushManager.js +29 -55
  28. package/cjs/sync/submitters/telemetrySubmitter.js +0 -2
  29. package/cjs/sync/syncManagerOnline.js +14 -24
  30. package/cjs/utils/constants/index.js +4 -5
  31. package/cjs/utils/settingsValidation/index.js +1 -5
  32. package/esm/logger/constants.js +2 -1
  33. package/esm/logger/messages/info.js +2 -1
  34. package/esm/logger/messages/warn.js +1 -1
  35. package/esm/readiness/readinessManager.js +7 -12
  36. package/esm/services/splitApi.js +6 -10
  37. package/esm/storages/AbstractSegmentsCacheSync.js +41 -12
  38. package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
  39. package/esm/storages/AbstractSplitsCacheSync.js +5 -3
  40. package/esm/storages/KeyBuilder.js +0 -3
  41. package/esm/storages/KeyBuilderCS.js +6 -0
  42. package/esm/storages/dataLoader.js +1 -1
  43. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +29 -52
  44. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
  45. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +9 -40
  46. package/esm/storages/inMemory/SplitsCacheInMemory.js +7 -16
  47. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +4 -11
  48. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  49. package/esm/sync/polling/pollingManagerCS.js +34 -52
  50. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  51. package/esm/sync/polling/updaters/mySegmentsUpdater.js +12 -18
  52. package/esm/sync/streaming/AuthClient/index.js +1 -1
  53. package/esm/sync/streaming/SSEHandler/index.js +4 -7
  54. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +15 -9
  55. package/esm/sync/streaming/constants.js +2 -3
  56. package/esm/sync/streaming/parseUtils.js +12 -8
  57. package/esm/sync/streaming/pushManager.js +32 -57
  58. package/esm/sync/submitters/telemetrySubmitter.js +0 -2
  59. package/esm/sync/syncManagerOnline.js +15 -25
  60. package/esm/utils/constants/index.js +2 -3
  61. package/esm/utils/settingsValidation/index.js +1 -5
  62. package/package.json +1 -1
  63. package/src/dtos/types.ts +7 -8
  64. package/src/logger/constants.ts +2 -1
  65. package/src/logger/messages/info.ts +2 -1
  66. package/src/logger/messages/warn.ts +1 -1
  67. package/src/readiness/readinessManager.ts +7 -9
  68. package/src/readiness/types.ts +0 -1
  69. package/src/services/splitApi.ts +7 -12
  70. package/src/services/splitHttpClient.ts +1 -1
  71. package/src/services/types.ts +2 -3
  72. package/src/storages/AbstractSegmentsCacheSync.ts +53 -12
  73. package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
  74. package/src/storages/AbstractSplitsCacheSync.ts +7 -5
  75. package/src/storages/KeyBuilder.ts +0 -3
  76. package/src/storages/KeyBuilderCS.ts +9 -0
  77. package/src/storages/dataLoader.ts +1 -1
  78. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +26 -56
  79. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
  80. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +10 -44
  81. package/src/storages/inMemory/SplitsCacheInMemory.ts +7 -13
  82. package/src/storages/types.ts +10 -8
  83. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +7 -14
  84. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  85. package/src/sync/polling/fetchers/types.ts +2 -2
  86. package/src/sync/polling/pollingManagerCS.ts +29 -61
  87. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +12 -13
  88. package/src/sync/polling/types.ts +8 -8
  89. package/src/sync/polling/updaters/mySegmentsUpdater.ts +17 -18
  90. package/src/sync/streaming/AuthClient/index.ts +1 -1
  91. package/src/sync/streaming/SSEClient/index.ts +4 -6
  92. package/src/sync/streaming/SSEHandler/index.ts +5 -9
  93. package/src/sync/streaming/SSEHandler/types.ts +13 -25
  94. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +17 -12
  95. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  96. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  97. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  98. package/src/sync/streaming/constants.ts +2 -3
  99. package/src/sync/streaming/parseUtils.ts +19 -11
  100. package/src/sync/streaming/pushManager.ts +38 -68
  101. package/src/sync/streaming/types.ts +11 -13
  102. package/src/sync/submitters/telemetrySubmitter.ts +0 -2
  103. package/src/sync/submitters/types.ts +3 -6
  104. package/src/sync/syncManagerOnline.ts +11 -19
  105. package/src/types.ts +1 -26
  106. package/src/utils/constants/index.ts +2 -3
  107. package/src/utils/settingsValidation/index.ts +1 -5
  108. package/types/dtos/types.d.ts +7 -8
  109. package/types/logger/constants.d.ts +2 -1
  110. package/types/readiness/types.d.ts +0 -1
  111. package/types/services/decorateHeaders.d.ts +2 -0
  112. package/types/services/splitApi.d.ts +1 -1
  113. package/types/services/splitHttpClient.d.ts +1 -1
  114. package/types/services/types.d.ts +2 -3
  115. package/types/storages/AbstractSegmentsCacheSync.d.ts +9 -11
  116. package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
  117. package/types/storages/AbstractSplitsCacheSync.d.ts +4 -4
  118. package/types/storages/KeyBuilder.d.ts +0 -1
  119. package/types/storages/KeyBuilderCS.d.ts +2 -0
  120. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -12
  121. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
  122. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +3 -9
  123. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
  124. package/types/storages/types.d.ts +8 -7
  125. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  126. package/types/sync/polling/fetchers/types.d.ts +2 -2
  127. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +4 -3
  128. package/types/sync/polling/types.d.ts +8 -12
  129. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -2
  130. package/types/sync/streaming/SSEHandler/types.d.ts +13 -22
  131. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -3
  132. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +2 -1
  133. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +3 -2
  134. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  135. package/types/sync/streaming/constants.d.ts +2 -3
  136. package/types/sync/streaming/parseUtils.d.ts +4 -5
  137. package/types/sync/streaming/pushManager.d.ts +0 -2
  138. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +9 -0
  139. package/types/sync/streaming/pushManager_Spec1_3.d.ts +9 -0
  140. package/types/sync/streaming/types.d.ts +9 -10
  141. package/types/sync/submitters/types.d.ts +3 -6
  142. package/types/types.d.ts +0 -25
  143. package/types/utils/constants/index.d.ts +2 -3
  144. package/types/utils/settingsValidation/index.d.ts +0 -2
@@ -5,7 +5,6 @@ var tslib_1 = require("tslib");
5
5
  var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
6
6
  var lang_1 = require("../../utils/lang");
7
7
  var sets_1 = require("../../utils/lang/sets");
8
- var constants_1 = require("../../utils/constants");
9
8
  /**
10
9
  * Default ISplitsCacheSync implementation that stores split definitions in memory.
11
10
  * Supported by all JS runtimes.
@@ -18,7 +17,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
18
17
  _this.ttCache = {};
19
18
  _this.changeNumber = -1;
20
19
  _this.segmentsCount = 0;
21
- _this.largeSegmentsCount = 0;
22
20
  _this.flagSetsCache = {};
23
21
  _this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
24
22
  return _this;
@@ -28,7 +26,6 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
28
26
  this.ttCache = {};
29
27
  this.changeNumber = -1;
30
28
  this.segmentsCount = 0;
31
- this.largeSegmentsCount = 0;
32
29
  };
33
30
  SplitsCacheInMemory.prototype.addSplit = function (name, split) {
34
31
  var previousSplit = this.getSplit(name);
@@ -38,11 +35,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
38
35
  if (!this.ttCache[previousTtName])
39
36
  delete this.ttCache[previousTtName];
40
37
  this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
41
- // Substract from segments count for the previous version of this Split.
42
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_SEGMENT))
38
+ // Subtract from segments count for the previous version of this Split
39
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit))
43
40
  this.segmentsCount--;
44
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
45
- this.largeSegmentsCount--;
46
41
  }
47
42
  if (split) {
48
43
  // Store the Split.
@@ -52,10 +47,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
52
47
  this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
53
48
  this.addToFlagSets(split);
54
49
  // Add to segments count for the new version of the Split
55
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
50
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
56
51
  this.segmentsCount++;
57
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
58
- this.largeSegmentsCount++;
59
52
  return true;
60
53
  }
61
54
  else {
@@ -73,10 +66,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
73
66
  delete this.ttCache[ttName];
74
67
  this.removeFromFlagSets(split.name, split.sets);
75
68
  // Update the segments count.
76
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_SEGMENT))
69
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
77
70
  this.segmentsCount--;
78
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
79
- this.largeSegmentsCount--;
80
71
  return true;
81
72
  }
82
73
  else {
@@ -99,8 +90,8 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
99
90
  SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
100
91
  return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
101
92
  };
102
- SplitsCacheInMemory.prototype.usesMatcher = function (matcherType) {
103
- return this.getChangeNumber() === -1 || (matcherType === constants_1.IN_SEGMENT ? this.segmentsCount > 0 : this.largeSegmentsCount > 0);
93
+ SplitsCacheInMemory.prototype.usesSegments = function () {
94
+ return this.getChangeNumber() === -1 || this.segmentsCount > 0;
104
95
  };
105
96
  SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
106
97
  var _this = this;
@@ -5,21 +5,14 @@ exports.mySegmentsFetcherFactory = void 0;
5
5
  * Factory of MySegments fetcher.
6
6
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
7
7
  */
8
- function mySegmentsFetcherFactory(fetchMySegments) {
8
+ function mySegmentsFetcherFactory(fetchMemberships) {
9
9
  return function mySegmentsFetcher(userMatchingKey, noCache,
10
- // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
10
+ // Optional decorator for `fetchMemberships` promise, such as timeout or time tracker
11
11
  decorator) {
12
- var mySegmentsPromise = fetchMySegments(userMatchingKey, noCache);
12
+ var mySegmentsPromise = fetchMemberships(userMatchingKey, noCache);
13
13
  if (decorator)
14
14
  mySegmentsPromise = decorator(mySegmentsPromise);
15
- // Extract segment names
16
- return mySegmentsPromise
17
- .then(function (resp) { return resp.json(); })
18
- .then(function (json) {
19
- return json.mySegments ?
20
- json.mySegments.map(function (segment) { return segment.name; }) :
21
- json.myLargeSegments;
22
- });
15
+ return mySegmentsPromise.then(function (resp) { return resp.json(); });
23
16
  };
24
17
  }
25
18
  exports.mySegmentsFetcherFactory = mySegmentsFetcherFactory;
@@ -23,7 +23,7 @@ function greedyFetch(fetchSegmentChanges, since, segmentName, noCache, targetTil
23
23
  */
24
24
  function segmentChangesFetcherFactory(fetchSegmentChanges) {
25
25
  return function segmentChangesFetcher(since, segmentName, noCache, till,
26
- // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
26
+ // Optional decorator for `fetchSegmentChanges` promise, such as timeout or time tracker
27
27
  decorator) {
28
28
  var segmentsPromise = greedyFetch(fetchSegmentChanges, since, segmentName, noCache, till);
29
29
  if (decorator)
@@ -7,7 +7,6 @@ var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
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 constants_3 = require("../../utils/constants");
11
10
  /**
12
11
  * Expose start / stop mechanism for polling data from services.
13
12
  * For client-side API with multiple clients.
@@ -16,74 +15,59 @@ function pollingManagerCSFactory(params) {
16
15
  var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
17
16
  var log = settings.log;
18
17
  var splitsSyncTask = (0, splitsSyncTask_1.splitsSyncTaskFactory)(splitApi.fetchSplitChanges, storage, readiness, settings, true);
19
- // Map of matching keys to their corresponding MySegmentsSyncTask for segments and large segments.
18
+ // Map of matching keys to their corresponding MySegmentsSyncTask.
20
19
  var mySegmentsSyncTasks = {};
21
20
  var matchingKey = (0, key_1.getMatching)(settings.core.key);
22
- var _a = add(matchingKey, readiness, storage), msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
21
+ var mySegmentsSyncTask = add(matchingKey, readiness, storage);
23
22
  function startMySegmentsSyncTasks() {
24
- var splitsHaveSegments = storage.splits.usesMatcher(constants_3.IN_SEGMENT);
25
- var splitsHaveLargeSegments = storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT);
26
- (0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
27
- var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
28
- if (splitsHaveSegments)
29
- msSyncTask.start();
30
- else
31
- msSyncTask.stop(); // smart pausing
32
- if (mlsSyncTask) {
33
- if (splitsHaveLargeSegments)
34
- mlsSyncTask.start();
35
- else
36
- mlsSyncTask.stop(); // smart pausing
37
- }
23
+ (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
24
+ mySegmentsSyncTask.start();
38
25
  });
39
26
  }
40
27
  function stopMySegmentsSyncTasks() {
41
- (0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
42
- var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
43
- msSyncTask.stop();
44
- mlsSyncTask && mlsSyncTask.stop();
28
+ (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
29
+ if (mySegmentsSyncTask.isRunning())
30
+ mySegmentsSyncTask.stop();
45
31
  });
46
32
  }
33
+ // smart pausing
47
34
  readiness.splits.on(constants_1.SDK_SPLITS_ARRIVED, function () {
48
- if (splitsSyncTask.isRunning())
49
- startMySegmentsSyncTasks();
35
+ if (!splitsSyncTask.isRunning())
36
+ return; // noop if not doing polling
37
+ var splitsHaveSegments = storage.splits.usesSegments();
38
+ if (splitsHaveSegments !== mySegmentsSyncTask.isRunning()) {
39
+ log.info(constants_2.POLLING_SMART_PAUSING, [splitsHaveSegments ? 'ON' : 'OFF']);
40
+ if (splitsHaveSegments) {
41
+ startMySegmentsSyncTasks();
42
+ }
43
+ else {
44
+ stopMySegmentsSyncTasks();
45
+ }
46
+ }
50
47
  });
51
48
  function add(matchingKey, readiness, storage) {
52
- var msSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMySegments, storage.segments, function () { if (storage.splits.usesMatcher(constants_3.IN_SEGMENT))
53
- readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
54
- var mlsSyncTask;
55
- if (settings.sync.largeSegmentsEnabled) {
56
- mlsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMyLargeSegments, storage.largeSegments, function () { if (readiness.largeSegments && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
57
- readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED); }, settings, matchingKey, settings.scheduler.largeSegmentsRefreshRate, 'myLargeSegmentsUpdater');
58
- }
49
+ var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
59
50
  // smart ready
60
51
  function smartReady() {
61
- if (!readiness.isReady()) {
62
- if (readiness.largeSegments && !storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
63
- readiness.largeSegments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
64
- if (!storage.splits.usesMatcher(constants_3.IN_SEGMENT))
65
- readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
66
- }
52
+ if (!readiness.isReady() && !storage.splits.usesSegments())
53
+ readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED);
67
54
  }
68
- if (storage.splits.usesMatcher(constants_3.IN_SEGMENT) && storage.splits.usesMatcher(constants_3.IN_LARGE_SEGMENT))
69
- readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
70
- else
55
+ if (!storage.splits.usesSegments())
71
56
  setTimeout(smartReady, 0);
72
- mySegmentsSyncTasks[matchingKey] = { msSyncTask: msSyncTask, mlsSyncTask: mlsSyncTask };
73
- return {
74
- msSyncTask: msSyncTask,
75
- mlsSyncTask: mlsSyncTask
76
- };
57
+ else
58
+ readiness.splits.once(constants_1.SDK_SPLITS_ARRIVED, smartReady);
59
+ mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
60
+ return mySegmentsSyncTask;
77
61
  }
78
62
  return {
79
63
  splitsSyncTask: splitsSyncTask,
80
- segmentsSyncTask: msSyncTask,
81
- largeSegmentsSyncTask: mlsSyncTask,
64
+ segmentsSyncTask: mySegmentsSyncTask,
82
65
  // Start periodic fetching (polling)
83
66
  start: function () {
84
67
  log.info(constants_2.POLLING_START);
85
68
  splitsSyncTask.start();
86
- startMySegmentsSyncTasks();
69
+ if (storage.splits.usesSegments())
70
+ startMySegmentsSyncTasks();
87
71
  },
88
72
  // Stop periodic fetching (polling)
89
73
  stop: function () {
@@ -97,10 +81,8 @@ function pollingManagerCSFactory(params) {
97
81
  // fetch splits and segments
98
82
  syncAll: function () {
99
83
  var promises = [splitsSyncTask.execute()];
100
- (0, lang_1.forOwn)(mySegmentsSyncTasks, function (_a) {
101
- var msSyncTask = _a.msSyncTask, mlsSyncTask = _a.mlsSyncTask;
102
- promises.push(msSyncTask.execute());
103
- mlsSyncTask && promises.push(mlsSyncTask.execute());
84
+ (0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
85
+ promises.push(mySegmentsSyncTask.execute());
104
86
  });
105
87
  return Promise.all(promises);
106
88
  },
@@ -7,7 +7,7 @@ var mySegmentsUpdater_1 = require("../updaters/mySegmentsUpdater");
7
7
  /**
8
8
  * Creates a sync task that periodically executes a `mySegmentsUpdater` task
9
9
  */
10
- function mySegmentsSyncTaskFactory(fetchMySegments, mySegmentsCache, notifyUpdate, settings, matchingKey, segmentsRefreshRate, NAME) {
11
- return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMySegments), mySegmentsCache, notifyUpdate, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), segmentsRefreshRate, NAME);
10
+ function mySegmentsSyncTaskFactory(fetchMemberships, storage, readiness, settings, matchingKey) {
11
+ return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMemberships), storage, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
12
12
  }
13
13
  exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
@@ -2,14 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mySegmentsUpdaterFactory = void 0;
4
4
  var timeout_1 = require("../../../utils/promise/timeout");
5
- var constants_1 = require("../../../logger/constants");
5
+ var constants_1 = require("../../../readiness/constants");
6
+ var constants_2 = require("../../../logger/constants");
7
+ var constants_3 = require("../../streaming/constants");
6
8
  /**
7
9
  * factory of MySegments updater, a task that:
8
10
  * - fetches mySegments using `mySegmentsFetcher`
9
11
  * - updates `mySegmentsCache`
10
12
  * - uses `segmentsEventEmitter` to emit events related to segments data updates
11
13
  */
12
- function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notifyUpdate, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
14
+ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
15
+ var splits = storage.splits, segments = storage.segments, largeSegments = storage.largeSegments;
13
16
  var readyOnAlreadyExistentState = true;
14
17
  var startingUp = true;
15
18
  /** timeout and telemetry decorator for `splitChangesFetcher` promise */
@@ -21,28 +24,19 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
21
24
  // @TODO if allowing pluggable storages, handle async execution
22
25
  function updateSegments(segmentsData) {
23
26
  var shouldNotifyUpdate;
24
- if (Array.isArray(segmentsData)) {
25
- // Update the list of segment names available
26
- shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
27
+ if (segmentsData.type !== undefined) {
28
+ shouldNotifyUpdate = segmentsData.type === constants_3.MEMBERSHIP_LS_UPDATE ?
29
+ largeSegments.resetSegments(segmentsData) :
30
+ segments.resetSegments(segmentsData);
27
31
  }
28
32
  else {
29
- // Add/Delete the segment
30
- var name_1 = segmentsData.name, add = segmentsData.add;
31
- if (mySegmentsCache.isInSegment(name_1) !== add) {
32
- shouldNotifyUpdate = true;
33
- if (add)
34
- mySegmentsCache.addToSegment(name_1);
35
- else
36
- mySegmentsCache.removeFromSegment(name_1);
37
- }
38
- else {
39
- shouldNotifyUpdate = false;
40
- }
33
+ shouldNotifyUpdate = segments.resetSegments(segmentsData.ms || {});
34
+ shouldNotifyUpdate = largeSegments.resetSegments(segmentsData.ls || {}) || shouldNotifyUpdate;
41
35
  }
42
36
  // Notify update if required
43
- if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
37
+ if (splits.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
44
38
  readyOnAlreadyExistentState = false;
45
- notifyUpdate();
39
+ segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
46
40
  }
47
41
  }
48
42
  function _mySegmentsUpdater(retry, segmentsData, noCache) {
@@ -59,7 +53,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
59
53
  return updaterPromise.catch(function (error) {
60
54
  if (startingUp && retriesOnFailureBeforeReady > retry) {
61
55
  retry += 1;
62
- log.warn(constants_1.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
56
+ log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
63
57
  return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
64
58
  }
65
59
  else {
@@ -13,7 +13,7 @@ var murmur3_1 = require("../../../utils/murmur3/murmur3");
13
13
  function authenticateFactory(fetchAuth) {
14
14
  /**
15
15
  * Run authentication requests to Auth Server, and returns a promise that resolves with the decoded JTW token.
16
- * @param {string[] | undefined} userKeys set of user Keys to track MY_SEGMENTS_CHANGES. It is undefined for server-side API.
16
+ * @param {string[] | undefined} userKeys set of user Keys to track membership updates. It is undefined for server-side API.
17
17
  */
18
18
  return function authenticate(userKeys) {
19
19
  return fetchAuth(userKeys)
@@ -68,21 +68,18 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
68
68
  }
69
69
  var parsedData = messageWithParsedData.parsedData, data = messageWithParsedData.data, channel = messageWithParsedData.channel, timestamp = messageWithParsedData.timestamp;
70
70
  log.debug(constants_2.STREAMING_NEW_MESSAGE, [data]);
71
- // we only handle update events if streaming is up.
71
+ // we only handle update events if streaming is up
72
72
  if (!notificationKeeper.isStreamingUp() && [constants_1.OCCUPANCY, constants_1.CONTROL].indexOf(parsedData.type) === -1)
73
73
  return;
74
74
  switch (parsedData.type) {
75
75
  /* update events */
76
76
  case constants_1.SPLIT_UPDATE:
77
77
  case constants_1.SEGMENT_UPDATE:
78
- case constants_1.MY_SEGMENTS_UPDATE_V2:
79
- case constants_1.MY_LARGE_SEGMENTS_UPDATE:
78
+ case constants_1.MEMBERSHIP_MS_UPDATE:
79
+ case constants_1.MEMBERSHIP_LS_UPDATE:
80
80
  case constants_1.SPLIT_KILL:
81
81
  pushEmitter.emit(parsedData.type, parsedData);
82
82
  break;
83
- case constants_1.MY_SEGMENTS_UPDATE:
84
- pushEmitter.emit(parsedData.type, parsedData, channel);
85
- break;
86
83
  /* occupancy & control events, handled by NotificationManagerKeeper */
87
84
  case constants_1.OCCUPANCY:
88
85
  notificationKeeper.handleOccupancyEvent(parsedData.metrics.publishers, channel, timestamp);
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MySegmentsUpdateWorker = void 0;
4
4
  var Backoff_1 = require("../../../utils/Backoff");
5
+ var constants_1 = require("../../../utils/constants");
5
6
  /**
6
7
  * MySegmentsUpdateWorker factory
7
8
  */
8
- function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType) {
9
+ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
9
10
  var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
10
11
  var currentChangeNumber = -1;
11
12
  var handleNewEvent = false;
@@ -23,6 +24,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
23
24
  var syncTask = _delay ?
24
25
  new Promise(function (res) {
25
26
  _delayTimeoutID = setTimeout(function () {
27
+ _delay = undefined;
26
28
  mySegmentsSyncTask.execute(_segmentsData, true).then(res);
27
29
  }, _delay);
28
30
  }) :
@@ -32,7 +34,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
32
34
  return; // halt if `stop` has been called
33
35
  if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
34
36
  if (_segmentsData)
35
- telemetryTracker.trackUpdatesFromSSE(updateType);
37
+ telemetryTracker.trackUpdatesFromSSE(constants_1.MEMBERSHIPS);
36
38
  currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
37
39
  }
38
40
  if (handleNewEvent) {
@@ -49,17 +51,20 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
49
51
  }
50
52
  return {
51
53
  /**
52
- * Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
54
+ * Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
53
55
  *
54
- * @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
55
- * @param {SegmentsData | undefined} segmentsData might be undefined
56
+ * @param changeNumber change number of the notification
57
+ * @param segmentsData data for KeyList or SegmentRemoval instant updates
58
+ * @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
56
59
  */
57
- put: function (changeNumber, segmentsData, delay) {
58
- if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
60
+ put: function (mySegmentsData, payload, delay) {
61
+ var type = mySegmentsData.type, cn = mySegmentsData.cn;
62
+ // Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
63
+ if (cn <= currentChangeNumber || cn <= maxChangeNumber || _delay)
59
64
  return;
60
- maxChangeNumber = changeNumber;
65
+ maxChangeNumber = cn;
61
66
  handleNewEvent = true;
62
- _segmentsData = segmentsData;
67
+ _segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
63
68
  _delay = delay;
64
69
  if (backoff.timeoutID || !isHandlingEvent)
65
70
  __handleMySegmentsUpdateCall();
@@ -67,6 +72,7 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
67
72
  },
68
73
  stop: function () {
69
74
  clearTimeout(_delayTimeoutID);
75
+ _delay = undefined;
70
76
  isHandlingEvent = false;
71
77
  backoff.reset();
72
78
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.MY_LARGE_SEGMENTS_UPDATE = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MY_SEGMENTS_UPDATE_V2 = exports.MY_SEGMENTS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
3
+ exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIP_LS_UPDATE = exports.MEMBERSHIP_MS_UPDATE = exports.PUSH_SUBSYSTEM_DOWN = exports.PUSH_SUBSYSTEM_UP = exports.PUSH_RETRYABLE_ERROR = exports.PUSH_NONRETRYABLE_ERROR = exports.SECONDS_BEFORE_EXPIRATION = void 0;
4
4
  // time for refresh token
5
5
  exports.SECONDS_BEFORE_EXPIRATION = 600;
6
6
  // Internal SDK events, subscribed by SyncManager and PushManager
@@ -25,12 +25,11 @@ exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
25
25
  */
26
26
  exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
27
27
  // Update-type push notifications, handled by NotificationProcessor
28
- exports.MY_SEGMENTS_UPDATE = 'MY_SEGMENTS_UPDATE';
29
- exports.MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
28
+ exports.MEMBERSHIP_MS_UPDATE = 'MEMBERSHIP_MS_UPDATE';
29
+ exports.MEMBERSHIP_LS_UPDATE = 'MEMBERSHIP_LS_UPDATE';
30
30
  exports.SEGMENT_UPDATE = 'SEGMENT_UPDATE';
31
31
  exports.SPLIT_KILL = 'SPLIT_KILL';
32
32
  exports.SPLIT_UPDATE = 'SPLIT_UPDATE';
33
- exports.MY_LARGE_SEGMENTS_UPDATE = 'MY_LARGE_SEGMENTS_UPDATE';
34
33
  // Control-type push notifications, handled by NotificationKeeper
35
34
  exports.CONTROL = 'CONTROL';
36
35
  exports.OCCUPANCY = 'OCCUPANCY';
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
3
+ exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
4
4
  var decompress_1 = require("../../utils/decompress");
5
5
  var base64_1 = require("../../utils/base64");
6
+ var murmur3_1 = require("../../utils/murmur3/murmur3");
6
7
  var GZIP = 1;
7
8
  var ZLIB = 2;
8
9
  function Uint8ArrayToString(myUint8Arr) {
@@ -80,15 +81,19 @@ function isInBitmap(bitmap, hash64hex) {
80
81
  exports.isInBitmap = isInBitmap;
81
82
  /**
82
83
  * Parse feature flags notifications for instant feature flag updates
83
- *
84
- * @param {ISplitUpdateData} data
85
- * @returns {KeyList}
86
84
  */
87
85
  function parseFFUpdatePayload(compression, data) {
88
- var avoidPrecisionLoss = false;
89
- if (compression > 0)
90
- return parseKeyList(data, compression, avoidPrecisionLoss);
91
- else
92
- return JSON.parse((0, base64_1.decodeFromBase64)(data));
86
+ return compression > 0 ?
87
+ parseKeyList(data, compression, false) :
88
+ JSON.parse((0, base64_1.decodeFromBase64)(data));
93
89
  }
94
90
  exports.parseFFUpdatePayload = parseFFUpdatePayload;
91
+ var DEFAULT_MAX_INTERVAL = 60000;
92
+ function getDelay(parsedData, matchingKey) {
93
+ if (parsedData.h === 0)
94
+ return 0;
95
+ var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
96
+ var seed = parsedData.s || 0;
97
+ return (0, murmur3_1.hash)(matchingKey, seed) % interval;
98
+ }
99
+ exports.getDelay = getDelay;