@splitsoftware/splitio-commons 1.2.1-rc.0 → 1.2.1-rc.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/cjs/evaluator/Engine.js +6 -6
  2. package/cjs/evaluator/combiners/and.js +1 -1
  3. package/cjs/evaluator/combiners/ifelseif.js +2 -2
  4. package/cjs/evaluator/condition/engineUtils.js +2 -2
  5. package/cjs/evaluator/condition/index.js +4 -4
  6. package/cjs/evaluator/index.js +5 -5
  7. package/cjs/evaluator/matchers/cont_all.js +1 -1
  8. package/cjs/evaluator/matchers/cont_any.js +1 -1
  9. package/cjs/evaluator/matchers/cont_str.js +1 -1
  10. package/cjs/evaluator/matchers/dependency.js +1 -1
  11. package/cjs/evaluator/matchers/eq_set.js +1 -1
  12. package/cjs/evaluator/matchers/ew.js +3 -3
  13. package/cjs/evaluator/matchers/part_of.js +1 -1
  14. package/cjs/evaluator/matchers/segment.js +1 -1
  15. package/cjs/evaluator/matchers/sw.js +1 -1
  16. package/cjs/evaluator/matchers/whitelist.js +1 -1
  17. package/cjs/evaluator/matchersTransform/index.js +12 -12
  18. package/cjs/evaluator/parser/index.js +6 -6
  19. package/cjs/evaluator/treatments/index.js +1 -1
  20. package/cjs/evaluator/value/index.js +1 -1
  21. package/cjs/evaluator/value/sanitize.js +4 -4
  22. package/cjs/integrations/browser.js +3 -3
  23. package/cjs/integrations/ga/GaToSplit.js +14 -14
  24. package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +5 -3
  25. package/cjs/integrations/ga/SplitToGa.js +1 -1
  26. package/cjs/integrations/ga/SplitToGoogleAnalytics.js +4 -2
  27. package/cjs/listeners/browser.js +15 -11
  28. package/cjs/listeners/node.js +1 -1
  29. package/cjs/logger/constants.js +9 -3
  30. package/cjs/logger/index.js +2 -2
  31. package/cjs/logger/messages/debug.js +4 -4
  32. package/cjs/logger/messages/error.js +5 -4
  33. package/cjs/logger/messages/info.js +8 -5
  34. package/cjs/logger/messages/warn.js +1 -1
  35. package/cjs/logger/sdkLogger.js +1 -1
  36. package/cjs/readiness/readinessManager.js +2 -2
  37. package/cjs/readiness/sdkReadinessManager.js +4 -4
  38. package/cjs/sdkClient/client.js +12 -11
  39. package/cjs/sdkClient/clientAttributesDecoration.js +4 -4
  40. package/cjs/sdkClient/clientCS.js +3 -3
  41. package/cjs/sdkClient/clientInputValidation.js +20 -22
  42. package/cjs/sdkClient/sdkClient.js +3 -6
  43. package/cjs/sdkClient/sdkClientMethod.js +1 -1
  44. package/cjs/sdkClient/sdkClientMethodCS.js +6 -10
  45. package/cjs/sdkClient/sdkClientMethodCSWithTT.js +7 -15
  46. package/cjs/sdkFactory/index.js +14 -12
  47. package/cjs/sdkFactory/userConsentProps.js +40 -0
  48. package/cjs/sdkManager/index.js +11 -11
  49. package/cjs/services/splitApi.js +3 -2
  50. package/cjs/services/splitHttpClient.js +2 -2
  51. package/cjs/storages/KeyBuilder.js +2 -6
  52. package/cjs/storages/KeyBuilderCS.js +13 -3
  53. package/cjs/storages/KeyBuilderSS.js +1 -1
  54. package/cjs/storages/findLatencyIndex.js +1 -1
  55. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +24 -4
  56. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +12 -12
  57. package/cjs/storages/inLocalStorage/index.js +4 -4
  58. package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
  59. package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
  60. package/cjs/storages/inMemory/ImpressionsCacheInMemory.js +15 -1
  61. package/cjs/storages/inMemory/InMemoryStorage.js +1 -1
  62. package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -1
  63. package/cjs/storages/inMemory/LatenciesCacheInMemory.js +1 -1
  64. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
  65. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +2 -2
  66. package/cjs/storages/inMemory/SplitsCacheInMemory.js +5 -5
  67. package/cjs/storages/inRedis/LatenciesCacheInRedis.js +1 -1
  68. package/cjs/storages/inRedis/RedisAdapter.js +24 -11
  69. package/cjs/storages/inRedis/SegmentsCacheInRedis.js +1 -1
  70. package/cjs/storages/inRedis/SplitsCacheInRedis.js +3 -3
  71. package/cjs/storages/inRedis/index.js +1 -1
  72. package/cjs/storages/pluggable/SegmentsCachePluggable.js +1 -1
  73. package/cjs/storages/pluggable/SplitsCachePluggable.js +3 -3
  74. package/cjs/storages/pluggable/inMemoryWrapper.js +4 -4
  75. package/cjs/storages/pluggable/index.js +6 -6
  76. package/cjs/sync/offline/LocalhostFromFile.js +1 -1
  77. package/cjs/sync/offline/LocalhostFromObject.js +1 -1
  78. package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
  79. package/cjs/sync/offline/splitsParser/splitsParserFromFile.js +13 -13
  80. package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +3 -3
  81. package/cjs/sync/offline/syncManagerOffline.js +1 -1
  82. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +2 -2
  83. package/cjs/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  84. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  85. package/cjs/sync/polling/pollingManagerCS.js +8 -7
  86. package/cjs/sync/polling/pollingManagerSS.js +5 -4
  87. package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  88. package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +1 -1
  89. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
  90. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  91. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
  92. package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -2
  93. package/cjs/sync/streaming/AuthClient/index.js +3 -3
  94. package/cjs/sync/streaming/SSEClient/index.js +2 -1
  95. package/cjs/sync/streaming/SSEHandler/NotificationParser.js +1 -1
  96. package/cjs/sync/streaming/SSEHandler/index.js +3 -3
  97. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  98. package/cjs/sync/streaming/mySegmentsV2utils.js +1 -1
  99. package/cjs/sync/streaming/pushManager.js +27 -19
  100. package/cjs/sync/submitters/eventsSyncTask.js +17 -5
  101. package/cjs/sync/submitters/impressionCountsSyncTask.js +1 -1
  102. package/cjs/sync/submitters/impressionsSyncTask.js +15 -3
  103. package/cjs/sync/submitters/metricsSyncTask.js +3 -3
  104. package/cjs/sync/submitters/submitterManager.js +6 -5
  105. package/cjs/sync/submitters/submitterSyncTask.js +1 -1
  106. package/cjs/sync/syncManagerOnline.js +14 -15
  107. package/cjs/trackers/eventTracker.js +11 -4
  108. package/cjs/trackers/impressionObserver/impressionObserverCS.js +1 -1
  109. package/cjs/trackers/impressionObserver/impressionObserverSS.js +1 -1
  110. package/cjs/trackers/impressionObserver/utils.js +8 -1
  111. package/cjs/trackers/impressionsTracker.js +9 -8
  112. package/cjs/utils/MinEvents.js +2 -1
  113. package/cjs/utils/consent.js +10 -0
  114. package/cjs/utils/constants/index.js +5 -1
  115. package/cjs/utils/inputValidation/apiKey.js +1 -1
  116. package/cjs/utils/inputValidation/attribute.js +4 -4
  117. package/cjs/utils/inputValidation/attributes.js +2 -2
  118. package/cjs/utils/inputValidation/event.js +1 -1
  119. package/cjs/utils/inputValidation/eventProperties.js +7 -5
  120. package/cjs/utils/inputValidation/eventValue.js +1 -1
  121. package/cjs/utils/inputValidation/key.js +6 -5
  122. package/cjs/utils/inputValidation/preloadedData.js +8 -8
  123. package/cjs/utils/inputValidation/split.js +1 -1
  124. package/cjs/utils/inputValidation/splits.js +2 -2
  125. package/cjs/utils/inputValidation/trafficType.js +1 -1
  126. package/cjs/utils/inputValidation/trafficTypeExistance.js +1 -1
  127. package/cjs/utils/jwt/index.js +1 -1
  128. package/cjs/utils/key/index.js +3 -3
  129. package/cjs/utils/lang/index.js +13 -16
  130. package/cjs/utils/lang/maps.js +16 -2
  131. package/cjs/utils/murmur3/common.js +1 -1
  132. package/cjs/utils/murmur3/murmur3.js +10 -10
  133. package/cjs/utils/murmur3/murmur3_128.js +1 -1
  134. package/cjs/utils/murmur3/murmur3_128_x86.js +37 -37
  135. package/cjs/utils/murmur3/murmur3_64.js +1 -1
  136. package/cjs/utils/settingsValidation/consent.js +16 -0
  137. package/cjs/utils/settingsValidation/impressionsMode.js +6 -6
  138. package/cjs/utils/settingsValidation/index.js +32 -14
  139. package/cjs/utils/settingsValidation/integrations/configurable.js +1 -1
  140. package/cjs/utils/settingsValidation/integrations/pluggable.js +1 -1
  141. package/cjs/utils/settingsValidation/localhost/builtin.js +2 -2
  142. package/cjs/utils/settingsValidation/logger/builtinLogger.js +3 -3
  143. package/cjs/utils/settingsValidation/logger/commons.js +1 -1
  144. package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
  145. package/cjs/utils/settingsValidation/runtime.js +11 -0
  146. package/cjs/utils/settingsValidation/splitFilters.js +1 -1
  147. package/cjs/utils/settingsValidation/storage/storageCS.js +1 -1
  148. package/cjs/utils/timeTracker/index.js +3 -3
  149. package/esm/evaluator/matchers/ew.js +4 -4
  150. package/esm/integrations/ga/GoogleAnalyticsToSplit.js +4 -2
  151. package/esm/integrations/ga/SplitToGoogleAnalytics.js +4 -2
  152. package/esm/listeners/browser.js +14 -10
  153. package/esm/logger/constants.js +6 -2
  154. package/esm/logger/messages/debug.js +3 -3
  155. package/esm/logger/messages/error.js +4 -3
  156. package/esm/logger/messages/info.js +7 -4
  157. package/esm/sdkClient/client.js +3 -2
  158. package/esm/sdkClient/clientCS.js +1 -1
  159. package/esm/sdkClient/clientInputValidation.js +6 -8
  160. package/esm/sdkClient/sdkClient.js +1 -4
  161. package/esm/sdkClient/sdkClientMethodCS.js +1 -5
  162. package/esm/sdkClient/sdkClientMethodCSWithTT.js +1 -9
  163. package/esm/sdkFactory/index.js +8 -6
  164. package/esm/sdkFactory/userConsentProps.js +36 -0
  165. package/esm/services/splitApi.js +2 -1
  166. package/esm/storages/KeyBuilder.js +2 -6
  167. package/esm/storages/KeyBuilderCS.js +11 -1
  168. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -3
  169. package/esm/storages/inLocalStorage/index.js +1 -1
  170. package/esm/storages/inMemory/ImpressionsCacheInMemory.js +15 -1
  171. package/esm/storages/inMemory/InMemoryStorage.js +1 -1
  172. package/esm/storages/inMemory/InMemoryStorageCS.js +1 -1
  173. package/esm/storages/inRedis/RedisAdapter.js +15 -2
  174. package/esm/storages/pluggable/index.js +2 -2
  175. package/esm/sync/offline/splitsParser/splitsParserFromFile.js +1 -1
  176. package/esm/sync/polling/fetchers/mySegmentsFetcher.js +2 -2
  177. package/esm/sync/polling/fetchers/segmentChangesFetcher.js +2 -2
  178. package/esm/sync/polling/pollingManagerCS.js +2 -1
  179. package/esm/sync/polling/pollingManagerSS.js +2 -1
  180. package/esm/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
  181. package/esm/sync/polling/updaters/mySegmentsUpdater.js +2 -2
  182. package/esm/sync/streaming/SSEClient/index.js +2 -1
  183. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +1 -1
  184. package/esm/sync/streaming/pushManager.js +13 -5
  185. package/esm/sync/submitters/eventsSyncTask.js +18 -6
  186. package/esm/sync/submitters/impressionsSyncTask.js +13 -1
  187. package/esm/sync/submitters/submitterManager.js +2 -1
  188. package/esm/sync/syncManagerOnline.js +14 -15
  189. package/esm/trackers/eventTracker.js +8 -1
  190. package/esm/trackers/impressionObserver/utils.js +7 -1
  191. package/esm/trackers/impressionsTracker.js +6 -5
  192. package/esm/utils/consent.js +6 -0
  193. package/esm/utils/constants/index.js +4 -0
  194. package/esm/utils/inputValidation/attributes.js +1 -1
  195. package/esm/utils/inputValidation/eventProperties.js +4 -2
  196. package/esm/utils/inputValidation/key.js +2 -1
  197. package/esm/utils/lang/index.js +12 -15
  198. package/esm/utils/lang/maps.js +14 -1
  199. package/esm/utils/settingsValidation/consent.js +12 -0
  200. package/esm/utils/settingsValidation/impressionsMode.js +7 -7
  201. package/esm/utils/settingsValidation/index.js +28 -10
  202. package/esm/utils/settingsValidation/runtime.js +7 -0
  203. package/package.json +6 -6
  204. package/src/evaluator/matchers/ew.ts +4 -4
  205. package/src/evaluator/parser/index.ts +1 -1
  206. package/src/evaluator/types.ts +2 -2
  207. package/src/evaluator/value/index.ts +2 -2
  208. package/src/evaluator/value/sanitize.ts +2 -2
  209. package/src/integrations/ga/GoogleAnalyticsToSplit.ts +7 -4
  210. package/src/integrations/ga/SplitToGoogleAnalytics.ts +7 -4
  211. package/src/integrations/pluggable.ts +2 -2
  212. package/src/integrations/types.ts +5 -0
  213. package/src/listeners/browser.ts +13 -9
  214. package/src/logger/constants.ts +6 -2
  215. package/src/logger/messages/debug.ts +3 -3
  216. package/src/logger/messages/error.ts +4 -3
  217. package/src/logger/messages/info.ts +7 -4
  218. package/src/logger/types.ts +4 -0
  219. package/src/sdkClient/client.ts +3 -2
  220. package/src/sdkClient/clientCS.ts +1 -1
  221. package/src/sdkClient/clientInputValidation.ts +8 -7
  222. package/src/sdkClient/sdkClient.ts +2 -5
  223. package/src/sdkClient/sdkClientMethodCS.ts +1 -6
  224. package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -11
  225. package/src/sdkFactory/index.ts +9 -7
  226. package/src/sdkFactory/types.ts +2 -1
  227. package/src/sdkFactory/userConsentProps.ts +42 -0
  228. package/src/storages/KeyBuilder.ts +2 -6
  229. package/src/storages/KeyBuilderCS.ts +13 -1
  230. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +23 -3
  231. package/src/storages/inLocalStorage/index.ts +1 -1
  232. package/src/storages/inMemory/ImpressionsCacheInMemory.ts +22 -1
  233. package/src/storages/inMemory/InMemoryStorage.ts +1 -1
  234. package/src/storages/inMemory/InMemoryStorageCS.ts +1 -1
  235. package/src/storages/inRedis/RedisAdapter.ts +8 -2
  236. package/src/storages/pluggable/index.ts +2 -2
  237. package/src/storages/types.ts +6 -2
  238. package/src/sync/offline/splitsParser/splitsParserFromFile.ts +1 -1
  239. package/src/sync/polling/fetchers/mySegmentsFetcher.ts +2 -1
  240. package/src/sync/polling/fetchers/types.ts +1 -0
  241. package/src/sync/polling/pollingManagerCS.ts +3 -6
  242. package/src/sync/polling/pollingManagerSS.ts +3 -8
  243. package/src/sync/polling/syncTasks/mySegmentsSyncTask.ts +2 -1
  244. package/src/sync/polling/types.ts +0 -12
  245. package/src/sync/polling/updaters/mySegmentsUpdater.ts +2 -1
  246. package/src/sync/streaming/SSEClient/index.ts +2 -1
  247. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  248. package/src/sync/streaming/pushManager.ts +19 -16
  249. package/src/sync/streaming/types.ts +5 -25
  250. package/src/sync/submitters/eventsSyncTask.ts +19 -6
  251. package/src/sync/submitters/impressionsSyncTask.ts +16 -1
  252. package/src/sync/submitters/submitterManager.ts +4 -8
  253. package/src/sync/syncManagerOnline.ts +20 -24
  254. package/src/sync/types.ts +4 -1
  255. package/src/trackers/eventTracker.ts +11 -3
  256. package/src/trackers/impressionObserver/utils.ts +8 -1
  257. package/src/trackers/impressionsTracker.ts +7 -8
  258. package/src/types.ts +22 -1
  259. package/src/utils/consent.ts +8 -0
  260. package/src/utils/constants/index.ts +5 -0
  261. package/src/utils/inputValidation/attributes.ts +1 -2
  262. package/src/utils/inputValidation/eventProperties.ts +4 -2
  263. package/src/utils/lang/index.ts +15 -18
  264. package/src/utils/lang/maps.ts +15 -1
  265. package/src/utils/settingsValidation/consent.ts +16 -0
  266. package/src/utils/settingsValidation/impressionsMode.ts +8 -8
  267. package/src/utils/settingsValidation/index.ts +29 -10
  268. package/src/utils/settingsValidation/runtime.ts +9 -0
  269. package/src/utils/settingsValidation/types.ts +12 -6
  270. package/types/evaluator/types.d.ts +2 -2
  271. package/types/evaluator/value/index.d.ts +1 -1
  272. package/types/evaluator/value/sanitize.d.ts +1 -1
  273. package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +2 -2
  274. package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +2 -3
  275. package/types/integrations/types.d.ts +4 -0
  276. package/types/logger/constants.d.ts +6 -2
  277. package/types/logger/types.d.ts +4 -0
  278. package/types/sdkClient/clientAttributesDecoration.d.ts +1 -1
  279. package/types/sdkClient/clientInputValidation.d.ts +2 -3
  280. package/types/sdkFactory/types.d.ts +1 -1
  281. package/types/sdkFactory/userConsentProps.d.ts +6 -0
  282. package/types/storages/KeyBuilderCS.d.ts +2 -0
  283. package/types/storages/inMemory/ImpressionsCacheInMemory.d.ts +9 -0
  284. package/types/storages/inMemory/index.d.ts +10 -0
  285. package/types/storages/inRedis/RedisAdapter.d.ts +1 -1
  286. package/types/storages/parseSegments.d.ts +6 -0
  287. package/types/storages/types.d.ts +3 -1
  288. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +1 -1
  289. package/types/sync/polling/fetchers/types.d.ts +1 -1
  290. package/types/sync/polling/pollingManagerCS.d.ts +2 -5
  291. package/types/sync/polling/pollingManagerSS.d.ts +2 -5
  292. package/types/sync/polling/types.d.ts +0 -11
  293. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
  294. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
  295. package/types/sync/streaming/pushManager.d.ts +3 -7
  296. package/types/sync/streaming/pushManagerCS.d.ts +1 -12
  297. package/types/sync/streaming/pushManagerSS.d.ts +1 -11
  298. package/types/sync/streaming/types.d.ts +3 -23
  299. package/types/sync/submitters/submitterManager.d.ts +2 -4
  300. package/types/sync/syncManagerOnline.d.ts +3 -3
  301. package/types/sync/types.d.ts +3 -0
  302. package/types/trackers/eventTracker.d.ts +2 -2
  303. package/types/trackers/impressionObserver/utils.d.ts +4 -0
  304. package/types/trackers/impressionsTracker.d.ts +2 -3
  305. package/types/types.d.ts +22 -1
  306. package/types/utils/consent.d.ts +2 -0
  307. package/types/utils/constants/index.d.ts +3 -0
  308. package/types/utils/lang/index.d.ts +6 -5
  309. package/types/utils/lang/maps.d.ts +7 -0
  310. package/types/utils/settingsValidation/consent.d.ts +6 -0
  311. package/types/utils/settingsValidation/impressionsMode.d.ts +1 -1
  312. package/types/utils/settingsValidation/runtime/browser.d.ts +2 -0
  313. package/types/utils/settingsValidation/runtime/node.d.ts +2 -0
  314. package/types/utils/settingsValidation/runtime.d.ts +2 -0
  315. package/types/utils/settingsValidation/types.d.ts +12 -6
  316. package/types/utils/settingsValidation/userConsent.d.ts +5 -0
@@ -298,7 +298,7 @@ export interface IRecorderCacheProducerSync<T> {
298
298
  // @TODO names are inconsistent with spec
299
299
  /* Checks if cache is empty. Returns true if the cache was just created or cleared */
300
300
  isEmpty(): boolean
301
- /* clears cache data */
301
+ /* Clears cache data */
302
302
  clear(): void
303
303
  /* Gets cache data */
304
304
  state(): T
@@ -307,10 +307,13 @@ export interface IRecorderCacheProducerSync<T> {
307
307
 
308
308
  export interface IImpressionsCacheSync extends IImpressionsCacheBase, IRecorderCacheProducerSync<ImpressionDTO[]> {
309
309
  track(data: ImpressionDTO[]): void
310
+ /* Registers callback for full queue */
311
+ setOnFullQueueCb(cb: () => void): void
310
312
  }
311
313
 
312
314
  export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<SplitIO.EventData[]> {
313
315
  track(data: SplitIO.EventData, size?: number): boolean
316
+ /* Registers callback for full queue */
314
317
  setOnFullQueueCb(cb: () => void): void
315
318
  }
316
319
 
@@ -423,6 +426,7 @@ export type DataLoader = (storage: IStorageSync, matchingKey: string) => void
423
426
 
424
427
  export interface IStorageFactoryParams {
425
428
  log: ILogger,
429
+ impressionsQueueSize?: number,
426
430
  eventsQueueSize?: number,
427
431
  optimize?: boolean /* whether create the `impressionCounts` cache (OPTIMIZED impression mode) or not (DEBUG impression mode) */,
428
432
 
@@ -443,7 +447,7 @@ export interface IStorageFactoryParams {
443
447
  export type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
444
448
 
445
449
  export type IStorageSyncFactory = {
446
- type: StorageType,
450
+ readonly type: StorageType,
447
451
  (params: IStorageFactoryParams): IStorageSync
448
452
  }
449
453
 
@@ -82,7 +82,7 @@ export function splitsParserFromFileFactory(): ISplitsParser {
82
82
  try {
83
83
  data = fs.readFileSync(filePath, 'utf-8');
84
84
  } catch (e) {
85
- log.error(e.message);
85
+ log.error(e && (e as Error).message);
86
86
 
87
87
  return {};
88
88
  }
@@ -6,9 +6,10 @@ import { IMySegmentsFetcher } from './types';
6
6
  * Factory of MySegments fetcher.
7
7
  * MySegments fetcher is a wrapper around `mySegments` API service that parses the response and handle errors.
8
8
  */
9
- export function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments, userMatchingKey: string): IMySegmentsFetcher {
9
+ export function mySegmentsFetcherFactory(fetchMySegments: IFetchMySegments): IMySegmentsFetcher {
10
10
 
11
11
  return function mySegmentsFetcher(
12
+ userMatchingKey: string,
12
13
  noCache?: boolean,
13
14
  // Optional decorator for `fetchMySegments` promise, such as timeout or time tracker
14
15
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
@@ -15,6 +15,7 @@ export type ISegmentChangesFetcher = (
15
15
  ) => Promise<ISegmentChangesResponse[]>
16
16
 
17
17
  export type IMySegmentsFetcher = (
18
+ userMatchingKey: string,
18
19
  noCache?: boolean,
19
20
  decorator?: (promise: Promise<IResponse>) => Promise<IResponse>
20
21
  ) => Promise<string[]>
@@ -1,26 +1,23 @@
1
1
  import { ISegmentsSyncTask, ISplitsSyncTask, IPollingManagerCS } from './types';
2
2
  import { forOwn } from '../../utils/lang';
3
3
  import { IReadinessManager } from '../../readiness/types';
4
- import { ISplitApi } from '../../services/types';
5
4
  import { IStorageSync } from '../../storages/types';
6
5
  import { mySegmentsSyncTaskFactory } from './syncTasks/mySegmentsSyncTask';
7
6
  import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
8
- import { ISettings } from '../../types';
9
7
  import { getMatching } from '../../utils/key';
10
8
  import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../readiness/constants';
11
9
  import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger/constants';
10
+ import { ISyncManagerFactoryParams } from '../types';
12
11
 
13
12
  /**
14
13
  * Expose start / stop mechanism for polling data from services.
15
14
  * For client-side API with multiple clients.
16
15
  */
17
16
  export function pollingManagerCSFactory(
18
- splitApi: ISplitApi,
19
- storage: IStorageSync,
20
- readiness: IReadinessManager,
21
- settings: ISettings,
17
+ params: ISyncManagerFactoryParams
22
18
  ): IPollingManagerCS {
23
19
 
20
+ const { splitApi, storage, readiness, settings } = params;
24
21
  const log = settings.log;
25
22
 
26
23
  const splitsSyncTask: ISplitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
@@ -1,23 +1,18 @@
1
1
  import { splitsSyncTaskFactory } from './syncTasks/splitsSyncTask';
2
2
  import { segmentsSyncTaskFactory } from './syncTasks/segmentsSyncTask';
3
- import { IStorageSync } from '../../storages/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { ISplitApi } from '../../services/types';
6
- import { ISettings } from '../../types';
7
3
  import { IPollingManager, ISegmentsSyncTask, ISplitsSyncTask } from './types';
8
4
  import { thenable } from '../../utils/promise/thenable';
9
5
  import { POLLING_START, POLLING_STOP, LOG_PREFIX_SYNC_POLLING } from '../../logger/constants';
6
+ import { ISyncManagerFactoryParams } from '../types';
10
7
 
11
8
  /**
12
9
  * Expose start / stop mechanism for pulling data from services.
13
10
  */
14
11
  export function pollingManagerSSFactory(
15
- splitApi: ISplitApi,
16
- storage: IStorageSync,
17
- readiness: IReadinessManager,
18
- settings: ISettings
12
+ params: ISyncManagerFactoryParams
19
13
  ): IPollingManager {
20
14
 
15
+ const { splitApi, storage, readiness, settings } = params;
21
16
  const log = settings.log;
22
17
 
23
18
  const splitsSyncTask: ISplitsSyncTask = splitsSyncTaskFactory(splitApi.fetchSplitChanges, storage, readiness, settings);
@@ -21,12 +21,13 @@ export function mySegmentsSyncTaskFactory(
21
21
  settings.log,
22
22
  mySegmentsUpdaterFactory(
23
23
  settings.log,
24
- mySegmentsFetcherFactory(fetchMySegments, matchingKey),
24
+ mySegmentsFetcherFactory(fetchMySegments),
25
25
  storage.splits,
26
26
  storage.segments,
27
27
  readiness.segments,
28
28
  settings.startup.requestTimeoutBeforeReady,
29
29
  settings.startup.retriesOnFailureBeforeReady,
30
+ matchingKey
30
31
  ),
31
32
  settings.scheduler.segmentsRefreshRate,
32
33
  'mySegmentsUpdater',
@@ -1,7 +1,5 @@
1
1
  import { IReadinessManager } from '../../readiness/types';
2
- import { ISplitApi } from '../../services/types';
3
2
  import { IStorageSync } from '../../storages/types';
4
- import { ISettings } from '../../types';
5
3
  import { SegmentsData } from '../streaming/SSEHandler/types';
6
4
  import { ITask, ISyncTask } from '../types';
7
5
 
@@ -23,13 +21,3 @@ export interface IPollingManagerCS extends IPollingManager {
23
21
  remove(matchingKey: string): void;
24
22
  get(matchingKey: string): ISegmentsSyncTask | undefined
25
23
  }
26
-
27
- /**
28
- * Signature of polling manager factory/constructor
29
- */
30
- export type IPollingManagerFactoryParams = [
31
- splitApi: ISplitApi,
32
- storage: IStorageSync,
33
- readiness: IReadinessManager,
34
- settings: ISettings,
35
- ]
@@ -23,6 +23,7 @@ export function mySegmentsUpdaterFactory(
23
23
  segmentsEventEmitter: ISegmentsEventEmitter,
24
24
  requestTimeoutBeforeReady: number,
25
25
  retriesOnFailureBeforeReady: number,
26
+ matchingKey: string
26
27
  ): IMySegmentsUpdater {
27
28
 
28
29
  let readyOnAlreadyExistentState = true;
@@ -69,7 +70,7 @@ export function mySegmentsUpdaterFactory(
69
70
  // If segmentsData is provided, there is no need to fetch mySegments
70
71
  new Promise((res) => { updateSegments(segmentsData); res(true); }) :
71
72
  // If not provided, fetch mySegments
72
- mySegmentsFetcher(noCache, _promiseDecorator).then(segments => {
73
+ mySegmentsFetcher(matchingKey, noCache, _promiseDecorator).then(segments => {
73
74
  // Only when we have downloaded segments completely, we should not keep retrying anymore
74
75
  startingUp = false;
75
76
 
@@ -1,5 +1,6 @@
1
1
  import { IEventSourceConstructor } from '../../../services/types';
2
2
  import { ISettings } from '../../../types';
3
+ import { isString } from '../../../utils/lang';
3
4
  import { IAuthTokenPushEnabled } from '../AuthClient/types';
4
5
  import { ISSEClient, ISseEventHandler } from './types';
5
6
 
@@ -15,7 +16,7 @@ const CONTROL_CHANNEL_REGEX = /^control_/;
15
16
  */
16
17
  function buildSSEHeaders(settings: ISettings) {
17
18
  const headers: Record<string, string> = {
18
- SplitSDKClientKey: settings.core.authorizationKey.slice(-4),
19
+ SplitSDKClientKey: isString(settings.core.authorizationKey) ? settings.core.authorizationKey.slice(-4) : '',
19
20
  SplitSDKVersion: settings.version,
20
21
  };
21
22
 
@@ -19,7 +19,7 @@ export class SegmentsUpdateWorker implements IUpdateWorker {
19
19
  * @param {Object} segmentsCache segments data cache
20
20
  * @param {Object} segmentsSyncTask task for syncing segments data
21
21
  */
22
- constructor(segmentsCache: ISegmentsCacheSync, segmentsSyncTask: ISegmentsSyncTask) {
22
+ constructor(segmentsSyncTask: ISegmentsSyncTask, segmentsCache: ISegmentsCacheSync) {
23
23
  this.segmentsCache = segmentsCache;
24
24
  this.segmentsSyncTask = segmentsSyncTask;
25
25
  this.maxChangeNumbers = {};
@@ -1,7 +1,5 @@
1
- import { IPushEventEmitter, IPushManagerCS } from './types';
1
+ import { IPushEventEmitter, IPushManager } from './types';
2
2
  import { ISSEClient } from './SSEClient/types';
3
- import { IStorageSync } from '../../storages/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
3
  import { ISegmentsSyncTask, IPollingManager } from '../polling/types';
6
4
  import { objectAssign } from '../../utils/lang/objectAssign';
7
5
  import { Backoff } from '../../utils/Backoff';
@@ -12,17 +10,15 @@ import { SplitsUpdateWorker } from './UpdateWorkers/SplitsUpdateWorker';
12
10
  import { authenticateFactory, hashUserKey } from './AuthClient';
13
11
  import { forOwn } from '../../utils/lang';
14
12
  import { SSEClient } from './SSEClient';
15
- import { IFetchAuth } from '../../services/types';
16
- import { ISettings } from '../../types';
17
13
  import { getMatching } from '../../utils/key';
18
14
  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';
19
- import { IPlatform } from '../../sdkFactory/types';
20
15
  import { STREAMING_FALLBACK, STREAMING_REFRESH_TOKEN, STREAMING_CONNECTING, STREAMING_DISABLED, ERROR_STREAMING_AUTH, STREAMING_DISCONNECTING, STREAMING_RECONNECT, STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 } from '../../logger/constants';
21
16
  import { KeyList, UpdateStrategy } from './SSEHandler/types';
22
17
  import { isInBitmap, parseBitmap, parseKeyList } from './mySegmentsV2utils';
23
18
  import { ISet, _Set } from '../../utils/lang/sets';
24
19
  import { Hash64, hash64 } from '../../utils/murmur3/murmur3_64';
25
20
  import { IAuthTokenPushEnabled } from './AuthClient/types';
21
+ import { ISyncManagerFactoryParams } from '../types';
26
22
 
27
23
  /**
28
24
  * PushManager factory:
@@ -30,13 +26,11 @@ import { IAuthTokenPushEnabled } from './AuthClient/types';
30
26
  * - for client-side, with support for multiple clients, if key is provided in settings
31
27
  */
32
28
  export function pushManagerFactory(
29
+ params: ISyncManagerFactoryParams,
33
30
  pollingManager: IPollingManager,
34
- storage: IStorageSync,
35
- readiness: IReadinessManager,
36
- fetchAuth: IFetchAuth,
37
- platform: IPlatform,
38
- settings: ISettings,
39
- ): IPushManagerCS | undefined {
31
+ ): IPushManager | undefined {
32
+
33
+ const { settings, storage, splitApi, readiness, platform } = params;
40
34
 
41
35
  // `userKey` is the matching key of main client in client-side SDK.
42
36
  // It can be used to check if running on client-side or server-side SDK.
@@ -51,7 +45,7 @@ export function pushManagerFactory(
51
45
  log.warn(STREAMING_FALLBACK, [e]);
52
46
  return;
53
47
  }
54
- const authenticate = authenticateFactory(fetchAuth);
48
+ const authenticate = authenticateFactory(splitApi.fetchAuth);
55
49
 
56
50
  // init feedback loop
57
51
  const pushEmitter = new platform.EventEmitter() as IPushEventEmitter;
@@ -60,7 +54,7 @@ export function pushManagerFactory(
60
54
 
61
55
  // init workers
62
56
  // MySegmentsUpdateWorker (client-side) are initiated in `add` method
63
- const segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(storage.segments, pollingManager.segmentsSyncTask);
57
+ const segmentsUpdateWorker = userKey ? undefined : new SegmentsUpdateWorker(pollingManager.segmentsSyncTask, storage.segments);
64
58
  // For server-side we pass the segmentsSyncTask, used by SplitsUpdateWorker to fetch new segments
65
59
  const splitsUpdateWorker = new SplitsUpdateWorker(storage.splits, pollingManager.splitsSyncTask, readiness.splits, userKey ? undefined : pollingManager.segmentsSyncTask);
66
60
 
@@ -77,6 +71,7 @@ export function pushManagerFactory(
77
71
  // It is used to halt the `connectPush` process if it was in progress.
78
72
  let disconnected: boolean | undefined;
79
73
  // flag that indicates a PUSH_NONRETRYABLE_ERROR, condition with which starting pushManager again is ignored.
74
+ // true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
80
75
  let disabled: boolean | undefined; // `disabled` implies `disconnected === true`
81
76
 
82
77
  /** PushManager functions related to initialization */
@@ -302,12 +297,15 @@ export function pushManagerFactory(
302
297
  // Expose Event Emitter functionality and Event constants
303
298
  Object.create(pushEmitter),
304
299
  {
305
- // Stop/pause push mode
300
+ // Stop/pause push mode.
301
+ // It doesn't emit events. Neither PUSH_SUBSYSTEM_DOWN to start polling.
306
302
  stop() {
307
303
  disconnectPush(); // `handleNonRetryableError` cannot be used as `stop`, because it emits PUSH_SUBSYSTEM_DOWN event, which starts polling.
308
304
  if (userKey) this.remove(userKey); // Necessary to properly resume streaming in client-side (e.g., RN SDK transition to foreground).
309
305
  },
310
- // Start/resume push mode
306
+
307
+ // Start/resume push mode.
308
+ // It eventually emits PUSH_SUBSYSTEM_DOWN, that starts polling, or PUSH_SUBSYSTEM_UP, that executes a syncAll
311
309
  start() {
312
310
  // Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times or if push has been disabled.
313
311
  if (disabled || disconnected === false) return;
@@ -317,6 +315,11 @@ export function pushManagerFactory(
317
315
  else setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
318
316
  },
319
317
 
318
+ // true/false if start or stop was called last respectively
319
+ isRunning(){
320
+ return disconnected === false;
321
+ },
322
+
320
323
  // [Only for client-side]
321
324
  add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask) {
322
325
  const hash = hashUserKey(userKey);
@@ -1,11 +1,7 @@
1
1
  import { IMySegmentsUpdateData, IMySegmentsUpdateV2Data, ISegmentUpdateData, ISplitUpdateData, ISplitKillData } from './SSEHandler/types';
2
2
  import { ITask } from '../types';
3
- import { IPollingManager, ISegmentsSyncTask } from '../polling/types';
4
- import { IReadinessManager } from '../../readiness/types';
5
- import { IFetchAuth } from '../../services/types';
6
- import { IStorageSync } from '../../storages/types';
7
- import { IEventEmitter, ISettings } from '../../types';
8
- import { IPlatform } from '../../sdkFactory/types';
3
+ import { ISegmentsSyncTask } from '../polling/types';
4
+ import { IEventEmitter } from '../../types';
9
5
  import { ControlType } from './constants';
10
6
 
11
7
  // Internal SDK events, subscribed by SyncManager and PushManager
@@ -45,26 +41,10 @@ export interface IPushEventEmitter extends IEventEmitter {
45
41
  }
46
42
 
47
43
  /**
48
- * PushManager for server-side
44
+ * PushManager
49
45
  */
50
- export interface IPushManager extends ITask, IPushEventEmitter { }
51
-
52
- /**
53
- * PushManager for client-side with support for multiple clients
54
- */
55
- export interface IPushManagerCS extends IPushManager {
46
+ export interface IPushManager extends ITask, IPushEventEmitter {
47
+ // Methods used in client-side, to support multiple clients
56
48
  add(userKey: string, mySegmentsSyncTask: ISegmentsSyncTask): void,
57
49
  remove(userKey: string): void
58
50
  }
59
-
60
- /**
61
- * Signature of push manager factory/constructor
62
- */
63
- export type IPushManagerFactoryParams = [
64
- pollingManager: IPollingManager,
65
- storage: IStorageSync,
66
- readiness: IReadinessManager,
67
- fetchAuth: IFetchAuth,
68
- platform: IPlatform,
69
- settings: ISettings
70
- ]
@@ -3,7 +3,9 @@ import { IPostEventsBulk } from '../../services/types';
3
3
  import { ISyncTask, ITimeTracker } from '../types';
4
4
  import { submitterSyncTaskFactory } from './submitterSyncTask';
5
5
  import { ILogger } from '../../logger/types';
6
- import { SUBMITTERS_PUSH_FULL_EVENTS_QUEUE } from '../../logger/constants';
6
+ import { SUBMITTERS_PUSH_FULL_QUEUE } from '../../logger/constants';
7
+
8
+ const DATA_NAME = 'events';
7
9
 
8
10
  /**
9
11
  * Sync task that periodically posts tracked events
@@ -18,26 +20,37 @@ export function eventsSyncTaskFactory(
18
20
  ): ISyncTask {
19
21
 
20
22
  // don't retry events.
21
- const syncTask = submitterSyncTaskFactory(log, postEventsBulk, eventsCache, eventsPushRate, 'queued events', latencyTracker);
23
+ const syncTask = submitterSyncTaskFactory(log, postEventsBulk, eventsCache, eventsPushRate, DATA_NAME, latencyTracker);
22
24
 
23
- // Set a timer for the first push of events,
25
+ // Set a timer for the first push window of events.
26
+ // Not implemented in the base submitter or sync task, since this feature is only used by the events submitter.
24
27
  if (eventsFirstPushWindow > 0) {
28
+ let running = false;
25
29
  let stopEventPublisherTimeout: ReturnType<typeof setTimeout>;
26
30
  const originalStart = syncTask.start;
27
31
  syncTask.start = () => {
32
+ running = true;
28
33
  stopEventPublisherTimeout = setTimeout(originalStart, eventsFirstPushWindow);
29
34
  };
30
35
  const originalStop = syncTask.stop;
31
36
  syncTask.stop = () => {
37
+ running = false;
32
38
  clearTimeout(stopEventPublisherTimeout);
33
39
  originalStop();
34
40
  };
41
+ syncTask.isRunning = () => {
42
+ return running;
43
+ };
35
44
  }
36
45
 
37
- // register eventsSubmitter to be executed when events cache is full
46
+ // register events submitter to be executed when events cache is full
38
47
  eventsCache.setOnFullQueueCb(() => {
39
- log.info(SUBMITTERS_PUSH_FULL_EVENTS_QUEUE);
40
- syncTask.execute();
48
+ if (syncTask.isRunning()) {
49
+ log.info(SUBMITTERS_PUSH_FULL_QUEUE, [DATA_NAME]);
50
+ syncTask.execute();
51
+ }
52
+ // If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
53
+ // Data will be sent when submitter is resumed.
41
54
  });
42
55
 
43
56
  return syncTask;
@@ -6,6 +6,9 @@ import { ImpressionDTO } from '../../types';
6
6
  import { submitterSyncTaskFactory } from './submitterSyncTask';
7
7
  import { ImpressionsPayload } from './types';
8
8
  import { ILogger } from '../../logger/types';
9
+ import { SUBMITTERS_PUSH_FULL_QUEUE } from '../../logger/constants';
10
+
11
+ const DATA_NAME = 'impressions';
9
12
 
10
13
  /**
11
14
  * Converts `impressions` data from cache into request payload.
@@ -50,5 +53,17 @@ export function impressionsSyncTaskFactory(
50
53
  ): ISyncTask {
51
54
 
52
55
  // retry impressions only once.
53
- return submitterSyncTaskFactory(log, postTestImpressionsBulk, impressionsCache, impressionsRefreshRate, 'impressions', latencyTracker, fromImpressionsCollector.bind(undefined, sendLabels), 1);
56
+ const syncTask = submitterSyncTaskFactory(log, postTestImpressionsBulk, impressionsCache, impressionsRefreshRate, DATA_NAME, latencyTracker, fromImpressionsCollector.bind(undefined, sendLabels), 1);
57
+
58
+ // register impressions submitter to be executed when impressions cache is full
59
+ impressionsCache.setOnFullQueueCb(() => {
60
+ if (syncTask.isRunning()) {
61
+ log.info(SUBMITTERS_PUSH_FULL_QUEUE, [DATA_NAME]);
62
+ syncTask.execute();
63
+ }
64
+ // If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
65
+ // Data will be sent when submitter is resumed.
66
+ });
67
+
68
+ return syncTask;
54
69
  }
@@ -2,15 +2,11 @@ import { syncTaskComposite } from '../syncTaskComposite';
2
2
  import { eventsSyncTaskFactory } from './eventsSyncTask';
3
3
  import { impressionsSyncTaskFactory } from './impressionsSyncTask';
4
4
  import { impressionCountsSyncTaskFactory } from './impressionCountsSyncTask';
5
- import { ISplitApi } from '../../services/types';
6
- import { IStorageSync } from '../../storages/types';
7
- import { ISettings } from '../../types';
5
+ import { ISyncManagerFactoryParams } from '../types';
8
6
 
9
- export function submitterManagerFactory(
10
- settings: ISettings,
11
- storage: IStorageSync,
12
- splitApi: ISplitApi,
13
- ) {
7
+ export function submitterManagerFactory(params: ISyncManagerFactoryParams) {
8
+
9
+ const { settings, storage, splitApi } = params;
14
10
  const log = settings.log;
15
11
  const submitters = [
16
12
  impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
@@ -2,10 +2,11 @@ import { ISyncManagerCS, ISyncManagerFactoryParams } from './types';
2
2
  import { submitterManagerFactory } from './submitters/submitterManager';
3
3
  import { IReadinessManager } from '../readiness/types';
4
4
  import { IStorageSync } from '../storages/types';
5
- import { IPushManagerFactoryParams, IPushManager, IPushManagerCS } from './streaming/types';
6
- import { IPollingManager, IPollingManagerCS, IPollingManagerFactoryParams } from './polling/types';
5
+ import { IPushManager } from './streaming/types';
6
+ import { IPollingManager, IPollingManagerCS } from './polling/types';
7
7
  import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
8
8
  import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
9
+ import { isConsentGranted } from '../utils/consent';
9
10
 
10
11
  /**
11
12
  * Online SyncManager factory.
@@ -16,35 +17,28 @@ import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '..
16
17
  * @param pushManagerFactory optional to build a SyncManager with or without streaming support
17
18
  */
18
19
  export function syncManagerOnlineFactory(
19
- pollingManagerFactory?: (...args: IPollingManagerFactoryParams) => IPollingManager,
20
- pushManagerFactory?: (...args: IPushManagerFactoryParams) => IPushManager | undefined
20
+ pollingManagerFactory?: (params: ISyncManagerFactoryParams) => IPollingManager,
21
+ pushManagerFactory?: (params: ISyncManagerFactoryParams, pollingManager: IPollingManager) => IPushManager | undefined,
21
22
  ): (params: ISyncManagerFactoryParams) => ISyncManagerCS {
22
23
 
23
24
  /**
24
25
  * SyncManager factory for modular SDK
25
26
  */
26
- return function ({
27
- settings,
28
- platform,
29
- splitApi,
30
- storage,
31
- readiness
32
- }: ISyncManagerFactoryParams): ISyncManagerCS {
27
+ return function (params: ISyncManagerFactoryParams): ISyncManagerCS {
33
28
 
34
- const log = settings.log;
29
+ const { settings, settings: { log, streamingEnabled } } = params;
35
30
 
36
31
  /** Polling Manager */
37
- const pollingManager = pollingManagerFactory && pollingManagerFactory(splitApi, storage, readiness, settings);
32
+ const pollingManager = pollingManagerFactory && pollingManagerFactory(params);
38
33
 
39
34
  /** Push Manager */
40
- const pushManager = settings.streamingEnabled && pollingManager && pushManagerFactory ?
41
- pushManagerFactory(pollingManager, storage, readiness, splitApi.fetchAuth, platform, settings) :
35
+ const pushManager = streamingEnabled && pollingManager && pushManagerFactory ?
36
+ pushManagerFactory(params, pollingManager) :
42
37
  undefined;
43
38
 
44
39
  /** Submitter Manager */
45
40
  // It is not inyected as push and polling managers, because at the moment it is required
46
- const submitter = submitterManagerFactory(settings, storage, splitApi);
47
-
41
+ const submitter = submitterManagerFactory(params);
48
42
 
49
43
  /** Sync Manager logic */
50
44
 
@@ -75,13 +69,16 @@ export function syncManagerOnlineFactory(
75
69
  let startFirstTime = true; // flag to distinguish calling the `start` method for the first time, to support pausing and resuming the synchronization
76
70
 
77
71
  return {
72
+ // Exposed for fine-grained control of synchronization.
73
+ // E.g.: user consent, app state changes (Page hide, Foreground/Background, Online/Offline).
74
+ pollingManager,
78
75
  pushManager,
76
+ submitter,
79
77
 
80
78
  /**
81
79
  * Method used to start the syncManager for the first time, or resume it after being stopped.
82
80
  */
83
81
  start() {
84
- if (running) return;
85
82
  running = true;
86
83
 
87
84
  // start syncing splits and segments
@@ -99,14 +96,13 @@ export function syncManagerOnlineFactory(
99
96
  }
100
97
 
101
98
  // start periodic data recording (events, impressions, telemetry).
102
- if (submitter) submitter.start();
99
+ if (isConsentGranted(settings)) submitter.start();
103
100
  },
104
101
 
105
102
  /**
106
103
  * Method used to stop/pause the syncManager.
107
104
  */
108
105
  stop() {
109
- if (!running) return;
110
106
  running = false;
111
107
 
112
108
  // stop syncing
@@ -114,7 +110,7 @@ export function syncManagerOnlineFactory(
114
110
  if (pollingManager && pollingManager.isRunning()) pollingManager.stop();
115
111
 
116
112
  // stop periodic data recording (events, impressions, telemetry).
117
- if (submitter) submitter.stop();
113
+ submitter.stop();
118
114
  },
119
115
 
120
116
  isRunning() {
@@ -122,7 +118,7 @@ export function syncManagerOnlineFactory(
122
118
  },
123
119
 
124
120
  flush() {
125
- if (submitter) return submitter.execute();
121
+ if (isConsentGranted(settings)) return submitter.execute();
126
122
  else return Promise.resolve();
127
123
  },
128
124
 
@@ -145,7 +141,7 @@ export function syncManagerOnlineFactory(
145
141
  // of segments since `syncAll` was already executed when starting the main client
146
142
  mySegmentsSyncTask.execute();
147
143
  }
148
- (pushManager as IPushManagerCS).add(matchingKey, mySegmentsSyncTask);
144
+ pushManager.add(matchingKey, mySegmentsSyncTask);
149
145
  } else {
150
146
  if (storage.splits.usesSegments()) mySegmentsSyncTask.start();
151
147
  }
@@ -155,7 +151,7 @@ export function syncManagerOnlineFactory(
155
151
  const mySegmentsSyncTask = (pollingManager as IPollingManagerCS).get(matchingKey);
156
152
  if (mySegmentsSyncTask) {
157
153
  // stop syncing
158
- if (pushManager) (pushManager as IPushManagerCS).remove(matchingKey);
154
+ if (pushManager) pushManager.remove(matchingKey);
159
155
  if (mySegmentsSyncTask.isRunning()) mySegmentsSyncTask.stop();
160
156
 
161
157
  (pollingManager as IPollingManagerCS).remove(matchingKey);
package/src/sync/types.ts CHANGED
@@ -3,6 +3,7 @@ import { IPlatform } from '../sdkFactory/types';
3
3
  import { ISplitApi } from '../services/types';
4
4
  import { IStorageSync } from '../storages/types';
5
5
  import { ISettings } from '../types';
6
+ import { IPollingManager } from './polling/types';
6
7
  import { IPushManager } from './streaming/types';
7
8
 
8
9
  export interface ITask<Input extends any[] = []> {
@@ -43,7 +44,9 @@ export interface ITimeTracker {
43
44
 
44
45
  export interface ISyncManager extends ITask {
45
46
  flush(): Promise<any>,
46
- pushManager?: IPushManager
47
+ pushManager?: IPushManager,
48
+ pollingManager?: IPollingManager,
49
+ submitter?: ISyncTask
47
50
  }
48
51
 
49
52
  export interface ISyncManagerCS extends ISyncManager {
@@ -2,9 +2,10 @@ import { objectAssign } from '../utils/lang/objectAssign';
2
2
  import { thenable } from '../utils/promise/thenable';
3
3
  import { IEventsCacheBase } from '../storages/types';
4
4
  import { IEventsHandler, IEventTracker } from './types';
5
- import { SplitIO } from '../types';
6
- import { ILogger } from '../logger/types';
5
+ import { ISettings, SplitIO } from '../types';
7
6
  import { EVENTS_TRACKER_SUCCESS, ERROR_EVENTS_TRACKER } from '../logger/constants';
7
+ import { CONSENT_DECLINED } from '../utils/constants';
8
+ import { isStorageSync } from './impressionObserver/utils';
8
9
 
9
10
  /**
10
11
  * Event tracker stores events in cache and pass them to the integrations manager if provided.
@@ -13,11 +14,14 @@ import { EVENTS_TRACKER_SUCCESS, ERROR_EVENTS_TRACKER } from '../logger/constant
13
14
  * @param integrationsManager optional event handler used for integrations
14
15
  */
15
16
  export function eventTrackerFactory(
16
- log: ILogger,
17
+ settings: ISettings,
17
18
  eventsCache: IEventsCacheBase,
18
19
  integrationsManager?: IEventsHandler
19
20
  ): IEventTracker {
20
21
 
22
+ const log = settings.log;
23
+ const isSync = isStorageSync(settings);
24
+
21
25
  function queueEventsCallback(eventData: SplitIO.EventData, tracked: boolean) {
22
26
  const { eventTypeId, trafficTypeName, key, value, timestamp, properties } = eventData;
23
27
  // Logging every prop would be too much.
@@ -44,6 +48,10 @@ export function eventTrackerFactory(
44
48
 
45
49
  return {
46
50
  track(eventData: SplitIO.EventData, size?: number) {
51
+ if (settings.userConsent === CONSENT_DECLINED) {
52
+ return isSync ? false : Promise.resolve(false);
53
+ }
54
+
47
55
  const tracked = eventsCache.track(eventData, size);
48
56
 
49
57
  if (thenable(tracked)) {