@splitsoftware/splitio-commons 2.12.0 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/CHANGES.txt +19 -1
  2. package/cjs/evaluator/condition/engineUtils.js +2 -2
  3. package/cjs/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.js +70 -0
  4. package/cjs/evaluator/fallbackConfigsCalculator/index.js +25 -0
  5. package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  6. package/cjs/evaluator/fallbackTreatmentsCalculator/index.js +21 -32
  7. package/cjs/evaluator/index.js +73 -48
  8. package/cjs/evaluator/matchers/whitelist.js +1 -1
  9. package/cjs/integrations/pluggable.js +1 -1
  10. package/cjs/listeners/browser.js +4 -3
  11. package/cjs/listeners/node.js +4 -4
  12. package/cjs/logger/constants.js +15 -21
  13. package/cjs/logger/index.js +1 -1
  14. package/cjs/logger/messages/debug.js +6 -7
  15. package/cjs/logger/messages/error.js +4 -4
  16. package/cjs/logger/messages/info.js +2 -4
  17. package/cjs/logger/messages/warn.js +9 -10
  18. package/cjs/platform/browser.js +15 -0
  19. package/cjs/platform/getEventSource/browser.js +8 -0
  20. package/cjs/platform/getEventSource/eventsource.js +480 -0
  21. package/cjs/platform/getEventSource/node.js +26 -0
  22. package/cjs/platform/getFetch/browser.js +9 -0
  23. package/cjs/platform/getFetch/node.js +27 -0
  24. package/cjs/platform/getOptions/node.js +25 -0
  25. package/cjs/platform/node.js +17 -0
  26. package/cjs/readiness/constants.js +5 -4
  27. package/cjs/readiness/readinessManager.js +22 -22
  28. package/cjs/readiness/sdkReadinessManager.js +0 -16
  29. package/cjs/sdkClient/client.js +9 -35
  30. package/cjs/sdkClient/clientAttributesDecoration.js +3 -3
  31. package/cjs/sdkClient/clientInputValidation.js +38 -81
  32. package/cjs/sdkClient/identity.js +1 -1
  33. package/cjs/sdkClient/sdkClient.js +4 -49
  34. package/cjs/sdkClient/sdkLifecycle.js +71 -0
  35. package/cjs/sdkClient/trackMethod.js +56 -0
  36. package/cjs/sdkFactory/index.js +13 -50
  37. package/cjs/sdkManager/index.js +5 -5
  38. package/cjs/services/authProvider.js +67 -0
  39. package/cjs/services/secureSplitHttpClient.js +39 -0
  40. package/cjs/services/splitApi.js +24 -14
  41. package/cjs/services/splitHttpClient.js +1 -1
  42. package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
  43. package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
  44. package/cjs/storages/KeyBuilder.js +16 -16
  45. package/cjs/storages/KeyBuilderCS.js +17 -17
  46. package/cjs/storages/KeyBuilderSS.js +16 -16
  47. package/cjs/storages/getRolloutPlan.js +4 -4
  48. package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +194 -0
  49. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -1
  50. package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
  51. package/cjs/storages/inLocalStorage/index.js +6 -6
  52. package/cjs/storages/inLocalStorage/validateCache.js +3 -3
  53. package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +121 -0
  54. package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
  55. package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
  56. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
  57. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
  58. package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
  59. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  60. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  61. package/cjs/storages/inRedis/DefinitionsCacheInRedis.js +243 -0
  62. package/cjs/storages/inRedis/EventsCacheInRedis.js +1 -1
  63. package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +5 -5
  64. package/cjs/storages/inRedis/ImpressionsCacheInRedis.js +1 -1
  65. package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  66. package/cjs/storages/inRedis/RedisAdapter.js +8 -8
  67. package/cjs/storages/inRedis/TelemetryCacheInRedis.js +7 -7
  68. package/cjs/storages/inRedis/UniqueKeysCacheInRedis.js +3 -3
  69. package/cjs/storages/inRedis/index.js +2 -2
  70. package/cjs/storages/pluggable/DefinitionsCachePluggable.js +212 -0
  71. package/cjs/storages/pluggable/EventsCachePluggable.js +1 -1
  72. package/cjs/storages/pluggable/ImpressionCountsCachePluggable.js +6 -6
  73. package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  74. package/cjs/storages/pluggable/TelemetryCachePluggable.js +7 -7
  75. package/cjs/storages/pluggable/UniqueKeysCachePluggable.js +2 -2
  76. package/cjs/storages/pluggable/index.js +5 -5
  77. package/cjs/storages/pluggable/wrapperAdapter.js +1 -1
  78. package/cjs/storages/setRolloutPlan.js +6 -6
  79. package/cjs/storages/utils.js +6 -6
  80. package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
  81. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
  82. package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
  83. package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
  84. package/cjs/sync/polling/pollingManagerCS.js +18 -18
  85. package/cjs/sync/polling/pollingManagerSS.js +13 -13
  86. package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +12 -0
  87. package/cjs/sync/polling/updaters/{splitChangesUpdater.js → definitionChangesUpdater.js} +72 -64
  88. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  89. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
  90. package/cjs/sync/streaming/SSEClient/index.js +2 -2
  91. package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
  92. package/cjs/sync/streaming/SSEHandler/index.js +1 -1
  93. package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +18 -18
  94. package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +2 -2
  95. package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -2
  96. package/cjs/sync/streaming/constants.js +3 -3
  97. package/cjs/sync/streaming/parseUtils.js +12 -12
  98. package/cjs/sync/streaming/pushManager.js +14 -14
  99. package/cjs/sync/submitters/impressionsSubmitter.js +6 -6
  100. package/cjs/sync/submitters/submitter.js +1 -1
  101. package/cjs/sync/submitters/telemetrySubmitter.js +1 -2
  102. package/cjs/sync/syncManagerOnline.js +9 -6
  103. package/cjs/trackers/eventTracker.js +10 -12
  104. package/cjs/trackers/impressionObserver/buildKey.js +1 -1
  105. package/cjs/trackers/impressionsTracker.js +37 -20
  106. package/cjs/trackers/uniqueKeysTracker.js +1 -1
  107. package/cjs/utils/Backoff.js +20 -0
  108. package/cjs/utils/EventEmitter.js +391 -0
  109. package/cjs/utils/filter/bloomFilter.js +37 -0
  110. package/cjs/utils/inputValidation/apiKey.js +1 -1
  111. package/cjs/utils/inputValidation/attribute.js +2 -2
  112. package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
  113. package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
  114. package/cjs/utils/inputValidation/definitions.js +25 -0
  115. package/cjs/utils/inputValidation/eventProperties.js +1 -1
  116. package/cjs/utils/inputValidation/index.js +7 -7
  117. package/cjs/utils/inputValidation/isOperational.js +4 -4
  118. package/cjs/utils/inputValidation/target.js +22 -0
  119. package/cjs/utils/labels/index.js +3 -3
  120. package/cjs/utils/lang/index.js +1 -1
  121. package/cjs/utils/lang/sets.js +4 -4
  122. package/cjs/utils/promise/timeout.js +1 -1
  123. package/cjs/utils/settingsValidation/splitFilters.js +4 -4
  124. package/cjs/utils/settingsValidation/url.js +6 -6
  125. package/esm/evaluator/condition/engineUtils.js +2 -2
  126. package/esm/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.js +64 -0
  127. package/esm/evaluator/fallbackConfigsCalculator/index.js +21 -0
  128. package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  129. package/esm/evaluator/fallbackTreatmentsCalculator/index.js +21 -33
  130. package/esm/evaluator/index.js +72 -48
  131. package/esm/evaluator/matchers/whitelist.js +1 -1
  132. package/esm/integrations/pluggable.js +1 -1
  133. package/esm/listeners/browser.js +4 -3
  134. package/esm/listeners/node.js +4 -4
  135. package/esm/logger/constants.js +12 -18
  136. package/esm/logger/index.js +1 -1
  137. package/esm/logger/messages/debug.js +5 -6
  138. package/esm/logger/messages/error.js +3 -3
  139. package/esm/logger/messages/info.js +1 -3
  140. package/esm/logger/messages/warn.js +8 -9
  141. package/esm/platform/browser.js +12 -0
  142. package/esm/platform/getEventSource/browser.js +4 -0
  143. package/esm/platform/getEventSource/eventsource.js +480 -0
  144. package/esm/platform/getEventSource/node.js +20 -0
  145. package/esm/platform/getFetch/browser.js +5 -0
  146. package/esm/platform/getFetch/node.js +22 -0
  147. package/esm/platform/getOptions/node.js +20 -0
  148. package/esm/platform/node.js +14 -0
  149. package/esm/readiness/constants.js +4 -3
  150. package/esm/readiness/readinessManager.js +23 -23
  151. package/esm/readiness/sdkReadinessManager.js +1 -17
  152. package/esm/sdkClient/client.js +10 -37
  153. package/esm/sdkClient/clientAttributesDecoration.js +3 -3
  154. package/esm/sdkClient/clientInputValidation.js +40 -83
  155. package/esm/sdkClient/identity.js +1 -1
  156. package/esm/sdkClient/sdkClient.js +4 -49
  157. package/esm/sdkClient/sdkLifecycle.js +67 -0
  158. package/esm/sdkClient/trackMethod.js +52 -0
  159. package/esm/sdkFactory/index.js +14 -51
  160. package/esm/sdkManager/index.js +6 -6
  161. package/esm/services/authProvider.js +63 -0
  162. package/esm/services/secureSplitHttpClient.js +35 -0
  163. package/esm/services/splitApi.js +24 -14
  164. package/esm/services/splitHttpClient.js +1 -1
  165. package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
  166. package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
  167. package/esm/storages/KeyBuilder.js +16 -16
  168. package/esm/storages/KeyBuilderCS.js +16 -16
  169. package/esm/storages/KeyBuilderSS.js +15 -15
  170. package/esm/storages/getRolloutPlan.js +4 -4
  171. package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +191 -0
  172. package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
  173. package/esm/storages/inLocalStorage/index.js +6 -6
  174. package/esm/storages/inLocalStorage/validateCache.js +3 -3
  175. package/esm/storages/inMemory/DefinitionsCacheInMemory.js +118 -0
  176. package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
  177. package/esm/storages/inMemory/InMemoryStorage.js +4 -4
  178. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
  179. package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
  180. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  181. package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  182. package/esm/storages/inRedis/DefinitionsCacheInRedis.js +240 -0
  183. package/esm/storages/inRedis/EventsCacheInRedis.js +1 -1
  184. package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +4 -4
  185. package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
  186. package/esm/storages/inRedis/RedisAdapter.js +7 -7
  187. package/esm/storages/inRedis/TelemetryCacheInRedis.js +7 -7
  188. package/esm/storages/inRedis/UniqueKeysCacheInRedis.js +1 -1
  189. package/esm/storages/inRedis/index.js +2 -2
  190. package/esm/storages/pluggable/DefinitionsCachePluggable.js +209 -0
  191. package/esm/storages/pluggable/EventsCachePluggable.js +1 -1
  192. package/esm/storages/pluggable/ImpressionCountsCachePluggable.js +5 -5
  193. package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
  194. package/esm/storages/pluggable/TelemetryCachePluggable.js +7 -7
  195. package/esm/storages/pluggable/UniqueKeysCachePluggable.js +1 -1
  196. package/esm/storages/pluggable/index.js +4 -4
  197. package/esm/storages/pluggable/wrapperAdapter.js +1 -1
  198. package/esm/storages/setRolloutPlan.js +6 -6
  199. package/esm/storages/utils.js +6 -6
  200. package/esm/sync/offline/splitsParser/parseCondition.js +1 -1
  201. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
  202. package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
  203. package/esm/sync/polling/pollingManagerCS.js +15 -15
  204. package/esm/sync/polling/pollingManagerSS.js +13 -13
  205. package/esm/sync/polling/syncTasks/definitionsSyncTask.js +8 -0
  206. package/esm/sync/polling/updaters/definitionChangesUpdater.js +200 -0
  207. package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  208. package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
  209. package/esm/sync/streaming/SSEClient/index.js +2 -2
  210. package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
  211. package/esm/sync/streaming/SSEHandler/index.js +2 -2
  212. package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +17 -17
  213. package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +2 -2
  214. package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -2
  215. package/esm/sync/streaming/constants.js +2 -2
  216. package/esm/sync/streaming/parseUtils.js +10 -10
  217. package/esm/sync/streaming/pushManager.js +16 -16
  218. package/esm/sync/submitters/impressionsSubmitter.js +6 -6
  219. package/esm/sync/submitters/submitter.js +1 -1
  220. package/esm/sync/submitters/telemetrySubmitter.js +1 -2
  221. package/esm/sync/syncManagerOnline.js +8 -5
  222. package/esm/trackers/eventTracker.js +10 -12
  223. package/esm/trackers/impressionObserver/buildKey.js +1 -1
  224. package/esm/trackers/impressionsTracker.js +38 -21
  225. package/esm/trackers/uniqueKeysTracker.js +1 -1
  226. package/esm/utils/Backoff.js +20 -0
  227. package/esm/utils/EventEmitter.js +387 -0
  228. package/esm/utils/filter/bloomFilter.js +33 -0
  229. package/esm/utils/inputValidation/apiKey.js +1 -1
  230. package/esm/utils/inputValidation/attribute.js +2 -2
  231. package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
  232. package/esm/utils/inputValidation/definitionExistence.js +15 -0
  233. package/esm/utils/inputValidation/definitions.js +21 -0
  234. package/esm/utils/inputValidation/index.js +3 -3
  235. package/esm/utils/inputValidation/isOperational.js +4 -4
  236. package/esm/utils/inputValidation/target.js +18 -0
  237. package/esm/utils/labels/index.js +2 -2
  238. package/esm/utils/lang/sets.js +4 -4
  239. package/esm/utils/promise/timeout.js +1 -1
  240. package/esm/utils/settingsValidation/splitFilters.js +4 -4
  241. package/esm/utils/settingsValidation/url.js +6 -6
  242. package/package.json +15 -6
  243. package/src/dtos/types.ts +65 -70
  244. package/src/evaluator/Engine.ts +4 -4
  245. package/src/evaluator/combiners/and.ts +3 -3
  246. package/src/evaluator/combiners/ifelseif.ts +2 -2
  247. package/src/evaluator/condition/engineUtils.ts +2 -2
  248. package/src/evaluator/condition/index.ts +3 -3
  249. package/src/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.ts +76 -0
  250. package/src/evaluator/fallbackConfigsCalculator/index.ts +24 -0
  251. package/src/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.ts +5 -7
  252. package/src/evaluator/fallbackTreatmentsCalculator/index.ts +27 -41
  253. package/src/evaluator/index.ts +86 -51
  254. package/src/evaluator/matchers/dependency.ts +2 -2
  255. package/src/evaluator/matchers/matcherTypes.ts +2 -2
  256. package/src/evaluator/matchers/prerequisites.ts +4 -4
  257. package/src/evaluator/matchers/rbsegment.ts +2 -2
  258. package/src/evaluator/matchers/whitelist.ts +2 -2
  259. package/src/evaluator/matchersTransform/index.ts +2 -2
  260. package/src/evaluator/matchersTransform/whitelist.ts +2 -2
  261. package/src/evaluator/parser/index.ts +4 -4
  262. package/src/evaluator/treatments/index.ts +2 -2
  263. package/src/evaluator/types.ts +6 -6
  264. package/src/evaluator/value/index.ts +1 -1
  265. package/src/integrations/pluggable.ts +1 -1
  266. package/src/listeners/browser.ts +11 -8
  267. package/src/listeners/node.ts +2 -5
  268. package/src/logger/constants.ts +12 -18
  269. package/src/logger/messages/debug.ts +5 -6
  270. package/src/logger/messages/error.ts +3 -3
  271. package/src/logger/messages/info.ts +1 -3
  272. package/src/logger/messages/warn.ts +8 -9
  273. package/src/platform/browser.ts +14 -0
  274. package/src/platform/getEventSource/browser.ts +4 -0
  275. package/src/platform/getEventSource/eventsource.js +519 -0
  276. package/src/platform/getEventSource/node.ts +23 -0
  277. package/src/platform/getFetch/browser.ts +5 -0
  278. package/src/platform/getFetch/node.ts +27 -0
  279. package/src/platform/getOptions/node.ts +24 -0
  280. package/src/platform/node.ts +16 -0
  281. package/src/readiness/constants.ts +4 -3
  282. package/src/readiness/readinessManager.ts +22 -22
  283. package/src/readiness/sdkReadinessManager.ts +1 -16
  284. package/src/readiness/types.ts +10 -16
  285. package/src/sdkClient/client.ts +11 -41
  286. package/src/sdkClient/clientInputValidation.ts +44 -84
  287. package/src/sdkClient/sdkClient.ts +5 -54
  288. package/src/sdkClient/sdkLifecycle.ts +79 -0
  289. package/src/sdkClient/trackMethod.ts +59 -0
  290. package/src/sdkFactory/index.ts +15 -59
  291. package/src/sdkFactory/types.ts +19 -16
  292. package/src/sdkManager/index.ts +15 -15
  293. package/src/services/authProvider.ts +86 -0
  294. package/src/services/secureSplitHttpClient.ts +44 -0
  295. package/src/services/splitApi.ts +14 -2
  296. package/src/services/types.ts +7 -2
  297. package/src/storages/AbstractDefinitionsCacheAsync.ts +63 -0
  298. package/src/storages/AbstractDefinitionsCacheSync.ts +95 -0
  299. package/src/storages/KeyBuilder.ts +6 -6
  300. package/src/storages/KeyBuilderCS.ts +6 -6
  301. package/src/storages/KeyBuilderSS.ts +2 -2
  302. package/src/storages/getRolloutPlan.ts +3 -3
  303. package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +234 -0
  304. package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +8 -8
  305. package/src/storages/inLocalStorage/index.ts +6 -6
  306. package/src/storages/inLocalStorage/validateCache.ts +4 -4
  307. package/src/storages/inMemory/DefinitionsCacheInMemory.ts +130 -0
  308. package/src/storages/inMemory/InMemoryStorage.ts +4 -4
  309. package/src/storages/inMemory/InMemoryStorageCS.ts +5 -5
  310. package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +3 -3
  311. package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
  312. package/src/storages/inMemory/TelemetryCacheInMemory.ts +5 -5
  313. package/src/storages/inRedis/{SplitsCacheInRedis.ts → DefinitionsCacheInRedis.ts} +69 -69
  314. package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +2 -2
  315. package/src/storages/inRedis/index.ts +2 -2
  316. package/src/storages/pluggable/DefinitionsCachePluggable.ts +230 -0
  317. package/src/storages/pluggable/RBSegmentsCachePluggable.ts +2 -2
  318. package/src/storages/pluggable/index.ts +2 -2
  319. package/src/storages/setRolloutPlan.ts +7 -7
  320. package/src/storages/types.ts +34 -29
  321. package/src/sync/offline/splitsParser/parseCondition.ts +2 -2
  322. package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +3 -3
  323. package/src/sync/offline/splitsParser/types.ts +6 -3
  324. package/src/sync/offline/syncManagerOffline.ts +2 -2
  325. package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +14 -14
  326. package/src/sync/polling/fetchers/splitChangesFetcher.ts +58 -23
  327. package/src/sync/polling/fetchers/types.ts +5 -3
  328. package/src/sync/polling/pollingManagerCS.ts +16 -14
  329. package/src/sync/polling/pollingManagerSS.ts +15 -13
  330. package/src/sync/polling/syncTasks/{splitsSyncTask.ts → definitionsSyncTask.ts} +11 -12
  331. package/src/sync/polling/types.ts +3 -3
  332. package/src/sync/polling/updaters/definitionChangesUpdater.ts +239 -0
  333. package/src/sync/polling/updaters/mySegmentsUpdater.ts +3 -3
  334. package/src/sync/polling/updaters/segmentChangesUpdater.ts +7 -7
  335. package/src/sync/streaming/AuthClient/index.ts +2 -2
  336. package/src/sync/streaming/AuthClient/types.ts +14 -11
  337. package/src/sync/streaming/SSEClient/index.ts +2 -2
  338. package/src/sync/streaming/SSEClient/types.ts +2 -2
  339. package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +2 -2
  340. package/src/sync/streaming/SSEHandler/index.ts +2 -2
  341. package/src/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.ts → DefinitionsUpdateWorker.ts} +21 -21
  342. package/src/sync/streaming/constants.ts +2 -2
  343. package/src/sync/streaming/parseUtils.ts +12 -12
  344. package/src/sync/streaming/pushManager.ts +18 -18
  345. package/src/sync/streaming/types.ts +2 -2
  346. package/src/sync/submitters/impressionsSubmitter.ts +9 -9
  347. package/src/sync/submitters/telemetrySubmitter.ts +1 -2
  348. package/src/sync/submitters/types.ts +3 -0
  349. package/src/sync/syncManagerOnline.ts +9 -5
  350. package/src/trackers/eventTracker.ts +7 -10
  351. package/src/trackers/impressionsTracker.ts +42 -26
  352. package/src/trackers/types.ts +3 -1
  353. package/src/utils/Backoff.ts +21 -0
  354. package/src/utils/EventEmitter.js +444 -0
  355. package/src/utils/filter/bloomFilter.ts +38 -0
  356. package/src/utils/inputValidation/definition.ts +27 -0
  357. package/src/utils/inputValidation/definitionExistence.ts +19 -0
  358. package/src/utils/inputValidation/definitions.ts +21 -0
  359. package/src/utils/inputValidation/index.ts +3 -3
  360. package/src/utils/inputValidation/isOperational.ts +4 -4
  361. package/src/utils/inputValidation/target.ts +21 -0
  362. package/src/utils/inputValidation/trafficTypeExistence.ts +2 -2
  363. package/src/utils/jwt/types.ts +1 -1
  364. package/src/utils/labels/index.ts +2 -2
  365. package/src/utils/lang/sets.ts +4 -2
  366. package/src/utils/settingsValidation/splitFilters.ts +3 -3
  367. package/src/utils/settingsValidation/url.ts +1 -1
  368. package/types/splitio.d.ts +222 -11
  369. package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
  370. package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
  371. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
  372. package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
  373. package/cjs/storages/inRedis/SplitsCacheInRedis.js +0 -243
  374. package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
  375. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
  376. package/cjs/utils/inputValidation/splits.js +0 -25
  377. package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
  378. package/esm/storages/AbstractSplitsCacheSync.js +0 -71
  379. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
  380. package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
  381. package/esm/storages/inRedis/SplitsCacheInRedis.js +0 -240
  382. package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
  383. package/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
  384. package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -192
  385. package/esm/utils/inputValidation/splitExistence.js +0 -15
  386. package/esm/utils/inputValidation/splits.js +0 -21
  387. package/src/storages/AbstractSplitsCacheAsync.ts +0 -63
  388. package/src/storages/AbstractSplitsCacheSync.ts +0 -95
  389. package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +0 -234
  390. package/src/storages/inMemory/SplitsCacheInMemory.ts +0 -130
  391. package/src/storages/pluggable/SplitsCachePluggable.ts +0 -230
  392. package/src/sync/polling/updaters/splitChangesUpdater.ts +0 -230
  393. package/src/utils/inputValidation/split.ts +0 -27
  394. package/src/utils/inputValidation/splitExistence.ts +0 -19
  395. package/src/utils/inputValidation/splits.ts +0 -21
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFetch = exports.__setFetch = void 0;
4
+ var nodeFetch;
5
+ try {
6
+ nodeFetch = require('node-fetch');
7
+ // Handle node-fetch issue https://github.com/node-fetch/node-fetch/issues/1037
8
+ if (typeof nodeFetch !== 'function')
9
+ nodeFetch = nodeFetch.default;
10
+ }
11
+ catch (error) {
12
+ // Try to access global fetch if `node-fetch` package couldn't be imported (e.g., not in a Node environment)
13
+ // eslint-disable-next-line no-undef
14
+ nodeFetch = typeof fetch === 'function' ? fetch : undefined;
15
+ }
16
+ // This function is only exposed for testing purposes.
17
+ function __setFetch(fetch) {
18
+ nodeFetch = fetch;
19
+ }
20
+ exports.__setFetch = __setFetch;
21
+ /**
22
+ * Retrieves 'node-fetch', a Fetch API polyfill for Node.js, with fallback to global 'fetch' if available.
23
+ */
24
+ function getFetch() {
25
+ return nodeFetch;
26
+ }
27
+ exports.getFetch = getFetch;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOptions = void 0;
4
+ var tslib_1 = require("tslib");
5
+ // @TODO
6
+ // 1- handle multiple protocols automatically
7
+ // 2- destroy it once the sdk is destroyed
8
+ var https_1 = tslib_1.__importDefault(require("https"));
9
+ var lang_1 = require("../../utils/lang");
10
+ var agent = new https_1.default.Agent({
11
+ keepAlive: true,
12
+ keepAliveMsecs: 1500
13
+ });
14
+ function getOptions(settings) {
15
+ // User provided options take precedence
16
+ if (settings.sync.requestOptions)
17
+ return settings.sync.requestOptions;
18
+ // If some URL is not HTTPS, we don't use the agent, to let the SDK connect to HTTP endpoints
19
+ if ((0, lang_1.find)(settings.urls, function (url) { return !url.startsWith('https:'); }))
20
+ return;
21
+ return {
22
+ agent: agent
23
+ };
24
+ }
25
+ exports.getOptions = getOptions;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platform = void 0;
4
+ var events_1 = require("events");
5
+ var node_1 = require("../platform/getFetch/node");
6
+ var node_2 = require("../platform/getEventSource/node");
7
+ var node_3 = require("../platform/getOptions/node");
8
+ var node_4 = require("../listeners/node");
9
+ var node_5 = require("../utils/timeTracker/now/node");
10
+ exports.platform = {
11
+ getFetch: node_1.getFetch,
12
+ getEventSource: node_2.getEventSource,
13
+ getOptions: node_3.getOptions,
14
+ EventEmitter: events_1.EventEmitter,
15
+ now: node_5.now,
16
+ SignalListener: node_4.NodeSignalListener
17
+ };
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SEGMENTS_UPDATE = exports.FLAGS_UPDATE = exports.SDK_UPDATE = exports.SDK_READY_FROM_CACHE = exports.SDK_READY = exports.SDK_READY_TIMED_OUT = exports.SDK_SEGMENTS_ARRIVED = exports.SDK_SPLITS_CACHE_LOADED = exports.SDK_SPLITS_ARRIVED = void 0;
4
- // Splits events:
5
- exports.SDK_SPLITS_ARRIVED = 'state::splits-arrived';
6
- exports.SDK_SPLITS_CACHE_LOADED = 'state::splits-cache-loaded';
3
+ exports.CONFIGS_UPDATE = exports.SEGMENTS_UPDATE = exports.FLAGS_UPDATE = exports.SDK_UPDATE = exports.SDK_READY_FROM_CACHE = exports.SDK_READY = exports.SDK_READY_TIMED_OUT = exports.SDK_SEGMENTS_ARRIVED = exports.SDK_DEFINITIONS_CACHE_LOADED = exports.SDK_DEFINITIONS_ARRIVED = void 0;
4
+ // Definitions events:
5
+ exports.SDK_DEFINITIONS_ARRIVED = 'state::splits-arrived';
6
+ exports.SDK_DEFINITIONS_CACHE_LOADED = 'state::splits-cache-loaded';
7
7
  // Segments events:
8
8
  exports.SDK_SEGMENTS_ARRIVED = 'state::segments-arrived';
9
9
  // Readiness events:
@@ -14,3 +14,4 @@ exports.SDK_UPDATE = 'state::update';
14
14
  // SdkUpdateMetadata types:
15
15
  exports.FLAGS_UPDATE = 'FLAGS_UPDATE';
16
16
  exports.SEGMENTS_UPDATE = 'SEGMENTS_UPDATE';
17
+ exports.CONFIGS_UPDATE = 'CONFIGS_UPDATE';
@@ -3,20 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.readinessManagerFactory = void 0;
4
4
  var objectAssign_1 = require("../utils/lang/objectAssign");
5
5
  var constants_1 = require("./constants");
6
- function splitsEventEmitterFactory(EventEmitter) {
7
- var splitsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), {
8
- splitsArrived: false,
9
- splitsCacheLoaded: false,
6
+ function definitionsEventEmitterFactory(EventEmitter) {
7
+ var definitionsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), {
8
+ definitionsArrived: false,
9
+ definitionsCacheLoaded: false,
10
10
  hasInit: false,
11
11
  initCallbacks: []
12
12
  });
13
13
  // `isSplitKill` condition avoids an edge-case of wrongly emitting SDK_READY if:
14
14
  // - `/memberships` fetch and SPLIT_KILL occurs before `/splitChanges` fetch, and
15
15
  // - storage has cached splits (for which case `splitsStorage.killLocally` can return true)
16
- splitsEventEmitter.on(constants_1.SDK_SPLITS_ARRIVED, function (metadata, isSplitKill) { if (!isSplitKill)
17
- splitsEventEmitter.splitsArrived = true; });
18
- splitsEventEmitter.once(constants_1.SDK_SPLITS_CACHE_LOADED, function () { splitsEventEmitter.splitsCacheLoaded = true; });
19
- return splitsEventEmitter;
16
+ definitionsEventEmitter.on(constants_1.SDK_DEFINITIONS_ARRIVED, function (metadata, isSplitKill) { if (!isSplitKill)
17
+ definitionsEventEmitter.definitionsArrived = true; });
18
+ definitionsEventEmitter.once(constants_1.SDK_DEFINITIONS_CACHE_LOADED, function () { definitionsEventEmitter.definitionsCacheLoaded = true; });
19
+ return definitionsEventEmitter;
20
20
  }
21
21
  function segmentsEventEmitterFactory(EventEmitter) {
22
22
  var segmentsEventEmitter = (0, objectAssign_1.objectAssign)(new EventEmitter(), {
@@ -28,8 +28,8 @@ function segmentsEventEmitterFactory(EventEmitter) {
28
28
  /**
29
29
  * Factory of readiness manager, which handles the ready / update event propagation.
30
30
  */
31
- function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
32
- if (splits === void 0) { splits = splitsEventEmitterFactory(EventEmitter); }
31
+ function readinessManagerFactory(EventEmitter, settings, definitions, isShared) {
32
+ if (definitions === void 0) { definitions = definitionsEventEmitterFactory(EventEmitter); }
33
33
  var readyTimeout = settings.startup.readyTimeout;
34
34
  var segments = segmentsEventEmitterFactory(EventEmitter);
35
35
  var gate = new EventEmitter();
@@ -44,10 +44,10 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
44
44
  };
45
45
  // emit SDK_READY_FROM_CACHE
46
46
  var isReadyFromCache = false;
47
- if (splits.splitsCacheLoaded)
47
+ if (definitions.definitionsCacheLoaded)
48
48
  isReadyFromCache = true; // ready from cache, but doesn't emit SDK_READY_FROM_CACHE
49
49
  else
50
- splits.once(constants_1.SDK_SPLITS_CACHE_LOADED, checkIsReadyFromCache);
50
+ definitions.once(constants_1.SDK_DEFINITIONS_CACHE_LOADED, checkIsReadyFromCache);
51
51
  // emit SDK_READY_TIMED_OUT
52
52
  var hasTimedout = false;
53
53
  function timeout() {
@@ -59,7 +59,7 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
59
59
  }
60
60
  // emit SDK_READY and SDK_UPDATE
61
61
  var isReady = false;
62
- splits.on(constants_1.SDK_SPLITS_ARRIVED, checkIsReadyOrUpdate);
62
+ definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, checkIsReadyOrUpdate);
63
63
  segments.on(constants_1.SDK_SEGMENTS_ARRIVED, checkIsReadyOrUpdate);
64
64
  var isDestroyed = false;
65
65
  var readyTimeoutId;
@@ -68,8 +68,8 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
68
68
  if (readyTimeout > 0 && !isReady)
69
69
  readyTimeoutId = setTimeout(timeout, readyTimeout);
70
70
  }
71
- splits.initCallbacks.push(__init);
72
- if (splits.hasInit)
71
+ definitions.initCallbacks.push(__init);
72
+ if (definitions.hasInit)
73
73
  __init();
74
74
  function checkIsReadyFromCache(cacheMetadata) {
75
75
  metadataReady = cacheMetadata;
@@ -100,7 +100,7 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
100
100
  }
101
101
  }
102
102
  else {
103
- if (splits.splitsArrived && segments.segmentsArrived) {
103
+ if (definitions.definitionsArrived && segments.segmentsArrived) {
104
104
  clearTimeout(readyTimeoutId);
105
105
  isReady = true;
106
106
  try {
@@ -123,11 +123,11 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
123
123
  }
124
124
  }
125
125
  return {
126
- splits: splits,
126
+ definitions: definitions,
127
127
  segments: segments,
128
128
  gate: gate,
129
129
  shared: function () {
130
- return readinessManagerFactory(EventEmitter, settings, splits, true);
130
+ return readinessManagerFactory(EventEmitter, settings, definitions, true);
131
131
  },
132
132
  // @TODO review/remove next methods when non-recoverable errors are reworked
133
133
  // Called on consumer mode, when storage fails to connect
@@ -136,17 +136,17 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
136
136
  // tracking and evaluations, while keeping event listeners to emit SDK_READY_TIMED_OUT event
137
137
  setDestroyed: function () { isDestroyed = true; },
138
138
  init: function () {
139
- if (splits.hasInit)
139
+ if (definitions.hasInit)
140
140
  return;
141
- splits.hasInit = true;
142
- splits.initCallbacks.forEach(function (cb) { return cb(); });
141
+ definitions.hasInit = true;
142
+ definitions.initCallbacks.forEach(function (cb) { return cb(); });
143
143
  },
144
144
  destroy: function () {
145
145
  isDestroyed = true;
146
146
  syncLastUpdate();
147
147
  clearTimeout(readyTimeoutId);
148
148
  if (!isShared)
149
- splits.hasInit = false;
149
+ definitions.hasInit = false;
150
150
  },
151
151
  isReady: function () { return isReady; },
152
152
  isReadyFromCache: function () { return isReadyFromCache; },
@@ -7,7 +7,6 @@ var readinessManager_1 = require("./readinessManager");
7
7
  var constants_1 = require("./constants");
8
8
  var constants_2 = require("../logger/constants");
9
9
  var NEW_LISTENER_EVENT = 'newListener';
10
- var REMOVE_LISTENER_EVENT = 'removeListener';
11
10
  var TIMEOUT_ERROR = new Error(constants_1.SDK_READY_TIMED_OUT);
12
11
  /**
13
12
  * SdkReadinessManager factory, which provides the public status API of SDK clients and manager: ready promise, readiness event emitter and constants (SDK_READY, etc).
@@ -19,21 +18,11 @@ var TIMEOUT_ERROR = new Error(constants_1.SDK_READY_TIMED_OUT);
19
18
  function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
20
19
  if (readinessManager === void 0) { readinessManager = (0, readinessManager_1.readinessManagerFactory)(EventEmitter, settings); }
21
20
  var log = settings.log;
22
- /** Ready callback warning */
23
- var internalReadyCbCount = 0;
24
- var readyCbCount = 0;
25
- readinessManager.gate.on(REMOVE_LISTENER_EVENT, function (event) {
26
- if (event === constants_1.SDK_READY)
27
- readyCbCount--;
28
- });
29
21
  readinessManager.gate.on(NEW_LISTENER_EVENT, function (event) {
30
22
  if (event === constants_1.SDK_READY || event === constants_1.SDK_READY_TIMED_OUT) {
31
23
  if (readinessManager.isReady()) {
32
24
  log.error(constants_2.ERROR_CLIENT_LISTENER, [event === constants_1.SDK_READY ? 'SDK_READY' : 'SDK_READY_TIMED_OUT']);
33
25
  }
34
- else if (event === constants_1.SDK_READY) {
35
- readyCbCount++;
36
- }
37
26
  }
38
27
  else if (event === constants_1.SDK_READY_FROM_CACHE && readinessManager.isReadyFromCache()) {
39
28
  log.error(constants_2.ERROR_CLIENT_LISTENER, ['SDK_READY_FROM_CACHE']);
@@ -52,8 +41,6 @@ function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
52
41
  var promise = (0, wrapper_1.promiseWrapper)(new Promise(function (resolve, reject) {
53
42
  readinessManager.gate.once(constants_1.SDK_READY, function () {
54
43
  log.info(constants_2.CLIENT_READY);
55
- if (readyCbCount === internalReadyCbCount && !promise.hasOnFulfilled())
56
- log.warn(constants_2.CLIENT_NO_LISTENER);
57
44
  resolve();
58
45
  });
59
46
  readinessManager.gate.once(constants_1.SDK_READY_TIMED_OUT, function (message) {
@@ -78,9 +65,6 @@ function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
78
65
  shared: function () {
79
66
  return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared());
80
67
  },
81
- incInternalReadyCbCount: function () {
82
- internalReadyCbCount++;
83
- },
84
68
  sdkStatus: (0, objectAssign_1.objectAssign)(
85
69
  // Expose Event Emitter functionality
86
70
  Object.create(readinessManager.gate), {
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.clientFactory = void 0;
3
+ exports.clientFactory = exports.stringify = void 0;
4
4
  var evaluator_1 = require("../evaluator");
5
5
  var thenable_1 = require("../utils/promise/thenable");
6
6
  var key_1 = require("../utils/key");
7
- var splitExistence_1 = require("../utils/inputValidation/splitExistence");
8
- var trafficTypeExistence_1 = require("../utils/inputValidation/trafficTypeExistence");
7
+ var definitionExistence_1 = require("../utils/inputValidation/definitionExistence");
9
8
  var labels_1 = require("../utils/labels");
10
9
  var constants_1 = require("../utils/constants");
11
10
  var constants_2 = require("../logger/constants");
12
11
  var mode_1 = require("../utils/settingsValidation/mode");
12
+ var trackMethod_1 = require("./trackMethod");
13
13
  var treatmentNotReady = { treatment: constants_1.CONTROL, label: labels_1.SDK_NOT_READY };
14
14
  function treatmentsNotReady(featureFlagNames) {
15
15
  var evaluations = {};
@@ -26,11 +26,12 @@ function stringify(options) {
26
26
  catch ( /* JSON.stringify should never throw with validated options, but handling just in case */_a) { /* JSON.stringify should never throw with validated options, but handling just in case */ }
27
27
  }
28
28
  }
29
+ exports.stringify = stringify;
29
30
  /**
30
31
  * Creator of base client with getTreatments and track methods.
31
32
  */
32
33
  function clientFactory(params) {
33
- var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, eventTracker = params.eventTracker, telemetryTracker = params.telemetryTracker, fallbackTreatmentsCalculator = params.fallbackTreatmentsCalculator;
34
+ var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, telemetryTracker = params.telemetryTracker, fallbackCalculator = params.fallbackCalculator;
34
35
  var log = settings.log, mode = settings.mode;
35
36
  var isAsync = (0, mode_1.isConsumerMode)(mode);
36
37
  function getTreatment(key, featureFlagName, attributes, options, withConfig, methodName) {
@@ -118,14 +119,13 @@ function clientFactory(params) {
118
119
  var changeNumber = evaluation.changeNumber, impressionsDisabled = evaluation.impressionsDisabled;
119
120
  var treatment = evaluation.treatment, label = evaluation.label, _a = evaluation.config, config = _a === void 0 ? null : _a;
120
121
  if (treatment === constants_1.CONTROL) {
121
- var fallbackTreatment = fallbackTreatmentsCalculator.resolve(featureFlagName, label);
122
+ var fallbackTreatment = fallbackCalculator(featureFlagName, label);
122
123
  treatment = fallbackTreatment.treatment;
123
124
  label = fallbackTreatment.label;
124
125
  config = fallbackTreatment.config;
125
126
  }
126
- log.info(constants_2.IMPRESSION, [featureFlagName, matchingKey, treatment, label]);
127
- if ((0, splitExistence_1.validateSplitExistence)(log, readinessManager, featureFlagName, label, invokingMethodName)) {
128
- log.info(constants_2.IMPRESSION_QUEUEING);
127
+ if ((0, definitionExistence_1.validateDefinitionExistence)(log, readinessManager, featureFlagName, label, invokingMethodName)) {
128
+ log.info(constants_2.IMPRESSION_QUEUEING, ['Feature flag', featureFlagName, matchingKey, treatment, label]);
129
129
  queue.push({
130
130
  imp: {
131
131
  feature: featureFlagName,
@@ -148,33 +148,7 @@ function clientFactory(params) {
148
148
  }
149
149
  return treatment;
150
150
  }
151
- function track(key, trafficTypeName, eventTypeId, value, properties, size) {
152
- if (size === void 0) { size = 1024; }
153
- var stopTelemetryTracker = telemetryTracker.trackEval(constants_1.TRACK);
154
- var matchingKey = (0, key_1.getMatching)(key);
155
- var timestamp = Date.now();
156
- var eventData = {
157
- eventTypeId: eventTypeId,
158
- trafficTypeName: trafficTypeName,
159
- value: value,
160
- timestamp: timestamp,
161
- key: matchingKey,
162
- properties: properties
163
- };
164
- // This may be async but we only warn, we don't actually care if it is valid or not in terms of queueing the event.
165
- (0, trafficTypeExistence_1.validateTrafficTypeExistence)(log, readinessManager, storage.splits, mode, trafficTypeName, constants_1.TRACK_FN_LABEL);
166
- var result = eventTracker.track(eventData, size);
167
- if ((0, thenable_1.thenable)(result)) {
168
- return result.then(function (result) {
169
- stopTelemetryTracker();
170
- return result;
171
- });
172
- }
173
- else {
174
- stopTelemetryTracker();
175
- return result;
176
- }
177
- }
151
+ var track = (0, trackMethod_1.trackMethodFactory)(params);
178
152
  return {
179
153
  getTreatment: getTreatment,
180
154
  getTreatmentWithConfig: getTreatmentWithConfig,
@@ -69,7 +69,7 @@ function clientAttributesDecoration(log, client) {
69
69
  attribute[attributeName] = attributeValue;
70
70
  if (!(0, attributes_1.validateAttributesDeep)(log, attribute, 'setAttribute'))
71
71
  return false;
72
- log.debug("stored " + attributeValue + " for attribute " + attributeName);
72
+ log.debug("stored ".concat(attributeValue, " for attribute ").concat(attributeName));
73
73
  return attributeStorage.setAttribute(attributeName, attributeValue);
74
74
  },
75
75
  /**
@@ -79,7 +79,7 @@ function clientAttributesDecoration(log, client) {
79
79
  * @returns Attribute with the given name
80
80
  */
81
81
  getAttribute: function (attributeName) {
82
- log.debug("retrieved attribute " + attributeName);
82
+ log.debug("retrieved attribute ".concat(attributeName));
83
83
  return attributeStorage.getAttribute(attributeName + '');
84
84
  },
85
85
  /**
@@ -108,7 +108,7 @@ function clientAttributesDecoration(log, client) {
108
108
  * @returns true if attribute was removed and false otherways
109
109
  */
110
110
  removeAttribute: function (attributeName) {
111
- log.debug("removed attribute " + attributeName);
111
+ log.debug("removed attribute ".concat(attributeName));
112
112
  return attributeStorage.removeAttribute(attributeName + '');
113
113
  },
114
114
  /**
@@ -10,7 +10,7 @@ var splitFilters_1 = require("../utils/settingsValidation/splitFilters");
10
10
  * Decorator that validates the input before actually executing the client methods.
11
11
  * We should "guard" the client here, while not polluting the "real" implementation of those methods.
12
12
  */
13
- function clientInputValidationDecorator(settings, client, readinessManager, fallbackTreatmentsCalculator) {
13
+ function clientInputValidationDecorator(settings, client, readinessManager, fallbackCalculator) {
14
14
  var log = settings.log, mode = settings.mode;
15
15
  var isAsync = (0, mode_1.isConsumerMode)(mode);
16
16
  /**
@@ -21,12 +21,12 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
21
21
  var nameOrNames = methodName.indexOf('ByFlagSet') > -1 ?
22
22
  (0, splitFilters_1.validateFlagSets)(log, methodName, maybeNameOrNames, settings.sync.__splitFiltersValidation.groupedFilters.bySet) :
23
23
  (0, lang_1.startsWith)(methodName, constants_1.GET_TREATMENTS) ?
24
- (0, inputValidation_1.validateSplits)(log, maybeNameOrNames, methodName) :
25
- (0, inputValidation_1.validateSplit)(log, maybeNameOrNames, methodName);
24
+ (0, inputValidation_1.validateDefinitions)(log, maybeNameOrNames, methodName) :
25
+ (0, inputValidation_1.validateDefinition)(log, maybeNameOrNames, methodName);
26
26
  var attributes = (0, inputValidation_1.validateAttributes)(log, maybeAttributes, methodName);
27
27
  var isNotDestroyed = (0, inputValidation_1.validateIfNotDestroyed)(log, readinessManager, methodName);
28
28
  var options = (0, inputValidation_1.validateEvaluationOptions)(log, maybeOptions, methodName);
29
- (0, inputValidation_1.validateIfReadyFromCache)(log, readinessManager, methodName, nameOrNames);
29
+ (0, inputValidation_1.validateIfReadyFromCache)(log, readinessManager, methodName);
30
30
  var valid = isNotDestroyed && key && nameOrNames && attributes !== false;
31
31
  return {
32
32
  valid: valid,
@@ -37,111 +37,68 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
37
37
  };
38
38
  }
39
39
  function evaluateFallBackTreatment(featureFlagName, withConfig) {
40
- var _a = fallbackTreatmentsCalculator.resolve(featureFlagName, ''), treatment = _a.treatment, config = _a.config;
41
- if (withConfig) {
42
- return {
40
+ if (Array.isArray(featureFlagName)) {
41
+ var res_1 = {};
42
+ featureFlagName.forEach(function (split) { return res_1[split] = evaluateFallBackTreatment(split, withConfig); });
43
+ return res_1;
44
+ }
45
+ var _a = fallbackCalculator(featureFlagName), treatment = _a.treatment, config = _a.config;
46
+ return withConfig ?
47
+ {
43
48
  treatment: treatment,
44
49
  config: config
45
- };
46
- }
47
- return treatment;
50
+ } : treatment;
48
51
  }
49
52
  function wrapResult(value) {
50
53
  return isAsync ? Promise.resolve(value) : value;
51
54
  }
52
55
  function getTreatment(maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions) {
53
56
  var params = validateEvaluationParams(constants_1.GET_TREATMENT, maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions);
54
- if (params.valid) {
55
- return client.getTreatment(params.key, params.nameOrNames, params.attributes, params.options);
56
- }
57
- else {
58
- var result = evaluateFallBackTreatment(params.nameOrNames, false);
59
- return wrapResult(result);
60
- }
57
+ return params.valid ?
58
+ client.getTreatment(params.key, params.nameOrNames, params.attributes, params.options) :
59
+ wrapResult(evaluateFallBackTreatment(params.nameOrNames, false));
61
60
  }
62
61
  function getTreatmentWithConfig(maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions) {
63
62
  var params = validateEvaluationParams(constants_1.GET_TREATMENT_WITH_CONFIG, maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions);
64
- if (params.valid) {
65
- return client.getTreatmentWithConfig(params.key, params.nameOrNames, params.attributes, params.options);
66
- }
67
- else {
68
- var result = evaluateFallBackTreatment(params.nameOrNames, true);
69
- return wrapResult(result);
70
- }
63
+ return params.valid ?
64
+ client.getTreatmentWithConfig(params.key, params.nameOrNames, params.attributes, params.options) :
65
+ wrapResult(evaluateFallBackTreatment(params.nameOrNames, true));
71
66
  }
72
67
  function getTreatments(maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions) {
73
68
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS, maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions);
74
- if (params.valid) {
75
- return client.getTreatments(params.key, params.nameOrNames, params.attributes, params.options);
76
- }
77
- else {
78
- var res_1 = {};
79
- if (params.nameOrNames)
80
- params.nameOrNames.forEach(function (split) { return res_1[split] = evaluateFallBackTreatment(split, false); });
81
- return wrapResult(res_1);
82
- }
69
+ return params.valid ?
70
+ client.getTreatments(params.key, params.nameOrNames, params.attributes, params.options) :
71
+ wrapResult(evaluateFallBackTreatment(params.nameOrNames || [], false));
83
72
  }
84
73
  function getTreatmentsWithConfig(maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions) {
85
74
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS_WITH_CONFIG, maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions);
86
- if (params.valid) {
87
- return client.getTreatmentsWithConfig(params.key, params.nameOrNames, params.attributes, params.options);
88
- }
89
- else {
90
- var res_2 = {};
91
- if (params.nameOrNames)
92
- params.nameOrNames.forEach(function (split) { return res_2[split] = evaluateFallBackTreatment(split, true); });
93
- return wrapResult(res_2);
94
- }
75
+ return params.valid ?
76
+ client.getTreatmentsWithConfig(params.key, params.nameOrNames, params.attributes, params.options) :
77
+ wrapResult(evaluateFallBackTreatment(params.nameOrNames || [], true));
95
78
  }
96
79
  function getTreatmentsByFlagSets(maybeKey, maybeFlagSets, maybeAttributes, maybeOptions) {
97
80
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS_BY_FLAG_SETS, maybeKey, maybeFlagSets, maybeAttributes, maybeOptions);
98
- if (params.valid) {
99
- return client.getTreatmentsByFlagSets(params.key, params.nameOrNames, params.attributes, params.options);
100
- }
101
- else {
102
- return wrapResult({});
103
- }
81
+ return params.valid ?
82
+ client.getTreatmentsByFlagSets(params.key, params.nameOrNames, params.attributes, params.options) :
83
+ wrapResult({});
104
84
  }
105
85
  function getTreatmentsWithConfigByFlagSets(maybeKey, maybeFlagSets, maybeAttributes, maybeOptions) {
106
86
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, maybeKey, maybeFlagSets, maybeAttributes, maybeOptions);
107
- if (params.valid) {
108
- return client.getTreatmentsWithConfigByFlagSets(params.key, params.nameOrNames, params.attributes, params.options);
109
- }
110
- else {
111
- return wrapResult({});
112
- }
87
+ return params.valid ?
88
+ client.getTreatmentsWithConfigByFlagSets(params.key, params.nameOrNames, params.attributes, params.options) :
89
+ wrapResult({});
113
90
  }
114
91
  function getTreatmentsByFlagSet(maybeKey, maybeFlagSet, maybeAttributes, maybeOptions) {
115
92
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS_BY_FLAG_SET, maybeKey, [maybeFlagSet], maybeAttributes, maybeOptions);
116
- if (params.valid) {
117
- return client.getTreatmentsByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options);
118
- }
119
- else {
120
- return wrapResult({});
121
- }
93
+ return params.valid ?
94
+ client.getTreatmentsByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
95
+ wrapResult({});
122
96
  }
123
97
  function getTreatmentsWithConfigByFlagSet(maybeKey, maybeFlagSet, maybeAttributes, maybeOptions) {
124
98
  var params = validateEvaluationParams(constants_1.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, maybeKey, [maybeFlagSet], maybeAttributes, maybeOptions);
125
- if (params.valid) {
126
- return client.getTreatmentsWithConfigByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options);
127
- }
128
- else {
129
- return wrapResult({});
130
- }
131
- }
132
- function track(maybeKey, maybeTT, maybeEvent, maybeEventValue, maybeProperties) {
133
- var key = (0, inputValidation_1.validateKey)(log, maybeKey, constants_1.TRACK_FN_LABEL);
134
- var tt = (0, inputValidation_1.validateTrafficType)(log, maybeTT, constants_1.TRACK_FN_LABEL);
135
- var event = (0, inputValidation_1.validateEvent)(log, maybeEvent, constants_1.TRACK_FN_LABEL);
136
- var eventValue = (0, inputValidation_1.validateEventValue)(log, maybeEventValue, constants_1.TRACK_FN_LABEL);
137
- var _a = (0, inputValidation_1.validateEventProperties)(log, maybeProperties, constants_1.TRACK_FN_LABEL), properties = _a.properties, size = _a.size;
138
- var isNotDestroyed = (0, inputValidation_1.validateIfNotDestroyed)(log, readinessManager, constants_1.TRACK_FN_LABEL);
139
- if (isNotDestroyed && key && tt && event && eventValue !== false && properties !== false) { // @ts-expect-error
140
- return client.track(key, tt, event, eventValue, properties, size);
141
- }
142
- else {
143
- return isAsync ? Promise.resolve(false) : false;
144
- }
99
+ return params.valid ?
100
+ client.getTreatmentsWithConfigByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
101
+ wrapResult({});
145
102
  }
146
103
  return {
147
104
  getTreatment: getTreatment,
@@ -152,7 +109,7 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
152
109
  getTreatmentsWithConfigByFlagSets: getTreatmentsWithConfigByFlagSets,
153
110
  getTreatmentsByFlagSet: getTreatmentsByFlagSet,
154
111
  getTreatmentsWithConfigByFlagSet: getTreatmentsWithConfigByFlagSet,
155
- track: track
112
+ track: client.track,
156
113
  };
157
114
  }
158
115
  exports.clientInputValidationDecorator = clientInputValidationDecorator;
@@ -2,6 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildInstanceId = void 0;
4
4
  function buildInstanceId(key, trafficType) {
5
- return (key.matchingKey ? key.matchingKey : key) + "-" + (key.bucketingKey ? key.bucketingKey : key) + "-" + (trafficType ? trafficType : '');
5
+ return "".concat(key.matchingKey ? key.matchingKey : key, "-").concat(key.bucketingKey ? key.bucketingKey : key, "-").concat(trafficType ? trafficType : '');
6
6
  }
7
7
  exports.buildInstanceId = buildInstanceId;
@@ -2,63 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sdkClientFactory = void 0;
4
4
  var objectAssign_1 = require("../utils/lang/objectAssign");
5
- var apiKey_1 = require("../utils/inputValidation/apiKey");
6
5
  var client_1 = require("./client");
7
6
  var clientInputValidation_1 = require("./clientInputValidation");
8
- var COOLDOWN_TIME_IN_MILLIS = 1000;
7
+ var sdkLifecycle_1 = require("./sdkLifecycle");
9
8
  /**
10
- * Creates an Sdk client, i.e., a base client with status and destroy interface
9
+ * Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
11
10
  */
12
11
  function sdkClientFactory(params, isSharedClient) {
13
- var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, signalListener = params.signalListener, settings = params.settings, telemetryTracker = params.telemetryTracker, uniqueKeysTracker = params.uniqueKeysTracker;
14
- var lastActionTime = 0;
15
- function __cooldown(func, time) {
16
- var now = Date.now();
17
- //get the actual time elapsed in ms
18
- var timeElapsed = now - lastActionTime;
19
- //check if the time elapsed is less than desired cooldown
20
- if (timeElapsed < time) {
21
- //if yes, return message with remaining time in seconds
22
- settings.log.warn("Flush cooldown, remaining time " + (time - timeElapsed) / 1000 + " seconds");
23
- return Promise.resolve();
24
- }
25
- else {
26
- //Do the requested action and re-assign the lastActionTime
27
- lastActionTime = now;
28
- return func();
29
- }
30
- }
31
- function __flush() {
32
- return syncManager ? syncManager.flush() : Promise.resolve();
33
- }
12
+ var sdkReadinessManager = params.sdkReadinessManager, settings = params.settings;
34
13
  return (0, objectAssign_1.objectAssign)(
35
14
  // Proto-linkage of the readiness Event Emitter
36
15
  Object.create(sdkReadinessManager.sdkStatus),
37
16
  // Client API (getTreatment* & track methods)
38
- (0, clientInputValidation_1.clientInputValidationDecorator)(settings, (0, client_1.clientFactory)(params), sdkReadinessManager.readinessManager, params.fallbackTreatmentsCalculator),
39
- // Sdk destroy
40
- {
41
- flush: function () {
42
- // @TODO define cooldown time
43
- return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
44
- },
45
- destroy: function () {
46
- // Mark the SDK as destroyed immediately
47
- sdkReadinessManager.readinessManager.destroy();
48
- // For main client, cleanup the SDK Key, listeners and scheduled jobs, and record stat before flushing data
49
- if (!isSharedClient) {
50
- (0, apiKey_1.releaseApiKey)(settings.core.authorizationKey);
51
- telemetryTracker.sessionLength();
52
- signalListener && signalListener.stop();
53
- uniqueKeysTracker.stop();
54
- }
55
- // Stop background jobs
56
- syncManager && syncManager.stop();
57
- return __flush().then(function () {
58
- // Cleanup storage
59
- return storage.destroy();
60
- });
61
- }
62
- });
17
+ (0, clientInputValidation_1.clientInputValidationDecorator)(settings, (0, client_1.clientFactory)(params), sdkReadinessManager.readinessManager, params.fallbackCalculator), (0, sdkLifecycle_1.sdkLifecycleFactory)(params, isSharedClient));
63
18
  }
64
19
  exports.sdkClientFactory = sdkClientFactory;