@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
@@ -3,121 +3,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MySegmentsUpdateWorker = void 0;
4
4
  var Backoff_1 = require("../../../utils/Backoff");
5
5
  var constants_1 = require("../../../utils/constants");
6
- var constants_2 = require("./constants");
7
- var constants_3 = require("../constants");
8
6
  /**
9
7
  * MySegmentsUpdateWorker factory
10
8
  */
11
- function MySegmentsUpdateWorker(log, storage, mySegmentsSyncTask, telemetryTracker) {
12
- var _a;
13
- var _delay;
14
- var _delayTimeoutID;
15
- function createUpdateWorker(mySegmentsCache) {
16
- var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
17
- var currentChangeNumber = -1;
18
- var handleNewEvent = false;
19
- var isHandlingEvent;
20
- var cdnBypass;
21
- var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
22
- var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
23
- function __handleMySegmentsUpdateCall() {
24
- isHandlingEvent = true;
25
- if (maxChangeNumber > Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber())) {
26
- handleNewEvent = false;
27
- var currentMaxChangeNumber_1 = maxChangeNumber;
28
- // fetch mySegments revalidating data if cached
29
- var syncTask = _delay ?
30
- new Promise(function (res) {
31
- _delayTimeoutID = setTimeout(function () {
32
- _delay = undefined;
33
- mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined).then(res);
34
- }, _delay);
35
- }) :
36
- mySegmentsSyncTask.execute(_segmentsData, true, cdnBypass ? maxChangeNumber : undefined);
37
- syncTask.then(function (result) {
38
- if (!isHandlingEvent)
39
- return; // halt if `stop` has been called
40
- if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, `mySegmentsCache.getChangeNumber` can be -1, since `/memberships` change number is optional
41
- var storageChangeNumber = mySegmentsCache.getChangeNumber();
42
- currentChangeNumber = storageChangeNumber > -1 ?
43
- storageChangeNumber :
44
- Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
45
- }
46
- if (handleNewEvent) {
47
- __handleMySegmentsUpdateCall();
48
- }
49
- else {
50
- if (_segmentsData)
51
- telemetryTracker.trackUpdatesFromSSE(constants_1.MEMBERSHIPS);
52
- var attempts = backoff.attempts + 1;
53
- if (maxChangeNumber <= currentChangeNumber) {
54
- log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
55
- isHandlingEvent = false;
56
- return;
57
- }
58
- if (attempts < constants_2.FETCH_BACKOFF_MAX_RETRIES) {
59
- backoff.scheduleCall();
60
- return;
61
- }
62
- if (cdnBypass) {
63
- log.debug("No changes fetched after " + attempts + " attempts with CDN bypassed.");
64
- isHandlingEvent = false;
65
- }
66
- else {
67
- backoff.reset();
68
- cdnBypass = true;
69
- __handleMySegmentsUpdateCall();
70
- }
71
- }
72
- });
73
- }
74
- else {
75
- isHandlingEvent = false;
76
- }
77
- }
78
- return {
79
- /**
80
- * Invoked by NotificationProcessor on MY_(LARGE)_SEGMENTS_UPDATE notifications
81
- *
82
- * @param changeNumber change number of the notification
83
- * @param segmentsData data for KeyList or SegmentRemoval instant updates
84
- * @param delay optional time to wait for BoundedFetchRequest or BoundedFetchRequest updates
85
- */
86
- put: function (mySegmentsData, payload, delay) {
87
- var type = mySegmentsData.type, cn = mySegmentsData.cn;
88
- // Discard event if it is outdated or there is a pending fetch request (_delay is set), but update target change number
89
- if (cn <= Math.max(currentChangeNumber, mySegmentsCache.getChangeNumber()) || cn <= maxChangeNumber)
90
- return;
91
- maxChangeNumber = cn;
92
- if (_delay)
93
- return;
94
- handleNewEvent = true;
95
- cdnBypass = false;
96
- _segmentsData = payload && { type: type, cn: cn, added: payload.added, removed: payload.removed };
97
- _delay = delay;
98
- if (backoff.timeoutID || !isHandlingEvent)
9
+ function MySegmentsUpdateWorker(mySegmentsSyncTask, telemetryTracker) {
10
+ var maxChangeNumber = 0; // keeps the maximum changeNumber among queued events
11
+ var currentChangeNumber = -1;
12
+ var handleNewEvent = false;
13
+ var isHandlingEvent;
14
+ var _segmentsData; // keeps the segmentsData (if included in notification payload) from the queued event with maximum changeNumber
15
+ var backoff = new Backoff_1.Backoff(__handleMySegmentsUpdateCall);
16
+ function __handleMySegmentsUpdateCall() {
17
+ isHandlingEvent = true;
18
+ if (maxChangeNumber > currentChangeNumber) {
19
+ handleNewEvent = false;
20
+ var currentMaxChangeNumber_1 = maxChangeNumber;
21
+ // fetch mySegments revalidating data if cached
22
+ mySegmentsSyncTask.execute(_segmentsData, true).then(function (result) {
23
+ if (!isHandlingEvent)
24
+ return; // halt if `stop` has been called
25
+ if (result !== false) { // Unlike `Splits|SegmentsUpdateWorker`, we cannot use `mySegmentsCache.getChangeNumber` since `/mySegments` endpoint doesn't provide this value.
26
+ if (_segmentsData)
27
+ telemetryTracker.trackUpdatesFromSSE(constants_1.MY_SEGMENT);
28
+ currentChangeNumber = Math.max(currentChangeNumber, currentMaxChangeNumber_1); // use `currentMaxChangeNumber`, in case that `maxChangeNumber` was updated during fetch.
29
+ }
30
+ if (handleNewEvent) {
99
31
  __handleMySegmentsUpdateCall();
100
- backoff.reset();
101
- },
102
- stop: function () {
103
- clearTimeout(_delayTimeoutID);
104
- _delay = undefined;
105
- isHandlingEvent = false;
106
- backoff.reset();
107
- }
108
- };
32
+ }
33
+ else {
34
+ backoff.scheduleCall();
35
+ }
36
+ });
37
+ }
38
+ else {
39
+ isHandlingEvent = false;
40
+ }
109
41
  }
110
- var updateWorkers = (_a = {},
111
- _a[constants_3.MEMBERSHIPS_MS_UPDATE] = createUpdateWorker(storage.segments),
112
- _a[constants_3.MEMBERSHIPS_LS_UPDATE] = createUpdateWorker(storage.largeSegments),
113
- _a);
114
42
  return {
115
- put: function (mySegmentsData, payload, delay) {
116
- updateWorkers[mySegmentsData.type].put(mySegmentsData, payload, delay);
43
+ /**
44
+ * Invoked by NotificationProcessor on MY_SEGMENTS_UPDATE event
45
+ *
46
+ * @param {number} changeNumber change number of the MY_SEGMENTS_UPDATE notification
47
+ * @param {SegmentsData | undefined} segmentsData might be undefined
48
+ */
49
+ put: function (changeNumber, segmentsData) {
50
+ if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
51
+ return;
52
+ maxChangeNumber = changeNumber;
53
+ handleNewEvent = true;
54
+ _segmentsData = segmentsData;
55
+ if (backoff.timeoutID || !isHandlingEvent)
56
+ __handleMySegmentsUpdateCall();
57
+ backoff.reset();
117
58
  },
118
59
  stop: function () {
119
- updateWorkers[constants_3.MEMBERSHIPS_MS_UPDATE].stop();
120
- updateWorkers[constants_3.MEMBERSHIPS_LS_UPDATE].stop();
60
+ isHandlingEvent = false;
61
+ backoff.reset();
121
62
  }
122
63
  };
123
64
  }
@@ -16,7 +16,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
16
16
  var backoff = new Backoff_1.Backoff(__handleSegmentUpdateCall, constants_1.FETCH_BACKOFF_BASE, constants_1.FETCH_BACKOFF_MAX_WAIT);
17
17
  function __handleSegmentUpdateCall() {
18
18
  isHandlingEvent = true;
19
- if (maxChangeNumber > segmentsCache.getChangeNumber(segment)) {
19
+ if (maxChangeNumber > (segmentsCache.getChangeNumber(segment) || -1)) {
20
20
  handleNewEvent = false;
21
21
  // fetch segments revalidating data if cached
22
22
  segmentsSyncTask.execute(false, segment, true, cdnBypass ? maxChangeNumber : undefined).then(function () {
@@ -27,7 +27,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
27
27
  }
28
28
  else {
29
29
  var attempts = backoff.attempts + 1;
30
- if (maxChangeNumber <= segmentsCache.getChangeNumber(segment)) {
30
+ if (maxChangeNumber <= (segmentsCache.getChangeNumber(segment) || -1)) {
31
31
  log.debug("Refresh completed" + (cdnBypass ? ' bypassing the CDN' : '') + " in " + attempts + " attempts.");
32
32
  isHandlingEvent = false;
33
33
  return;
@@ -54,7 +54,7 @@ function SegmentsUpdateWorker(log, segmentsSyncTask, segmentsCache) {
54
54
  }
55
55
  return {
56
56
  put: function (changeNumber) {
57
- var currentChangeNumber = segmentsCache.getChangeNumber(segment);
57
+ var currentChangeNumber = segmentsCache.getChangeNumber(segment) || -1;
58
58
  if (changeNumber <= currentChangeNumber || changeNumber <= maxChangeNumber)
59
59
  return;
60
60
  maxChangeNumber = changeNumber;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ControlType = exports.OCCUPANCY = exports.CONTROL = exports.SPLIT_UPDATE = exports.SPLIT_KILL = exports.SEGMENT_UPDATE = exports.MEMBERSHIPS_LS_UPDATE = exports.MEMBERSHIPS_MS_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
@@ -25,8 +25,8 @@ exports.PUSH_SUBSYSTEM_UP = 'PUSH_SUBSYSTEM_UP';
25
25
  */
26
26
  exports.PUSH_SUBSYSTEM_DOWN = 'PUSH_SUBSYSTEM_DOWN';
27
27
  // Update-type push notifications, handled by NotificationProcessor
28
- exports.MEMBERSHIPS_MS_UPDATE = 'MEMBERSHIPS_MS_UPDATE';
29
- exports.MEMBERSHIPS_LS_UPDATE = 'MEMBERSHIPS_LS_UPDATE';
28
+ exports.MY_SEGMENTS_UPDATE = 'MY_SEGMENTS_UPDATE';
29
+ 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';
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDelay = exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
3
+ exports.parseFFUpdatePayload = exports.isInBitmap = exports.parseBitmap = exports.parseKeyList = void 0;
4
4
  var decompress_1 = require("../../utils/decompress");
5
5
  var base64_1 = require("../../utils/base64");
6
- var murmur3_1 = require("../../utils/murmur3/murmur3");
7
6
  var GZIP = 1;
8
7
  var ZLIB = 2;
9
8
  function Uint8ArrayToString(myUint8Arr) {
@@ -81,19 +80,15 @@ function isInBitmap(bitmap, hash64hex) {
81
80
  exports.isInBitmap = isInBitmap;
82
81
  /**
83
82
  * Parse feature flags notifications for instant feature flag updates
83
+ *
84
+ * @param {ISplitUpdateData} data
85
+ * @returns {KeyList}
84
86
  */
85
87
  function parseFFUpdatePayload(compression, data) {
86
- return compression > 0 ?
87
- parseKeyList(data, compression, false) :
88
- 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));
89
93
  }
90
94
  exports.parseFFUpdatePayload = parseFFUpdatePayload;
91
- var DEFAULT_MAX_INTERVAL = 60000;
92
- function getDelay(parsedData, matchingKey) {
93
- if (parsedData.h === 0)
94
- return 0;
95
- var interval = parsedData.i || DEFAULT_MAX_INTERVAL;
96
- var seed = parsedData.s || 0;
97
- return (0, murmur3_1.hash)(matchingKey, seed) % interval;
98
- }
99
- exports.getDelay = getDelay;
@@ -48,10 +48,10 @@ function pushManagerFactory(params, pollingManager) {
48
48
  var segmentsUpdateWorker = userKey ? undefined : (0, SegmentsUpdateWorker_1.SegmentsUpdateWorker)(log, pollingManager.segmentsSyncTask, storage.segments);
49
49
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
50
50
  var splitsUpdateWorker = (0, SplitsUpdateWorker_1.SplitsUpdateWorker)(log, storage.splits, pollingManager.splitsSyncTask, readiness.splits, telemetryTracker, userKey ? undefined : pollingManager.segmentsSyncTask);
51
- // [Only for client-side] map of hashes to user keys, to dispatch membership update events to the corresponding MySegmentsUpdateWorker
51
+ // [Only for client-side] map of hashes to user keys, to dispatch MY_SEGMENTS_UPDATE events to the corresponding MySegmentsUpdateWorker
52
52
  var userKeyHashes = {};
53
53
  // [Only for client-side] map of user keys to their corresponding hash64 and MySegmentsUpdateWorkers.
54
- // Hash64 is used to process membership update events and dispatch actions to the corresponding MySegmentsUpdateWorker.
54
+ // Hash64 is used to process MY_SEGMENTS_UPDATE_V2 events and dispatch actions to the corresponding MySegmentsUpdateWorker.
55
55
  var clients = {};
56
56
  // [Only for client-side] variable to flag that a new client was added. It is needed to reconnect streaming.
57
57
  var connectForNewClient = false;
@@ -198,76 +198,77 @@ function pushManagerFactory(params, pollingManager) {
198
198
  }
199
199
  splitsUpdateWorker.put(parsedData);
200
200
  });
201
- function handleMySegmentsUpdate(parsedData) {
202
- switch (parsedData.u) {
203
- case types_1.UpdateStrategy.BoundedFetchRequest: {
204
- var bitmap_1;
205
- try {
206
- bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
207
- }
208
- catch (e) {
209
- log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['BoundedFetchRequest', e]);
210
- break;
211
- }
212
- (0, lang_1.forOwn)(clients, function (_a, matchingKey) {
213
- var hash64 = _a.hash64, worker = _a.worker;
214
- if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
215
- worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
216
- }
217
- });
218
- return;
201
+ if (userKey) {
202
+ pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE, function handleMySegmentsUpdate(parsedData, channel) {
203
+ var userKeyHash = channel.split('_')[2];
204
+ var userKey = userKeyHashes[userKeyHash];
205
+ if (userKey && clients[userKey]) { // check existence since it can be undefined if client has been destroyed
206
+ clients[userKey].worker.put(parsedData.changeNumber, parsedData.includesPayload ? parsedData.segmentList ? parsedData.segmentList : [] : undefined);
219
207
  }
220
- case types_1.UpdateStrategy.KeyList: {
221
- var keyList = void 0, added_1, removed_1;
222
- try {
223
- keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
224
- added_1 = new sets_1._Set(keyList.a);
225
- removed_1 = new sets_1._Set(keyList.r);
226
- }
227
- catch (e) {
228
- log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
229
- break;
230
- }
231
- if (!parsedData.n || !parsedData.n.length) {
232
- log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', 'No segment name was provided']);
233
- break;
208
+ });
209
+ pushEmitter.on(constants_1.MY_SEGMENTS_UPDATE_V2, function handleMySegmentsUpdate(parsedData) {
210
+ switch (parsedData.u) {
211
+ case types_1.UpdateStrategy.BoundedFetchRequest: {
212
+ var bitmap_1;
213
+ try {
214
+ bitmap_1 = (0, parseUtils_1.parseBitmap)(parsedData.d, parsedData.c);
215
+ }
216
+ catch (e) {
217
+ log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
218
+ break;
219
+ }
220
+ (0, lang_1.forOwn)(clients, function (_a) {
221
+ var hash64 = _a.hash64, worker = _a.worker;
222
+ if ((0, parseUtils_1.isInBitmap)(bitmap_1, hash64.hex)) {
223
+ worker.put(parsedData.changeNumber); // fetch mySegments
224
+ }
225
+ });
226
+ return;
234
227
  }
235
- (0, lang_1.forOwn)(clients, function (_a) {
236
- var hash64 = _a.hash64, worker = _a.worker;
237
- var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
238
- if (add !== undefined) {
239
- worker.put(parsedData, {
240
- added: add ? [parsedData.n[0]] : [],
241
- removed: add ? [] : [parsedData.n[0]]
242
- });
228
+ case types_1.UpdateStrategy.KeyList: {
229
+ var keyList = void 0, added_1, removed_1;
230
+ try {
231
+ keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
232
+ added_1 = new sets_1._Set(keyList.a);
233
+ removed_1 = new sets_1._Set(keyList.r);
243
234
  }
244
- });
245
- return;
246
- }
247
- case types_1.UpdateStrategy.SegmentRemoval:
248
- if (!parsedData.n || !parsedData.n.length) {
249
- log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['SegmentRemoval', 'No segment name was provided']);
250
- break;
235
+ catch (e) {
236
+ log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
237
+ break;
238
+ }
239
+ (0, lang_1.forOwn)(clients, function (_a) {
240
+ var hash64 = _a.hash64, worker = _a.worker;
241
+ var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
242
+ if (add !== undefined) {
243
+ worker.put(parsedData.changeNumber, {
244
+ name: parsedData.segmentName,
245
+ add: add
246
+ });
247
+ }
248
+ });
249
+ return;
251
250
  }
252
- (0, lang_1.forOwn)(clients, function (_a) {
253
- var worker = _a.worker;
254
- worker.put(parsedData, {
255
- added: [],
256
- removed: parsedData.n
251
+ case types_1.UpdateStrategy.SegmentRemoval:
252
+ if (!parsedData.segmentName) {
253
+ log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
254
+ break;
255
+ }
256
+ (0, lang_1.forOwn)(clients, function (_a) {
257
+ var worker = _a.worker;
258
+ return worker.put(parsedData.changeNumber, {
259
+ name: parsedData.segmentName,
260
+ add: false
261
+ });
257
262
  });
258
- });
259
- return;
260
- }
261
- // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
262
- (0, lang_1.forOwn)(clients, function (_a, matchingKey) {
263
- var worker = _a.worker;
264
- worker.put(parsedData, undefined, (0, parseUtils_1.getDelay)(parsedData, matchingKey));
263
+ return;
264
+ }
265
+ // `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
266
+ (0, lang_1.forOwn)(clients, function (_a) {
267
+ var worker = _a.worker;
268
+ worker.put(parsedData.changeNumber);
269
+ });
265
270
  });
266
271
  }
267
- if (userKey) {
268
- pushEmitter.on(constants_1.MEMBERSHIPS_MS_UPDATE, handleMySegmentsUpdate);
269
- pushEmitter.on(constants_1.MEMBERSHIPS_LS_UPDATE, handleMySegmentsUpdate);
270
- }
271
272
  else {
272
273
  pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
273
274
  }
@@ -302,10 +303,7 @@ function pushManagerFactory(params, pollingManager) {
302
303
  var hash = (0, AuthClient_1.hashUserKey)(userKey);
303
304
  if (!userKeyHashes[hash]) {
304
305
  userKeyHashes[hash] = userKey;
305
- clients[userKey] = {
306
- hash64: (0, murmur3_64_1.hash64)(userKey),
307
- worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(log, storage, mySegmentsSyncTask, telemetryTracker)
308
- };
306
+ clients[userKey] = { hash64: (0, murmur3_64_1.hash64)(userKey), worker: (0, MySegmentsUpdateWorker_1.MySegmentsUpdateWorker)(mySegmentsSyncTask, telemetryTracker) };
309
307
  connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
310
308
  // Reconnects in case of a new client.
311
309
  // Run in next event-loop cycle to save authentication calls
@@ -118,32 +118,33 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
118
118
  if (!pollingManager)
119
119
  return;
120
120
  var mySegmentsSyncTask = pollingManager.add(matchingKey, readinessManager, storage);
121
- if (running) {
122
- if (syncEnabled) {
123
- if (pushManager) {
124
- if (pollingManager.isRunning()) {
125
- // if doing polling, we must start the periodic fetch of data
126
- if (storage.splits.usesSegments())
127
- mySegmentsSyncTask.start();
121
+ return {
122
+ isRunning: mySegmentsSyncTask.isRunning,
123
+ start: function () {
124
+ if (syncEnabled) {
125
+ if (pushManager) {
126
+ if (pollingManager.isRunning()) {
127
+ // if doing polling, we must start the periodic fetch of data
128
+ if (storage.splits.usesSegments())
129
+ mySegmentsSyncTask.start();
130
+ }
131
+ else {
132
+ // if not polling, we must execute the sync task for the initial fetch
133
+ // of segments since `syncAll` was already executed when starting the main client
134
+ mySegmentsSyncTask.execute();
135
+ }
136
+ pushManager.add(matchingKey, mySegmentsSyncTask);
128
137
  }
129
138
  else {
130
- // if not polling, we must execute the sync task for the initial fetch
131
- // of segments since `syncAll` was already executed when starting the main client
132
- mySegmentsSyncTask.execute();
139
+ if (storage.splits.usesSegments())
140
+ mySegmentsSyncTask.start();
133
141
  }
134
- pushManager.add(matchingKey, mySegmentsSyncTask);
135
142
  }
136
143
  else {
137
- if (storage.splits.usesSegments())
138
- mySegmentsSyncTask.start();
144
+ if (!readinessManager.isReady())
145
+ mySegmentsSyncTask.execute();
139
146
  }
140
- }
141
- else {
142
- if (!readinessManager.isReady())
143
- mySegmentsSyncTask.execute();
144
- }
145
- }
146
- return {
147
+ },
147
148
  stop: function () {
148
149
  // check in case `client.destroy()` has been invoked more than once for the same client
149
150
  var mySegmentsSyncTask = pollingManager.get(matchingKey);
@@ -69,8 +69,8 @@ function syncTaskFactory(log, task, period, taskName) {
69
69
  }
70
70
  },
71
71
  stop: function () {
72
- running = false;
73
- if (timeoutID) {
72
+ if (running) {
73
+ running = false;
74
74
  log.debug(constants_1.SYNC_TASK_STOP, [taskName]);
75
75
  clearTimeout(timeoutID);
76
76
  timeoutID = undefined;
@@ -12,7 +12,7 @@ var mode_1 = require("../utils/settingsValidation/mode");
12
12
  * @param eventsCache cache to save events
13
13
  * @param integrationsManager optional event handler used for integrations
14
14
  */
15
- function eventTrackerFactory(settings, eventsCache, whenInit, integrationsManager, telemetryCache) {
15
+ function eventTrackerFactory(settings, eventsCache, integrationsManager, telemetryCache) {
16
16
  var log = settings.log, mode = settings.mode;
17
17
  var isAsync = (0, mode_1.isConsumerMode)(mode);
18
18
  function queueEventsCallback(eventData, tracked) {
@@ -22,17 +22,15 @@ function eventTrackerFactory(settings, eventsCache, whenInit, integrationsManage
22
22
  if (tracked) {
23
23
  log.info(constants_1.EVENTS_TRACKER_SUCCESS, [msg]);
24
24
  if (integrationsManager) {
25
- whenInit(function () {
26
- // Wrap in a timeout because we don't want it to be blocking.
27
- setTimeout(function () {
28
- // copy of event, to avoid unexpected behaviour if modified by integrations
29
- var eventDataCopy = (0, objectAssign_1.objectAssign)({}, eventData);
30
- if (properties)
31
- eventDataCopy.properties = (0, objectAssign_1.objectAssign)({}, properties);
32
- // integrationsManager does not throw errors (they are internally handled by each integration module)
33
- integrationsManager.handleEvent(eventDataCopy);
34
- });
35
- });
25
+ // Wrap in a timeout because we don't want it to be blocking.
26
+ setTimeout(function () {
27
+ // copy of event, to avoid unexpected behaviour if modified by integrations
28
+ var eventDataCopy = (0, objectAssign_1.objectAssign)({}, eventData);
29
+ if (properties)
30
+ eventDataCopy.properties = (0, objectAssign_1.objectAssign)({}, properties);
31
+ // integrationsManager does not throw errors (they are internally handled by each integration module)
32
+ integrationsManager.handleEvent(eventDataCopy);
33
+ }, 0);
36
34
  }
37
35
  }
38
36
  else {
@@ -14,7 +14,7 @@ var constants_2 = require("../utils/constants");
14
14
  * @param integrationsManager optional integrations manager
15
15
  * @param strategy strategy for impressions tracking.
16
16
  */
17
- function impressionsTrackerFactory(settings, impressionsCache, strategy, whenInit, integrationsManager, telemetryCache) {
17
+ function impressionsTrackerFactory(settings, impressionsCache, strategy, integrationsManager, telemetryCache) {
18
18
  var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
19
19
  return {
20
20
  track: function (impressions, attributes) {
@@ -53,21 +53,19 @@ function impressionsTrackerFactory(settings, impressionsCache, strategy, whenIni
53
53
  hostname: hostname,
54
54
  sdkLanguageVersion: version
55
55
  };
56
- whenInit(function () {
57
- // Wrap in a timeout because we don't want it to be blocking.
58
- setTimeout(function () {
59
- // integrationsManager.handleImpression does not throw errors
60
- if (integrationsManager)
61
- integrationsManager.handleImpression(impressionData);
62
- try { // @ts-ignore. An exception on the listeners should not break the SDK.
63
- if (impressionListener)
64
- impressionListener.logImpression(impressionData);
65
- }
66
- catch (err) {
67
- log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]);
68
- }
69
- });
70
- });
56
+ // Wrap in a timeout because we don't want it to be blocking.
57
+ setTimeout(function () {
58
+ // integrationsManager.handleImpression does not throw errors
59
+ if (integrationsManager)
60
+ integrationsManager.handleImpression(impressionData);
61
+ try { // @ts-ignore. An exception on the listeners should not break the SDK.
62
+ if (impressionListener)
63
+ impressionListener.logImpression(impressionData);
64
+ }
65
+ catch (err) {
66
+ log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]);
67
+ }
68
+ }, 0);
71
69
  };
72
70
  for (var i = 0; i < impressionsToListenerCount; i++) {
73
71
  _loop_1(i);
@@ -19,6 +19,9 @@ var noopFilterAdapter = {
19
19
  function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
20
20
  if (filterAdapter === void 0) { filterAdapter = noopFilterAdapter; }
21
21
  var intervalId;
22
+ if (filterAdapter.refreshRate) {
23
+ intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
24
+ }
22
25
  return {
23
26
  track: function (key, featureName) {
24
27
  if (!filterAdapter.add(key, featureName)) {
@@ -27,11 +30,6 @@ function uniqueKeysTrackerFactory(log, uniqueKeysCache, filterAdapter) {
27
30
  }
28
31
  uniqueKeysCache.track(key, featureName);
29
32
  },
30
- start: function () {
31
- if (filterAdapter.refreshRate) {
32
- intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate);
33
- }
34
- },
35
33
  stop: function () {
36
34
  clearInterval(intervalId);
37
35
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MEMBERSHIPS = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
4
- exports.IN_LARGE_SEGMENT = exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
3
+ exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.NONE_ENUM = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.NAMES_FN_LABEL = exports.SPLITS_FN_LABEL = exports.SPLIT_FN_LABEL = exports.TRACK_FN_LABEL = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS = exports.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET = exports.GET_TREATMENTS_BY_FLAG_SETS = exports.GET_TREATMENTS_BY_FLAG_SET = exports.GET_TREATMENTS_WITH_CONFIG = exports.GET_TREATMENT_WITH_CONFIG = exports.GET_TREATMENTS = exports.GET_TREATMENT = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.NONE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
4
+ exports.IN_SEGMENT = exports.FLAG_SPEC_VERSION = exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSETS = exports.TREATMENTS_WITH_CONFIG_BY_FLAGSET = exports.TREATMENTS_BY_FLAGSETS = exports.TREATMENTS_BY_FLAGSET = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = void 0;
5
5
  // Special treatments
6
6
  exports.CONTROL = 'control';
7
7
  exports.CONTROL_WITH_CONFIG = {
@@ -64,7 +64,7 @@ exports.EVENTS = 'ev';
64
64
  exports.TELEMETRY = 'te';
65
65
  exports.TOKEN = 'to';
66
66
  exports.SEGMENT = 'se';
67
- exports.MEMBERSHIPS = 'ms';
67
+ exports.MY_SEGMENT = 'ms';
68
68
  exports.TREATMENT = 't';
69
69
  exports.TREATMENTS = 'ts';
70
70
  exports.TREATMENT_WITH_CONFIG = 'tc';
@@ -90,7 +90,6 @@ exports.NON_REQUESTED = 1;
90
90
  exports.DISABLED = 0;
91
91
  exports.ENABLED = 1;
92
92
  exports.PAUSED = 2;
93
- exports.FLAG_SPEC_VERSION = '1.2';
93
+ exports.FLAG_SPEC_VERSION = '1.1';
94
94
  // Matcher types
95
95
  exports.IN_SEGMENT = 'IN_SEGMENT';
96
- exports.IN_LARGE_SEGMENT = 'IN_LARGE_SEGMENT';