@splitsoftware/splitio-commons 1.17.1-rc.3 → 1.17.1-rc.5

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 (275) hide show
  1. package/CHANGES.txt +28 -28
  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 +11 -12
  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 +17 -15
  18. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +17 -15
  19. package/cjs/sdkFactory/index.js +11 -38
  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 +12 -41
  24. package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
  25. package/cjs/storages/AbstractSplitsCacheSync.js +8 -2
  26. package/cjs/storages/KeyBuilderCS.js +5 -23
  27. package/cjs/storages/dataLoader.js +33 -65
  28. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  29. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  30. package/cjs/storages/inLocalStorage/index.js +3 -12
  31. package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -20
  32. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  33. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  34. package/cjs/storages/inMemory/SplitsCacheInMemory.js +8 -8
  35. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  36. package/cjs/storages/inRedis/RedisAdapter.js +1 -1
  37. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  38. package/cjs/storages/inRedis/index.js +11 -5
  39. package/cjs/storages/pluggable/SegmentsCachePluggable.js +2 -2
  40. package/cjs/storages/pluggable/inMemoryWrapper.js +1 -1
  41. package/cjs/storages/pluggable/index.js +32 -37
  42. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
  43. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  44. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  45. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  46. package/cjs/sync/polling/pollingManagerSS.js +3 -3
  47. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  48. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  49. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  50. package/cjs/sync/polling/updaters/splitChangesUpdater.js +11 -2
  51. package/cjs/sync/streaming/AuthClient/index.js +1 -1
  52. package/cjs/sync/streaming/SSEHandler/index.js +5 -3
  53. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +48 -107
  54. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  55. package/cjs/sync/streaming/constants.js +3 -3
  56. package/cjs/sync/streaming/parseUtils.js +9 -14
  57. package/cjs/sync/streaming/pushManager.js +67 -69
  58. package/cjs/sync/syncTask.js +2 -2
  59. package/cjs/trackers/eventTracker.js +9 -11
  60. package/cjs/trackers/impressionsTracker.js +13 -15
  61. package/cjs/trackers/uniqueKeysTracker.js +3 -5
  62. package/cjs/utils/constants/index.js +4 -5
  63. package/cjs/utils/settingsValidation/index.js +1 -2
  64. package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
  65. package/esm/consent/sdkUserConsent.js +4 -2
  66. package/esm/evaluator/matchers/index.js +1 -3
  67. package/esm/evaluator/matchers/matcherTypes.js +0 -1
  68. package/esm/evaluator/matchers/segment.js +0 -6
  69. package/esm/evaluator/matchersTransform/index.js +1 -4
  70. package/esm/evaluator/matchersTransform/segment.js +1 -3
  71. package/esm/logger/constants.js +1 -1
  72. package/esm/logger/messages/info.js +1 -1
  73. package/esm/logger/messages/warn.js +1 -1
  74. package/esm/readiness/readinessManager.js +11 -12
  75. package/esm/readiness/sdkReadinessManager.js +6 -5
  76. package/esm/sdkClient/sdkClient.js +5 -5
  77. package/esm/sdkClient/sdkClientMethod.js +1 -3
  78. package/esm/sdkClient/sdkClientMethodCS.js +15 -13
  79. package/esm/sdkClient/sdkClientMethodCSWithTT.js +15 -13
  80. package/esm/sdkFactory/index.js +12 -39
  81. package/esm/services/decorateHeaders.js +4 -0
  82. package/esm/services/splitApi.js +6 -6
  83. package/esm/services/splitHttpClient.js +6 -3
  84. package/esm/storages/AbstractSegmentsCacheSync.js +12 -41
  85. package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
  86. package/esm/storages/AbstractSplitsCacheSync.js +9 -3
  87. package/esm/storages/KeyBuilderCS.js +4 -21
  88. package/esm/storages/dataLoader.js +31 -62
  89. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +52 -29
  90. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +9 -1
  91. package/esm/storages/inLocalStorage/index.js +5 -14
  92. package/esm/storages/inMemory/InMemoryStorageCS.js +3 -20
  93. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +40 -9
  94. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  95. package/esm/storages/inMemory/SplitsCacheInMemory.js +8 -8
  96. package/esm/storages/inMemory/TelemetryCacheInMemory.js +10 -7
  97. package/esm/storages/inRedis/RedisAdapter.js +1 -1
  98. package/esm/storages/inRedis/SegmentsCacheInRedis.js +2 -2
  99. package/esm/storages/inRedis/index.js +11 -5
  100. package/esm/storages/pluggable/SegmentsCachePluggable.js +2 -2
  101. package/esm/storages/pluggable/inMemoryWrapper.js +1 -1
  102. package/esm/storages/pluggable/index.js +32 -37
  103. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
  104. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +8 -5
  105. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  106. package/esm/sync/polling/pollingManagerCS.js +1 -1
  107. package/esm/sync/polling/pollingManagerSS.js +3 -3
  108. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +2 -2
  109. package/esm/sync/polling/updaters/mySegmentsUpdater.js +21 -15
  110. package/esm/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  111. package/esm/sync/polling/updaters/splitChangesUpdater.js +12 -3
  112. package/esm/sync/streaming/AuthClient/index.js +1 -1
  113. package/esm/sync/streaming/SSEHandler/index.js +6 -4
  114. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +49 -108
  115. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +3 -3
  116. package/esm/sync/streaming/constants.js +2 -2
  117. package/esm/sync/streaming/parseUtils.js +8 -12
  118. package/esm/sync/streaming/pushManager.js +70 -72
  119. package/esm/sync/syncTask.js +2 -2
  120. package/esm/trackers/eventTracker.js +9 -11
  121. package/esm/trackers/impressionsTracker.js +13 -15
  122. package/esm/trackers/uniqueKeysTracker.js +3 -5
  123. package/esm/utils/constants/index.js +2 -3
  124. package/esm/utils/settingsValidation/index.js +1 -2
  125. package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
  126. package/package.json +1 -1
  127. package/src/consent/sdkUserConsent.ts +3 -2
  128. package/src/dtos/types.ts +7 -21
  129. package/src/evaluator/matchers/index.ts +0 -2
  130. package/src/evaluator/matchers/matcherTypes.ts +0 -1
  131. package/src/evaluator/matchers/segment.ts +0 -7
  132. package/src/evaluator/matchersTransform/index.ts +1 -4
  133. package/src/evaluator/matchersTransform/segment.ts +3 -5
  134. package/src/logger/constants.ts +1 -1
  135. package/src/logger/messages/info.ts +1 -1
  136. package/src/logger/messages/warn.ts +1 -1
  137. package/src/readiness/readinessManager.ts +12 -16
  138. package/src/readiness/sdkReadinessManager.ts +7 -7
  139. package/src/readiness/types.ts +2 -3
  140. package/src/sdkClient/sdkClient.ts +5 -5
  141. package/src/sdkClient/sdkClientMethod.ts +1 -4
  142. package/src/sdkClient/sdkClientMethodCS.ts +14 -11
  143. package/src/sdkClient/sdkClientMethodCSWithTT.ts +14 -11
  144. package/src/sdkFactory/index.ts +13 -42
  145. package/src/sdkFactory/types.ts +1 -5
  146. package/src/services/decorateHeaders.ts +5 -0
  147. package/src/services/splitApi.ts +7 -7
  148. package/src/services/splitHttpClient.ts +7 -4
  149. package/src/services/types.ts +2 -2
  150. package/src/storages/AbstractSegmentsCacheSync.ts +12 -53
  151. package/src/storages/AbstractSplitsCacheAsync.ts +8 -0
  152. package/src/storages/AbstractSplitsCacheSync.ts +11 -4
  153. package/src/storages/KeyBuilderCS.ts +5 -34
  154. package/src/storages/dataLoader.ts +33 -63
  155. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +59 -29
  156. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +10 -1
  157. package/src/storages/inLocalStorage/index.ts +6 -16
  158. package/src/storages/inMemory/InMemoryStorageCS.ts +3 -23
  159. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +44 -10
  160. package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
  161. package/src/storages/inMemory/SplitsCacheInMemory.ts +8 -7
  162. package/src/storages/inMemory/TelemetryCacheInMemory.ts +11 -7
  163. package/src/storages/inRedis/RedisAdapter.ts +1 -1
  164. package/src/storages/inRedis/SegmentsCacheInRedis.ts +2 -2
  165. package/src/storages/inRedis/index.ts +12 -6
  166. package/src/storages/pluggable/SegmentsCachePluggable.ts +2 -2
  167. package/src/storages/pluggable/inMemoryWrapper.ts +1 -1
  168. package/src/storages/pluggable/index.ts +33 -38
  169. package/src/storages/types.ts +15 -15
  170. package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
  171. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +10 -8
  172. package/src/sync/polling/fetchers/segmentChangesFetcher.ts +1 -1
  173. package/src/sync/polling/fetchers/types.ts +2 -3
  174. package/src/sync/polling/pollingManagerCS.ts +4 -4
  175. package/src/sync/polling/pollingManagerSS.ts +2 -3
  176. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +5 -4
  177. package/src/sync/polling/types.ts +6 -7
  178. package/src/sync/polling/updaters/mySegmentsUpdater.ts +22 -19
  179. package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -2
  180. package/src/sync/polling/updaters/splitChangesUpdater.ts +12 -4
  181. package/src/sync/streaming/AuthClient/index.ts +1 -1
  182. package/src/sync/streaming/SSEClient/index.ts +6 -4
  183. package/src/sync/streaming/SSEHandler/index.ts +8 -5
  184. package/src/sync/streaming/SSEHandler/types.ts +15 -15
  185. package/src/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.ts +49 -116
  186. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +4 -4
  187. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  188. package/src/sync/streaming/UpdateWorkers/types.ts +2 -2
  189. package/src/sync/streaming/constants.ts +2 -2
  190. package/src/sync/streaming/parseUtils.ts +11 -19
  191. package/src/sync/streaming/pushManager.ts +72 -73
  192. package/src/sync/streaming/types.ts +10 -10
  193. package/src/sync/submitters/types.ts +5 -8
  194. package/src/sync/syncTask.ts +2 -2
  195. package/src/trackers/eventTracker.ts +7 -10
  196. package/src/trackers/impressionsTracker.ts +9 -12
  197. package/src/trackers/types.ts +0 -1
  198. package/src/trackers/uniqueKeysTracker.ts +4 -6
  199. package/src/types.ts +9 -16
  200. package/src/utils/constants/index.ts +2 -3
  201. package/src/utils/settingsValidation/index.ts +2 -3
  202. package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
  203. package/src/utils/settingsValidation/types.ts +1 -1
  204. package/types/dtos/types.d.ts +7 -18
  205. package/types/evaluator/matchersTransform/segment.d.ts +2 -2
  206. package/types/logger/constants.d.ts +1 -1
  207. package/types/readiness/readinessManager.d.ts +2 -2
  208. package/types/readiness/sdkReadinessManager.d.ts +3 -2
  209. package/types/readiness/types.d.ts +2 -3
  210. package/types/sdkClient/sdkClientMethod.d.ts +1 -1
  211. package/types/sdkFactory/types.d.ts +1 -4
  212. package/types/services/decorateHeaders.d.ts +1 -0
  213. package/types/services/splitApi.d.ts +1 -1
  214. package/types/services/splitHttpClient.d.ts +1 -1
  215. package/types/services/types.d.ts +2 -2
  216. package/types/storages/AbstractSegmentsCacheSync.d.ts +11 -9
  217. package/types/storages/AbstractSplitsCacheAsync.d.ts +5 -0
  218. package/types/storages/AbstractSplitsCacheSync.d.ts +6 -1
  219. package/types/storages/KeyBuilderCS.d.ts +2 -9
  220. package/types/storages/dataLoader.d.ts +6 -17
  221. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +14 -4
  222. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +6 -0
  223. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +9 -3
  224. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -1
  225. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -1
  226. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -4
  227. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +1 -1
  228. package/types/storages/inRedis/index.d.ts +1 -1
  229. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +1 -1
  230. package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -1
  231. package/types/storages/types.d.ts +11 -11
  232. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +2 -2
  233. package/types/sync/polling/fetchers/types.d.ts +2 -2
  234. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +2 -2
  235. package/types/sync/polling/types.d.ts +4 -7
  236. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +3 -4
  237. package/types/sync/streaming/SSEHandler/types.d.ts +14 -16
  238. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +2 -4
  239. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -2
  240. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +2 -3
  241. package/types/sync/streaming/UpdateWorkers/types.d.ts +2 -2
  242. package/types/sync/streaming/constants.d.ts +2 -2
  243. package/types/sync/streaming/parseUtils.d.ts +5 -4
  244. package/types/sync/streaming/types.d.ts +8 -8
  245. package/types/sync/submitters/types.d.ts +4 -7
  246. package/types/trackers/eventTracker.d.ts +1 -1
  247. package/types/trackers/impressionsTracker.d.ts +1 -1
  248. package/types/trackers/types.d.ts +0 -1
  249. package/types/types.d.ts +9 -15
  250. package/types/utils/constants/index.d.ts +2 -3
  251. package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
  252. package/types/utils/settingsValidation/types.d.ts +1 -1
  253. package/cjs/evaluator/matchers/large_segment.js +0 -16
  254. package/cjs/sdkClient/identity.js +0 -7
  255. package/esm/evaluator/matchers/large_segment.js +0 -12
  256. package/esm/sdkClient/identity.js +0 -3
  257. package/src/evaluator/matchers/large_segment.ts +0 -18
  258. package/src/sdkClient/identity.ts +0 -5
  259. package/types/evaluator/matchers/large_segment.d.ts +0 -5
  260. package/types/evaluator/matchers/sember_inlist.d.ts +0 -3
  261. package/types/evaluator/matchersTransform/set.d.ts +0 -5
  262. package/types/evaluator/matchersTransform/string.d.ts +0 -7
  263. package/types/sdkClient/identity.d.ts +0 -2
  264. package/types/storages/AbstractMySegmentsCacheSync.d.ts +0 -39
  265. package/types/storages/AbstractSplitsCache.d.ts +0 -46
  266. package/types/sync/streaming/mySegmentsV2utils.d.ts +0 -27
  267. package/types/sync/streaming/pushManagerCS_Spec1_3.d.ts +0 -9
  268. package/types/sync/streaming/pushManager_Spec1_3.d.ts +0 -9
  269. package/types/trackers/impressionObserver/utils.d.ts +0 -5
  270. package/types/utils/inputValidation/sdkKey.d.ts +0 -7
  271. package/types/utils/inputValidation/splitExistance.d.ts +0 -7
  272. package/types/utils/inputValidation/trafficTypeExistance.d.ts +0 -9
  273. package/types/utils/redis/RedisMock.d.ts +0 -4
  274. package/types/utils/settingsValidation/logger/globalLogLevel.d.ts +0 -8
  275. /package/types/utils/{semVer.d.ts → Semver.d.ts} +0 -0
@@ -1,120 +1,61 @@
1
1
  import { Backoff } from '../../../utils/Backoff';
2
- import { MEMBERSHIPS } from '../../../utils/constants';
3
- import { FETCH_BACKOFF_MAX_RETRIES } from './constants';
4
- import { MEMBERSHIPS_LS_UPDATE, MEMBERSHIPS_MS_UPDATE } from '../constants';
2
+ import { MY_SEGMENT } from '../../../utils/constants';
5
3
  /**
6
4
  * MySegmentsUpdateWorker factory
7
5
  */
8
- export function MySegmentsUpdateWorker(log, storage, mySegmentsSyncTask, telemetryTracker) {
9
- var _a;
10
- var _delay;
11
- var _delayTimeoutID;
12
- function createUpdateWorker(mySegmentsCache) {
13
- var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
14
- var currentChangeNumber = -1;
15
- var handleNewEvent = false;
16
- var isHandlingEvent;
17
- var cdnBypass;
18
- var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
19
- var backoff = new Backoff(__handleMySegmentsUpdateCall);
20
- function __handleMySegmentsUpdateCall() {
21
- isHandlingEvent = true;
22
- if (maxChangeNumber > Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber())) {
23
- handleNewEvent = false;
24
- var currentMaxChangeNumber_1 = maxChangeNumber;
25
- // fetch mySegments revalidating data if cached
26
- var syncTask = _delay ?
27
- new Promise(function (res) {
28
- _delayTimeoutID = setTimeout(function () {
29
- _delay = undefined;
30
- mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined).then(res);
31
- }, _delay);
32
- }) :
33
- mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined);
34
- syncTask.then(function (result) {
35
- if (!isHandlingEvent)
36
- return; // halt if `stop` has been called
37
- if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, `mySegmentsCache.getChangeNumber` can be -1, since `/memberships` change number is optional
38
- var storageChangeNumber = mySegmentsCache.getChangeNumber();
39
- currentChangeNumber = storageChangeNumber > -1 ?
40
- storageChangeNumber :
41
- Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
42
- }
43
- if (handleNewEvent) {
44
- __handleMySegmentsUpdateCall();
45
- }
46
- else {
47
- if (_segmentsData)
48
- telemetryTracker.trackUpdatesFromSSE(MEMBERSHIPS);
49
- var attempts = backoff.attempts + 1;
50
- if (maxChangeNumber <= currentChangeNumber) {
51
- log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
52
- isHandlingEvent = false;
53
- return;
54
- }
55
- if (attempts < FETCH_BACKOFF_MAX_RETRIES) {
56
- backoff.scheduleCall();
57
- return;
58
- }
59
- if (cdnBypass) {
60
- log.debug("No changes fetched after " + attempts + " attempts with CDN bypassed.");
61
- isHandlingEvent = false;
62
- }
63
- else {
64
- backoff.reset();
65
- cdnBypass = true;
66
- __handleMySegmentsUpdateCall();
67
- }
68
- }
69
- });
70
- }
71
- else {
72
- isHandlingEvent = false;
73
- }
74
- }
75
- return {
76
- /**
77
- * Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
78
- *
79
- * @param changeNumber change number of the notification
80
- * @param segmentsData data for KeyList or SegmentRemoval instant updates
81
- * @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
82
- */
83
- put: function (mySegmentsData, payload, delay) {
84
- var type = mySegmentsData.type, cn = mySegmentsData.cn;
85
- // Discard event if it is outdated or there is a pending fetch request (_delay is set), but update target change number
86
- if (cn <= Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber()) || cn <= maxChangeNumber)
87
- return;
88
- maxChangeNumber = cn;
89
- if (_delay)
90
- return;
91
- handleNewEvent = true;
92
- cdnBypass = false;
93
- _segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
94
- _delay = delay;
95
- if (backoff.timeoutID || !isHandlingEvent)
6
+ export function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
7
+ var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
8
+ var currentChangeNumber = -1;
9
+ var handleNewEvent = false;
10
+ var isHandlingEvent;
11
+ var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
12
+ var backoff = new Backoff(__handleMySegmentsUpdateCall);
13
+ function __handleMySegmentsUpdateCall() {
14
+ isHandlingEvent = true;
15
+ if (maxChangeNumber > currentChangeNumber) {
16
+ handleNewEvent = false;
17
+ var currentMaxChangeNumber_1 = maxChangeNumber;
18
+ // fetch mySegments revalidating data if cached
19
+ mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
20
+ if (!isHandlingEvent)
21
+ return; // halt if `stop` has been called
22
+ if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
23
+ if (_segmentsData)
24
+ telemetryTracker.trackUpdatesFromSSE(MY_SEGMENT);
25
+ currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
26
+ }
27
+ if (handleNewEvent) {
96
28
  __handleMySegmentsUpdateCall();
97
- backoff.reset();
98
- },
99
- stop: function () {
100
- clearTimeout(_delayTimeoutID);
101
- _delay = undefined;
102
- isHandlingEvent = false;
103
- backoff.reset();
104
- }
105
- };
29
+ }
30
+ else {
31
+ backoff.scheduleCall();
32
+ }
33
+ });
34
+ }
35
+ else {
36
+ isHandlingEvent = false;
37
+ }
106
38
  }
107
- var updateWorkers = (_a = {},
108
- _a[MEMBERSHIPS_MS_UPDATE] = createUpdateWorker(storage.segments),
109
- _a[MEMBERSHIPS_LS_UPDATE] = createUpdateWorker(storage.largeSegments),
110
- _a);
111
39
  return {
112
- put: function (mySegmentsData, payload, delay) {
113
- updateWorkers[mySegmentsData.type].put(mySegmentsData, payload, delay);
40
+ /**
41
+ * Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
42
+ *
43
+ * @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
44
+ * @param {SegmentsData | undefined} segmentsData might be undefined
45
+ */
46
+ put: function (changeNumber, segmentsData) {
47
+ if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
48
+ return;
49
+ maxChangeNumber = changeNumber;
50
+ handleNewEvent = true;
51
+ _segmentsData = segmentsData;
52
+ if (backoff.timeoutID || !isHandlingEvent)
53
+ __handleMySegmentsUpdateCall();
54
+ backoff.reset();
114
55
  },
115
56
  stop: function () {
116
- updateWorkers[MEMBERSHIPS_MS_UPDATE].stop();
117
- updateWorkers[MEMBERSHIPS_LS_UPDATE].stop();
57
+ isHandlingEvent = false;
58
+ backoff.reset();
118
59
  }
119
60
  };
120
61
  }
@@ -13,7 +13,7 @@ export function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
13
13
  var backoff = new Backoff(__handleSegmentUpdateCall, FETCH_BACKOFF_BASE, FETCH_BACKOFF_MAX_WAIT);
14
14
  function __handleSegmentUpdateCall() {
15
15
  isHandlingEvent = true;
16
- if (maxChangeNumber > segmentsCache.getChangeNumber(segment)) {
16
+ if (maxChangeNumber > (segmentsCache.getChangeNumber(segment) || -1)) {
17
17
  handleNewEvent = false;
18
18
  // fetch segments revalidating data if cached
19
19
  segmentsSyncTask.execute(false, segment, true, cdnBypass ? maxChangeNumber : undefined).then(function () {
@@ -24,7 +24,7 @@ export function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
24
24
  }
25
25
  else {
26
26
  var attempts = backoff.attempts + 1;
27
- if (maxChangeNumber <= segmentsCache.getChangeNumber(segment)) {
27
+ if (maxChangeNumber <= (segmentsCache.getChangeNumber(segment) || -1)) {
28
28
  log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
29
29
  isHandlingEvent = false;
30
30
  return;
@@ -51,7 +51,7 @@ export function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
51
51
  }
52
52
  return {
53
53
  put: function (changeNumber) {
54
- var currentChangeNumber = segmentsCache.getChangeNumber(segment);
54
+ var currentChangeNumber = segmentsCache.getChangeNumber(segment) || -1;
55
55
  if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
56
56
  return;
57
57
  maxChangeNumber = changeNumber;
@@ -22,8 +22,8 @@ export var PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
22
22
  */
23
23
  export var PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
24
24
  // Update-type push notifications, handled by NotificationProcessor
25
- export var MEMBERSHIPS_MS_UPDATE = 'MEMBERSHIPS_MS_UPDATE';
26
- export var MEMBERSHIPS_LS_UPDATE = 'MEMBERSHIPS_LS_UPDATE';
25
+ export var MY_SEGMENTS_UPDATE = 'MY_SEGMENTS_UPDATE';
26
+ export var MY_SEGMENTS_UPDATE_V2 = 'MY_SEGMENTS_UPDATE_V2';
27
27
  export var SEGMENT_UPDATE = 'SEGMENT_UPDATE';
28
28
  export var SPLIT_KILL = 'SPLIT_KILL';
29
29
  export var SPLIT_UPDATE = 'SPLIT_UPDATE';
@@ -1,6 +1,5 @@
1
1
  import { algorithms } from '../../utils/decompress';
2
2
  import { decodeFromBase64 } from '../../utils/base64';
3
- import { hash } from '../../utils/murmur3/murmur3';
4
3
  var GZIP = 1;
5
4
  var ZLIB = 2;
6
5
  function Uint8ArrayToString(myUint8Arr) {
@@ -75,17 +74,14 @@ export function isInBitmap(bitmap, hash64hex) {
75
74
  }
76
75
  /**
77
76
  * Parse feature flags notifications for instant feature flag updates
77
+ *
78
+ * @param {ISplitUpdateData} data
79
+ * @returns {KeyList}
78
80
  */
79
81
  export function parseFFUpdatePayload(compression, data) {
80
- return compression > 0 ?
81
- parseKeyList(data, compression, false) :
82
- JSON.parse(decodeFromBase64(data));
83
- }
84
- var DEFAULT_MAX_INTERVAL = 60000;
85
- export function getDelay(parsedData, matchingKey) {
86
- if (parsedData.h === 0)
87
- return 0;
88
- var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
89
- var seed = parsedData.s || 0;
90
- return hash(matchingKey, seed) % interval;
82
+ var avoidPrecisionLoss = false;
83
+ if (compression > 0)
84
+ return parseKeyList(data, compression, avoidPrecisionLoss);
85
+ else
86
+ return JSON.parse(decodeFromBase64(data));
91
87
  }
@@ -8,10 +8,10 @@ import { authenticateFactory, hashUserKey } from './AuthClient';
8
8
  import { forOwn } from '../../utils/lang';
9
9
  import { SSEClient } from './SSEClient';
10
10
  import { getMatching } from '../../utils/key';
11
- import { MEMBERSHIPS_MS_UPDATE, MEMBERSHIPS_LS_UPDATE, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType } from './constants';
12
- import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MEMBERSHIPS_UPDATE, STREAMING_PARSING_SPLIT_UPDATE } from '../../logger/constants';
11
+ import { MY_SEGMENTS_UPDATE, MY_SEGMENTS_UPDATE_V2, PUSH_NONRETRYABLE_ERROR, PUSH_SUBSYSTEM_DOWN, SECONDS_BEFORE_EXPIRATION, SEGMENT_UPDATE, SPLIT_KILL, SPLIT_UPDATE, PUSH_RETRYABLE_ERROR, PUSH_SUBSYSTEM_UP, ControlType } from './constants';
12
+ import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, STREAMING_PARSING_SPLIT_UPDATE } from '../../logger/constants';
13
13
  import { UpdateStrategy } from './SSEHandler/types';
14
- import { getDelay, isInBitmap, parseBitmap, parseFFUpdatePayload, parseKeyList } from './parseUtils';
14
+ import { isInBitmap, parseBitmap, parseFFUpdatePayload, parseKeyList } from './parseUtils';
15
15
  import { _Set } from '../../utils/lang/sets';
16
16
  import { hash64 } from '../../utils/murmur3/murmur3_64';
17
17
  import { TOKEN_REFRESH, AUTH_REJECTION } from '../../utils/constants';
@@ -45,10 +45,10 @@ export function pushManagerFactory(params, pollingManager) {
45
45
  var segmentsUpdateWorker = userKey ? undefined : SegmentsUpdateWorker(log, pollingManager.segmentsSyncTask, storage.segments);
46
46
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
47
47
  var splitsUpdateWorker = SplitsUpdateWorker(log, storage.splits, pollingManager.splitsSyncTask, readiness.splits, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
48
- // [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
48
+ // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
49
49
  var userKeyHashes = {};
50
50
  // [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
51
- // Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
51
+ // Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
52
52
  var clients = {};
53
53
  // [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
54
54
  var connectForNewClient = false;
@@ -195,76 +195,77 @@ export function pushManagerFactory(params, pollingManager) {
195
195
  }
196
196
  splitsUpdateWorker.put(parsedData);
197
197
  });
198
- function handleMySegmentsUpdate(parsedData) {
199
- switch (parsedData.u) {
200
- case UpdateStrategy.BoundedFetchRequest: {
201
- var bitmap_1;
202
- try {
203
- bitmap_1 = parseBitmap(parsedData.d, parsedData.c);
204
- }
205
- catch (e) {
206
- log.warn(STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
207
- break;
208
- }
209
- forOwn(clients, function (_a, matchingKey) {
210
- var hash64 = _a.hash64, worker = _a.worker;
211
- if (isInBitmap(bitmap_1, hash64.hex)) {
212
- worker.put(parsedData, undefined, getDelay(parsedData, matchingKey));
213
- }
214
- });
215
- return;
198
+ if (userKey) {
199
+ pushEmitter.on(MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
200
+ var userKeyHash = channel.split('_')[2];
201
+ var userKey = userKeyHashes[userKeyHash];
202
+ if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
203
+ clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
216
204
  }
217
- case UpdateStrategy.KeyList: {
218
- var keyList = void 0, added_1, removed_1;
219
- try {
220
- keyList = parseKeyList(parsedData.d, parsedData.c);
221
- added_1 = new _Set(keyList.a);
222
- removed_1 = new _Set(keyList.r);
223
- }
224
- catch (e) {
225
- log.warn(STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
226
- break;
227
- }
228
- if (!parsedData.n || !parsedData.n.length) {
229
- log.warn(STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', 'No segment name was provided']);
230
- break;
205
+ });
206
+ pushEmitter.on(MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
207
+ switch (parsedData.u) {
208
+ case UpdateStrategy.BoundedFetchRequest: {
209
+ var bitmap_1;
210
+ try {
211
+ bitmap_1 = parseBitmap(parsedData.d, parsedData.c);
212
+ }
213
+ catch (e) {
214
+ log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
215
+ break;
216
+ }
217
+ forOwn(clients, function (_a) {
218
+ var hash64 = _a.hash64, worker = _a.worker;
219
+ if (isInBitmap(bitmap_1, hash64.hex)) {
220
+ worker.put(parsedData.changeNumber); // fetch mySegments
221
+ }
222
+ });
223
+ return;
231
224
  }
232
- forOwn(clients, function (_a) {
233
- var hash64 = _a.hash64, worker = _a.worker;
234
- var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
235
- if (add !== undefined) {
236
- worker.put(parsedData, {
237
- added: add ? [parsedData.n[0]] : [],
238
- removed: add ? [] : [parsedData.n[0]]
239
- });
225
+ case UpdateStrategy.KeyList: {
226
+ var keyList = void 0, added_1, removed_1;
227
+ try {
228
+ keyList = parseKeyList(parsedData.d, parsedData.c);
229
+ added_1 = new _Set(keyList.a);
230
+ removed_1 = new _Set(keyList.r);
240
231
  }
241
- });
242
- return;
243
- }
244
- case UpdateStrategy.SegmentRemoval:
245
- if (!parsedData.n || !parsedData.n.length) {
246
- log.warn(STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
247
- break;
232
+ catch (e) {
233
+ log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
234
+ break;
235
+ }
236
+ forOwn(clients, function (_a) {
237
+ var hash64 = _a.hash64, worker = _a.worker;
238
+ var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
239
+ if (add !== undefined) {
240
+ worker.put(parsedData.changeNumber, {
241
+ name: parsedData.segmentName,
242
+ add: add
243
+ });
244
+ }
245
+ });
246
+ return;
248
247
  }
249
- forOwn(clients, function (_a) {
250
- var worker = _a.worker;
251
- worker.put(parsedData, {
252
- added: [],
253
- removed: parsedData.n
248
+ case UpdateStrategy.SegmentRemoval:
249
+ if (!parsedData.segmentName) {
250
+ log.warn(STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
251
+ break;
252
+ }
253
+ forOwn(clients, function (_a) {
254
+ var worker = _a.worker;
255
+ return worker.put(parsedData.changeNumber, {
256
+ name: parsedData.segmentName,
257
+ add: false
258
+ });
254
259
  });
255
- });
256
- return;
257
- }
258
- // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
259
- forOwn(clients, function (_a, matchingKey) {
260
- var worker = _a.worker;
261
- worker.put(parsedData, undefined, getDelay(parsedData, matchingKey));
260
+ return;
261
+ }
262
+ // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
263
+ forOwn(clients, function (_a) {
264
+ var worker = _a.worker;
265
+ worker.put(parsedData.changeNumber);
266
+ });
262
267
  });
263
268
  }
264
- if (userKey) {
265
- pushEmitter.on(MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
266
- pushEmitter.on(MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
267
- }
268
269
  else {
269
270
  pushEmitter.on(SEGMENT_UPDATE, segmentsUpdateWorker.put);
270
271
  }
@@ -299,10 +300,7 @@ export function pushManagerFactory(params, pollingManager) {
299
300
  var hash = hashUserKey(userKey);
300
301
  if (!userKeyHashes[hash]) {
301
302
  userKeyHashes[hash] = userKey;
302
- clients[userKey] = {
303
- hash64: hash64(userKey),
304
- worker: MySegmentsUpdateWorker(log, storage, mySegmentsSyncTask, telemetryTracker)
305
- };
303
+ clients[userKey] = { hash64: hash64(userKey), worker: MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) };
306
304
  connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
307
305
  // Reconnects in case of a new client.
308
306
  // Run in next event-loop cycle to save authentication calls
@@ -66,8 +66,8 @@ export function syncTaskFactory(log, task, period, taskName) {
66
66
  }
67
67
  },
68
68
  stop: function () {
69
- running = false;
70
- if (timeoutID) {
69
+ if (running) {
70
+ running = false;
71
71
  log.debug(SYNC_TASK_STOP, [taskName]);
72
72
  clearTimeout(timeoutID);
73
73
  timeoutID = undefined;
@@ -9,7 +9,7 @@ import { isConsumerMode } from '../utils/settingsValidation/mode';
9
9
  * @param eventsCache cache to save events
10
10
  * @param integrationsManager optional event handler used for integrations
11
11
  */
12
- export function eventTrackerFactory(settings, eventsCache, whenInit, integrationsManager, telemetryCache) {
12
+ export function eventTrackerFactory(settings, eventsCache, integrationsManager, telemetryCache) {
13
13
  var log = settings.log, mode = settings.mode;
14
14
  var isAsync = isConsumerMode(mode);
15
15
  function queueEventsCallback(eventData, tracked) {
@@ -20,16 +20,14 @@ export function eventTrackerFactory(settings, eventsCache, whenInit, integration
20
20
  log.info(EVENTS_TRACKER_SUCCESS, [msg]);
21
21
  if (integrationsManager) {
22
22
  // Wrap in a timeout because we don't want it to be blocking.
23
- whenInit(function () {
24
- setTimeout(function () {
25
- // copy of event, to avoid unexpected behaviour if modified by integrations
26
- var eventDataCopy = objectAssign({}, eventData);
27
- if (properties)
28
- eventDataCopy.properties = objectAssign({}, properties);
29
- // integrationsManager does not throw errors (they are internally handled by each integration module)
30
- integrationsManager.handleEvent(eventDataCopy);
31
- });
32
- });
23
+ setTimeout(function () {
24
+ // copy of event, to avoid unexpected behaviour if modified by integrations
25
+ var eventDataCopy = objectAssign({}, eventData);
26
+ if (properties)
27
+ eventDataCopy.properties = objectAssign({}, properties);
28
+ // integrationsManager does not throw errors (they are internally handled by each integration module)
29
+ integrationsManager.handleEvent(eventDataCopy);
30
+ }, 0);
33
31
  }
34
32
  }
35
33
  else {
@@ -11,7 +11,7 @@ import { CONSENT_DECLINED, DEDUPED, QUEUED } from '../utils/constants';
11
11
  * @param integrationsManager optional integrations manager
12
12
  * @param strategy strategy for impressions tracking.
13
13
  */
14
- export function impressionsTrackerFactory(settings, impressionsCache, strategy, whenInit, integrationsManager, telemetryCache) {
14
+ export function impressionsTrackerFactory(settings, impressionsCache, strategy, integrationsManager, telemetryCache) {
15
15
  var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
16
16
  return {
17
17
  track: function (impressions, attributes) {
@@ -51,20 +51,18 @@ export function impressionsTrackerFactory(settings, impressionsCache, strategy,
51
51
  sdkLanguageVersion: version
52
52
  };
53
53
  // Wrap in a timeout because we don't want it to be blocking.
54
- whenInit(function () {
55
- setTimeout(function () {
56
- // integrationsManager.handleImpression does not throw errors
57
- if (integrationsManager)
58
- integrationsManager.handleImpression(impressionData);
59
- try { // @ts-ignore. An exception on the listeners should not break the SDK.
60
- if (impressionListener)
61
- impressionListener.logImpression(impressionData);
62
- }
63
- catch (err) {
64
- log.error(ERROR_IMPRESSIONS_LISTENER, [err]);
65
- }
66
- });
67
- });
54
+ setTimeout(function () {
55
+ // integrationsManager.handleImpression does not throw errors
56
+ if (integrationsManager)
57
+ integrationsManager.handleImpression(impressionData);
58
+ try { // @ts-ignore. An exception on the listeners should not break the SDK.
59
+ if (impressionListener)
60
+ impressionListener.logImpression(impressionData);
61
+ }
62
+ catch (err) {
63
+ log.error(ERROR_IMPRESSIONS_LISTENER, [err]);
64
+ }
65
+ }, 0);
68
66
  };
69
67
  for (var i = 0; i < impressionsToListenerCount; i++) {
70
68
  _loop_1(i);
@@ -16,6 +16,9 @@ var noopFilterAdapter = {
16
16
  export function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
17
17
  if (filterAdapter === void 0) { filterAdapter = noopFilterAdapter; }
18
18
  var intervalId;
19
+ if (filterAdapter.refreshRate) {
20
+ intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
21
+ }
19
22
  return {
20
23
  track: function (key, featureName) {
21
24
  if (!filterAdapter.add(key, featureName)) {
@@ -24,11 +27,6 @@ export function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
24
27
  }
25
28
  uniqueKeysCache.track(key, featureName);
26
29
  },
27
- start: function () {
28
- if (filterAdapter.refreshRate) {
29
- intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
30
- }
31
- },
32
30
  stop: function () {
33
31
  clearInterval(intervalId);
34
32
  }
@@ -60,7 +60,7 @@ export var EVENTS = 'ev';
60
60
  export var TELEMETRY = 'te';
61
61
  export var TOKEN = 'to';
62
62
  export var SEGMENT = 'se';
63
- export var MEMBERSHIPS = 'ms';
63
+ export var MY_SEGMENT = 'ms';
64
64
  export var TREATMENT = 't';
65
65
  export var TREATMENTS = 'ts';
66
66
  export var TREATMENT_WITH_CONFIG = 'tc';
@@ -86,7 +86,6 @@ export var NON_REQUESTED = 1;
86
86
  export var DISABLED = 0;
87
87
  export var ENABLED = 1;
88
88
  export var PAUSED = 2;
89
- export var FLAG_SPEC_VERSION = '1.2';
89
+ export var FLAG_SPEC_VERSION = '1.1';
90
90
  // Matcher types
91
91
  export var IN_SEGMENT = 'IN_SEGMENT';
92
- export var IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';
@@ -183,10 +183,9 @@ export function settingsValidation(config, validationParams) {
183
183
  var splitFiltersValidation = validateSplitFilters(log, sync.splitFilters, withDefaults.mode);
184
184
  sync.splitFilters = splitFiltersValidation.validFilters;
185
185
  sync.__splitFiltersValidation = splitFiltersValidation;
186
- // ensure a valid flag spec version
187
186
  sync.flagSpecVersion = flagSpec ? flagSpec(withDefaults) : FLAG_SPEC_VERSION;
188
187
  // ensure a valid user consent value
189
188
  // @ts-ignore, modify readonly prop
190
- withDefaults.userConsent = consent ? consent(withDefaults) : undefined;
189
+ withDefaults.userConsent = consent(withDefaults);
191
190
  return withDefaults;
192
191
  }
@@ -1,6 +1,12 @@
1
1
  import { InMemoryStorageCSFactory } from '../../../storages/inMemory/InMemoryStorageCS';
2
2
  import { ERROR_STORAGE_INVALID } from '../../../logger/constants';
3
3
  import { LOCALHOST_MODE, STANDALONE_MODE, STORAGE_PLUGGABLE, STORAGE_LOCALSTORAGE, STORAGE_MEMORY } from '../../../utils/constants';
4
+ export function __InLocalStorageMockFactory(params) {
5
+ var result = InMemoryStorageCSFactory(params);
6
+ result.splits.checkCache = function () { return true; }; // to emit SDK_READY_FROM_CACHE
7
+ return result;
8
+ }
9
+ __InLocalStorageMockFactory.type = STORAGE_MEMORY;
4
10
  /**
5
11
  * This function validates `settings.storage` object
6
12
  *
@@ -17,6 +23,10 @@ export function validateStorageCS(settings) {
17
23
  storage = InMemoryStorageCSFactory;
18
24
  log.error(ERROR_STORAGE_INVALID);
19
25
  }
26
+ // In localhost mode with InLocalStorage, fallback to a mock InLocalStorage to emit SDK_READY_FROM_CACHE
27
+ if (mode === LOCALHOST_MODE && storage.type === STORAGE_LOCALSTORAGE) {
28
+ return __InLocalStorageMockFactory;
29
+ }
20
30
  if ([LOCALHOST_MODE, STANDALONE_MODE].indexOf(mode) === -1) {
21
31
  // Consumer modes require an async storage
22
32
  if (storage.type !== STORAGE_PLUGGABLE)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.17.1-rc.3",
3
+ "version": "1.17.1-rc.5",
4
4
  "description": "Split JavaScript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -15,7 +15,7 @@ const ConsentStatus = {
15
15
  * The public user consent API exposed via SplitFactory, used to control if the SDK tracks and sends impressions and events or not.
16
16
  */
17
17
  export function createUserConsentAPI(params: ISdkFactoryContext) {
18
- const { settings, settings: { log }, syncManager, storage: { events, impressions, impressionCounts } } = params;
18
+ const { settings, settings: { log }, syncManager, storage: { events, impressions, impressionCounts, uniqueKeys } } = params;
19
19
 
20
20
  if (!isConsentGranted(settings)) log.info(USER_CONSENT_INITIAL, [settings.userConsent]);
21
21
 
@@ -41,7 +41,8 @@ export function createUserConsentAPI(params: ISdkFactoryContext) {
41
41
  // @ts-ignore, clear method is present in storage for standalone and partial consumer mode
42
42
  if (events.clear) events.clear(); // @ts-ignore
43
43
  if (impressions.clear) impressions.clear(); // @ts-ignore
44
- if (impressionCounts && impressionCounts.clear) impressionCounts.clear();
44
+ if (impressionCounts && impressionCounts.clear) impressionCounts.clear(); // @ts-ignore
45
+ if (uniqueKeys && uniqueKeys.clear) uniqueKeys.clear();
45
46
  }
46
47
  } else {
47
48
  log.info(USER_CONSENT_NOT_UPDATED, [newConsentStatus]);