@splitsoftware/splitio-commons 1.16.1-rc.7 → 1.17.0-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 +2 -1
  2. package/cjs/evaluator/matchers/index.js +1 -3
  3. package/cjs/evaluator/matchers/matcherTypes.js +0 -1
  4. package/cjs/evaluator/matchersTransform/index.js +1 -1
  5. package/cjs/logger/constants.js +4 -3
  6. package/cjs/logger/messages/info.js +2 -1
  7. package/cjs/readiness/readinessManager.js +10 -14
  8. package/cjs/readiness/sdkReadinessManager.js +6 -5
  9. package/cjs/sdkClient/sdkClientMethodCS.js +2 -2
  10. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +2 -2
  11. package/cjs/sdkFactory/index.js +1 -1
  12. package/cjs/services/decorateHeaders.js +42 -0
  13. package/cjs/services/splitApi.js +0 -4
  14. package/cjs/services/splitHttpClient.js +5 -4
  15. package/cjs/storages/AbstractSplitsCacheAsync.js +2 -2
  16. package/cjs/storages/AbstractSplitsCacheSync.js +6 -5
  17. package/cjs/storages/KeyBuilder.js +0 -3
  18. package/cjs/storages/KeyBuilderCS.js +5 -17
  19. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +4 -16
  20. package/cjs/storages/inLocalStorage/index.js +2 -6
  21. package/cjs/storages/inMemory/InMemoryStorageCS.js +0 -5
  22. package/cjs/storages/inMemory/SplitsCacheInMemory.js +11 -20
  23. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  24. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  25. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
  26. package/cjs/sync/polling/pollingManagerCS.js +33 -51
  27. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  28. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -20
  29. package/cjs/sync/streaming/SSEClient/index.js +0 -4
  30. package/cjs/sync/streaming/SSEHandler/index.js +0 -1
  31. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
  32. package/cjs/sync/streaming/constants.js +1 -2
  33. package/cjs/sync/streaming/parseUtils.js +8 -3
  34. package/cjs/sync/streaming/pushManager.js +68 -97
  35. package/cjs/sync/submitters/telemetrySubmitter.js +0 -4
  36. package/cjs/sync/syncManagerOnline.js +14 -24
  37. package/cjs/utils/constants/index.js +2 -4
  38. package/cjs/utils/settingsValidation/index.js +2 -7
  39. package/esm/evaluator/matchers/index.js +1 -3
  40. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  41. package/esm/evaluator/matchersTransform/index.js +1 -1
  42. package/esm/logger/constants.js +1 -0
  43. package/esm/logger/messages/info.js +2 -1
  44. package/esm/readiness/readinessManager.js +10 -14
  45. package/esm/readiness/sdkReadinessManager.js +6 -5
  46. package/esm/sdkClient/sdkClientMethodCS.js +2 -2
  47. package/esm/sdkClient/sdkClientMethodCSWithTT.js +2 -2
  48. package/esm/sdkFactory/index.js +1 -1
  49. package/esm/services/decorateHeaders.js +38 -0
  50. package/esm/services/splitApi.js +1 -5
  51. package/esm/services/splitHttpClient.js +5 -4
  52. package/esm/storages/AbstractSplitsCacheAsync.js +2 -2
  53. package/esm/storages/AbstractSplitsCacheSync.js +4 -3
  54. package/esm/storages/KeyBuilder.js +0 -3
  55. package/esm/storages/KeyBuilderCS.js +4 -15
  56. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +5 -17
  57. package/esm/storages/inLocalStorage/index.js +3 -7
  58. package/esm/storages/inMemory/InMemoryStorageCS.js +0 -5
  59. package/esm/storages/inMemory/SplitsCacheInMemory.js +12 -21
  60. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  61. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  62. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +1 -5
  63. package/esm/sync/polling/pollingManagerCS.js +34 -52
  64. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  65. package/esm/sync/polling/updaters/mySegmentsUpdater.js +19 -18
  66. package/esm/sync/streaming/SSEClient/index.js +1 -5
  67. package/esm/sync/streaming/SSEHandler/index.js +1 -2
  68. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +9 -23
  69. package/esm/sync/streaming/constants.js +0 -1
  70. package/esm/sync/streaming/parseUtils.js +8 -3
  71. package/esm/sync/streaming/pushManager.js +69 -97
  72. package/esm/sync/submitters/telemetrySubmitter.js +0 -4
  73. package/esm/sync/syncManagerOnline.js +15 -25
  74. package/esm/utils/constants/index.js +1 -3
  75. package/esm/utils/settingsValidation/index.js +2 -7
  76. package/package.json +1 -1
  77. package/src/dtos/types.ts +7 -17
  78. package/src/evaluator/matchers/index.ts +0 -2
  79. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  80. package/src/evaluator/matchersTransform/index.ts +1 -1
  81. package/src/logger/constants.ts +1 -0
  82. package/src/logger/messages/info.ts +2 -1
  83. package/src/readiness/readinessManager.ts +9 -13
  84. package/src/readiness/sdkReadinessManager.ts +7 -7
  85. package/src/readiness/types.ts +2 -3
  86. package/src/sdkClient/sdkClientMethodCS.ts +2 -2
  87. package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -2
  88. package/src/sdkFactory/index.ts +1 -1
  89. package/src/services/decorateHeaders.ts +40 -0
  90. package/src/services/splitApi.ts +1 -6
  91. package/src/services/splitHttpClient.ts +5 -4
  92. package/src/services/types.ts +0 -1
  93. package/src/storages/AbstractSplitsCacheAsync.ts +2 -2
  94. package/src/storages/AbstractSplitsCacheSync.ts +5 -4
  95. package/src/storages/KeyBuilder.ts +0 -3
  96. package/src/storages/KeyBuilderCS.ts +5 -25
  97. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +3 -3
  98. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +5 -20
  99. package/src/storages/inLocalStorage/index.ts +4 -8
  100. package/src/storages/inMemory/InMemoryStorageCS.ts +0 -5
  101. package/src/storages/inMemory/SplitsCacheInMemory.ts +10 -15
  102. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  103. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  104. package/src/storages/types.ts +5 -7
  105. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -6
  106. package/src/sync/polling/pollingManagerCS.ts +29 -61
  107. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +10 -10
  108. package/src/sync/polling/types.ts +3 -4
  109. package/src/sync/polling/updaters/mySegmentsUpdater.ts +20 -17
  110. package/src/sync/streaming/SSEClient/index.ts +7 -10
  111. package/src/sync/streaming/SSEHandler/index.ts +1 -2
  112. package/src/sync/streaming/SSEHandler/types.ts +2 -14
  113. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +9 -25
  114. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  115. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  116. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  117. package/src/sync/streaming/constants.ts +0 -1
  118. package/src/sync/streaming/parseUtils.ts +10 -6
  119. package/src/sync/streaming/pushManager.ts +67 -101
  120. package/src/sync/streaming/types.ts +3 -5
  121. package/src/sync/submitters/telemetrySubmitter.ts +0 -4
  122. package/src/sync/submitters/types.ts +4 -11
  123. package/src/sync/syncManagerOnline.ts +11 -19
  124. package/src/types.ts +9 -28
  125. package/src/utils/constants/index.ts +1 -3
  126. package/src/utils/settingsValidation/index.ts +3 -8
  127. package/src/utils/settingsValidation/types.ts +1 -1
  128. package/types/dtos/types.d.ts +6 -14
  129. package/types/logger/constants.d.ts +1 -0
  130. package/types/readiness/readinessManager.d.ts +2 -2
  131. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  132. package/types/readiness/types.d.ts +2 -3
  133. package/types/services/decorateHeaders.d.ts +2 -0
  134. package/types/services/types.d.ts +0 -1
  135. package/types/storages/AbstractSplitsCacheAsync.d.ts +1 -1
  136. package/types/storages/AbstractSplitsCacheSync.d.ts +3 -3
  137. package/types/storages/KeyBuilder.d.ts +0 -1
  138. package/types/storages/KeyBuilderCS.d.ts +2 -7
  139. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -2
  140. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -1
  141. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -3
  142. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  143. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  144. package/types/storages/types.d.ts +3 -4
  145. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +3 -2
  146. package/types/sync/polling/types.d.ts +3 -10
  147. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +4 -4
  148. package/types/sync/streaming/SSEClient/index.d.ts +0 -1
  149. package/types/sync/streaming/SSEHandler/types.d.ts +2 -13
  150. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -3
  151. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  152. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  153. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  154. package/types/sync/streaming/constants.d.ts +0 -1
  155. package/types/sync/streaming/parseUtils.d.ts +4 -2
  156. package/types/sync/streaming/pushManager.d.ts +0 -2
  157. package/types/sync/streaming/types.d.ts +4 -5
  158. package/types/sync/submitters/types.d.ts +3 -10
  159. package/types/types.d.ts +11 -26
  160. package/types/utils/constants/index.d.ts +1 -3
  161. package/types/utils/settingsValidation/index.d.ts +0 -2
  162. package/types/utils/settingsValidation/types.d.ts +1 -1
  163. package/cjs/evaluator/matchers/large_segment.js +0 -16
  164. package/esm/evaluator/matchers/large_segment.js +0 -12
  165. package/src/evaluator/matchers/large_segment.ts +0 -18
@@ -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.
@@ -17,8 +16,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
17
16
  _this.splitsCache = {};
18
17
  _this.ttCache = {};
19
18
  _this.changeNumber = -1;
20
- _this.segmentsCount = 0;
21
- _this.largeSegmentsCount = 0;
19
+ _this.splitsWithSegmentsCount = 0;
22
20
  _this.flagSetsCache = {};
23
21
  _this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
24
22
  return _this;
@@ -27,8 +25,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
27
25
  this.splitsCache = {};
28
26
  this.ttCache = {};
29
27
  this.changeNumber = -1;
30
- this.segmentsCount = 0;
31
- this.largeSegmentsCount = 0;
28
+ this.splitsWithSegmentsCount = 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))
43
- this.segmentsCount--;
44
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(previousSplit, constants_1.IN_LARGE_SEGMENT))
45
- this.largeSegmentsCount--;
38
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit)) { // Substract from segments count for the previous version of this Split.
39
+ this.splitsWithSegmentsCount--;
40
+ }
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))
56
- this.segmentsCount++;
57
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
58
- this.largeSegmentsCount++;
50
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
51
+ this.splitsWithSegmentsCount++;
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))
77
- this.segmentsCount--;
78
- if ((0, AbstractSplitsCacheSync_1.usesMatcher)(split, constants_1.IN_LARGE_SEGMENT))
79
- this.largeSegmentsCount--;
69
+ if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
70
+ this.splitsWithSegmentsCount--;
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.splitsWithSegmentsCount > 0;
104
95
  };
105
96
  SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
106
97
  var _this = this;
@@ -23,10 +23,9 @@ function shouldRecordTelemetry(_a) {
23
23
  }
24
24
  exports.shouldRecordTelemetry = shouldRecordTelemetry;
25
25
  var TelemetryCacheInMemory = /** @class */ (function () {
26
- function TelemetryCacheInMemory(splits, segments, largeSegments) {
26
+ function TelemetryCacheInMemory(splits, segments) {
27
27
  this.splits = splits;
28
28
  this.segments = segments;
29
- this.largeSegments = largeSegments;
30
29
  // isEmpty flag
31
30
  this.e = true;
32
31
  this.notReadyUsage = 0;
@@ -42,7 +41,10 @@ var TelemetryCacheInMemory = /** @class */ (function () {
42
41
  this.tags = [];
43
42
  this.exceptions = {};
44
43
  this.latencies = {};
45
- this.updatesFromSSE = {};
44
+ this.updatesFromSSE = {
45
+ sp: 0,
46
+ ms: 0
47
+ };
46
48
  }
47
49
  TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
48
50
  TelemetryCacheInMemory.prototype.clear = function () { };
@@ -62,8 +64,6 @@ var TelemetryCacheInMemory = /** @class */ (function () {
62
64
  spC: this.splits && this.splits.getSplitNames().length,
63
65
  seC: this.segments && this.segments.getRegisteredSegments().length,
64
66
  skC: this.segments && this.segments.getKeysCount(),
65
- lseC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
66
- lskC: this.largeSegments && this.largeSegments.getKeysCount(),
67
67
  sL: this.getSessionLength(),
68
68
  eQ: this.getEventStats(constants_1.QUEUED),
69
69
  eD: this.getEventStats(constants_1.DROPPED),
@@ -195,11 +195,14 @@ var TelemetryCacheInMemory = /** @class */ (function () {
195
195
  };
196
196
  TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
197
197
  var result = this.updatesFromSSE;
198
- this.updatesFromSSE = {};
198
+ this.updatesFromSSE = {
199
+ sp: 0,
200
+ ms: 0,
201
+ };
199
202
  return result;
200
203
  };
201
204
  TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
202
- this.updatesFromSSE[type] = (this.updatesFromSSE[type] || 0) + 1;
205
+ this.updatesFromSSE[type]++;
203
206
  this.e = false;
204
207
  };
205
208
  return TelemetryCacheInMemory;
@@ -8,7 +8,7 @@ var sets_1 = require("../../utils/lang/sets");
8
8
  * The `_cache` property is the object were items are stored.
9
9
  * Intended for testing purposes.
10
10
  *
11
- * @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves immediately.
11
+ * @param connDelay delay in millis for `connect` resolve. If not provided, `connect` resolves inmediatelly.
12
12
  */
13
13
  function inMemoryWrapperFactory(connDelay) {
14
14
  var _cache = {};
@@ -15,11 +15,7 @@ function mySegmentsFetcherFactory(fetchMySegments) {
15
15
  // Extract segment names
16
16
  return mySegmentsPromise
17
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
- });
18
+ .then(function (json) { return json.mySegments.map(function (segment) { return segment.name; }); });
23
19
  };
24
20
  }
25
21
  exports.mySegmentsFetcherFactory = mySegmentsFetcherFactory;
@@ -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.fetchMySegments, 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(fetchMySegments, storage, readiness, settings, matchingKey) {
11
+ return (0, syncTask_1.syncTaskFactory)(settings.log, (0, mySegmentsUpdater_1.mySegmentsUpdaterFactory)(settings.log, (0, mySegmentsFetcher_1.mySegmentsFetcherFactory)(fetchMySegments), storage.splits, storage.segments, readiness.segments, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, matchingKey), settings.scheduler.segmentsRefreshRate, 'mySegmentsUpdater');
12
12
  }
13
13
  exports.mySegmentsSyncTaskFactory = mySegmentsSyncTaskFactory;
@@ -2,15 +2,15 @@
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");
6
- var lang_1 = require("../../../utils/lang");
5
+ var constants_1 = require("../../../readiness/constants");
6
+ var constants_2 = require("../../../logger/constants");
7
7
  /**
8
8
  * factory of MySegments updater, a task that:
9
9
  * - fetches mySegments using `mySegmentsFetcher`
10
10
  * - updates `mySegmentsCache`
11
11
  * - uses `segmentsEventEmitter` to emit events related to segments data updates
12
12
  */
13
- function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notifyUpdate, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
13
+ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, splitsCache, mySegmentsCache, segmentsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, matchingKey) {
14
14
  var readyOnAlreadyExistentState = true;
15
15
  var startingUp = true;
16
16
  /** timeout and telemetry decorator for `splitChangesFetcher` promise */
@@ -22,27 +22,28 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
22
22
  // @TODO if allowing pluggable storages, handle async execution
23
23
  function updateSegments(segmentsData) {
24
24
  var shouldNotifyUpdate;
25
- if ((0, lang_1.isObject)(segmentsData[0])) {
26
- // Add/Delete the segment names
27
- segmentsData.forEach(function (_a) {
28
- var name = _a.name, add = _a.add;
29
- if (mySegmentsCache.isInSegment(name) !== add) {
30
- shouldNotifyUpdate = true;
31
- if (add)
32
- mySegmentsCache.addToSegment(name);
33
- else
34
- mySegmentsCache.removeFromSegment(name);
35
- }
36
- });
25
+ if (Array.isArray(segmentsData)) {
26
+ // Update the list of segment names available
27
+ shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
37
28
  }
38
29
  else {
39
- // Reset the list of segment names
40
- shouldNotifyUpdate = mySegmentsCache.resetSegments(segmentsData);
30
+ // Add/Delete the segment
31
+ var name_1 = segmentsData.name, add = segmentsData.add;
32
+ if (mySegmentsCache.isInSegment(name_1) !== add) {
33
+ shouldNotifyUpdate = true;
34
+ if (add)
35
+ mySegmentsCache.addToSegment(name_1);
36
+ else
37
+ mySegmentsCache.removeFromSegment(name_1);
38
+ }
39
+ else {
40
+ shouldNotifyUpdate = false;
41
+ }
41
42
  }
42
43
  // Notify update if required
43
- if (shouldNotifyUpdate || readyOnAlreadyExistentState) {
44
+ if (splitsCache.usesSegments() && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
44
45
  readyOnAlreadyExistentState = false;
45
- notifyUpdate();
46
+ segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED);
46
47
  }
47
48
  }
48
49
  function _mySegmentsUpdater(retry, segmentsData, noCache) {
@@ -59,7 +60,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, mySegmentsCache, notif
59
60
  return updaterPromise.catch(function (error) {
60
61
  if (startingUp && retriesOnFailureBeforeReady > retry) {
61
62
  retry += 1;
62
- log.warn(constants_1.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
63
+ log.warn(constants_2.SYNC_MYSEGMENTS_FETCH_RETRY, [retry, error]);
63
64
  return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
64
65
  }
65
66
  else {
@@ -47,7 +47,6 @@ var SSEClient = /** @class */ (function () {
47
47
  this.useHeaders = useHeaders;
48
48
  this.headers = buildSSEHeaders(settings);
49
49
  this.options = getOptions && getOptions(settings);
50
- this.lse = settings.sync.largeSegmentsEnabled;
51
50
  }
52
51
  SSEClient.prototype.setEventHandler = function (handler) {
53
52
  this.handler = handler;
@@ -59,13 +58,10 @@ var SSEClient = /** @class */ (function () {
59
58
  * @throws {TypeError} Will throw an error if `authToken` is undefined
60
59
  */
61
60
  SSEClient.prototype.open = function (authToken) {
62
- var _this = this;
63
61
  this.close(); // it closes connection if previously opened
64
62
  var channelsQueryParam = Object.keys(authToken.channels).map(function (channel) {
65
63
  var params = CONTROL_CHANNEL_REGEX.test(channel) ? '[?occupancy=metrics.publishers]' : '';
66
64
  return encodeURIComponent(params + channel);
67
- }).filter(function (channel) {
68
- return _this.lse || !(0, lang_1.endsWith)(channel, 'myLargeSegments');
69
65
  }).join(',');
70
66
  var url = this.streamingUrl + "?channels=" + channelsQueryParam + "&accessToken=" + authToken.token + "&v=" + ABLY_API_VERSION + "&heartbeats=true"; // same results using `&heartbeats=false`
71
67
  this.connection = new this.eventSource(
@@ -76,7 +76,6 @@ function SSEHandlerFactory(log, pushEmitter, telemetryTracker) {
76
76
  case constants_1.SPLIT_UPDATE:
77
77
  case constants_1.SEGMENT_UPDATE:
78
78
  case constants_1.MY_SEGMENTS_UPDATE_V2:
79
- case constants_1.MY_LARGE_SEGMENTS_UPDATE:
80
79
  case constants_1.SPLIT_KILL:
81
80
  pushEmitter.emit(parsedData.type, parsedData);
82
81
  break;
@@ -2,17 +2,16 @@
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;
12
13
  var isHandlingEvent;
13
14
  var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
14
- var _delay;
15
- var _delayTimeoutID;
16
15
  var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
17
16
  function __handleMySegmentsUpdateCall() {
18
17
  isHandlingEvent = true;
@@ -20,20 +19,12 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
20
19
  handleNewEvent = false;
21
20
  var currentMaxChangeNumber_1 = maxChangeNumber;
22
21
  // fetch mySegments revalidating data if cached
23
- var syncTask = _delay ?
24
- new Promise(function (res) {
25
- _delayTimeoutID = setTimeout(function () {
26
- _delay = undefined;
27
- mySegmentsSyncTask.execute(_segmentsData, true).then(res);
28
- }, _delay);
29
- }) :
30
- mySegmentsSyncTask.execute(_segmentsData, true);
31
- syncTask.then(function (result) {
22
+ mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
32
23
  if (!isHandlingEvent)
33
24
  return; // halt if `stop` has been called
34
25
  if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
35
26
  if (_segmentsData)
36
- telemetryTracker.trackUpdatesFromSSE(updateType);
27
+ telemetryTracker.trackUpdatesFromSSE(constants_1.MY_SEGMENT);
37
28
  currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
38
29
  }
39
30
  if (handleNewEvent) {
@@ -50,27 +41,22 @@ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker, updateType
50
41
  }
51
42
  return {
52
43
  /**
53
- * Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
44
+ * Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
54
45
  *
55
- * @param changeNumber change number of the notification
56
- * @param segmentsData data for KeyList or SegmentRemoval instant updates
57
- * @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
46
+ * @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
47
+ * @param {SegmentsData | undefined} segmentsData might be undefined
58
48
  */
59
- put: function (changeNumber, segmentsData, delay) {
60
- // Ignore event if it is outdated or if there is a pending fetch request (_delay is set)
61
- if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber || _delay)
49
+ put: function (changeNumber, segmentsData) {
50
+ if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
62
51
  return;
63
52
  maxChangeNumber = changeNumber;
64
53
  handleNewEvent = true;
65
54
  _segmentsData = segmentsData;
66
- _delay = delay;
67
55
  if (backoff.timeoutID || !isHandlingEvent)
68
56
  __handleMySegmentsUpdateCall();
69
57
  backoff.reset();
70
58
  },
71
59
  stop: function () {
72
- clearTimeout(_delayTimeoutID);
73
- _delay = undefined;
74
60
  isHandlingEvent = false;
75
61
  backoff.reset();
76
62
  }
@@ -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.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;
4
4
  // time for refresh token
5
5
  exports.SECONDS_BEFORE_EXPIRATION = 600;
6
6
  // Internal SDK events, subscribed by SyncManager and PushManager
@@ -30,7 +30,6 @@ exports.MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
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';
@@ -80,10 +80,15 @@ function isInBitmap(bitmap, hash64hex) {
80
80
  exports.isInBitmap = isInBitmap;
81
81
  /**
82
82
  * Parse feature flags notifications for instant feature flag updates
83
+ *
84
+ * @param {ISplitUpdateData} data
85
+ * @returns {KeyList}
83
86
  */
84
87
  function parseFFUpdatePayload(compression, data) {
85
- return compression > 0 ?
86
- parseKeyList(data, compression, false) :
87
- JSON.parse((0, base64_1.decodeFromBase64)(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));
88
93
  }
89
94
  exports.parseFFUpdatePayload = parseFFUpdatePayload;