@splitsoftware/splitio-commons 1.17.1-rc.4 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGES.txt +28 -29
  2. package/LICENSE +1 -1
  3. package/README.md +4 -3
  4. package/cjs/consent/sdkUserConsent.js +4 -2
  5. package/cjs/evaluator/matchers/index.js +1 -3
  6. package/cjs/evaluator/matchers/matcherTypes.js +0 -1
  7. package/cjs/evaluator/matchers/segment.js +0 -6
  8. package/cjs/evaluator/matchersTransform/index.js +1 -4
  9. package/cjs/evaluator/matchersTransform/segment.js +1 -3
  10. package/cjs/logger/constants.js +2 -2
  11. package/cjs/logger/messages/info.js +1 -1
  12. package/cjs/logger/messages/warn.js +1 -1
  13. package/cjs/readiness/readinessManager.js +8 -18
  14. package/cjs/readiness/sdkReadinessManager.js +6 -5
  15. package/cjs/sdkClient/sdkClient.js +5 -5
  16. package/cjs/sdkClient/sdkClientMethod.js +1 -3
  17. package/cjs/sdkClient/sdkClientMethodCS.js +15 -9
  18. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +15 -9
  19. package/cjs/sdkFactory/index.js +10 -32
  20. package/cjs/services/decorateHeaders.js +6 -1
  21. package/cjs/services/splitApi.js +5 -5
  22. package/cjs/services/splitHttpClient.js +5 -2
  23. package/cjs/storages/AbstractSegmentsCacheSync.js +33 -0
  24. package/cjs/storages/AbstractSplitsCacheSync.js +1 -2
  25. package/cjs/storages/KeyBuilderCS.js +5 -23
  26. package/cjs/storages/dataLoader.js +1 -1
  27. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
  28. package/cjs/storages/inLocalStorage/index.js +2 -6
  29. package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -6
  30. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
  31. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +28 -14
  32. package/cjs/storages/inMemory/SplitsCacheInMemory.js +9 -8
  33. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  34. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +21 -15
  35. package/cjs/storages/inRedis/index.js +11 -5
  36. package/cjs/storages/pluggable/SegmentsCachePluggable.js +34 -13
  37. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  38. package/cjs/sync/offline/syncManagerOffline.js +11 -18
  39. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  40. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  41. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  42. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  43. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  44. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +28 -12
  45. package/cjs/sync/polling/updaters/splitChangesUpdater.js +1 -1
  46. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  47. package/cjs/sync/streaming/SSEHandler/index.js +5 -3
  48. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
  49. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  50. package/cjs/sync/streaming/constants.js +3 -3
  51. package/cjs/sync/streaming/parseUtils.js +9 -14
  52. package/cjs/sync/streaming/pushManager.js +67 -69
  53. package/cjs/sync/syncManagerOnline.js +21 -20
  54. package/cjs/sync/syncTask.js +2 -2
  55. package/cjs/trackers/eventTracker.js +10 -12
  56. package/cjs/trackers/impressionsTracker.js +14 -16
  57. package/cjs/trackers/uniqueKeysTracker.js +3 -5
  58. package/cjs/utils/constants/index.js +4 -5
  59. package/cjs/utils/settingsValidation/index.js +1 -2
  60. package/esm/consent/sdkUserConsent.js +4 -2
  61. package/esm/evaluator/matchers/index.js +1 -3
  62. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  63. package/esm/evaluator/matchers/segment.js +0 -6
  64. package/esm/evaluator/matchersTransform/index.js +1 -4
  65. package/esm/evaluator/matchersTransform/segment.js +1 -3
  66. package/esm/logger/constants.js +1 -1
  67. package/esm/logger/messages/info.js +1 -1
  68. package/esm/logger/messages/warn.js +1 -1
  69. package/esm/readiness/readinessManager.js +8 -18
  70. package/esm/readiness/sdkReadinessManager.js +6 -5
  71. package/esm/sdkClient/sdkClient.js +5 -5
  72. package/esm/sdkClient/sdkClientMethod.js +1 -3
  73. package/esm/sdkClient/sdkClientMethodCS.js +13 -7
  74. package/esm/sdkClient/sdkClientMethodCSWithTT.js +13 -7
  75. package/esm/sdkFactory/index.js +10 -32
  76. package/esm/services/decorateHeaders.js +4 -0
  77. package/esm/services/splitApi.js +6 -6
  78. package/esm/services/splitHttpClient.js +6 -3
  79. package/esm/storages/AbstractSegmentsCacheSync.js +30 -0
  80. package/esm/storages/AbstractSplitsCacheSync.js +2 -3
  81. package/esm/storages/KeyBuilderCS.js +4 -21
  82. package/esm/storages/dataLoader.js +1 -1
  83. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +56 -33
  84. package/esm/storages/inLocalStorage/index.js +3 -7
  85. package/esm/storages/inMemory/InMemoryStorageCS.js +1 -6
  86. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +44 -13
  87. package/esm/storages/inMemory/SegmentsCacheInMemory.js +28 -14
  88. package/esm/storages/inMemory/SplitsCacheInMemory.js +9 -8
  89. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  90. package/esm/storages/inRedis/SegmentsCacheInRedis.js +21 -15
  91. package/esm/storages/inRedis/index.js +11 -5
  92. package/esm/storages/pluggable/SegmentsCachePluggable.js +34 -13
  93. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  94. package/esm/sync/offline/syncManagerOffline.js +11 -18
  95. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  96. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  97. package/esm/sync/polling/pollingManagerCS.js +1 -1
  98. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  99. package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  100. package/esm/sync/polling/updaters/segmentChangesUpdater.js +28 -12
  101. package/esm/sync/polling/updaters/splitChangesUpdater.js +1 -1
  102. package/esm/sync/streaming/AuthClient/index.js +1 -1
  103. package/esm/sync/streaming/SSEHandler/index.js +6 -4
  104. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
  105. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  106. package/esm/sync/streaming/constants.js +2 -2
  107. package/esm/sync/streaming/parseUtils.js +8 -12
  108. package/esm/sync/streaming/pushManager.js +70 -72
  109. package/esm/sync/syncManagerOnline.js +21 -20
  110. package/esm/sync/syncTask.js +2 -2
  111. package/esm/trackers/eventTracker.js +10 -12
  112. package/esm/trackers/impressionsTracker.js +14 -16
  113. package/esm/trackers/uniqueKeysTracker.js +3 -5
  114. package/esm/utils/constants/index.js +2 -3
  115. package/esm/utils/settingsValidation/index.js +1 -2
  116. package/package.json +2 -2
  117. package/src/consent/sdkUserConsent.ts +3 -2
  118. package/src/dtos/types.ts +7 -21
  119. package/src/evaluator/matchers/index.ts +0 -2
  120. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  121. package/src/evaluator/matchers/segment.ts +0 -7
  122. package/src/evaluator/matchersTransform/index.ts +1 -4
  123. package/src/evaluator/matchersTransform/segment.ts +3 -5
  124. package/src/logger/constants.ts +1 -1
  125. package/src/logger/messages/info.ts +1 -1
  126. package/src/logger/messages/warn.ts +1 -1
  127. package/src/readiness/readinessManager.ts +8 -19
  128. package/src/readiness/sdkReadinessManager.ts +7 -7
  129. package/src/readiness/types.ts +2 -5
  130. package/src/sdkClient/sdkClient.ts +5 -5
  131. package/src/sdkClient/sdkClientMethod.ts +1 -4
  132. package/src/sdkClient/sdkClientMethodCS.ts +15 -7
  133. package/src/sdkClient/sdkClientMethodCSWithTT.ts +15 -7
  134. package/src/sdkFactory/index.ts +12 -35
  135. package/src/sdkFactory/types.ts +1 -4
  136. package/src/services/decorateHeaders.ts +5 -0
  137. package/src/services/splitApi.ts +7 -7
  138. package/src/services/splitHttpClient.ts +7 -4
  139. package/src/services/types.ts +2 -2
  140. package/src/storages/AbstractSegmentsCacheSync.ts +68 -0
  141. package/src/storages/AbstractSplitsCacheSync.ts +3 -4
  142. package/src/storages/KeyBuilderCS.ts +5 -34
  143. package/src/storages/dataLoader.ts +1 -1
  144. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +63 -33
  145. package/src/storages/inLocalStorage/index.ts +4 -8
  146. package/src/storages/inMemory/InMemoryStorageCS.ts +1 -6
  147. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +47 -13
  148. package/src/storages/inMemory/SegmentsCacheInMemory.ts +27 -13
  149. package/src/storages/inMemory/SplitsCacheInMemory.ts +9 -7
  150. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  151. package/src/storages/inRedis/SegmentsCacheInRedis.ts +24 -15
  152. package/src/storages/inRedis/index.ts +12 -6
  153. package/src/storages/pluggable/SegmentsCachePluggable.ts +37 -13
  154. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  155. package/src/storages/types.ts +17 -15
  156. package/src/sync/offline/syncManagerOffline.ts +13 -21
  157. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
  158. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  159. package/src/sync/polling/fetchers/types.ts +2 -3
  160. package/src/sync/polling/pollingManagerCS.ts +4 -4
  161. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
  162. package/src/sync/polling/types.ts +6 -7
  163. package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
  164. package/src/sync/polling/updaters/segmentChangesUpdater.ts +29 -13
  165. package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
  166. package/src/sync/streaming/AuthClient/index.ts +1 -1
  167. package/src/sync/streaming/SSEClient/index.ts +6 -4
  168. package/src/sync/streaming/SSEHandler/index.ts +8 -5
  169. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  170. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
  171. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
  172. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  173. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  174. package/src/sync/streaming/constants.ts +2 -2
  175. package/src/sync/streaming/parseUtils.ts +11 -19
  176. package/src/sync/streaming/pushManager.ts +72 -73
  177. package/src/sync/streaming/types.ts +10 -10
  178. package/src/sync/submitters/types.ts +5 -8
  179. package/src/sync/syncManagerOnline.ts +17 -17
  180. package/src/sync/syncTask.ts +2 -2
  181. package/src/sync/types.ts +1 -1
  182. package/src/trackers/eventTracker.ts +8 -11
  183. package/src/trackers/impressionsTracker.ts +10 -13
  184. package/src/trackers/types.ts +0 -1
  185. package/src/trackers/uniqueKeysTracker.ts +4 -6
  186. package/src/types.ts +1 -7
  187. package/src/utils/constants/index.ts +2 -3
  188. package/src/utils/settingsValidation/index.ts +2 -3
  189. package/src/utils/settingsValidation/types.ts +1 -1
  190. package/types/dtos/types.d.ts +7 -18
  191. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  192. package/types/logger/constants.d.ts +1 -1
  193. package/types/readiness/readinessManager.d.ts +2 -2
  194. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  195. package/types/readiness/types.d.ts +2 -5
  196. package/types/sdkClient/sdkClientMethod.d.ts +1 -1
  197. package/types/sdkFactory/types.d.ts +1 -3
  198. package/types/services/decorateHeaders.d.ts +1 -0
  199. package/types/services/splitApi.d.ts +1 -1
  200. package/types/services/splitHttpClient.d.ts +1 -1
  201. package/types/services/types.d.ts +2 -2
  202. package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
  203. package/types/storages/AbstractSplitsCacheSync.d.ts +1 -1
  204. package/types/storages/KeyBuilderCS.d.ts +2 -9
  205. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +18 -8
  206. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +13 -7
  207. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +8 -6
  208. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +2 -1
  209. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  210. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +4 -7
  211. package/types/storages/inRedis/index.d.ts +1 -1
  212. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +17 -5
  213. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  214. package/types/storages/types.d.ts +15 -11
  215. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  216. package/types/sync/polling/fetchers/types.d.ts +2 -2
  217. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  218. package/types/sync/polling/types.d.ts +4 -7
  219. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
  220. package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
  221. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
  222. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  223. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  224. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  225. package/types/sync/streaming/constants.d.ts +2 -2
  226. package/types/sync/streaming/parseUtils.d.ts +5 -4
  227. package/types/sync/streaming/types.d.ts +8 -8
  228. package/types/sync/submitters/types.d.ts +4 -7
  229. package/types/sync/types.d.ts +1 -1
  230. package/types/trackers/eventTracker.d.ts +1 -1
  231. package/types/trackers/impressionsTracker.d.ts +1 -1
  232. package/types/trackers/types.d.ts +0 -1
  233. package/types/types.d.ts +1 -7
  234. package/types/utils/constants/index.d.ts +2 -3
  235. package/types/utils/settingsValidation/types.d.ts +1 -1
  236. package/cjs/evaluator/matchers/large_segment.js +0 -16
  237. package/cjs/sdkClient/identity.js +0 -7
  238. package/cjs/storages/AbstractMySegmentsCacheSync.js +0 -60
  239. package/esm/evaluator/matchers/large_segment.js +0 -12
  240. package/esm/sdkClient/identity.js +0 -3
  241. package/esm/storages/AbstractMySegmentsCacheSync.js +0 -57
  242. package/src/evaluator/matchers/large_segment.ts +0 -18
  243. package/src/sdkClient/identity.ts +0 -5
  244. package/src/storages/AbstractMySegmentsCacheSync.ts +0 -94
  245. package/types/evaluator/matchers/large_segment.d.ts +0 -5
  246. package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
  247. package/types/evaluator/matchersTransform/set.d.ts +0 -5
  248. package/types/evaluator/matchersTransform/string.d.ts +0 -7
  249. package/types/sdkClient/identity.d.ts +0 -2
  250. package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
  251. package/types/storages/AbstractSplitsCache.d.ts +0 -46
  252. package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
  253. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
  254. package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
  255. package/types/trackers/impressionObserver/utils.d.ts +0 -5
  256. package/types/utils/inputValidation/sdkKey.d.ts +0 -7
  257. package/types/utils/inputValidation/splitExistance.d.ts +0 -7
  258. package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
  259. package/types/utils/redis/RedisMock.d.ts +0 -4
  260. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
  261. /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
@@ -42,6 +42,6 @@ export function dataLoaderFactory(preloadedData) {
42
42
  return Array.isArray(userIds) && userIds.indexOf(userId) > -1;
43
43
  });
44
44
  }
45
- storage.segments.resetSegments({ k: mySegmentsData.map(function (s) { return ({ n: s }); }) });
45
+ storage.segments.resetSegments(mySegmentsData);
46
46
  };
47
47
  }
@@ -1,6 +1,5 @@
1
1
  import { __extends } from "tslib";
2
- import { isNaNNumber } from '../../utils/lang';
3
- import { AbstractMySegmentsCacheSync } from '../AbstractMySegmentsCacheSync';
2
+ import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
4
3
  import { LOG_PREFIX, DEFINED } from './constants';
5
4
  var MySegmentsCacheInLocal = /** @class */ (function (_super) {
6
5
  __extends(MySegmentsCacheInLocal, _super);
@@ -11,11 +10,19 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
11
10
  return _this;
12
11
  // There is not need to flush segments cache like splits cache, since resetSegments receives the up-to-date list of active segments
13
12
  }
14
- MySegmentsCacheInLocal.prototype.addSegment = function (name) {
13
+ /**
14
+ * Removes list of segments from localStorage
15
+ * @NOTE this method is not being used at the moment.
16
+ */
17
+ MySegmentsCacheInLocal.prototype.clear = function () {
18
+ this.log.info(LOG_PREFIX + 'Flushing MySegments data from localStorage');
19
+ // We cannot simply call `localStorage.clear()` since that implies removing user items from the storage
20
+ // We could optimize next sentence, since it implies iterating over all localStorage items
21
+ this.resetSegments([]);
22
+ };
23
+ MySegmentsCacheInLocal.prototype.addToSegment = function (name) {
15
24
  var segmentKey = this.keys.buildSegmentNameKey(name);
16
25
  try {
17
- if (localStorage.getItem(segmentKey) === DEFINED)
18
- return false;
19
26
  localStorage.setItem(segmentKey, DEFINED);
20
27
  return true;
21
28
  }
@@ -24,11 +31,9 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
24
31
  return false;
25
32
  }
26
33
  };
27
- MySegmentsCacheInLocal.prototype.removeSegment = function (name) {
34
+ MySegmentsCacheInLocal.prototype.removeFromSegment = function (name) {
28
35
  var segmentKey = this.keys.buildSegmentNameKey(name);
29
36
  try {
30
- if (localStorage.getItem(segmentKey) !== DEFINED)
31
- return false;
32
37
  localStorage.removeItem(segmentKey);
33
38
  return true;
34
39
  }
@@ -40,22 +45,30 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
40
45
  MySegmentsCacheInLocal.prototype.isInSegment = function (name) {
41
46
  return localStorage.getItem(this.keys.buildSegmentNameKey(name)) === DEFINED;
42
47
  };
43
- MySegmentsCacheInLocal.prototype.getRegisteredSegments = function () {
48
+ /**
49
+ * Reset (update) the cached list of segments with the given list, removing and adding segments if necessary.
50
+ *
51
+ * @param {string[]} segmentNames list of segment names
52
+ * @returns boolean indicating if the cache was updated (i.e., given list was different from the cached one)
53
+ */
54
+ MySegmentsCacheInLocal.prototype.resetSegments = function (names) {
44
55
  var _this = this;
56
+ var isDiff = false;
57
+ var index;
45
58
  // Scan current values from localStorage
46
- return Object.keys(localStorage).reduce(function (accum, key) {
59
+ var storedSegmentNames = Object.keys(localStorage).reduce(function (accum, key) {
47
60
  var segmentName = _this.keys.extractSegmentName(key);
48
61
  if (segmentName) {
49
62
  accum.push(segmentName);
50
63
  }
51
64
  else {
52
- // @TODO @BREAKING: This is only to clean up "old" keys. Remove this whole else code block
65
+ // @TODO @BREAKING: This is only to clean up "old" keys. Remove this whole else code block and reuse `getRegisteredSegments` method.
53
66
  segmentName = _this.keys.extractOldSegmentKey(key);
54
67
  if (segmentName) { // this was an old segment key, let's clean up.
55
68
  var newSegmentKey = _this.keys.buildSegmentNameKey(segmentName);
56
69
  try {
57
70
  // If the new format key is not there, create it.
58
- if (!localStorage.getItem(newSegmentKey)) {
71
+ if (!localStorage.getItem(newSegmentKey) && names.indexOf(segmentName) > -1) {
59
72
  localStorage.setItem(newSegmentKey, DEFINED);
60
73
  // we are migrating a segment, let's track it.
61
74
  accum.push(segmentName);
@@ -69,30 +82,40 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
69
82
  }
70
83
  return accum;
71
84
  }, []);
72
- };
73
- MySegmentsCacheInLocal.prototype.getKeysCount = function () {
74
- return 1;
75
- };
76
- MySegmentsCacheInLocal.prototype.setChangeNumber = function (changeNumber) {
77
- try {
78
- if (changeNumber)
79
- localStorage.setItem(this.keys.buildTillKey(), changeNumber + '');
80
- else
81
- localStorage.removeItem(this.keys.buildTillKey());
85
+ // Extreme fast => everything is empty
86
+ if (names.length === 0 && storedSegmentNames.length === names.length)
87
+ return isDiff;
88
+ // Quick path
89
+ if (storedSegmentNames.length !== names.length) {
90
+ isDiff = true;
91
+ storedSegmentNames.forEach(function (name) { return _this.removeFromSegment(name); });
92
+ names.forEach(function (name) { return _this.addToSegment(name); });
82
93
  }
83
- catch (e) {
84
- this.log.error(e);
94
+ else {
95
+ // Slowest path => we need to find at least 1 difference because
96
+ for (index = 0; index < names.length && storedSegmentNames.indexOf(names[index]) !== -1; index++) {
97
+ // TODO: why empty statement?
98
+ }
99
+ if (index < names.length) {
100
+ isDiff = true;
101
+ storedSegmentNames.forEach(function (name) { return _this.removeFromSegment(name); });
102
+ names.forEach(function (name) { return _this.addToSegment(name); });
103
+ }
85
104
  }
105
+ return isDiff;
86
106
  };
87
- MySegmentsCacheInLocal.prototype.getChangeNumber = function () {
88
- var n = -1;
89
- var value = localStorage.getItem(this.keys.buildTillKey());
90
- if (value !== null) {
91
- value = parseInt(value, 10);
92
- return isNaNNumber(value) ? n : value;
93
- }
94
- return n;
107
+ MySegmentsCacheInLocal.prototype.getRegisteredSegments = function () {
108
+ var _this = this;
109
+ return Object.keys(localStorage).reduce(function (accum, key) {
110
+ var segmentName = _this.keys.extractSegmentName(key);
111
+ if (segmentName)
112
+ accum.push(segmentName);
113
+ return accum;
114
+ }, []);
115
+ };
116
+ MySegmentsCacheInLocal.prototype.getKeysCount = function () {
117
+ return 1;
95
118
  };
96
119
  return MySegmentsCacheInLocal;
97
- }(AbstractMySegmentsCacheSync));
120
+ }(AbstractSegmentsCacheSync));
98
121
  export { MySegmentsCacheInLocal };
@@ -2,7 +2,7 @@ import { ImpressionsCacheInMemory } from '../inMemory/ImpressionsCacheInMemory';
2
2
  import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
3
3
  import { EventsCacheInMemory } from '../inMemory/EventsCacheInMemory';
4
4
  import { validatePrefix } from '../KeyBuilder';
5
- import { KeyBuilderCS, myLargeSegmentsKeyBuilder } from '../KeyBuilderCS';
5
+ import { KeyBuilderCS } from '../KeyBuilderCS';
6
6
  import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
7
7
  import { SplitsCacheInLocal } from './SplitsCacheInLocal';
8
8
  import { MySegmentsCacheInLocal } from './MySegmentsCacheInLocal';
@@ -33,11 +33,9 @@ export function InLocalStorage(options) {
33
33
  var expirationTimestamp = Date.now() - DEFAULT_CACHE_EXPIRATION_IN_MILLIS;
34
34
  var splits = new SplitsCacheInLocal(settings, keys, expirationTimestamp);
35
35
  var segments = new MySegmentsCacheInLocal(log, keys);
36
- var largeSegments = new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey));
37
36
  return {
38
37
  splits: splits,
39
38
  segments: segments,
40
- largeSegments: largeSegments,
41
39
  impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
42
40
  impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
43
41
  events: new EventsCacheInMemory(eventsQueueSize),
@@ -47,7 +45,6 @@ export function InLocalStorage(options) {
47
45
  var _a;
48
46
  this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
49
47
  this.segments = new MySegmentsCacheInMemory();
50
- this.largeSegments = new MySegmentsCacheInMemory();
51
48
  this.impressions.clear();
52
49
  this.impressionCounts && this.impressionCounts.clear();
53
50
  this.events.clear();
@@ -55,10 +52,10 @@ export function InLocalStorage(options) {
55
52
  },
56
53
  // When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
57
54
  shared: function (matchingKey) {
55
+ var childKeysBuilder = new KeyBuilderCS(prefix, matchingKey);
58
56
  return {
59
57
  splits: this.splits,
60
- segments: new MySegmentsCacheInLocal(log, new KeyBuilderCS(prefix, matchingKey)),
61
- largeSegments: new MySegmentsCacheInLocal(log, myLargeSegmentsKeyBuilder(prefix, matchingKey)),
58
+ segments: new MySegmentsCacheInLocal(log, childKeysBuilder),
62
59
  impressions: this.impressions,
63
60
  impressionCounts: this.impressionCounts,
64
61
  events: this.events,
@@ -66,7 +63,6 @@ export function InLocalStorage(options) {
66
63
  destroy: function () {
67
64
  this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
68
65
  this.segments = new MySegmentsCacheInMemory();
69
- this.largeSegments = new MySegmentsCacheInMemory();
70
66
  }
71
67
  };
72
68
  },
@@ -15,11 +15,9 @@ export function InMemoryStorageCSFactory(params) {
15
15
  var _a = params.settings, _b = _a.scheduler, impressionsQueueSize = _b.impressionsQueueSize, eventsQueueSize = _b.eventsQueueSize, _c = _a.sync, impressionsMode = _c.impressionsMode, __splitFiltersValidation = _c.__splitFiltersValidation;
16
16
  var splits = new SplitsCacheInMemory(__splitFiltersValidation);
17
17
  var segments = new MySegmentsCacheInMemory();
18
- var largeSegments = new MySegmentsCacheInMemory();
19
18
  var storage = {
20
19
  splits: splits,
21
20
  segments: segments,
22
- largeSegments: largeSegments,
23
21
  impressions: new ImpressionsCacheInMemory(impressionsQueueSize),
24
22
  impressionCounts: impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
25
23
  events: new EventsCacheInMemory(eventsQueueSize),
@@ -29,7 +27,6 @@ export function InMemoryStorageCSFactory(params) {
29
27
  destroy: function () {
30
28
  this.splits.clear();
31
29
  this.segments.clear();
32
- this.largeSegments.clear();
33
30
  this.impressions.clear();
34
31
  this.impressionCounts && this.impressionCounts.clear();
35
32
  this.events.clear();
@@ -40,7 +37,6 @@ export function InMemoryStorageCSFactory(params) {
40
37
  return {
41
38
  splits: this.splits,
42
39
  segments: new MySegmentsCacheInMemory(),
43
- largeSegments: new MySegmentsCacheInMemory(),
44
40
  impressions: this.impressions,
45
41
  impressionCounts: this.impressionCounts,
46
42
  events: this.events,
@@ -49,13 +45,12 @@ export function InMemoryStorageCSFactory(params) {
49
45
  destroy: function () {
50
46
  this.splits = new SplitsCacheInMemory(__splitFiltersValidation);
51
47
  this.segments.clear();
52
- this.largeSegments.clear();
53
48
  }
54
49
  };
55
50
  },
56
51
  };
57
52
  // @TODO revisit storage logic in localhost mode
58
- // No tracking in localhost mode to avoid memory leaks: https://github.com/splitio/javascript-commons/issues/181
53
+ // No tracking data in localhost mode to avoid memory leaks
59
54
  if (params.settings.mode === LOCALHOST_MODE) {
60
55
  var noopTrack = function () { return true; };
61
56
  storage.impressions.track = noopTrack;
@@ -1,5 +1,5 @@
1
1
  import { __extends } from "tslib";
2
- import { AbstractMySegmentsCacheSync } from '../AbstractMySegmentsCacheSync';
2
+ import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
3
3
  /**
4
4
  * Default MySegmentsCacheInMemory implementation that stores MySegments in memory.
5
5
  * Supported by all JS runtimes.
@@ -11,26 +11,57 @@ var MySegmentsCacheInMemory = /** @class */ (function (_super) {
11
11
  _this.segmentCache = {};
12
12
  return _this;
13
13
  }
14
- MySegmentsCacheInMemory.prototype.addSegment = function (name) {
15
- if (this.segmentCache[name])
16
- return false;
14
+ MySegmentsCacheInMemory.prototype.clear = function () {
15
+ this.segmentCache = {};
16
+ };
17
+ MySegmentsCacheInMemory.prototype.addToSegment = function (name) {
17
18
  this.segmentCache[name] = true;
18
19
  return true;
19
20
  };
20
- MySegmentsCacheInMemory.prototype.removeSegment = function (name) {
21
- if (!this.segmentCache[name])
22
- return false;
21
+ MySegmentsCacheInMemory.prototype.removeFromSegment = function (name) {
23
22
  delete this.segmentCache[name];
24
23
  return true;
25
24
  };
26
25
  MySegmentsCacheInMemory.prototype.isInSegment = function (name) {
27
26
  return this.segmentCache[name] === true;
28
27
  };
29
- MySegmentsCacheInMemory.prototype.setChangeNumber = function (changeNumber) {
30
- this.cn = changeNumber;
31
- };
32
- MySegmentsCacheInMemory.prototype.getChangeNumber = function () {
33
- return this.cn || -1;
28
+ /**
29
+ * Reset (update) the cached list of segments with the given list, removing and adding segments if necessary.
30
+ * @NOTE based on the way we use segments in the browser, this way is the best option
31
+ *
32
+ * @param {string[]} names list of segment names
33
+ * @returns boolean indicating if the cache was updated (i.e., given list was different from the cached one)
34
+ */
35
+ MySegmentsCacheInMemory.prototype.resetSegments = function (names) {
36
+ var _this = this;
37
+ var isDiff = false;
38
+ var index;
39
+ var storedSegmentKeys = Object.keys(this.segmentCache);
40
+ // Extreme fast => everything is empty
41
+ if (names.length === 0 && storedSegmentKeys.length === names.length)
42
+ return isDiff;
43
+ // Quick path
44
+ if (storedSegmentKeys.length !== names.length) {
45
+ isDiff = true;
46
+ this.segmentCache = {};
47
+ names.forEach(function (s) {
48
+ _this.addToSegment(s);
49
+ });
50
+ }
51
+ else {
52
+ // Slowest path => we need to find at least 1 difference because
53
+ for (index = 0; index < names.length && this.isInSegment(names[index]); index++) {
54
+ // TODO: why empty statement?
55
+ }
56
+ if (index < names.length) {
57
+ isDiff = true;
58
+ this.segmentCache = {};
59
+ names.forEach(function (s) {
60
+ _this.addToSegment(s);
61
+ });
62
+ }
63
+ }
64
+ return isDiff;
34
65
  };
35
66
  MySegmentsCacheInMemory.prototype.getRegisteredSegments = function () {
36
67
  return Object.keys(this.segmentCache);
@@ -39,5 +70,5 @@ var MySegmentsCacheInMemory = /** @class */ (function (_super) {
39
70
  return 1;
40
71
  };
41
72
  return MySegmentsCacheInMemory;
42
- }(AbstractMySegmentsCacheSync));
73
+ }(AbstractSegmentsCacheSync));
43
74
  export { MySegmentsCacheInMemory };
@@ -1,20 +1,32 @@
1
+ import { __extends } from "tslib";
2
+ import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
1
3
  import { _Set } from '../../utils/lang/sets';
2
4
  import { isIntegerNumber } from '../../utils/lang';
3
5
  /**
4
- * Default ISplitsCacheSync implementation for server-side that stores segments definitions in memory.
6
+ * Default ISplitsCacheSync implementation that stores split definitions in memory.
7
+ * Supported by all JS runtimes.
5
8
  */
6
- var SegmentsCacheInMemory = /** @class */ (function () {
9
+ var SegmentsCacheInMemory = /** @class */ (function (_super) {
10
+ __extends(SegmentsCacheInMemory, _super);
7
11
  function SegmentsCacheInMemory() {
8
- this.segmentCache = {};
9
- this.segmentChangeNumber = {};
12
+ var _this = _super !== null && _super.apply(this, arguments) || this;
13
+ _this.segmentCache = {};
14
+ _this.segmentChangeNumber = {};
15
+ return _this;
10
16
  }
11
- SegmentsCacheInMemory.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
12
- var keySet = this.segmentCache[name] || new _Set();
13
- addedKeys.forEach(function (k) { return keySet.add(k); });
14
- removedKeys.forEach(function (k) { return keySet.delete(k); });
17
+ SegmentsCacheInMemory.prototype.addToSegment = function (name, segmentKeys) {
18
+ var values = this.segmentCache[name];
19
+ var keySet = values ? values : new _Set();
20
+ segmentKeys.forEach(function (k) { return keySet.add(k); });
15
21
  this.segmentCache[name] = keySet;
16
- this.segmentChangeNumber[name] = changeNumber;
17
- return addedKeys.length > 0 || removedKeys.length > 0;
22
+ return true;
23
+ };
24
+ SegmentsCacheInMemory.prototype.removeFromSegment = function (name, segmentKeys) {
25
+ var values = this.segmentCache[name];
26
+ var keySet = values ? values : new _Set();
27
+ segmentKeys.forEach(function (k) { return keySet.delete(k); });
28
+ this.segmentCache[name] = keySet;
29
+ return true;
18
30
  };
19
31
  SegmentsCacheInMemory.prototype.isInSegment = function (name, key) {
20
32
  var segmentValues = this.segmentCache[name];
@@ -48,12 +60,14 @@ var SegmentsCacheInMemory = /** @class */ (function () {
48
60
  return acum + _this.segmentCache[segmentName].size;
49
61
  }, 0);
50
62
  };
63
+ SegmentsCacheInMemory.prototype.setChangeNumber = function (name, changeNumber) {
64
+ this.segmentChangeNumber[name] = changeNumber;
65
+ return true;
66
+ };
51
67
  SegmentsCacheInMemory.prototype.getChangeNumber = function (name) {
52
68
  var value = this.segmentChangeNumber[name];
53
- return isIntegerNumber(value) ? value : -1;
69
+ return isIntegerNumber(value) ? value : undefined;
54
70
  };
55
- // No-op. Not used in server-side
56
- SegmentsCacheInMemory.prototype.resetSegments = function () { return false; };
57
71
  return SegmentsCacheInMemory;
58
- }());
72
+ }(AbstractSegmentsCacheSync));
59
73
  export { SegmentsCacheInMemory };
@@ -4,6 +4,7 @@ import { isFiniteNumber } from '../../utils/lang';
4
4
  import { _Set } from '../../utils/lang/sets';
5
5
  /**
6
6
  * Default ISplitsCacheSync implementation that stores split definitions in memory.
7
+ * Supported by all JS runtimes.
7
8
  */
8
9
  var SplitsCacheInMemory = /** @class */ (function (_super) {
9
10
  __extends(SplitsCacheInMemory, _super);
@@ -12,7 +13,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
12
13
  _this.splitsCache = {};
13
14
  _this.ttCache = {};
14
15
  _this.changeNumber = -1;
15
- _this.segmentsCount = 0;
16
+ _this.splitsWithSegmentsCount = 0;
16
17
  _this.flagSetsCache = {};
17
18
  _this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
18
19
  return _this;
@@ -21,7 +22,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
21
22
  this.splitsCache = {};
22
23
  this.ttCache = {};
23
24
  this.changeNumber = -1;
24
- this.segmentsCount = 0;
25
+ this.splitsWithSegmentsCount = 0;
25
26
  };
26
27
  SplitsCacheInMemory.prototype.addSplit = function (name, split) {
27
28
  var previousSplit = this.getSplit(name);
@@ -31,9 +32,9 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
31
32
  if (!this.ttCache[previousTtName])
32
33
  delete this.ttCache[previousTtName];
33
34
  this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
34
- // Subtract from segments count for the previous version of this Split
35
- if (usesSegments(previousSplit))
36
- this.segmentsCount--;
35
+ if (usesSegments(previousSplit)) { // Substract from segments count for the previous version of this Split.
36
+ this.splitsWithSegmentsCount--;
37
+ }
37
38
  }
38
39
  if (split) {
39
40
  // Store the Split.
@@ -44,7 +45,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
44
45
  this.addToFlagSets(split);
45
46
  // Add to segments count for the new version of the Split
46
47
  if (usesSegments(split))
47
- this.segmentsCount++;
48
+ this.splitsWithSegmentsCount++;
48
49
  return true;
49
50
  }
50
51
  else {
@@ -63,7 +64,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
63
64
  this.removeFromFlagSets(split.name, split.sets);
64
65
  // Update the segments count.
65
66
  if (usesSegments(split))
66
- this.segmentsCount--;
67
+ this.splitsWithSegmentsCount--;
67
68
  return true;
68
69
  }
69
70
  else {
@@ -87,7 +88,7 @@ var SplitsCacheInMemory = /** @class */ (function (_super) {
87
88
  return isFiniteNumber(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
88
89
  };
89
90
  SplitsCacheInMemory.prototype.usesSegments = function () {
90
- return this.getChangeNumber() === -1 || this.segmentsCount > 0;
91
+ return this.getChangeNumber() === -1 || this.splitsWithSegmentsCount > 0;
91
92
  };
92
93
  SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
93
94
  var _this = this;
@@ -18,10 +18,9 @@ export function shouldRecordTelemetry(_a) {
18
18
  return settings.mode !== LOCALHOST_MODE && (settings.core.key === undefined || Math.random() <= ACCEPTANCE_RANGE);
19
19
  }
20
20
  var TelemetryCacheInMemory = /** @class */ (function () {
21
- function TelemetryCacheInMemory(splits, segments, largeSegments) {
21
+ function TelemetryCacheInMemory(splits, segments) {
22
22
  this.splits = splits;
23
23
  this.segments = segments;
24
- this.largeSegments = largeSegments;
25
24
  // isEmpty flag
26
25
  this.e = true;
27
26
  this.notReadyUsage = 0;
@@ -37,7 +36,10 @@ var TelemetryCacheInMemory = /** @class */ (function () {
37
36
  this.tags = [];
38
37
  this.exceptions = {};
39
38
  this.latencies = {};
40
- this.updatesFromSSE = {};
39
+ this.updatesFromSSE = {
40
+ sp: 0,
41
+ ms: 0
42
+ };
41
43
  }
42
44
  TelemetryCacheInMemory.prototype.isEmpty = function () { return this.e; };
43
45
  TelemetryCacheInMemory.prototype.clear = function () { };
@@ -57,8 +59,6 @@ var TelemetryCacheInMemory = /** @class */ (function () {
57
59
  spC: this.splits && this.splits.getSplitNames().length,
58
60
  seC: this.segments && this.segments.getRegisteredSegments().length,
59
61
  skC: this.segments && this.segments.getKeysCount(),
60
- lsC: this.largeSegments && this.largeSegments.getRegisteredSegments().length,
61
- lskC: this.largeSegments && this.largeSegments.getKeysCount(),
62
62
  sL: this.getSessionLength(),
63
63
  eQ: this.getEventStats(QUEUED),
64
64
  eD: this.getEventStats(DROPPED),
@@ -190,11 +190,14 @@ var TelemetryCacheInMemory = /** @class */ (function () {
190
190
  };
191
191
  TelemetryCacheInMemory.prototype.popUpdatesFromSSE = function () {
192
192
  var result = this.updatesFromSSE;
193
- this.updatesFromSSE = {};
193
+ this.updatesFromSSE = {
194
+ sp: 0,
195
+ ms: 0,
196
+ };
194
197
  return result;
195
198
  };
196
199
  TelemetryCacheInMemory.prototype.recordUpdatesFromSSE = function (type) {
197
- this.updatesFromSSE[type] = (this.updatesFromSSE[type] || 0) + 1;
200
+ this.updatesFromSSE[type]++;
198
201
  this.e = false;
199
202
  };
200
203
  return TelemetryCacheInMemory;
@@ -6,32 +6,38 @@ var SegmentsCacheInRedis = /** @class */ (function () {
6
6
  this.redis = redis;
7
7
  this.keys = keys;
8
8
  }
9
- /**
10
- * Update the given segment `name` with the lists of `addedKeys`, `removedKeys` and `changeNumber`.
11
- * The returned promise is resolved if the operation success, with `true` if the segment was updated (i.e., some key was added or removed),
12
- * or rejected if it fails (e.g., Redis operation fails).
13
- */
14
- SegmentsCacheInRedis.prototype.update = function (name, addedKeys, removedKeys, changeNumber) {
9
+ SegmentsCacheInRedis.prototype.addToSegment = function (name, segmentKeys) {
15
10
  var segmentKey = this.keys.buildSegmentNameKey(name);
16
- return Promise.all([
17
- addedKeys.length && this.redis.sadd(segmentKey, addedKeys),
18
- removedKeys.length && this.redis.srem(segmentKey, removedKeys),
19
- this.redis.set(this.keys.buildSegmentTillKey(name), changeNumber + '')
20
- ]).then(function () {
21
- return addedKeys.length > 0 || removedKeys.length > 0;
22
- });
11
+ if (segmentKeys.length) {
12
+ return this.redis.sadd(segmentKey, segmentKeys).then(function () { return true; });
13
+ }
14
+ else {
15
+ return Promise.resolve(true);
16
+ }
17
+ };
18
+ SegmentsCacheInRedis.prototype.removeFromSegment = function (name, segmentKeys) {
19
+ var segmentKey = this.keys.buildSegmentNameKey(name);
20
+ if (segmentKeys.length) {
21
+ return this.redis.srem(segmentKey, segmentKeys).then(function () { return true; });
22
+ }
23
+ else {
24
+ return Promise.resolve(true);
25
+ }
23
26
  };
24
27
  SegmentsCacheInRedis.prototype.isInSegment = function (name, key) {
25
28
  return this.redis.sismember(this.keys.buildSegmentNameKey(name), key).then(function (matches) { return matches !== 0; });
26
29
  };
30
+ SegmentsCacheInRedis.prototype.setChangeNumber = function (name, changeNumber) {
31
+ return this.redis.set(this.keys.buildSegmentTillKey(name), changeNumber + '').then(function (status) { return status === 'OK'; });
32
+ };
27
33
  SegmentsCacheInRedis.prototype.getChangeNumber = function (name) {
28
34
  var _this = this;
29
35
  return this.redis.get(this.keys.buildSegmentTillKey(name)).then(function (value) {
30
36
  var i = parseInt(value, 10);
31
- return isNaNNumber(i) ? -1 : i;
37
+ return isNaNNumber(i) ? undefined : i;
32
38
  }).catch(function (e) {
33
39
  _this.log.error(LOG_PREFIX + 'Could not retrieve changeNumber from segments storage. Error: ' + e);
34
- return -1;
40
+ return undefined;
35
41
  });
36
42
  };
37
43
  SegmentsCacheInRedis.prototype.registerSegments = function (segments) {
@@ -9,17 +9,23 @@ import { TelemetryCacheInRedis } from './TelemetryCacheInRedis';
9
9
  import { UniqueKeysCacheInRedis } from './UniqueKeysCacheInRedis';
10
10
  import { ImpressionCountsCacheInRedis } from './ImpressionCountsCacheInRedis';
11
11
  import { metadataBuilder } from '../utils';
12
+ var RD;
13
+ try {
14
+ // Using `require` to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
15
+ // Redis storage is not supported with .mjs files.
16
+ RD = require('./RedisAdapter').RedisAdapter;
17
+ }
18
+ catch (error) { /* empty */ }
12
19
  /**
13
- * InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.
20
+ * InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.js
14
21
  * @see {@link https://www.npmjs.com/package/ioredis}
15
22
  */
16
23
  export function InRedisStorage(options) {
17
24
  if (options === void 0) { options = {}; }
18
- // Lazy loading to prevent error when bundling or importing the SDK in a .mjs file, since ioredis is a CommonJS module.
19
- // Redis storage is not supported with .mjs files.
20
- var RD = require('./RedisAdapter').RedisAdapter;
21
25
  var prefix = validatePrefix(options.prefix);
22
26
  function InRedisStorageFactory(params) {
27
+ if (!RD)
28
+ throw new Error('The SDK Redis storage is unavailable. Make sure your runtime environment supports CommonJS (`require`) so the `ioredis` dependency can be imported.');
23
29
  var onReadyCb = params.onReadyCb, settings = params.settings, _a = params.settings, log = _a.log, impressionsMode = _a.sync.impressionsMode;
24
30
  var metadata = metadataBuilder(settings);
25
31
  var keys = new KeyBuilderSS(prefix, metadata);
@@ -27,7 +33,7 @@ export function InRedisStorage(options) {
27
33
  var telemetry = new TelemetryCacheInRedis(log, keys, redisClient);
28
34
  var impressionCountsCache = impressionsMode !== DEBUG ? new ImpressionCountsCacheInRedis(log, keys.buildImpressionsCountKey(), redisClient) : undefined;
29
35
  var uniqueKeysCache = impressionsMode === NONE ? new UniqueKeysCacheInRedis(log, keys.buildUniqueKeysKey(), redisClient) : undefined;
30
- // subscription to Redis connect event in order to emit SDK_READY event on consumer mode
36
+ // Subscription to Redis connect event in order to emit SDK_READY event on consumer mode
31
37
  redisClient.on('connect', function () {
32
38
  onReadyCb();
33
39
  if (impressionCountsCache)