@splitsoftware/splitio-commons 1.6.2-rc.4 → 1.6.2-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/cjs/consent/sdkUserConsent.js +2 -2
  2. package/cjs/listeners/browser.js +2 -1
  3. package/cjs/logger/constants.js +2 -1
  4. package/cjs/sdkClient/clientAttributesDecoration.js +1 -1
  5. package/cjs/sdkFactory/index.js +23 -6
  6. package/cjs/services/splitApi.js +20 -1
  7. package/cjs/storages/KeyBuilderSS.js +6 -0
  8. package/cjs/storages/inLocalStorage/index.js +4 -0
  9. package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
  10. package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +12 -1
  11. package/cjs/storages/inMemory/InMemoryStorage.js +5 -1
  12. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -1
  13. package/cjs/storages/inMemory/uniqueKeysCacheInMemory.js +73 -0
  14. package/cjs/storages/inMemory/uniqueKeysCacheInMemoryCS.js +78 -0
  15. package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +46 -0
  16. package/cjs/storages/inRedis/constants.js +4 -1
  17. package/cjs/storages/inRedis/index.js +15 -1
  18. package/cjs/storages/inRedis/uniqueKeysCacheInRedis.js +55 -0
  19. package/cjs/sync/submitters/submitterManager.js +3 -0
  20. package/cjs/sync/submitters/telemetrySubmitter.js +1 -0
  21. package/cjs/sync/submitters/uniqueKeysSubmitter.js +26 -0
  22. package/cjs/trackers/impressionsTracker.js +22 -41
  23. package/cjs/trackers/strategy/strategyDebug.js +25 -0
  24. package/cjs/trackers/strategy/strategyNone.js +29 -0
  25. package/cjs/trackers/strategy/strategyOptimized.js +34 -0
  26. package/cjs/trackers/uniqueKeysTracker.js +31 -0
  27. package/cjs/types.js +2 -0
  28. package/cjs/utils/constants/index.js +4 -2
  29. package/cjs/utils/key/index.js +1 -1
  30. package/cjs/utils/settingsValidation/impressionsMode.js +2 -2
  31. package/cjs/utils/settingsValidation/index.js +3 -1
  32. package/esm/consent/sdkUserConsent.js +2 -2
  33. package/esm/listeners/browser.js +3 -2
  34. package/esm/logger/constants.js +1 -0
  35. package/esm/sdkClient/clientAttributesDecoration.js +1 -1
  36. package/esm/sdkFactory/index.js +23 -6
  37. package/esm/services/splitApi.js +20 -1
  38. package/esm/storages/KeyBuilderSS.js +6 -0
  39. package/esm/storages/inLocalStorage/index.js +5 -1
  40. package/esm/storages/inMemory/AttributesCacheInMemory.js +1 -1
  41. package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +12 -1
  42. package/esm/storages/inMemory/InMemoryStorage.js +6 -2
  43. package/esm/storages/inMemory/InMemoryStorageCS.js +6 -2
  44. package/esm/storages/inMemory/uniqueKeysCacheInMemory.js +70 -0
  45. package/esm/storages/inMemory/uniqueKeysCacheInMemoryCS.js +75 -0
  46. package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +43 -0
  47. package/esm/storages/inRedis/constants.js +3 -0
  48. package/esm/storages/inRedis/index.js +16 -2
  49. package/esm/storages/inRedis/uniqueKeysCacheInRedis.js +52 -0
  50. package/esm/sync/submitters/submitterManager.js +3 -0
  51. package/esm/sync/submitters/telemetrySubmitter.js +2 -1
  52. package/esm/sync/submitters/uniqueKeysSubmitter.js +22 -0
  53. package/esm/trackers/impressionsTracker.js +22 -41
  54. package/esm/trackers/strategy/strategyDebug.js +21 -0
  55. package/esm/trackers/strategy/strategyNone.js +25 -0
  56. package/esm/trackers/strategy/strategyOptimized.js +30 -0
  57. package/esm/trackers/uniqueKeysTracker.js +27 -0
  58. package/esm/types.js +1 -0
  59. package/esm/utils/constants/index.js +2 -0
  60. package/esm/utils/key/index.js +1 -1
  61. package/esm/utils/settingsValidation/impressionsMode.js +3 -3
  62. package/esm/utils/settingsValidation/index.js +3 -1
  63. package/package.json +5 -4
  64. package/src/consent/sdkUserConsent.ts +5 -6
  65. package/src/dtos/types.ts +8 -0
  66. package/src/evaluator/Engine.ts +3 -3
  67. package/src/evaluator/combiners/and.ts +1 -1
  68. package/src/evaluator/combiners/ifelseif.ts +3 -3
  69. package/src/evaluator/condition/engineUtils.ts +1 -1
  70. package/src/evaluator/condition/index.ts +6 -6
  71. package/src/evaluator/index.ts +10 -10
  72. package/src/evaluator/matchers/all.ts +1 -1
  73. package/src/evaluator/matchers/between.ts +1 -1
  74. package/src/evaluator/matchers/boolean.ts +1 -1
  75. package/src/evaluator/matchers/cont_all.ts +1 -1
  76. package/src/evaluator/matchers/cont_any.ts +1 -1
  77. package/src/evaluator/matchers/cont_str.ts +1 -1
  78. package/src/evaluator/matchers/dependency.ts +1 -1
  79. package/src/evaluator/matchers/eq.ts +1 -1
  80. package/src/evaluator/matchers/eq_set.ts +1 -1
  81. package/src/evaluator/matchers/ew.ts +1 -1
  82. package/src/evaluator/matchers/gte.ts +1 -1
  83. package/src/evaluator/matchers/index.ts +1 -1
  84. package/src/evaluator/matchers/lte.ts +1 -1
  85. package/src/evaluator/matchers/part_of.ts +1 -1
  86. package/src/evaluator/matchers/segment.ts +1 -1
  87. package/src/evaluator/matchers/string.ts +1 -1
  88. package/src/evaluator/matchers/sw.ts +1 -1
  89. package/src/evaluator/matchers/whitelist.ts +1 -1
  90. package/src/evaluator/parser/index.ts +3 -3
  91. package/src/evaluator/types.ts +6 -6
  92. package/src/evaluator/value/index.ts +4 -4
  93. package/src/evaluator/value/sanitize.ts +4 -4
  94. package/src/integrations/ga/GaToSplit.ts +6 -6
  95. package/src/integrations/ga/SplitToGa.ts +10 -10
  96. package/src/integrations/ga/types.ts +4 -4
  97. package/src/integrations/pluggable.ts +3 -3
  98. package/src/integrations/types.ts +2 -2
  99. package/src/listeners/browser.ts +3 -2
  100. package/src/logger/constants.ts +1 -0
  101. package/src/logger/index.ts +3 -3
  102. package/src/logger/sdkLogger.ts +2 -1
  103. package/src/logger/types.ts +16 -0
  104. package/src/readiness/sdkReadinessManager.ts +1 -1
  105. package/src/readiness/types.ts +9 -2
  106. package/src/sdkClient/client.ts +13 -13
  107. package/src/sdkClient/clientAttributesDecoration.ts +13 -13
  108. package/src/sdkClient/clientCS.ts +4 -3
  109. package/src/sdkClient/clientInputValidation.ts +15 -15
  110. package/src/sdkClient/sdkClient.ts +2 -2
  111. package/src/sdkClient/sdkClientMethod.ts +2 -2
  112. package/src/sdkClient/sdkClientMethodCS.ts +9 -9
  113. package/src/sdkClient/sdkClientMethodCSWithTT.ts +9 -9
  114. package/src/sdkFactory/index.ts +28 -8
  115. package/src/sdkFactory/types.ts +11 -8
  116. package/src/sdkManager/index.ts +5 -5
  117. package/src/services/splitApi.ts +22 -1
  118. package/src/services/types.ts +6 -0
  119. package/src/storages/KeyBuilderSS.ts +8 -0
  120. package/src/storages/dataLoader.ts +2 -2
  121. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +1 -1
  122. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +2 -2
  123. package/src/storages/inLocalStorage/index.ts +6 -4
  124. package/src/storages/inMemory/AttributesCacheInMemory.ts +12 -13
  125. package/src/storages/inMemory/EventsCacheInMemory.ts +4 -4
  126. package/src/storages/inMemory/ImpressionCountsCacheInMemory.ts +16 -1
  127. package/src/storages/inMemory/InMemoryStorage.ts +5 -2
  128. package/src/storages/inMemory/InMemoryStorageCS.ts +6 -2
  129. package/src/storages/inMemory/uniqueKeysCacheInMemory.ts +82 -0
  130. package/src/storages/inMemory/uniqueKeysCacheInMemoryCS.ts +88 -0
  131. package/src/storages/inRedis/EventsCacheInRedis.ts +4 -4
  132. package/src/storages/inRedis/ImpressionCountsCacheInRedis.ts +48 -0
  133. package/src/storages/inRedis/ImpressionsCacheInRedis.ts +1 -1
  134. package/src/storages/inRedis/RedisAdapter.ts +1 -1
  135. package/src/storages/inRedis/SegmentsCacheInRedis.ts +1 -1
  136. package/src/storages/inRedis/SplitsCacheInRedis.ts +1 -1
  137. package/src/storages/inRedis/TelemetryCacheInRedis.ts +1 -1
  138. package/src/storages/inRedis/constants.ts +3 -0
  139. package/src/storages/inRedis/index.ts +14 -6
  140. package/src/storages/inRedis/uniqueKeysCacheInRedis.ts +61 -0
  141. package/src/storages/pluggable/EventsCachePluggable.ts +4 -4
  142. package/src/storages/pluggable/ImpressionsCachePluggable.ts +1 -1
  143. package/src/storages/pluggable/SegmentsCachePluggable.ts +1 -1
  144. package/src/storages/pluggable/SplitsCachePluggable.ts +1 -1
  145. package/src/storages/pluggable/TelemetryCachePluggable.ts +1 -1
  146. package/src/storages/pluggable/index.ts +3 -3
  147. package/src/storages/pluggable/wrapperAdapter.ts +1 -1
  148. package/src/storages/types.ts +45 -50
  149. package/src/sync/offline/LocalhostFromObject.ts +4 -4
  150. package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +8 -8
  151. package/src/sync/polling/updaters/mySegmentsUpdater.ts +1 -1
  152. package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
  153. package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
  154. package/src/sync/streaming/SSEHandler/index.ts +1 -1
  155. package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
  156. package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
  157. package/src/sync/submitters/submitter.ts +1 -1
  158. package/src/sync/submitters/submitterManager.ts +2 -0
  159. package/src/sync/submitters/telemetrySubmitter.ts +4 -3
  160. package/src/sync/submitters/types.ts +22 -3
  161. package/src/sync/submitters/uniqueKeysSubmitter.ts +35 -0
  162. package/src/sync/syncTask.ts +1 -1
  163. package/src/trackers/eventTracker.ts +3 -3
  164. package/src/trackers/impressionsTracker.ts +30 -51
  165. package/src/trackers/strategy/strategyDebug.ts +28 -0
  166. package/src/trackers/strategy/strategyNone.ts +34 -0
  167. package/src/trackers/strategy/strategyOptimized.ts +42 -0
  168. package/src/trackers/types.ts +30 -4
  169. package/src/trackers/uniqueKeysTracker.ts +37 -0
  170. package/src/types.ts +1265 -0
  171. package/src/utils/constants/index.ts +3 -1
  172. package/src/utils/inputValidation/apiKey.ts +1 -1
  173. package/src/utils/inputValidation/attribute.ts +1 -1
  174. package/src/utils/inputValidation/attributes.ts +3 -3
  175. package/src/utils/inputValidation/event.ts +1 -1
  176. package/src/utils/inputValidation/eventProperties.ts +3 -3
  177. package/src/utils/inputValidation/eventValue.ts +1 -1
  178. package/src/utils/inputValidation/isOperational.ts +1 -1
  179. package/src/utils/inputValidation/key.ts +3 -3
  180. package/src/utils/inputValidation/preloadedData.ts +3 -3
  181. package/src/utils/inputValidation/split.ts +1 -1
  182. package/src/utils/inputValidation/splitExistance.ts +1 -1
  183. package/src/utils/inputValidation/splits.ts +1 -1
  184. package/src/utils/inputValidation/trafficType.ts +1 -1
  185. package/src/utils/inputValidation/trafficTypeExistance.ts +1 -1
  186. package/src/utils/key/index.ts +9 -9
  187. package/src/utils/settingsValidation/consent.ts +2 -1
  188. package/src/utils/settingsValidation/impressionsMode.ts +6 -6
  189. package/src/utils/settingsValidation/index.ts +4 -1
  190. package/src/utils/settingsValidation/integrations/common.ts +1 -1
  191. package/src/utils/settingsValidation/integrations/configurable.ts +1 -1
  192. package/src/utils/settingsValidation/integrations/pluggable.ts +2 -1
  193. package/src/utils/settingsValidation/localhost/builtin.ts +2 -1
  194. package/src/utils/settingsValidation/localhost/pluggable.ts +2 -1
  195. package/src/utils/settingsValidation/logger/builtinLogger.ts +2 -1
  196. package/src/utils/settingsValidation/logger/pluggableLogger.ts +2 -1
  197. package/src/utils/settingsValidation/splitFilters.ts +9 -7
  198. package/src/utils/settingsValidation/storage/storageCS.ts +2 -1
  199. package/types/consent/index.d.ts +2 -0
  200. package/types/consent/sdkUserConsent.d.ts +13 -0
  201. package/types/dtos/types.d.ts +172 -0
  202. package/types/evaluator/Engine.d.ts +15 -0
  203. package/types/evaluator/combiners/and.d.ts +4 -0
  204. package/types/evaluator/combiners/ifelseif.d.ts +3 -0
  205. package/types/evaluator/condition/engineUtils.d.ts +11 -0
  206. package/types/evaluator/condition/index.d.ts +6 -0
  207. package/types/evaluator/convertions/index.d.ts +2 -0
  208. package/types/evaluator/index.d.ts +7 -0
  209. package/types/evaluator/matchers/all.d.ts +2 -0
  210. package/types/evaluator/matchers/between.d.ts +3 -0
  211. package/types/evaluator/matchers/boolean.d.ts +2 -0
  212. package/types/evaluator/matchers/cont_all.d.ts +2 -0
  213. package/types/evaluator/matchers/cont_any.d.ts +2 -0
  214. package/types/evaluator/matchers/cont_str.d.ts +2 -0
  215. package/types/evaluator/matchers/dependency.d.ts +5 -0
  216. package/types/evaluator/matchers/eq.d.ts +2 -0
  217. package/types/evaluator/matchers/eq_set.d.ts +2 -0
  218. package/types/evaluator/matchers/ew.d.ts +2 -0
  219. package/types/evaluator/matchers/gte.d.ts +2 -0
  220. package/types/evaluator/matchers/index.d.ts +7 -0
  221. package/types/evaluator/matchers/lte.d.ts +2 -0
  222. package/types/evaluator/matchers/matcherTypes.d.ts +10 -0
  223. package/types/evaluator/matchers/part_of.d.ts +2 -0
  224. package/types/evaluator/matchers/segment.d.ts +6 -0
  225. package/types/evaluator/matchers/string.d.ts +2 -0
  226. package/types/evaluator/matchers/sw.d.ts +2 -0
  227. package/types/evaluator/matchers/whitelist.d.ts +3 -0
  228. package/types/evaluator/matchersTransform/index.d.ts +6 -0
  229. package/types/evaluator/matchersTransform/segment.d.ts +5 -0
  230. package/types/evaluator/matchersTransform/set.d.ts +5 -0
  231. package/types/evaluator/matchersTransform/unaryNumeric.d.ts +5 -0
  232. package/types/evaluator/matchersTransform/whitelist.d.ts +5 -0
  233. package/types/evaluator/parser/index.d.ts +5 -0
  234. package/types/evaluator/treatments/index.d.ts +8 -0
  235. package/types/evaluator/types.d.ts +28 -0
  236. package/types/evaluator/value/index.d.ts +7 -0
  237. package/types/evaluator/value/sanitize.d.ts +7 -0
  238. package/types/index.d.ts +5 -0
  239. package/types/integrations/browser.d.ts +12 -0
  240. package/types/integrations/ga/GaToSplit.d.ts +40 -0
  241. package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +3 -0
  242. package/types/integrations/ga/SplitToGa.d.ts +34 -0
  243. package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +3 -0
  244. package/types/integrations/ga/types.d.ts +148 -0
  245. package/types/integrations/pluggable.d.ts +11 -0
  246. package/types/integrations/types.d.ts +17 -0
  247. package/types/listeners/browser.d.ts +40 -0
  248. package/types/listeners/node.d.ts +22 -0
  249. package/types/listeners/types.d.ts +4 -0
  250. package/types/logger/browser/DebugLogger.d.ts +2 -0
  251. package/types/logger/browser/ErrorLogger.d.ts +2 -0
  252. package/types/logger/browser/InfoLogger.d.ts +2 -0
  253. package/types/logger/browser/WarnLogger.d.ts +2 -0
  254. package/types/logger/constants.d.ts +142 -0
  255. package/types/logger/index.d.ts +22 -0
  256. package/types/logger/messages/debug.d.ts +1 -0
  257. package/types/logger/messages/error.d.ts +1 -0
  258. package/types/logger/messages/info.d.ts +1 -0
  259. package/types/logger/messages/warn.d.ts +1 -0
  260. package/types/logger/sdkLogger.d.ts +8 -0
  261. package/types/logger/types.d.ts +17 -0
  262. package/types/readiness/constants.d.ts +7 -0
  263. package/types/readiness/readinessManager.d.ts +6 -0
  264. package/types/readiness/sdkReadinessManager.d.ts +11 -0
  265. package/types/readiness/types.d.ts +60 -0
  266. package/types/sdkClient/client.d.ts +6 -0
  267. package/types/sdkClient/clientAttributesDecoration.d.ts +51 -0
  268. package/types/sdkClient/clientCS.d.ts +10 -0
  269. package/types/sdkClient/clientInputValidation.d.ts +7 -0
  270. package/types/sdkClient/sdkClient.d.ts +6 -0
  271. package/types/sdkClient/sdkClientMethod.d.ts +6 -0
  272. package/types/sdkClient/sdkClientMethodCS.d.ts +7 -0
  273. package/types/sdkClient/sdkClientMethodCSWithTT.d.ts +8 -0
  274. package/types/sdkClient/types.d.ts +18 -0
  275. package/types/sdkFactory/index.d.ts +6 -0
  276. package/types/sdkFactory/types.d.ts +82 -0
  277. package/types/sdkManager/index.d.ts +5 -0
  278. package/types/services/splitApi.d.ts +11 -0
  279. package/types/services/splitHttpClient.d.ts +10 -0
  280. package/types/services/types.d.ts +54 -0
  281. package/types/storages/AbstractSegmentsCacheSync.d.ts +55 -0
  282. package/types/storages/AbstractSplitsCacheAsync.d.ts +36 -0
  283. package/types/storages/AbstractSplitsCacheSync.d.ts +42 -0
  284. package/types/storages/KeyBuilder.d.ts +14 -0
  285. package/types/storages/KeyBuilderCS.d.ts +16 -0
  286. package/types/storages/KeyBuilderSS.d.ts +17 -0
  287. package/types/storages/dataLoader.d.ts +10 -0
  288. package/types/storages/findLatencyIndex.d.ts +7 -0
  289. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +25 -0
  290. package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +51 -0
  291. package/types/storages/inLocalStorage/constants.d.ts +2 -0
  292. package/types/storages/inLocalStorage/index.d.ts +8 -0
  293. package/types/storages/inMemory/AttributesCacheInMemory.d.ts +43 -0
  294. package/types/storages/inMemory/CountsCacheInMemory.d.ts +20 -0
  295. package/types/storages/inMemory/EventsCacheInMemory.d.ts +35 -0
  296. package/types/storages/inMemory/ImpressionCountsCacheInMemory.d.ts +28 -0
  297. package/types/storages/inMemory/ImpressionsCacheInMemory.d.ts +30 -0
  298. package/types/storages/inMemory/InMemoryStorage.d.ts +10 -0
  299. package/types/storages/inMemory/InMemoryStorageCS.d.ts +10 -0
  300. package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +20 -0
  301. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +22 -0
  302. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +19 -0
  303. package/types/storages/inMemory/SplitsCacheInMemory.d.ts +20 -0
  304. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +53 -0
  305. package/types/storages/inMemory/uniqueKeysCacheInMemory.d.ts +35 -0
  306. package/types/storages/inMemory/uniqueKeysCacheInMemoryCS.d.ts +37 -0
  307. package/types/storages/inRedis/CountsCacheInRedis.d.ts +9 -0
  308. package/types/storages/inRedis/EventsCacheInRedis.d.ts +32 -0
  309. package/types/storages/inRedis/ImpressionCountsCacheInRedis.d.ts +13 -0
  310. package/types/storages/inRedis/ImpressionsCacheInRedis.d.ts +18 -0
  311. package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +9 -0
  312. package/types/storages/inRedis/RedisAdapter.d.ts +24 -0
  313. package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +18 -0
  314. package/types/storages/inRedis/SplitsCacheInRedis.d.ts +91 -0
  315. package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +20 -0
  316. package/types/storages/inRedis/constants.d.ts +4 -0
  317. package/types/storages/inRedis/index.d.ts +10 -0
  318. package/types/storages/inRedis/uniqueKeysCacheInRedis.d.ts +14 -0
  319. package/types/storages/metadataBuilder.d.ts +3 -0
  320. package/types/storages/pluggable/EventsCachePluggable.d.ts +38 -0
  321. package/types/storages/pluggable/ImpressionsCachePluggable.d.ts +35 -0
  322. package/types/storages/pluggable/SegmentsCachePluggable.d.ts +54 -0
  323. package/types/storages/pluggable/SplitsCachePluggable.d.ts +89 -0
  324. package/types/storages/pluggable/TelemetryCachePluggable.d.ts +18 -0
  325. package/types/storages/pluggable/constants.d.ts +1 -0
  326. package/types/storages/pluggable/inMemoryWrapper.d.ts +13 -0
  327. package/types/storages/pluggable/index.d.ts +9 -0
  328. package/types/storages/pluggable/wrapperAdapter.d.ts +12 -0
  329. package/types/storages/types.d.ts +414 -0
  330. package/types/sync/offline/LocalhostFromFile.d.ts +2 -0
  331. package/types/sync/offline/LocalhostFromObject.d.ts +2 -0
  332. package/types/sync/offline/splitsParser/parseCondition.d.ts +7 -0
  333. package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +2 -0
  334. package/types/sync/offline/splitsParser/splitsParserFromSettings.d.ts +3 -0
  335. package/types/sync/offline/splitsParser/types.d.ts +3 -0
  336. package/types/sync/offline/syncManagerOffline.d.ts +10 -0
  337. package/types/sync/offline/syncTasks/fromObjectSyncTask.d.ts +17 -0
  338. package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +7 -0
  339. package/types/sync/polling/fetchers/segmentChangesFetcher.d.ts +7 -0
  340. package/types/sync/polling/fetchers/splitChangesFetcher.d.ts +7 -0
  341. package/types/sync/polling/fetchers/types.d.ts +5 -0
  342. package/types/sync/polling/pollingManagerCS.d.ts +7 -0
  343. package/types/sync/polling/pollingManagerSS.d.ts +6 -0
  344. package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +9 -0
  345. package/types/sync/polling/syncTasks/segmentsSyncTask.d.ts +9 -0
  346. package/types/sync/polling/syncTasks/splitsSyncTask.d.ts +9 -0
  347. package/types/sync/polling/types.d.ts +26 -0
  348. package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +13 -0
  349. package/types/sync/polling/updaters/segmentChangesUpdater.d.ts +18 -0
  350. package/types/sync/polling/updaters/splitChangesUpdater.d.ts +39 -0
  351. package/types/sync/streaming/AuthClient/index.d.ts +12 -0
  352. package/types/sync/streaming/AuthClient/types.d.ts +17 -0
  353. package/types/sync/streaming/SSEClient/index.d.ts +34 -0
  354. package/types/sync/streaming/SSEClient/types.d.ts +11 -0
  355. package/types/sync/streaming/SSEHandler/NotificationKeeper.d.ts +14 -0
  356. package/types/sync/streaming/SSEHandler/NotificationParser.d.ts +20 -0
  357. package/types/sync/streaming/SSEHandler/index.d.ts +11 -0
  358. package/types/sync/streaming/SSEHandler/types.d.ts +67 -0
  359. package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +6 -0
  360. package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +8 -0
  361. package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +12 -0
  362. package/types/sync/streaming/UpdateWorkers/constants.d.ts +3 -0
  363. package/types/sync/streaming/UpdateWorkers/types.d.ts +4 -0
  364. package/types/sync/streaming/constants.d.ts +34 -0
  365. package/types/sync/streaming/mySegmentsV2utils.d.ts +27 -0
  366. package/types/sync/streaming/pushManager.d.ts +9 -0
  367. package/types/sync/streaming/types.d.ts +35 -0
  368. package/types/sync/submitters/eventsSubmitter.d.ts +5 -0
  369. package/types/sync/submitters/eventsSyncTask.d.ts +8 -0
  370. package/types/sync/submitters/impressionCountsSubmitter.d.ts +10 -0
  371. package/types/sync/submitters/impressionCountsSubmitterInRedis.d.ts +5 -0
  372. package/types/sync/submitters/impressionCountsSyncTask.d.ts +13 -0
  373. package/types/sync/submitters/impressionsSubmitter.d.ts +11 -0
  374. package/types/sync/submitters/impressionsSyncTask.d.ts +14 -0
  375. package/types/sync/submitters/metricsSyncTask.d.ts +12 -0
  376. package/types/sync/submitters/submitter.d.ts +12 -0
  377. package/types/sync/submitters/submitterManager.d.ts +3 -0
  378. package/types/sync/submitters/submitterSyncTask.d.ts +10 -0
  379. package/types/sync/submitters/telemetrySubmitter.d.ts +25 -0
  380. package/types/sync/submitters/types.d.ts +194 -0
  381. package/types/sync/submitters/uniqueKeysSubmitter.d.ts +5 -0
  382. package/types/sync/submitters/uniqueKeysSubmitterInRedis.d.ts +5 -0
  383. package/types/sync/syncManagerOnline.d.ts +13 -0
  384. package/types/sync/syncTask.d.ts +13 -0
  385. package/types/sync/syncTaskComposite.d.ts +5 -0
  386. package/types/sync/types.d.ts +43 -0
  387. package/types/trackers/eventTracker.d.ts +10 -0
  388. package/types/trackers/filter/bloomFilter.d.ts +10 -0
  389. package/types/trackers/filter/dictionaryFilter.d.ts +8 -0
  390. package/types/trackers/filter/types.d.ts +5 -0
  391. package/types/trackers/impressionObserver/ImpressionObserver.d.ts +8 -0
  392. package/types/trackers/impressionObserver/buildKey.d.ts +2 -0
  393. package/types/trackers/impressionObserver/impressionObserverCS.d.ts +4 -0
  394. package/types/trackers/impressionObserver/impressionObserverSS.d.ts +4 -0
  395. package/types/trackers/impressionObserver/types.d.ts +4 -0
  396. package/types/trackers/impressionObserver/utils.d.ts +13 -0
  397. package/types/trackers/impressionsTracker.d.ts +13 -0
  398. package/types/trackers/strategy/strategyDebug.d.ts +9 -0
  399. package/types/trackers/strategy/strategyNone.d.ts +10 -0
  400. package/types/trackers/strategy/strategyOptimized.d.ts +11 -0
  401. package/types/trackers/telemetryTracker.d.ts +3 -0
  402. package/types/trackers/types.d.ts +57 -0
  403. package/types/trackers/uniqueKeysTracker.d.ts +13 -0
  404. package/types/types.d.ts +1263 -0
  405. package/types/utils/Backoff.d.ts +25 -0
  406. package/types/utils/LRUCache/LinkedList.d.ts +34 -0
  407. package/types/utils/LRUCache/index.d.ts +16 -0
  408. package/types/utils/MinEventEmitter.d.ts +12 -0
  409. package/types/utils/MinEvents.d.ts +4 -0
  410. package/types/utils/base64/index.d.ts +30 -0
  411. package/types/utils/constants/browser.d.ts +3 -0
  412. package/types/utils/constants/index.d.ts +64 -0
  413. package/types/utils/decompress/index.d.ts +16 -0
  414. package/types/utils/env/isLocalStorageAvailable.d.ts +1 -0
  415. package/types/utils/env/isNode.d.ts +5 -0
  416. package/types/utils/inputValidation/apiKey.d.ts +7 -0
  417. package/types/utils/inputValidation/attribute.d.ts +2 -0
  418. package/types/utils/inputValidation/attributes.d.ts +4 -0
  419. package/types/utils/inputValidation/event.d.ts +2 -0
  420. package/types/utils/inputValidation/eventProperties.d.ts +6 -0
  421. package/types/utils/inputValidation/eventValue.d.ts +2 -0
  422. package/types/utils/inputValidation/index.d.ts +13 -0
  423. package/types/utils/inputValidation/isOperational.d.ts +4 -0
  424. package/types/utils/inputValidation/key.d.ts +3 -0
  425. package/types/utils/inputValidation/preloadedData.d.ts +3 -0
  426. package/types/utils/inputValidation/split.d.ts +2 -0
  427. package/types/utils/inputValidation/splitExistance.d.ts +7 -0
  428. package/types/utils/inputValidation/splits.d.ts +2 -0
  429. package/types/utils/inputValidation/trafficType.d.ts +2 -0
  430. package/types/utils/inputValidation/trafficTypeExistance.d.ts +9 -0
  431. package/types/utils/jwt/index.d.ts +5 -0
  432. package/types/utils/jwt/types.d.ts +5 -0
  433. package/types/utils/key/index.d.ts +8 -0
  434. package/types/utils/labels/index.d.ts +7 -0
  435. package/types/utils/lang/binarySearch.d.ts +9 -0
  436. package/types/utils/lang/getFnName.d.ts +4 -0
  437. package/types/utils/lang/getGlobal.d.ts +4 -0
  438. package/types/utils/lang/index.d.ts +105 -0
  439. package/types/utils/lang/maps.d.ts +55 -0
  440. package/types/utils/lang/objectAssign.d.ts +3 -0
  441. package/types/utils/lang/sets.d.ts +60 -0
  442. package/types/utils/murmur3/common.d.ts +12 -0
  443. package/types/utils/murmur3/legacy.d.ts +2 -0
  444. package/types/utils/murmur3/murmur3.d.ts +2 -0
  445. package/types/utils/murmur3/murmur3_128.d.ts +6 -0
  446. package/types/utils/murmur3/murmur3_128_x86.d.ts +7 -0
  447. package/types/utils/murmur3/murmur3_64.d.ts +10 -0
  448. package/types/utils/murmur3/utfx.d.ts +27 -0
  449. package/types/utils/promise/thenable.d.ts +1 -0
  450. package/types/utils/promise/timeout.d.ts +1 -0
  451. package/types/utils/promise/wrapper.d.ts +21 -0
  452. package/types/utils/settingsValidation/consent.d.ts +6 -0
  453. package/types/utils/settingsValidation/impressionsMode.d.ts +3 -0
  454. package/types/utils/settingsValidation/index.d.ts +52 -0
  455. package/types/utils/settingsValidation/integrations/common.d.ts +14 -0
  456. package/types/utils/settingsValidation/integrations/configurable.d.ts +13 -0
  457. package/types/utils/settingsValidation/integrations/pluggable.d.ts +13 -0
  458. package/types/utils/settingsValidation/localhost/builtin.d.ts +16 -0
  459. package/types/utils/settingsValidation/localhost/pluggable.d.ts +16 -0
  460. package/types/utils/settingsValidation/logger/builtinLogger.d.ts +10 -0
  461. package/types/utils/settingsValidation/logger/commons.d.ts +9 -0
  462. package/types/utils/settingsValidation/logger/pluggableLogger.d.ts +11 -0
  463. package/types/utils/settingsValidation/mode.d.ts +1 -0
  464. package/types/utils/settingsValidation/runtime.d.ts +2 -0
  465. package/types/utils/settingsValidation/splitFilters.d.ts +16 -0
  466. package/types/utils/settingsValidation/storage/storageCS.d.ts +21 -0
  467. package/types/utils/settingsValidation/types.d.ts +32 -0
  468. package/types/utils/settingsValidation/url.d.ts +10 -0
  469. package/types/utils/time/index.d.ts +4 -0
  470. package/types/utils/timeTracker/index.d.ts +70 -0
  471. package/types/utils/timeTracker/now/browser.d.ts +1 -0
  472. package/types/utils/timeTracker/now/node.d.ts +1 -0
  473. package/types/utils/timeTracker/timer.d.ts +1 -0
  474. package/src/logger/.DS_Store +0 -0
  475. package/src/types.d.ts +0 -1581
@@ -4,7 +4,7 @@ import { impressionsTrackerFactory } from '../trackers/impressionsTracker';
4
4
  import { eventTrackerFactory } from '../trackers/eventTracker';
5
5
  import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
6
6
  import { IStorageFactoryParams } from '../storages/types';
7
- import { IBasicSDK } from '../types';
7
+ import { SplitIO } from '../types';
8
8
  import { getMatching } from '../utils/key';
9
9
  import { shouldBeOptimized } from '../trackers/impressionObserver/utils';
10
10
  import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
@@ -13,15 +13,21 @@ import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
13
13
  import { metadataBuilder } from '../storages/metadataBuilder';
14
14
  import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
15
15
  import { objectAssign } from '../utils/lang/objectAssign';
16
+ import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
17
+ import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
18
+ import { strategyNoneFactory } from '../trackers/strategy/strategyNone';
19
+ import { uniqueKeysTrackerFactory } from '../trackers/uniqueKeysTracker';
20
+ import { NONE, OPTIMIZED } from '../utils/constants';
16
21
 
17
22
  /**
18
23
  * Modular SDK factory
19
24
  */
20
- export function sdkFactory(params: ISdkFactoryParams): IBasicSDK<any, any> {
25
+ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.ISDK | SplitIO.IAsyncSDK {
21
26
 
22
27
  const { settings, platform, storageFactory, splitApiFactory, extraProps,
23
28
  syncManagerFactory, SignalListener, impressionsObserverFactory,
24
- integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory } = params;
29
+ integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory,
30
+ filterAdapterFactory } = params;
25
31
  const log = settings.log;
26
32
 
27
33
  // @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid API Key, etc.
@@ -37,15 +43,16 @@ export function sdkFactory(params: ISdkFactoryParams): IBasicSDK<any, any> {
37
43
  const storageFactoryParams: IStorageFactoryParams = {
38
44
  impressionsQueueSize: settings.scheduler.impressionsQueueSize,
39
45
  eventsQueueSize: settings.scheduler.eventsQueueSize,
46
+ uniqueKeysCacheSize: settings.scheduler.uniqueKeysCacheSize,
40
47
  optimize: shouldBeOptimized(settings),
41
48
 
42
49
  // ATM, only used by InLocalStorage
43
50
  matchingKey: getMatching(settings.core.key),
44
- // @ts-ignore
45
51
  splitFiltersValidation: settings.sync.__splitFiltersValidation,
46
52
 
47
53
  // ATM, only used by PluggableStorage
48
54
  mode: settings.mode,
55
+ impressionsMode: settings.sync.impressionsMode,
49
56
 
50
57
  // Callback used to emit SDK_READY in consumer mode, where `syncManagerFactory` is undefined,
51
58
  // or partial consumer mode, where it only has submitters, and therefore it doesn't emit readiness events.
@@ -63,16 +70,29 @@ export function sdkFactory(params: ISdkFactoryParams): IBasicSDK<any, any> {
63
70
 
64
71
  const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage });
65
72
 
66
- // trackers
67
- const observer = impressionsObserverFactory && impressionsObserverFactory();
68
- const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, integrationsManager, observer, storage.impressionCounts, storage.telemetry);
73
+ const observer = impressionsObserverFactory();
74
+ const uniqueKeysTracker = storageFactoryParams.impressionsMode === NONE ? uniqueKeysTrackerFactory(log, storage.uniqueKeys!, filterAdapterFactory && filterAdapterFactory()) : undefined;
75
+
76
+ let strategy;
77
+ switch (storageFactoryParams.impressionsMode) {
78
+ case OPTIMIZED:
79
+ strategy = strategyOptimizedFactory(observer, storage.impressionCounts!);
80
+ break;
81
+ case NONE:
82
+ strategy = strategyNoneFactory(storage.impressionCounts!, uniqueKeysTracker!);
83
+ break;
84
+ default:
85
+ strategy = strategyDebugFactory(observer);
86
+ }
87
+
88
+ const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, integrationsManager, storage.telemetry);
69
89
  const eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
70
90
  const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
71
91
 
72
92
  // splitApi is used by SyncManager and Browser signal listener
73
93
  const splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
74
94
 
75
- const ctx: ISdkFactoryContext = { splitApi, eventTracker, impressionsTracker, telemetryTracker, sdkReadinessManager, readiness, settings, storage, platform };
95
+ const ctx: ISdkFactoryContext = { splitApi, eventTracker, impressionsTracker, telemetryTracker, uniqueKeysTracker, sdkReadinessManager, readiness, settings, storage, platform };
76
96
 
77
97
  const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
78
98
  ctx.syncManager = syncManager;
@@ -1,13 +1,13 @@
1
1
  import { IIntegrationManager, IIntegrationFactoryParams } from '../integrations/types';
2
2
  import { ISignalListener } from '../listeners/types';
3
- import { IAsyncClientSS, IAsyncManager, IClientSS, IClientWithKey, ILogger, IManager, SplitKey } from '../types';
3
+ import { ILogger } from '../logger/types';
4
4
  import { IReadinessManager, ISdkReadinessManager } from '../readiness/types';
5
5
  import { IFetch, ISplitApi, IEventSourceConstructor } from '../services/types';
6
6
  import { IStorageAsync, IStorageSync, ISplitsCacheSync, ISplitsCacheAsync, IStorageFactoryParams } from '../storages/types';
7
7
  import { ISyncManager } from '../sync/types';
8
8
  import { IImpressionObserver } from '../trackers/impressionObserver/types';
9
- import { IImpressionsTracker, IEventTracker, ITelemetryTracker } from '../trackers/types';
10
- import { ISettings, IEventEmitter } from '../types';
9
+ import { IImpressionsTracker, IEventTracker, ITelemetryTracker, IFilterAdapter, IUniqueKeysTracker } from '../trackers/types';
10
+ import { SplitIO, ISettings, IEventEmitter } from '../types';
11
11
 
12
12
  /**
13
13
  * Environment related dependencies.
@@ -44,6 +44,7 @@ export interface ISdkFactoryContext {
44
44
  eventTracker: IEventTracker,
45
45
  telemetryTracker: ITelemetryTracker,
46
46
  storage: IStorageSync | IStorageAsync,
47
+ uniqueKeysTracker?: IUniqueKeysTracker,
47
48
  signalListener?: ISignalListener
48
49
  splitApi?: ISplitApi
49
50
  syncManager?: ISyncManager,
@@ -90,11 +91,16 @@ export interface ISdkFactoryParams {
90
91
  log: ILogger,
91
92
  splits: ISplitsCacheSync | ISplitsCacheAsync,
92
93
  sdkReadinessManager: ISdkReadinessManager
93
- ) => IManager | IAsyncManager,
94
+ ) => SplitIO.IManager | SplitIO.IAsyncManager,
94
95
 
95
96
  // Sdk client method factory (ISDK::client method).
96
97
  // It Allows to distinguish SDK clients with the client-side API (`ICsSDK`) or server-side API (`ISDK` or `IAsyncSDK`).
97
- sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): IClientWithKey; (key: SplitKey, trafficType?: string | undefined): IClientWithKey; } | (() => IClientSS) | (() => IAsyncClientSS))
98
+ sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): SplitIO.ICsClient; (key: SplitIO.SplitKey, trafficType?: string | undefined): SplitIO.ICsClient; } | (() => SplitIO.IClient) | (() => SplitIO.IAsyncClient))
99
+
100
+ // Impression observer factory. If provided, will be used for impressions dedupe
101
+ impressionsObserverFactory: () => IImpressionObserver
102
+
103
+ filterAdapterFactory?: () => IFilterAdapter
98
104
 
99
105
  // Optional signal listener constructor. Used to handle special app states, like shutdown, app paused or resumed.
100
106
  // Pass only if `syncManager` (used by Node listener) and `splitApi` (used by Browser listener) are passed.
@@ -107,9 +113,6 @@ export interface ISdkFactoryParams {
107
113
  // @TODO review impressionListener and integrations interfaces. What about handling impressionListener as an integration ?
108
114
  integrationsManagerFactory?: (params: IIntegrationFactoryParams) => IIntegrationManager | undefined,
109
115
 
110
- // Impression observer factory. If provided, will be used for impressions dedupe
111
- impressionsObserverFactory?: () => IImpressionObserver
112
-
113
116
  // Optional function to assign additional properties to the factory instance
114
117
  extraProps?: (params: ISdkFactoryContext) => object
115
118
  }
@@ -5,8 +5,8 @@ import { validateSplit, validateSplitExistance, validateIfNotDestroyed, validate
5
5
  import { ISplitsCacheAsync, ISplitsCacheSync } from '../storages/types';
6
6
  import { ISdkReadinessManager } from '../readiness/types';
7
7
  import { ISplit } from '../dtos/types';
8
- import { IAsyncManager, IManager, SplitView } from '../types';
9
- import { ILogger } from '../types';
8
+ import { SplitIO } from '../types';
9
+ import { ILogger } from '../logger/types';
10
10
 
11
11
  function collectTreatments(splitObject: ISplit) {
12
12
  const conditions = splitObject.conditions;
@@ -18,7 +18,7 @@ function collectTreatments(splitObject: ISplit) {
18
18
  return allTreatmentsCondition ? allTreatmentsCondition.partitions.map(v => v.treatment) : [];
19
19
  }
20
20
 
21
- function objectToView(json: string | null): SplitView | null {
21
+ function objectToView(json: string | null): SplitIO.SplitView | null {
22
22
  let splitObject: ISplit | null;
23
23
 
24
24
  try {
@@ -41,7 +41,7 @@ function objectToView(json: string | null): SplitView | null {
41
41
  }
42
42
 
43
43
  function objectsToViews(jsons: string[]) {
44
- let views: SplitView[] = [];
44
+ let views: SplitIO.SplitView[] = [];
45
45
 
46
46
  jsons.forEach(split => {
47
47
  const view = objectToView(split);
@@ -55,7 +55,7 @@ export function sdkManagerFactory<TSplitCache extends ISplitsCacheSync | ISplits
55
55
  log: ILogger,
56
56
  splits: TSplitCache,
57
57
  { readinessManager, sdkStatus }: ISdkReadinessManager
58
- ): TSplitCache extends ISplitsCacheAsync ? IAsyncManager : IManager {
58
+ ): TSplitCache extends ISplitsCacheAsync ? SplitIO.IAsyncManager : SplitIO.IManager {
59
59
  const SPLIT_FN_LABEL = 'split';
60
60
 
61
61
  return objectAssign(
@@ -25,7 +25,6 @@ export function splitApiFactory(
25
25
  ): ISplitApi {
26
26
 
27
27
  const urls = settings.urls;
28
- // @ts-ignore
29
28
  const filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
30
29
  const SplitSDKImpressionsMode = settings.sync.impressionsMode;
31
30
  const splitHttpClient = splitHttpClientFactory(settings, platform.getFetch, platform.getOptions);
@@ -107,6 +106,28 @@ export function splitApiFactory(
107
106
  const url = `${urls.events}/testImpressions/count`;
108
107
  return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(IMPRESSIONS_COUNT));
109
108
  },
109
+
110
+ /**
111
+ * Post unique keys for client side.
112
+ *
113
+ * @param body unique keys payload
114
+ * @param headers Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
115
+ */
116
+ postUniqueKeysBulkCs(body: string, headers?: Record<string, string>) {
117
+ const url = `${urls.telemetry}/v1/keys/cs`;
118
+ return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(TELEMETRY));
119
+ },
120
+
121
+ /**
122
+ * Post unique keys for server side.
123
+ *
124
+ * @param body unique keys payload
125
+ * @param headers Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
126
+ */
127
+ postUniqueKeysBulkSs(body: string, headers?: Record<string, string>) {
128
+ const url = `${urls.telemetry}/v1/keys/ss`;
129
+ return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(TELEMETRY));
130
+ },
110
131
 
111
132
  postMetricsConfig(body: string) {
112
133
  const url = `${urls.telemetry}/v1/metrics/config`;
@@ -43,6 +43,10 @@ export type IFetchMySegments = (userMatchingKey: string, noCache?: boolean) => P
43
43
 
44
44
  export type IPostEventsBulk = (body: string, headers?: Record<string, string>) => Promise<IResponse>
45
45
 
46
+ export type IPostUniqueKeysBulkCs = (body: string, headers?: Record<string, string>) => Promise<IResponse>
47
+
48
+ export type IPostUniqueKeysBulkSs = (body: string, headers?: Record<string, string>) => Promise<IResponse>
49
+
46
50
  export type IPostTestImpressionsBulk = (body: string, headers?: Record<string, string>) => Promise<IResponse>
47
51
 
48
52
  export type IPostTestImpressionsCount = (body: string, headers?: Record<string, string>) => Promise<IResponse>
@@ -59,6 +63,8 @@ export interface ISplitApi {
59
63
  fetchSegmentChanges: IFetchSegmentChanges
60
64
  fetchMySegments: IFetchMySegments
61
65
  postEventsBulk: IPostEventsBulk
66
+ postUniqueKeysBulkCs: IPostUniqueKeysBulkCs
67
+ postUniqueKeysBulkSs: IPostUniqueKeysBulkSs
62
68
  postTestImpressionsBulk: IPostTestImpressionsBulk
63
69
  postTestImpressionsCount: IPostTestImpressionsCount
64
70
  postMetricsConfig: IPostMetricsConfig
@@ -27,6 +27,14 @@ export class KeyBuilderSS extends KeyBuilder {
27
27
  return `${this.prefix}.impressions`;
28
28
  }
29
29
 
30
+ buildImpressionsCountKey() {
31
+ return `${this.prefix}.impressions.count`;
32
+ }
33
+
34
+ buildUniqueKeysKey() {
35
+ return `${this.prefix}.uniquekeys`;
36
+ }
37
+
30
38
  buildEventsKey() {
31
39
  return `${this.prefix}.events`;
32
40
  }
@@ -1,4 +1,4 @@
1
- import { PreloadedData } from './types';
1
+ import { SplitIO } from '../types';
2
2
  import { DEFAULT_CACHE_EXPIRATION_IN_MILLIS } from '../utils/constants/browser';
3
3
  import { DataLoader, ISegmentsCacheSync, ISplitsCacheSync } from './types';
4
4
 
@@ -9,7 +9,7 @@ import { DataLoader, ISegmentsCacheSync, ISplitsCacheSync } from './types';
9
9
  * and extended with a `mySegmentsData` property.
10
10
  * @returns function to preload the storage
11
11
  */
12
- export function dataLoaderFactory(preloadedData: PreloadedData): DataLoader {
12
+ export function dataLoaderFactory(preloadedData: SplitIO.PreloadedData): DataLoader {
13
13
 
14
14
  /**
15
15
  * Storage-agnostic adaptation of `loadDataIntoLocalStorage` function
@@ -1,4 +1,4 @@
1
- import { ILogger } from '../../types';
1
+ import { ILogger } from '../../logger/types';
2
2
  import { AbstractSegmentsCacheSync } from '../AbstractSegmentsCacheSync';
3
3
  import { KeyBuilderCS } from '../KeyBuilderCS';
4
4
  import { LOG_PREFIX, DEFINED } from './constants';
@@ -1,8 +1,8 @@
1
- import { ISplit } from '../../dtos/types';
1
+ import { ISplit, ISplitFiltersValidation } from '../../dtos/types';
2
2
  import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
3
3
  import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
4
4
  import { KeyBuilderCS } from '../KeyBuilderCS';
5
- import { ILogger, ISplitFiltersValidation } from '../../types';
5
+ import { ILogger } from '../../logger/types';
6
6
  import { LOG_PREFIX } from './constants';
7
7
 
8
8
  /**
@@ -1,8 +1,7 @@
1
1
  import { ImpressionsCacheInMemory } from '../inMemory/ImpressionsCacheInMemory';
2
2
  import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
3
3
  import { EventsCacheInMemory } from '../inMemory/EventsCacheInMemory';
4
- import { IStorageFactoryParams, IStorageSync } from '../types';
5
- import { StorageSyncFactory } from '../../types';
4
+ import { IStorageFactoryParams, IStorageSync, IStorageSyncFactory } from '../types';
6
5
  import { validatePrefix } from '../KeyBuilder';
7
6
  import { KeyBuilderCS } from '../KeyBuilderCS';
8
7
  import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
@@ -13,8 +12,9 @@ import { SplitsCacheInMemory } from '../inMemory/SplitsCacheInMemory';
13
12
  import { DEFAULT_CACHE_EXPIRATION_IN_MILLIS } from '../../utils/constants/browser';
14
13
  import { InMemoryStorageCSFactory } from '../inMemory/InMemoryStorageCS';
15
14
  import { LOG_PREFIX } from './constants';
16
- import { LOCALHOST_MODE, STORAGE_LOCALSTORAGE } from '../../utils/constants';
15
+ import { LOCALHOST_MODE, NONE, STORAGE_LOCALSTORAGE } from '../../utils/constants';
17
16
  import { shouldRecordTelemetry, TelemetryCacheInMemory } from '../inMemory/TelemetryCacheInMemory';
17
+ import { UniqueKeysCacheInMemoryCS } from '../inMemory/uniqueKeysCacheInMemoryCS';
18
18
 
19
19
  export interface InLocalStorageOptions {
20
20
  prefix?: string
@@ -23,7 +23,7 @@ export interface InLocalStorageOptions {
23
23
  /**
24
24
  * InLocal storage factory for standalone client-side SplitFactory
25
25
  */
26
- export function InLocalStorage(options: InLocalStorageOptions = {}): StorageSyncFactory {
26
+ export function InLocalStorage(options: InLocalStorageOptions = {}): IStorageSyncFactory {
27
27
 
28
28
  const prefix = validatePrefix(options.prefix);
29
29
 
@@ -46,6 +46,7 @@ export function InLocalStorage(options: InLocalStorageOptions = {}): StorageSync
46
46
  impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
47
47
  events: new EventsCacheInMemory(params.eventsQueueSize),
48
48
  telemetry: params.mode !== LOCALHOST_MODE && shouldRecordTelemetry() ? new TelemetryCacheInMemory() : undefined,
49
+ uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemoryCS() : undefined,
49
50
 
50
51
  destroy() {
51
52
  this.splits = new SplitsCacheInMemory();
@@ -53,6 +54,7 @@ export function InLocalStorage(options: InLocalStorageOptions = {}): StorageSync
53
54
  this.impressions.clear();
54
55
  this.impressionCounts && this.impressionCounts.clear();
55
56
  this.events.clear();
57
+ this.uniqueKeys?.clear();
56
58
  },
57
59
 
58
60
  // When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
@@ -1,36 +1,35 @@
1
- import { AttributeType } from '../../types';
2
1
  import { objectAssign } from '../../utils/lang/objectAssign';
3
2
 
4
3
  export class AttributesCacheInMemory {
5
4
 
6
- private attributesCache: Record<string, AttributeType> = {};
5
+ private attributesCache: Record<string, Object> = {};
7
6
 
8
7
 
9
8
  /**
10
9
  * Create or update the value for the given attribute
11
- *
10
+ *
12
11
  * @param {string} attributeName attribute name
13
12
  * @param {Object} attributeValue attribute value
14
- * @returns {boolean} the attribute was stored
13
+ * @returns {boolean} the attribute was stored
15
14
  */
16
- setAttribute(attributeName: string, attributeValue: AttributeType): boolean {
15
+ setAttribute(attributeName: string, attributeValue: Object): boolean {
17
16
  this.attributesCache[attributeName] = attributeValue;
18
17
  return true;
19
18
  }
20
19
 
21
20
  /**
22
21
  * Retrieves the value of a given attribute
23
- *
22
+ *
24
23
  * @param {string} attributeName attribute name
25
24
  * @returns {Object?} stored attribute value
26
25
  */
27
- getAttribute(attributeName: string): AttributeType {
26
+ getAttribute(attributeName: string): Object {
28
27
  return this.attributesCache[attributeName];
29
28
  }
30
29
 
31
30
  /**
32
31
  * Create or update all the given attributes
33
- *
32
+ *
34
33
  * @param {[string, Object]} attributes attributes to create or update
35
34
  * @returns {boolean} attributes were stored
36
35
  */
@@ -41,16 +40,16 @@ export class AttributesCacheInMemory {
41
40
 
42
41
  /**
43
42
  * Retrieve the full attributes map
44
- *
45
- * @returns {Map<string, AttributeType>} stored attributes
43
+ *
44
+ * @returns {Map<string, Object>} stored attributes
46
45
  */
47
- getAll(): Record<string, AttributeType> {
46
+ getAll(): Record<string, Object> {
48
47
  return this.attributesCache;
49
48
  }
50
49
 
51
50
  /**
52
51
  * Removes a given attribute from the map
53
- *
52
+ *
54
53
  * @param {string} attributeName attribute to remove
55
54
  * @returns {boolean} attribute removed
56
55
  */
@@ -64,7 +63,7 @@ export class AttributesCacheInMemory {
64
63
 
65
64
  /**
66
65
  * Clears all attributes stored in the SDK
67
- *
66
+ *
68
67
  */
69
68
  clear() {
70
69
  this.attributesCache = {};
@@ -1,4 +1,4 @@
1
- import { EventData } from '../../types';
1
+ import { SplitIO } from '../../types';
2
2
  import { IEventsCacheSync } from '../types';
3
3
 
4
4
  const MAX_QUEUE_BYTE_SIZE = 5 * 1024 * 1024; // 5M
@@ -7,7 +7,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
7
7
 
8
8
  private onFullQueue?: () => void;
9
9
  private readonly maxQueue: number;
10
- private queue: EventData[];
10
+ private queue: SplitIO.EventData[];
11
11
  private queueByteSize: number;
12
12
 
13
13
  /**
@@ -28,7 +28,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
28
28
  /**
29
29
  * Add a new event object at the end of the queue.
30
30
  */
31
- track(data: EventData, size = 0) {
31
+ track(data: SplitIO.EventData, size = 0) {
32
32
  this.queueByteSize += size;
33
33
  this.queue.push(data);
34
34
 
@@ -48,7 +48,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
48
48
  /**
49
49
  * Pop the collected data, used as payload for posting.
50
50
  */
51
- pop(toMerge?: EventData[]) {
51
+ pop(toMerge?: SplitIO.EventData[]) {
52
52
  const data = this.queue;
53
53
  this.clear();
54
54
  return toMerge ? toMerge.concat(data) : data;
@@ -1,8 +1,16 @@
1
1
  import { truncateTimeFrame } from '../../utils/time';
2
+ import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
2
3
  import { IImpressionCountsCacheSync } from '../types';
3
4
 
4
5
  export class ImpressionCountsCacheInMemory implements IImpressionCountsCacheSync {
5
- private cache: Record<string, number> = {};
6
+ protected cache: Record<string, number> = {};
7
+ private readonly maxStorage: number;
8
+ protected onFullQueue?: () => void;
9
+ private cacheSize = 0;
10
+
11
+ constructor(impressionCountsCacheSize: number = DEFAULT_CACHE_SIZE) {
12
+ this.maxStorage = impressionCountsCacheSize;
13
+ }
6
14
 
7
15
  /**
8
16
  * Builds key to be stored in the cache with the featureName and the timeFrame truncated.
@@ -18,6 +26,13 @@ export class ImpressionCountsCacheInMemory implements IImpressionCountsCacheSync
18
26
  const key = this._makeKey(featureName, timeFrame);
19
27
  const currentAmount = this.cache[key];
20
28
  this.cache[key] = currentAmount ? currentAmount + amount : amount;
29
+ if (this.onFullQueue) {
30
+ this.cacheSize = this.cacheSize + amount;
31
+ if (this.cacheSize >= this.maxStorage) {
32
+ this.onFullQueue();
33
+ this.cacheSize = 0;
34
+ }
35
+ }
21
36
  }
22
37
 
23
38
 
@@ -4,8 +4,9 @@ import { ImpressionsCacheInMemory } from './ImpressionsCacheInMemory';
4
4
  import { EventsCacheInMemory } from './EventsCacheInMemory';
5
5
  import { IStorageFactoryParams, IStorageSync } from '../types';
6
6
  import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
7
- import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
7
+ import { DEBUG, LOCALHOST_MODE, NONE, STORAGE_MEMORY } from '../../utils/constants';
8
8
  import { TelemetryCacheInMemory } from './TelemetryCacheInMemory';
9
+ import { UniqueKeysCacheInMemory } from './uniqueKeysCacheInMemory';
9
10
 
10
11
  /**
11
12
  * InMemory storage factory for standalone server-side SplitFactory
@@ -18,9 +19,10 @@ export function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageS
18
19
  splits: new SplitsCacheInMemory(),
19
20
  segments: new SegmentsCacheInMemory(),
20
21
  impressions: new ImpressionsCacheInMemory(params.impressionsQueueSize),
21
- impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
22
+ impressionCounts: params.impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
22
23
  events: new EventsCacheInMemory(params.eventsQueueSize),
23
24
  telemetry: params.mode !== LOCALHOST_MODE ? new TelemetryCacheInMemory() : undefined, // Always track telemetry in standalone mode on server-side
25
+ uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemory(params.uniqueKeysCacheSize) : undefined,
24
26
 
25
27
  // When using MEMORY we should clean all the caches to leave them empty
26
28
  destroy() {
@@ -29,6 +31,7 @@ export function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageS
29
31
  this.impressions.clear();
30
32
  this.impressionCounts && this.impressionCounts.clear();
31
33
  this.events.clear();
34
+ this.uniqueKeys?.clear();
32
35
  }
33
36
  };
34
37
  }
@@ -4,8 +4,9 @@ import { ImpressionsCacheInMemory } from './ImpressionsCacheInMemory';
4
4
  import { EventsCacheInMemory } from './EventsCacheInMemory';
5
5
  import { IStorageSync, IStorageFactoryParams } from '../types';
6
6
  import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
7
- import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
7
+ import { DEBUG, LOCALHOST_MODE, NONE, STORAGE_MEMORY } from '../../utils/constants';
8
8
  import { shouldRecordTelemetry, TelemetryCacheInMemory } from './TelemetryCacheInMemory';
9
+ import { UniqueKeysCacheInMemoryCS } from './uniqueKeysCacheInMemoryCS';
9
10
 
10
11
  /**
11
12
  * InMemory storage factory for standalone client-side SplitFactory
@@ -18,9 +19,11 @@ export function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorag
18
19
  splits: new SplitsCacheInMemory(),
19
20
  segments: new MySegmentsCacheInMemory(),
20
21
  impressions: new ImpressionsCacheInMemory(params.impressionsQueueSize),
21
- impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
22
+ impressionCounts: params.impressionsMode !== DEBUG ? new ImpressionCountsCacheInMemory() : undefined,
22
23
  events: new EventsCacheInMemory(params.eventsQueueSize),
23
24
  telemetry: params.mode !== LOCALHOST_MODE && shouldRecordTelemetry() ? new TelemetryCacheInMemory() : undefined,
25
+ uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemoryCS(params.uniqueKeysCacheSize) : undefined,
26
+
24
27
 
25
28
  // When using MEMORY we should clean all the caches to leave them empty
26
29
  destroy() {
@@ -29,6 +32,7 @@ export function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorag
29
32
  this.impressions.clear();
30
33
  this.impressionCounts && this.impressionCounts.clear();
31
34
  this.events.clear();
35
+ this.uniqueKeys?.clear();
32
36
  },
33
37
 
34
38
  // When using shared instanciation with MEMORY we reuse everything but segments (they are unique per key)
@@ -0,0 +1,82 @@
1
+ import { IUniqueKeysCacheBase } from '../types';
2
+ import { ISet, setToArray, _Set } from '../../utils/lang/sets';
3
+ import { UniqueKeysPayloadSs } from '../../sync/submitters/types';
4
+ import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
5
+
6
+ export class UniqueKeysCacheInMemory implements IUniqueKeysCacheBase {
7
+
8
+ protected onFullQueue?: () => void;
9
+ private readonly maxStorage: number;
10
+ private uniqueTrackerSize = 0;
11
+ protected uniqueKeysTracker: { [keys: string]: ISet<string> };
12
+
13
+ constructor(uniqueKeysQueueSize: number = DEFAULT_CACHE_SIZE) {
14
+ this.maxStorage = uniqueKeysQueueSize;
15
+ this.uniqueKeysTracker = {};
16
+ }
17
+
18
+ setOnFullQueueCb(cb: () => void) {
19
+ this.onFullQueue = cb;
20
+ }
21
+
22
+ /**
23
+ * Store unique keys in sequential order
24
+ * key: string = feature name.
25
+ * value: Set<string> = set of unique keys.
26
+ */
27
+ track(key: string, featureName: string) {
28
+ if (!this.uniqueKeysTracker[featureName]) this.uniqueKeysTracker[featureName] = new _Set();
29
+ const tracker = this.uniqueKeysTracker[featureName];
30
+ if (!tracker.has(key)) {
31
+ tracker.add(key);
32
+ this.uniqueTrackerSize++;
33
+ }
34
+ if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
35
+ this.uniqueTrackerSize = 0;
36
+ this.onFullQueue();
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Clear the data stored on the cache.
42
+ */
43
+ clear() {
44
+ this.uniqueKeysTracker = {};
45
+ }
46
+
47
+ /**
48
+ * Pop the collected data, used as payload for posting.
49
+ */
50
+ pop() {
51
+ const data = this.uniqueKeysTracker;
52
+ this.uniqueKeysTracker = {};
53
+ return this.fromUniqueKeysCollector(data);
54
+ }
55
+
56
+ /**
57
+ * Check if the cache is empty.
58
+ */
59
+ isEmpty() {
60
+ return Object.keys(this.uniqueKeysTracker).length === 0;
61
+ }
62
+
63
+ /**
64
+ * Converts `uniqueKeys` data from cache into request payload for SS.
65
+ */
66
+ private fromUniqueKeysCollector(uniqueKeys: { [featureName: string]: ISet<string> }): UniqueKeysPayloadSs {
67
+ const payload = [];
68
+ const featureNames = Object.keys(uniqueKeys);
69
+ for (let i = 0; i < featureNames.length; i++) {
70
+ const featureName = featureNames[i];
71
+ const featureKeys = setToArray(uniqueKeys[featureName]);
72
+ const uniqueKeysPayload = {
73
+ f: featureName,
74
+ ks: featureKeys
75
+ };
76
+
77
+ payload.push(uniqueKeysPayload);
78
+ }
79
+ return { keys: payload };
80
+ }
81
+
82
+ }