@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
@@ -0,0 +1,88 @@
1
+ import { IUniqueKeysCacheBase } from '../types';
2
+ import { ISet, setToArray, _Set } from '../../utils/lang/sets';
3
+ import { UniqueKeysPayloadCs } from '../../sync/submitters/types';
4
+ import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
5
+
6
+ export class UniqueKeysCacheInMemoryCS implements IUniqueKeysCacheBase {
7
+
8
+ private onFullQueue?: () => void;
9
+ private readonly maxStorage: number;
10
+ private uniqueTrackerSize = 0;
11
+ private uniqueKeysTracker: { [keys: string]: ISet<string> };
12
+
13
+ /**
14
+ *
15
+ * @param impressionsQueueSize number of queued impressions to call onFullQueueCb.
16
+ * Default value is 0, that means no maximum value, in case we want to avoid this being triggered.
17
+ */
18
+ constructor(uniqueKeysQueueSize: number = DEFAULT_CACHE_SIZE) {
19
+ this.maxStorage = uniqueKeysQueueSize;
20
+ this.uniqueKeysTracker = {};
21
+ }
22
+
23
+ setOnFullQueueCb(cb: () => void) {
24
+ this.onFullQueue = cb;
25
+ }
26
+
27
+ /**
28
+ * Store unique keys in sequential order
29
+ * key: string = key.
30
+ * value: HashSet<string> = set of split names.
31
+ */
32
+ track(key: string, featureName: string) {
33
+
34
+ if (!this.uniqueKeysTracker[key]) this.uniqueKeysTracker[key] = new _Set();
35
+ const tracker = this.uniqueKeysTracker[key];
36
+ if (!tracker.has(featureName)) {
37
+ tracker.add(featureName);
38
+ this.uniqueTrackerSize++;
39
+ }
40
+ if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
41
+ this.uniqueTrackerSize = 0;
42
+ this.onFullQueue();
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Clear the data stored on the cache.
48
+ */
49
+ clear() {
50
+ this.uniqueKeysTracker = {};
51
+ }
52
+
53
+ /**
54
+ * Pop the collected data, used as payload for posting.
55
+ */
56
+ pop() {
57
+ const data = this.uniqueKeysTracker;
58
+ this.uniqueKeysTracker = {};
59
+ return this.fromUniqueKeysCollector(data);
60
+ }
61
+
62
+ /**
63
+ * Check if the cache is empty.
64
+ */
65
+ isEmpty() {
66
+ return Object.keys(this.uniqueKeysTracker).length === 0;
67
+ }
68
+
69
+ /**
70
+ * Converts `uniqueKeys` data from cache into request payload.
71
+ */
72
+ private fromUniqueKeysCollector(uniqueKeys: { [featureName: string]: ISet<string> }): UniqueKeysPayloadCs {
73
+ const payload = [];
74
+ const featureKeys = Object.keys(uniqueKeys);
75
+ for (let k = 0; k < featureKeys.length; k++) {
76
+ const featureKey = featureKeys[k];
77
+ const featureNames = setToArray(uniqueKeys[featureKey]);
78
+ const uniqueKeysPayload = {
79
+ k: featureKey,
80
+ fs: featureNames
81
+ };
82
+
83
+ payload.push(uniqueKeysPayload);
84
+ }
85
+ return { keys: payload };
86
+ }
87
+
88
+ }
@@ -1,8 +1,8 @@
1
1
  import { IEventsCacheAsync } from '../types';
2
2
  import { IMetadata } from '../../dtos/types';
3
3
  import { Redis } from 'ioredis';
4
- import { EventData } from '../../types';
5
- import { ILogger } from '../../types';
4
+ import { SplitIO } from '../../types';
5
+ import { ILogger } from '../../logger/types';
6
6
  import { LOG_PREFIX } from './constants';
7
7
  import { StoredEventWithMetadata } from '../../sync/submitters/types';
8
8
 
@@ -24,7 +24,7 @@ export class EventsCacheInRedis implements IEventsCacheAsync {
24
24
  * Add a new event object into the queue.
25
25
  * Unlike `impressions::track`, result promise is never rejected.
26
26
  */
27
- track(eventData: EventData): Promise<boolean> {
27
+ track(eventData: SplitIO.EventData): Promise<boolean> {
28
28
  return this.redis.rpush(
29
29
  this.key,
30
30
  this._toJSON(eventData)
@@ -40,7 +40,7 @@ export class EventsCacheInRedis implements IEventsCacheAsync {
40
40
  /**
41
41
  * Generates the JSON as we'll store it on Redis.
42
42
  */
43
- private _toJSON(eventData: EventData): string {
43
+ private _toJSON(eventData: SplitIO.EventData): string {
44
44
  return JSON.stringify({
45
45
  m: this.metadata,
46
46
  e: eventData
@@ -0,0 +1,48 @@
1
+ import { Redis } from 'ioredis';
2
+ import { ILogger } from '../../logger/types';
3
+ import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
4
+ import { LOG_PREFIX, REFRESH_RATE, TTL_REFRESH } from './constants';
5
+
6
+ export class ImpressionCountsCacheInRedis extends ImpressionCountsCacheInMemory {
7
+
8
+ private readonly log: ILogger;
9
+ private readonly key: string;
10
+ private readonly redis: Redis;
11
+ private handle: any;
12
+
13
+ constructor(log: ILogger, key: string, redis: Redis, impressionCountsCacheSize?: number) {
14
+ super(impressionCountsCacheSize);
15
+ this.log = log;
16
+ this.key = key;
17
+ this.redis = redis;
18
+ this.onFullQueue = () => { this.postImpressionCountsInRedis(); };
19
+ }
20
+
21
+ postImpressionCountsInRedis(){
22
+ const counts = this.pop();
23
+ const keys = Object.keys(counts);
24
+ const pipeline = this.redis.pipeline();
25
+ keys.forEach(key => {
26
+ pipeline.hincrby(this.key, key, counts[key]);
27
+ });
28
+ return pipeline.exec()
29
+ .then(data => {
30
+ // If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
31
+ if (data.length && data.length === keys.length) {
32
+ return this.redis.expire(this.key, TTL_REFRESH);
33
+ }
34
+ })
35
+ .catch(err => {
36
+ this.log.error(`${LOG_PREFIX}Error in impression counts pipeline: ${err}.`);
37
+ return false;
38
+ });
39
+ }
40
+
41
+ start(refreshRate: number = REFRESH_RATE) {
42
+ this.handle = setInterval(this.postImpressionCountsInRedis.bind(this), refreshRate);
43
+ }
44
+
45
+ stop() {
46
+ clearInterval(this.handle);
47
+ }
48
+ }
@@ -3,7 +3,7 @@ import { IMetadata } from '../../dtos/types';
3
3
  import { ImpressionDTO } from '../../types';
4
4
  import { Redis } from 'ioredis';
5
5
  import { StoredImpressionWithMetadata } from '../../sync/submitters/types';
6
- import { ILogger } from '../../types';
6
+ import { ILogger } from '../../logger/types';
7
7
 
8
8
  const IMPRESSIONS_TTL_REFRESH = 3600; // 1 hr
9
9
 
@@ -1,5 +1,5 @@
1
1
  import ioredis from 'ioredis';
2
- import { ILogger } from '../../types';
2
+ import { ILogger } from '../../logger/types';
3
3
  import { merge, isString } from '../../utils/lang';
4
4
  import { _Set, setToArray, ISet } from '../../utils/lang/sets';
5
5
  import { thenable } from '../../utils/promise/thenable';
@@ -1,5 +1,5 @@
1
1
  import { Redis } from 'ioredis';
2
- import { ILogger } from '../../types';
2
+ import { ILogger } from '../../logger/types';
3
3
  import { isNaNNumber } from '../../utils/lang';
4
4
  import { LOG_PREFIX } from '../inLocalStorage/constants';
5
5
  import { KeyBuilderSS } from '../KeyBuilderSS';
@@ -1,7 +1,7 @@
1
1
  import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
2
2
  import { KeyBuilderSS } from '../KeyBuilderSS';
3
3
  import { Redis } from 'ioredis';
4
- import { ILogger } from '../../types';
4
+ import { ILogger } from '../../logger/types';
5
5
  import { LOG_PREFIX } from './constants';
6
6
  import { ISplit } from '../../dtos/types';
7
7
  import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
@@ -1,4 +1,4 @@
1
- import { ILogger } from '../../types';
1
+ import { ILogger } from '../../logger/types';
2
2
  import { Method } from '../../sync/submitters/types';
3
3
  import { KeyBuilderSS } from '../KeyBuilderSS';
4
4
  import { ITelemetryCacheAsync } from '../types';
@@ -1 +1,4 @@
1
1
  export const LOG_PREFIX = 'storage:redis: ';
2
+ export const DEFAULT_CACHE_SIZE = 30000;
3
+ export const REFRESH_RATE = 300000; // 300.000 ms = start after 5 mins
4
+ export const TTL_REFRESH = 3600; // 1hr
@@ -1,14 +1,15 @@
1
1
  import { RedisAdapter } from './RedisAdapter';
2
- import { IStorageAsync, IStorageFactoryParams } from '../types';
3
- import { StorageAsyncFactory } from '../../types';
2
+ import { IStorageAsync, IStorageAsyncFactory, IStorageFactoryParams } from '../types';
4
3
  import { validatePrefix } from '../KeyBuilder';
5
4
  import { KeyBuilderSS } from '../KeyBuilderSS';
6
5
  import { SplitsCacheInRedis } from './SplitsCacheInRedis';
7
6
  import { SegmentsCacheInRedis } from './SegmentsCacheInRedis';
8
7
  import { ImpressionsCacheInRedis } from './ImpressionsCacheInRedis';
9
8
  import { EventsCacheInRedis } from './EventsCacheInRedis';
10
- import { STORAGE_REDIS } from '../../utils/constants';
9
+ import { DEBUG, NONE, STORAGE_REDIS } from '../../utils/constants';
11
10
  import { TelemetryCacheInRedis } from './TelemetryCacheInRedis';
11
+ import { UniqueKeysCacheInRedis } from './uniqueKeysCacheInRedis';
12
+ import { ImpressionCountsCacheInRedis } from './ImpressionCountsCacheInRedis';
12
13
 
13
14
  export interface InRedisStorageOptions {
14
15
  prefix?: string
@@ -19,19 +20,22 @@ export interface InRedisStorageOptions {
19
20
  * InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.
20
21
  * @see {@link https://www.npmjs.com/package/ioredis}
21
22
  */
22
- export function InRedisStorage(options: InRedisStorageOptions = {}): StorageAsyncFactory {
23
+ export function InRedisStorage(options: InRedisStorageOptions = {}): IStorageAsyncFactory {
23
24
 
24
25
  const prefix = validatePrefix(options.prefix);
25
26
 
26
- function InRedisStorageFactory({ log, metadata, onReadyCb }: IStorageFactoryParams): IStorageAsync {
27
-
27
+ function InRedisStorageFactory({ log, metadata, onReadyCb, impressionsMode }: IStorageFactoryParams): IStorageAsync {
28
28
  const keys = new KeyBuilderSS(prefix, metadata);
29
29
  const redisClient = new RedisAdapter(log, options.options || {});
30
30
  const telemetry = new TelemetryCacheInRedis(log, keys, redisClient);
31
+ const impressionCountsCache = impressionsMode !== DEBUG ? new ImpressionCountsCacheInRedis(log, keys.buildImpressionsCountKey(), redisClient) : undefined;
32
+ const uniqueKeysCache = impressionsMode === NONE ? new UniqueKeysCacheInRedis(log, keys.buildUniqueKeysKey(), redisClient) : undefined;
31
33
 
32
34
  // subscription to Redis connect event in order to emit SDK_READY event on consumer mode
33
35
  redisClient.on('connect', () => {
34
36
  onReadyCb();
37
+ if (impressionCountsCache) impressionCountsCache.start();
38
+ if (uniqueKeysCache) uniqueKeysCache.start();
35
39
 
36
40
  // Synchronize config
37
41
  telemetry.recordConfig();
@@ -41,13 +45,17 @@ export function InRedisStorage(options: InRedisStorageOptions = {}): StorageAsyn
41
45
  splits: new SplitsCacheInRedis(log, keys, redisClient),
42
46
  segments: new SegmentsCacheInRedis(log, keys, redisClient),
43
47
  impressions: new ImpressionsCacheInRedis(log, keys.buildImpressionsKey(), redisClient, metadata),
48
+ impressionCounts: impressionCountsCache,
44
49
  events: new EventsCacheInRedis(log, keys.buildEventsKey(), redisClient, metadata),
45
50
  telemetry,
51
+ uniqueKeys: uniqueKeysCache,
46
52
 
47
53
  // When using REDIS we should:
48
54
  // 1- Disconnect from the storage
49
55
  destroy() {
50
56
  redisClient.disconnect();
57
+ if (impressionCountsCache) impressionCountsCache.stop();
58
+ if (uniqueKeysCache) uniqueKeysCache.stop();
51
59
  // @TODO check that caches works as expected when redisClient is disconnected
52
60
  }
53
61
  };
@@ -0,0 +1,61 @@
1
+ import { IUniqueKeysCacheBase } from '../types';
2
+ import { Redis } from 'ioredis';
3
+ import { UniqueKeysCacheInMemory } from '../inMemory/uniqueKeysCacheInMemory';
4
+ import { setToArray } from '../../utils/lang/sets';
5
+ import { DEFAULT_CACHE_SIZE, REFRESH_RATE, TTL_REFRESH } from './constants';
6
+ import { LOG_PREFIX } from './constants';
7
+ import { ILogger } from '../../logger/types';
8
+
9
+ export class UniqueKeysCacheInRedis extends UniqueKeysCacheInMemory implements IUniqueKeysCacheBase {
10
+
11
+ private readonly log: ILogger;
12
+ private readonly key: string;
13
+ private readonly redis: Redis;
14
+ private handle: any;
15
+
16
+ constructor(log: ILogger, key: string, redis: Redis, uniqueKeysQueueSize: number = DEFAULT_CACHE_SIZE) {
17
+ super(uniqueKeysQueueSize);
18
+ this.log = log;
19
+ this.key = key;
20
+ this.redis = redis;
21
+ this.onFullQueue = () => {this.postUniqueKeysInRedis();};
22
+ }
23
+
24
+ postUniqueKeysInRedis() {
25
+ const pipeline = this.redis.pipeline();
26
+
27
+ const featureNames = Object.keys(this.uniqueKeysTracker);
28
+ for (let i = 0; i < featureNames.length; i++) {
29
+ const featureName = featureNames[i];
30
+ const featureKeys = setToArray(this.uniqueKeysTracker[featureName]);
31
+ const uniqueKeysPayload = {
32
+ f: featureName,
33
+ ks: featureKeys
34
+ };
35
+
36
+ pipeline.rpush(this.key, JSON.stringify(uniqueKeysPayload));
37
+ }
38
+ this.clear();
39
+ return pipeline.exec()
40
+ .then(data => {
41
+ // If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
42
+ if (data.length && data.length === featureNames.length) {
43
+ return this.redis.expire(this.key, TTL_REFRESH);
44
+ }
45
+ })
46
+ .catch(err => {
47
+ this.log.error(`${LOG_PREFIX}Error in uniqueKeys pipeline: ${err}.`);
48
+ return false;
49
+ });
50
+ }
51
+
52
+
53
+ start(refreshRate: number = REFRESH_RATE) {
54
+ this.handle = setInterval(this.postUniqueKeysInRedis.bind(this), refreshRate);
55
+ }
56
+
57
+ stop() {
58
+ clearInterval(this.handle);
59
+ }
60
+
61
+ }
@@ -1,7 +1,7 @@
1
1
  import { IPluggableStorageWrapper, IEventsCacheAsync } from '../types';
2
2
  import { IMetadata } from '../../dtos/types';
3
- import { EventData } from '../../types';
4
- import { ILogger } from '../../types';
3
+ import { SplitIO } from '../../types';
4
+ import { ILogger } from '../../logger/types';
5
5
  import { LOG_PREFIX } from './constants';
6
6
  import { StoredEventWithMetadata } from '../../sync/submitters/types';
7
7
 
@@ -25,7 +25,7 @@ export class EventsCachePluggable implements IEventsCacheAsync {
25
25
  * @returns A promise that is resolved with a boolean value indicating if the push operation succeeded or failed.
26
26
  * Unlike `impressions::track`, The promise will never be rejected.
27
27
  */
28
- track(eventData: EventData): Promise<boolean> {
28
+ track(eventData: SplitIO.EventData): Promise<boolean> {
29
29
  return this.wrapper.pushItems(
30
30
  this.key,
31
31
  [this._toJSON(eventData)]
@@ -38,7 +38,7 @@ export class EventsCachePluggable implements IEventsCacheAsync {
38
38
  });
39
39
  }
40
40
 
41
- private _toJSON(eventData: EventData): string {
41
+ private _toJSON(eventData: SplitIO.EventData): string {
42
42
  return JSON.stringify({
43
43
  m: this.metadata,
44
44
  e: eventData
@@ -1,7 +1,7 @@
1
1
  import { IPluggableStorageWrapper, IImpressionsCacheAsync } from '../types';
2
2
  import { IMetadata } from '../../dtos/types';
3
3
  import { ImpressionDTO } from '../../types';
4
- import { ILogger } from '../../types';
4
+ import { ILogger } from '../../logger/types';
5
5
  import { StoredImpressionWithMetadata } from '../../sync/submitters/types';
6
6
 
7
7
  export class ImpressionsCachePluggable implements IImpressionsCacheAsync {
@@ -3,7 +3,7 @@
3
3
  import { isNaNNumber } from '../../utils/lang';
4
4
  import { KeyBuilderSS } from '../KeyBuilderSS';
5
5
  import { IPluggableStorageWrapper, ISegmentsCacheAsync } from '../types';
6
- import { ILogger } from '../../types';
6
+ import { ILogger } from '../../logger/types';
7
7
  import { LOG_PREFIX } from './constants';
8
8
  import { _Set } from '../../utils/lang/sets';
9
9
 
@@ -1,7 +1,7 @@
1
1
  import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
2
2
  import { KeyBuilder } from '../KeyBuilder';
3
3
  import { IPluggableStorageWrapper } from '../types';
4
- import { ILogger } from '../../types';
4
+ import { ILogger } from '../../logger/types';
5
5
  import { ISplit } from '../../dtos/types';
6
6
  import { LOG_PREFIX } from './constants';
7
7
  import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
@@ -1,4 +1,4 @@
1
- import { ILogger } from '../../types';
1
+ import { ILogger } from '../../logger/types';
2
2
  import { Method } from '../../sync/submitters/types';
3
3
  import { KeyBuilderSS } from '../KeyBuilderSS';
4
4
  import { IPluggableStorageWrapper, ITelemetryCacheAsync } from '../types';
@@ -1,5 +1,5 @@
1
- import { IPluggableStorageWrapper, IStorageAsync, IStorageFactoryParams } from '../types';
2
- import { StorageAsyncFactory } from '../../types';
1
+ import { IPluggableStorageWrapper, IStorageAsync, IStorageAsyncFactory, IStorageFactoryParams } from '../types';
2
+
3
3
  import { KeyBuilderSS } from '../KeyBuilderSS';
4
4
  import { SplitsCachePluggable } from './SplitsCachePluggable';
5
5
  import { SegmentsCachePluggable } from './SegmentsCachePluggable';
@@ -58,7 +58,7 @@ function promisifyEventsTrack(events: any) {
58
58
  /**
59
59
  * Pluggable storage factory for consumer server-side & client-side SplitFactory.
60
60
  */
61
- export function PluggableStorage(options: PluggableStorageOptions): StorageAsyncFactory {
61
+ export function PluggableStorage(options: PluggableStorageOptions): IStorageAsyncFactory {
62
62
 
63
63
  validatePluggableStorageOptions(options);
64
64
 
@@ -1,4 +1,4 @@
1
- import { ILogger } from '../../types';
1
+ import { ILogger } from '../../logger/types';
2
2
  import { IPluggableStorageWrapper } from '../types';
3
3
  import { LOG_PREFIX } from './constants';
4
4
 
@@ -1,6 +1,7 @@
1
- import { MaybeThenable, IMetadata } from '../dtos/types';
2
- import { EventDataType, HttpErrors, HttpLatencies, ImpressionDataType, LastSync, Method, MethodExceptions, MethodLatencies, OperationType, StoredEventWithMetadata, StoredImpressionWithMetadata, StreamingEvent } from '../sync/submitters/types';
3
- import { ImpressionDTO, SDKMode, ILogger, EventData, ISplitFiltersValidation } from '../types';
1
+ import { MaybeThenable, IMetadata, ISplitFiltersValidation } from '../dtos/types';
2
+ import { ILogger } from '../logger/types';
3
+ import { EventDataType, HttpErrors, HttpLatencies, ImpressionDataType, LastSync, Method, MethodExceptions, MethodLatencies, OperationType, StoredEventWithMetadata, StoredImpressionWithMetadata, StreamingEvent, UniqueKeysPayloadCs, UniqueKeysPayloadSs } from '../sync/submitters/types';
4
+ import { SplitIO, ImpressionDTO, SDKMode } from '../types';
4
5
 
5
6
  /**
6
7
  * Interface of a pluggable storage wrapper.
@@ -288,7 +289,7 @@ export interface IImpressionsCacheBase {
288
289
 
289
290
  export interface IEventsCacheBase {
290
291
  // Consumer API method, used by events tracker, in standalone and consumer modes, to push events into the storage.
291
- track(data: EventData, size?: number): MaybeThenable<boolean>
292
+ track(data: SplitIO.EventData, size?: number): MaybeThenable<boolean>
292
293
  }
293
294
 
294
295
  /** Impressions and events cache for standalone mode (sync) */
@@ -311,8 +312,8 @@ export interface IImpressionsCacheSync extends IImpressionsCacheBase, IRecorderC
311
312
  setOnFullQueueCb(cb: () => void): void
312
313
  }
313
314
 
314
- export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<EventData[]> {
315
- track(data: EventData, size?: number): boolean
315
+ export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<SplitIO.EventData[]> {
316
+ track(data: SplitIO.EventData, size?: number): boolean
316
317
  /* Registers callback for full queue */
317
318
  setOnFullQueueCb(cb: () => void): void
318
319
  }
@@ -338,7 +339,7 @@ export interface IImpressionsCacheAsync extends IImpressionsCacheBase, IRecorder
338
339
  export interface IEventsCacheAsync extends IEventsCacheBase, IRecorderCacheProducerAsync<StoredEventWithMetadata[]> {
339
340
  // Consumer API method, used by events tracker (in standalone and consumer modes) to push data into.
340
341
  // The result promise cannot reject.
341
- track(data: EventData, size?: number): Promise<boolean>
342
+ track(data: SplitIO.EventData, size?: number): Promise<boolean>
342
343
  }
343
344
 
344
345
  /**
@@ -346,14 +347,25 @@ export interface IEventsCacheAsync extends IEventsCacheBase, IRecorderCacheProdu
346
347
  * Only in memory. Named `ImpressionsCounter` in spec.
347
348
  */
348
349
  export interface IImpressionCountsCacheSync extends IRecorderCacheProducerSync<Record<string, number>> {
349
- // Used by impressions tracker
350
+ // Used by impressions tracker
350
351
  track(featureName: string, timeFrame: number, amount: number): void
351
352
 
352
353
  // Used by impressions count submitter in standalone and producer mode
353
354
  isEmpty(): boolean // check if cache is empty. Return true if the cache was just created or cleared.
354
- pop(toMerge?: Record<string, number>): Record<string, number> // pop cache data
355
+ pop(toMerge?: Record<string, number> ): Record<string, number> // pop cache data
355
356
  }
356
357
 
358
+ export interface IUniqueKeysCacheBase {
359
+ // Used by unique Keys tracker
360
+ track(key: string, value: string): void
361
+
362
+ // Used by unique keys submitter in standalone and producer mode
363
+ isEmpty(): boolean // check if cache is empty. Return true if the cache was just created or cleared.
364
+ pop(): UniqueKeysPayloadSs | UniqueKeysPayloadCs // pop cache data
365
+ /* Registers callback for full queue */
366
+ setOnFullQueueCb(cb: () => void): void,
367
+ clear(): void
368
+ }
357
369
 
358
370
  /**
359
371
  * Telemetry storage interface for standalone and partial consumer modes.
@@ -443,15 +455,18 @@ export interface IStorageBase<
443
455
  TSplitsCache extends ISplitsCacheBase,
444
456
  TSegmentsCache extends ISegmentsCacheBase,
445
457
  TImpressionsCache extends IImpressionsCacheBase,
458
+ TImpressionsCountCache extends IImpressionCountsCacheSync,
446
459
  TEventsCache extends IEventsCacheBase,
447
- TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync
460
+ TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync,
461
+ TUniqueKeysCache extends IUniqueKeysCacheBase
448
462
  > {
449
463
  splits: TSplitsCache,
450
464
  segments: TSegmentsCache,
451
465
  impressions: TImpressionsCache,
452
- impressionCounts?: IImpressionCountsCacheSync,
466
+ impressionCounts?: TImpressionsCountCache,
453
467
  events: TEventsCache,
454
- telemetry?: TTelemetryCache
468
+ telemetry?: TTelemetryCache,
469
+ uniqueKeys?: TUniqueKeysCache,
455
470
  destroy(): void | Promise<void>,
456
471
  shared?: (matchingKey: string, onReadyCb: (error?: any) => void) => this
457
472
  }
@@ -460,16 +475,20 @@ export interface IStorageSync extends IStorageBase<
460
475
  ISplitsCacheSync,
461
476
  ISegmentsCacheSync,
462
477
  IImpressionsCacheSync,
478
+ IImpressionCountsCacheSync,
463
479
  IEventsCacheSync,
464
- ITelemetryCacheSync
480
+ ITelemetryCacheSync,
481
+ IUniqueKeysCacheBase
465
482
  > { }
466
483
 
467
484
  export interface IStorageAsync extends IStorageBase<
468
485
  ISplitsCacheAsync,
469
486
  ISegmentsCacheAsync,
470
487
  IImpressionsCacheAsync | IImpressionsCacheSync,
488
+ IImpressionCountsCacheSync,
471
489
  IEventsCacheAsync | IEventsCacheSync,
472
- ITelemetryCacheAsync
490
+ ITelemetryCacheAsync,
491
+ IUniqueKeysCacheBase
473
492
  > { }
474
493
 
475
494
  /** StorageFactory */
@@ -479,10 +498,11 @@ export type DataLoader = (storage: IStorageSync, matchingKey: string) => void
479
498
  export interface IStorageFactoryParams {
480
499
  log: ILogger,
481
500
  impressionsQueueSize?: number,
501
+ uniqueKeysCacheSize?: number;
482
502
  eventsQueueSize?: number,
483
503
  optimize?: boolean /* whether create the `impressionCounts` cache (OPTIMIZED impression mode) or not (DEBUG impression mode) */,
484
504
  mode: SDKMode,
485
-
505
+ impressionsMode?: string,
486
506
  // ATM, only used by InLocalStorage
487
507
  matchingKey?: string, /* undefined on server-side SDKs */
488
508
  splitFiltersValidation?: ISplitFiltersValidation,
@@ -494,39 +514,14 @@ export interface IStorageFactoryParams {
494
514
  metadata: IMetadata,
495
515
  }
496
516
 
497
- /**
498
- * Defines the format of Split data to preload on the factory storage (cache).
499
- */
500
- export interface PreloadedData {
501
- /**
502
- * Timestamp of the last moment the data was synchronized with Split servers.
503
- * If this value is older than 10 days ago (expiration time policy), the data is not used to update the storage content.
504
- * @TODO configurable expiration time policy?
505
- */
506
- lastUpdated: number,
507
- /**
508
- * Change number of the preloaded data.
509
- * If this value is older than the current changeNumber at the storage, the data is not used to update the storage content.
510
- */
511
- since: number,
512
- /**
513
- * Map of splits to their serialized definitions.
514
- */
515
- splitsData: {
516
- [splitName: string]: string
517
- },
518
- /**
519
- * Optional map of user keys to their list of segments.
520
- * @TODO remove when releasing first version
521
- */
522
- mySegmentsData?: {
523
- [key: string]: string[]
524
- },
525
- /**
526
- * Optional map of segments to their serialized definitions.
527
- * This property is ignored if `mySegmentsData` was provided.
528
- */
529
- segmentsData?: {
530
- [segmentName: string]: string
531
- },
517
+ export type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
518
+
519
+ export type IStorageSyncFactory = {
520
+ readonly type: StorageType,
521
+ (params: IStorageFactoryParams): IStorageSync
522
+ }
523
+
524
+ export type IStorageAsyncFactory = {
525
+ type: StorageType,
526
+ (params: IStorageFactoryParams): IStorageAsync
532
527
  }
@@ -1,12 +1,12 @@
1
1
  import { splitsParserFromSettingsFactory } from './splitsParser/splitsParserFromSettings';
2
2
  import { syncManagerOfflineFactory } from './syncManagerOffline';
3
- import { LocalhostFactory } from '../../types';
3
+ import { SplitIO } from '../../types';
4
4
 
5
5
  // Singleton instance of the factory function for offline SyncManager from object (a.k.a. localhostFromObject)
6
6
  // SDK instances instantiate their SyncManagers with the same factory
7
- const localhostFromObject: any = syncManagerOfflineFactory(splitsParserFromSettingsFactory);
7
+ const localhostFromObject = syncManagerOfflineFactory(splitsParserFromSettingsFactory) as SplitIO.LocalhostFactory;
8
8
  localhostFromObject.type = 'LocalhostFromObject';
9
9
 
10
- export function LocalhostFromObject() {
11
- return localhostFromObject as LocalhostFactory;
10
+ export function LocalhostFromObject(): SplitIO.LocalhostFactory {
11
+ return localhostFromObject;
12
12
  }