@splitsoftware/splitio-commons 3.1.1-rc.10 → 3.1.1-rc.12

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 (237) hide show
  1. package/CHANGES.txt +3 -0
  2. package/cjs/evaluator/condition/index.js +2 -2
  3. package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  4. package/cjs/evaluator/index.js +81 -71
  5. package/cjs/listeners/browser.js +2 -1
  6. package/cjs/listeners/node.js +4 -4
  7. package/cjs/logger/constants.js +15 -20
  8. package/cjs/logger/messages/debug.js +5 -6
  9. package/cjs/logger/messages/error.js +3 -3
  10. package/cjs/logger/messages/info.js +3 -4
  11. package/cjs/logger/messages/warn.js +6 -7
  12. package/cjs/platform/browser.js +15 -0
  13. package/cjs/platform/getEventSource/browser.js +8 -0
  14. package/cjs/platform/getEventSource/eventsource.js +480 -0
  15. package/cjs/platform/getEventSource/node.js +26 -0
  16. package/cjs/platform/getFetch/browser.js +9 -0
  17. package/cjs/platform/getFetch/node.js +27 -0
  18. package/cjs/platform/getOptions/node.js +25 -0
  19. package/cjs/platform/node.js +17 -0
  20. package/cjs/presets/serverSide.js +2 -2
  21. package/cjs/readiness/constants.js +5 -4
  22. package/cjs/readiness/readinessManager.js +23 -23
  23. package/cjs/readiness/sdkReadinessManager.js +1 -17
  24. package/cjs/sdkClient/client.js +24 -50
  25. package/cjs/sdkClient/clientInputValidation.js +6 -17
  26. package/cjs/sdkClient/sdkClient.js +3 -60
  27. package/cjs/sdkClient/sdkLifecycle.js +74 -0
  28. package/cjs/sdkClient/trackMethod.js +56 -0
  29. package/cjs/sdkFactory/index.js +11 -15
  30. package/cjs/sdkManager/index.js +5 -5
  31. package/cjs/services/authProvider.js +80 -0
  32. package/cjs/services/decorateHeaders.js +2 -1
  33. package/cjs/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +15 -16
  34. package/cjs/services/secureSplitHttpClient.js +36 -0
  35. package/cjs/services/serviceApi.js +147 -0
  36. package/cjs/services/splitApi.js +24 -10
  37. package/cjs/services/splitHttpClient.js +3 -5
  38. package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
  39. package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
  40. package/cjs/storages/KeyBuilder.js +6 -6
  41. package/cjs/storages/KeyBuilderCS.js +5 -5
  42. package/cjs/storages/KeyBuilderSS.js +2 -2
  43. package/cjs/storages/getRolloutPlan.js +3 -3
  44. package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +195 -0
  45. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
  46. package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +12 -11
  47. package/cjs/storages/inLocalStorage/index.js +6 -6
  48. package/cjs/storages/inLocalStorage/validateCache.js +3 -3
  49. package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +122 -0
  50. package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
  51. package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
  52. package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +7 -6
  53. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  54. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  55. package/cjs/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +79 -77
  56. package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +4 -2
  57. package/cjs/storages/inRedis/index.js +2 -2
  58. package/cjs/storages/pluggable/DefinitionsCachePluggable.js +214 -0
  59. package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +4 -2
  60. package/cjs/storages/pluggable/index.js +2 -2
  61. package/cjs/storages/setRolloutPlan.js +4 -4
  62. package/cjs/storages/utils.js +1 -0
  63. package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
  64. package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
  65. package/cjs/sync/polling/pollingManagerCS.js +86 -81
  66. package/cjs/sync/polling/pollingManagerSS.js +44 -36
  67. package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +13 -0
  68. package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
  69. package/cjs/sync/polling/updaters/definitionChangesUpdater.js +207 -0
  70. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  71. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
  72. package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
  73. package/cjs/sync/streaming/SSEHandler/index.js +2 -1
  74. package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +19 -20
  75. package/cjs/sync/streaming/constants.js +4 -3
  76. package/cjs/sync/streaming/parseUtils.js +14 -14
  77. package/cjs/sync/streaming/pushManager.js +22 -26
  78. package/cjs/sync/submitters/eventsSubmitter.js +1 -1
  79. package/cjs/sync/submitters/impressionCountsSubmitter.js +1 -1
  80. package/cjs/sync/submitters/impressionsSubmitter.js +5 -4
  81. package/cjs/sync/submitters/telemetrySubmitter.js +3 -4
  82. package/cjs/sync/submitters/uniqueKeysSubmitter.js +1 -1
  83. package/cjs/sync/syncManagerOnline.js +5 -5
  84. package/cjs/utils/Backoff.js +35 -3
  85. package/cjs/utils/EventEmitter.js +391 -0
  86. package/cjs/utils/filter/bloomFilter.js +37 -0
  87. package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
  88. package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
  89. package/cjs/utils/inputValidation/definitions.js +25 -0
  90. package/cjs/utils/inputValidation/index.js +7 -7
  91. package/cjs/utils/inputValidation/isOperational.js +4 -4
  92. package/cjs/utils/inputValidation/target.js +22 -0
  93. package/cjs/utils/labels/index.js +3 -3
  94. package/cjs/utils/settingsValidation/index.js +2 -0
  95. package/cjs/utils/settingsValidation/splitFilters.js +3 -3
  96. package/cjs/utils/settingsValidation/url.js +6 -2
  97. package/esm/evaluator/condition/index.js +2 -2
  98. package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
  99. package/esm/evaluator/index.js +80 -71
  100. package/esm/listeners/browser.js +2 -1
  101. package/esm/listeners/node.js +4 -4
  102. package/esm/logger/constants.js +12 -17
  103. package/esm/logger/messages/debug.js +5 -6
  104. package/esm/logger/messages/error.js +3 -3
  105. package/esm/logger/messages/info.js +3 -4
  106. package/esm/logger/messages/warn.js +6 -7
  107. package/esm/platform/browser.js +12 -0
  108. package/esm/platform/getEventSource/browser.js +4 -0
  109. package/esm/platform/getEventSource/eventsource.js +480 -0
  110. package/esm/platform/getEventSource/node.js +20 -0
  111. package/esm/platform/getFetch/browser.js +5 -0
  112. package/esm/platform/getFetch/node.js +22 -0
  113. package/esm/platform/getOptions/node.js +20 -0
  114. package/esm/platform/node.js +14 -0
  115. package/esm/presets/serverSide.js +2 -2
  116. package/esm/readiness/constants.js +4 -3
  117. package/esm/readiness/readinessManager.js +24 -24
  118. package/esm/readiness/sdkReadinessManager.js +2 -18
  119. package/esm/sdkClient/client.js +23 -50
  120. package/esm/sdkClient/clientInputValidation.js +8 -19
  121. package/esm/sdkClient/sdkClient.js +3 -60
  122. package/esm/sdkClient/sdkLifecycle.js +70 -0
  123. package/esm/sdkClient/trackMethod.js +52 -0
  124. package/esm/sdkFactory/index.js +12 -16
  125. package/esm/sdkManager/index.js +6 -6
  126. package/esm/services/authProvider.js +76 -0
  127. package/esm/services/decorateHeaders.js +2 -1
  128. package/esm/{sync/streaming/AuthClient/index.js → services/fetchAuth.js} +13 -13
  129. package/esm/services/secureSplitHttpClient.js +32 -0
  130. package/esm/services/serviceApi.js +143 -0
  131. package/esm/services/splitApi.js +24 -10
  132. package/esm/services/splitHttpClient.js +3 -5
  133. package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
  134. package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
  135. package/esm/storages/KeyBuilder.js +6 -6
  136. package/esm/storages/KeyBuilderCS.js +5 -5
  137. package/esm/storages/KeyBuilderSS.js +2 -2
  138. package/esm/storages/getRolloutPlan.js +3 -3
  139. package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +192 -0
  140. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -2
  141. package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +9 -8
  142. package/esm/storages/inLocalStorage/index.js +6 -6
  143. package/esm/storages/inLocalStorage/validateCache.js +3 -3
  144. package/esm/storages/inMemory/DefinitionsCacheInMemory.js +119 -0
  145. package/esm/storages/inMemory/InMemoryStorage.js +4 -4
  146. package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
  147. package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +4 -3
  148. package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
  149. package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
  150. package/esm/storages/inRedis/{SplitsCacheInRedis.js → DefinitionsCacheInRedis.js} +78 -76
  151. package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +4 -2
  152. package/esm/storages/inRedis/index.js +2 -2
  153. package/esm/storages/pluggable/DefinitionsCachePluggable.js +211 -0
  154. package/esm/storages/pluggable/RBSegmentsCachePluggable.js +4 -2
  155. package/esm/storages/pluggable/index.js +2 -2
  156. package/esm/storages/setRolloutPlan.js +4 -4
  157. package/esm/storages/utils.js +1 -0
  158. package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
  159. package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
  160. package/esm/sync/polling/pollingManagerCS.js +87 -82
  161. package/esm/sync/polling/pollingManagerSS.js +44 -36
  162. package/esm/sync/polling/syncTasks/definitionsSyncTask.js +9 -0
  163. package/esm/sync/polling/syncTasks/segmentsSyncTask.js +2 -3
  164. package/esm/sync/polling/updaters/definitionChangesUpdater.js +201 -0
  165. package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
  166. package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
  167. package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
  168. package/esm/sync/streaming/SSEHandler/index.js +3 -2
  169. package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +19 -20
  170. package/esm/sync/streaming/constants.js +3 -2
  171. package/esm/sync/streaming/parseUtils.js +11 -11
  172. package/esm/sync/streaming/pushManager.js +24 -28
  173. package/esm/sync/submitters/eventsSubmitter.js +1 -1
  174. package/esm/sync/submitters/impressionCountsSubmitter.js +1 -1
  175. package/esm/sync/submitters/impressionsSubmitter.js +5 -4
  176. package/esm/sync/submitters/telemetrySubmitter.js +3 -4
  177. package/esm/sync/submitters/uniqueKeysSubmitter.js +1 -1
  178. package/esm/sync/syncManagerOnline.js +4 -4
  179. package/esm/utils/Backoff.js +35 -3
  180. package/esm/utils/EventEmitter.js +387 -0
  181. package/esm/utils/filter/bloomFilter.js +33 -0
  182. package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
  183. package/esm/utils/inputValidation/definitionExistence.js +15 -0
  184. package/esm/utils/inputValidation/definitions.js +21 -0
  185. package/esm/utils/inputValidation/index.js +3 -3
  186. package/esm/utils/inputValidation/isOperational.js +4 -4
  187. package/esm/utils/inputValidation/target.js +18 -0
  188. package/esm/utils/labels/index.js +2 -2
  189. package/esm/utils/settingsValidation/index.js +2 -0
  190. package/esm/utils/settingsValidation/splitFilters.js +3 -3
  191. package/esm/utils/settingsValidation/url.js +6 -2
  192. package/package.json +1 -1
  193. package/src/dtos/types.ts +4 -4
  194. package/src/services/authProvider.ts +2 -2
  195. package/src/{sync/streaming/AuthClient/index.ts → services/fetchAuth.ts} +3 -4
  196. package/src/services/splitApi.ts +1 -1
  197. package/src/services/types.ts +21 -4
  198. package/src/storages/AbstractDefinitionsCacheAsync.ts +3 -3
  199. package/src/storages/AbstractDefinitionsCacheSync.ts +2 -2
  200. package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +2 -2
  201. package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +3 -3
  202. package/src/storages/inMemory/DefinitionsCacheInMemory.ts +2 -2
  203. package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +2 -2
  204. package/src/storages/inRedis/DefinitionsCacheInRedis.ts +6 -4
  205. package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +7 -5
  206. package/src/storages/pluggable/DefinitionsCachePluggable.ts +4 -2
  207. package/src/storages/pluggable/RBSegmentsCachePluggable.ts +5 -3
  208. package/src/storages/types.ts +6 -6
  209. package/src/sync/polling/fetchers/splitChangesFetcher.ts +5 -5
  210. package/src/sync/polling/types.ts +22 -1
  211. package/src/sync/polling/updaters/definitionChangesUpdater.ts +26 -20
  212. package/src/sync/streaming/SSEClient/index.ts +1 -1
  213. package/src/sync/streaming/SSEClient/types.ts +1 -1
  214. package/src/sync/streaming/UpdateWorkers/DefinitionsUpdateWorker.ts +15 -11
  215. package/src/sync/streaming/UpdateWorkers/types.ts +6 -0
  216. package/src/sync/streaming/parseUtils.ts +3 -4
  217. package/src/sync/streaming/pushManager.ts +4 -3
  218. package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
  219. package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
  220. package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
  221. package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
  222. package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
  223. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
  224. package/cjs/sync/polling/updaters/splitChangesUpdater.js +0 -200
  225. package/cjs/sync/streaming/AuthClient/types.js +0 -2
  226. package/cjs/utils/inputValidation/splits.js +0 -25
  227. package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
  228. package/esm/storages/AbstractSplitsCacheSync.js +0 -71
  229. package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
  230. package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
  231. package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
  232. package/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
  233. package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -194
  234. package/esm/sync/streaming/AuthClient/types.js +0 -1
  235. package/esm/utils/inputValidation/splitExistence.js +0 -15
  236. package/esm/utils/inputValidation/splits.js +0 -21
  237. package/src/sync/streaming/AuthClient/types.ts +0 -19
@@ -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() {
@@ -55,11 +55,11 @@ function readinessManagerFactory(EventEmitter, settings, splits, isShared) {
55
55
  return;
56
56
  hasTimedout = true;
57
57
  syncLastUpdate();
58
- gate.emit(constants_1.SDK_READY_TIMED_OUT, 'Split SDK emitted SDK_READY_TIMED_OUT event.');
58
+ gate.emit(constants_1.SDK_READY_TIMED_OUT, 'SDK client emitted SDK_READY_TIMED_OUT event.');
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), {
@@ -95,7 +79,7 @@ function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) {
95
79
  ready: function () {
96
80
  if (readinessManager.hasTimedout()) {
97
81
  if (!readinessManager.isReady()) {
98
- return (0, wrapper_1.promiseWrapper)(Promise.reject(new Error('Split SDK has emitted SDK_READY_TIMED_OUT event.')), defaultOnRejected);
82
+ return (0, wrapper_1.promiseWrapper)(Promise.reject(new Error('SDK client has emitted SDK_READY_TIMED_OUT event.')), defaultOnRejected);
99
83
  }
100
84
  else {
101
85
  return Promise.resolve();
@@ -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 = {};
@@ -18,19 +18,20 @@ function treatmentsNotReady(featureFlagNames) {
18
18
  });
19
19
  return evaluations;
20
20
  }
21
- function stringify(options) {
22
- if (options && options.properties) {
21
+ function stringify(properties) {
22
+ if (properties) {
23
23
  try {
24
- return JSON.stringify(options.properties);
24
+ return JSON.stringify(properties);
25
25
  }
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) {
@@ -39,13 +40,13 @@ function clientFactory(params) {
39
40
  var stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? constants_1.TREATMENT_WITH_CONFIG : constants_1.TREATMENT);
40
41
  var wrapUp = function (evaluationResult) {
41
42
  var queue = [];
42
- var treatment = processEvaluation(evaluationResult, featureFlagName, key, stringify(options), withConfig, methodName, queue);
43
+ var treatment = processEvaluation(evaluationResult, featureFlagName, key, withConfig, methodName, queue, options);
43
44
  impressionsTracker.track(queue, attributes);
44
45
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
45
46
  return treatment;
46
47
  };
47
48
  var evaluation = readinessManager.isReadyFromCache() ?
48
- (0, evaluator_1.evaluateFeature)(log, key, featureFlagName, attributes, storage, options) :
49
+ (0, evaluator_1.evaluateFeature)(log, key, featureFlagName, attributes, storage) :
49
50
  isAsync ? // If the SDK is not ready, treatment may be incorrect due to having splits but not segments data, or storage is not connected
50
51
  Promise.resolve(treatmentNotReady) :
51
52
  treatmentNotReady;
@@ -61,16 +62,15 @@ function clientFactory(params) {
61
62
  var wrapUp = function (evaluationResults) {
62
63
  var queue = [];
63
64
  var treatments = {};
64
- var properties = stringify(options);
65
65
  Object.keys(evaluationResults).forEach(function (featureFlagName) {
66
- treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, properties, withConfig, methodName, queue);
66
+ treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, withConfig, methodName, queue, options);
67
67
  });
68
68
  impressionsTracker.track(queue, attributes);
69
69
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
70
70
  return treatments;
71
71
  };
72
72
  var evaluations = readinessManager.isReadyFromCache() ?
73
- (0, evaluator_1.evaluateFeatures)(log, key, featureFlagNames, attributes, storage, options) :
73
+ (0, evaluator_1.evaluateFeatures)(log, key, featureFlagNames, attributes, storage) :
74
74
  isAsync ? // If the SDK is not ready, treatment may be incorrect due to having splits but not segments data, or storage is not connected
75
75
  Promise.resolve(treatmentsNotReady(featureFlagNames)) :
76
76
  treatmentsNotReady(featureFlagNames);
@@ -87,16 +87,15 @@ function clientFactory(params) {
87
87
  var wrapUp = function (evaluationResults) {
88
88
  var queue = [];
89
89
  var treatments = {};
90
- var properties = stringify(options);
91
90
  Object.keys(evaluationResults).forEach(function (featureFlagName) {
92
- treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, properties, withConfig, methodName, queue);
91
+ treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, withConfig, methodName, queue, options);
93
92
  });
94
93
  impressionsTracker.track(queue, attributes);
95
94
  stopTelemetryTracker(queue[0] && queue[0].imp.label);
96
95
  return treatments;
97
96
  };
98
97
  var evaluations = readinessManager.isReadyFromCache() ?
99
- (0, evaluator_1.evaluateFeaturesByFlagSets)(log, key, flagSetNames, attributes, storage, methodName, options) :
98
+ (0, evaluator_1.evaluateFeaturesByFlagSets)(log, key, flagSetNames, attributes, storage, methodName) :
100
99
  isAsync ?
101
100
  Promise.resolve({}) :
102
101
  {};
@@ -112,19 +111,20 @@ function clientFactory(params) {
112
111
  return getTreatmentsByFlagSets(key, [flagSetName], attributes, options, true, constants_1.TREATMENTS_WITH_CONFIG_BY_FLAGSET, constants_1.GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET);
113
112
  }
114
113
  // Internal function
115
- function processEvaluation(evaluation, featureFlagName, key, properties, withConfig, invokingMethodName, queue) {
114
+ function processEvaluation(evaluation, featureFlagName, key, withConfig, invokingMethodName, queue, options) {
115
+ if (options === void 0) { options = {}; }
116
116
  var matchingKey = (0, key_1.getMatching)(key);
117
117
  var bucketingKey = (0, key_1.getBucketing)(key);
118
- var changeNumber = evaluation.changeNumber, impressionsDisabled = evaluation.impressionsDisabled;
118
+ var definition = evaluation.definition;
119
119
  var treatment = evaluation.treatment, label = evaluation.label, _a = evaluation.config, config = _a === void 0 ? null : _a;
120
120
  if (treatment === constants_1.CONTROL) {
121
- var fallbackTreatment = fallbackTreatmentsCalculator(featureFlagName, label);
121
+ var fallbackTreatment = fallbackCalculator(featureFlagName, label);
122
122
  treatment = fallbackTreatment.treatment;
123
123
  label = fallbackTreatment.label;
124
124
  config = fallbackTreatment.config;
125
125
  }
126
- if ((0, splitExistence_1.validateSplitExistence)(log, readinessManager, featureFlagName, label, invokingMethodName)) {
127
- log.info(constants_2.IMPRESSION_QUEUEING, [featureFlagName, matchingKey, treatment, label]);
126
+ if ((0, definitionExistence_1.validateDefinitionExistence)(log, readinessManager, featureFlagName, label, invokingMethodName)) {
127
+ log.info(constants_2.IMPRESSION_QUEUEING, ['Feature flag', featureFlagName, matchingKey, treatment, label]);
128
128
  queue.push({
129
129
  imp: {
130
130
  feature: featureFlagName,
@@ -133,10 +133,10 @@ function clientFactory(params) {
133
133
  time: Date.now(),
134
134
  bucketingKey: bucketingKey,
135
135
  label: label,
136
- changeNumber: changeNumber,
137
- properties: properties
136
+ changeNumber: definition === null || definition === void 0 ? void 0 : definition.changeNumber,
137
+ properties: stringify(options.properties)
138
138
  },
139
- disabled: impressionsDisabled
139
+ disabled: options.impressionsDisabled || (definition === null || definition === void 0 ? void 0 : definition.impressionsDisabled)
140
140
  });
141
141
  }
142
142
  if (withConfig) {
@@ -147,33 +147,7 @@ function clientFactory(params) {
147
147
  }
148
148
  return treatment;
149
149
  }
150
- function track(key, trafficTypeName, eventTypeId, value, properties, size) {
151
- if (size === void 0) { size = 1024; }
152
- var stopTelemetryTracker = telemetryTracker.trackEval(constants_1.TRACK);
153
- var matchingKey = (0, key_1.getMatching)(key);
154
- var timestamp = Date.now();
155
- var eventData = {
156
- eventTypeId: eventTypeId,
157
- trafficTypeName: trafficTypeName,
158
- value: value,
159
- timestamp: timestamp,
160
- key: matchingKey,
161
- properties: properties
162
- };
163
- // 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.
164
- (0, trafficTypeExistence_1.validateTrafficTypeExistence)(log, readinessManager, storage.splits, mode, trafficTypeName, constants_1.TRACK_FN_LABEL);
165
- var result = eventTracker.track(eventData, size);
166
- if ((0, thenable_1.thenable)(result)) {
167
- return result.then(function (result) {
168
- stopTelemetryTracker();
169
- return result;
170
- });
171
- }
172
- else {
173
- stopTelemetryTracker();
174
- return result;
175
- }
176
- }
150
+ var track = (0, trackMethod_1.trackMethodFactory)(params);
177
151
  return {
178
152
  getTreatment: getTreatment,
179
153
  getTreatmentWithConfig: getTreatmentWithConfig,
@@ -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,
@@ -42,7 +42,7 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
42
42
  featureFlagName.forEach(function (split) { return res_1[split] = evaluateFallBackTreatment(split, withConfig); });
43
43
  return res_1;
44
44
  }
45
- var _a = fallbackTreatmentsCalculator(featureFlagName), treatment = _a.treatment, config = _a.config;
45
+ var _a = fallbackCalculator(featureFlagName), treatment = _a.treatment, config = _a.config;
46
46
  return withConfig ?
47
47
  {
48
48
  treatment: treatment,
@@ -100,17 +100,6 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
100
100
  client.getTreatmentsWithConfigByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
101
101
  wrapResult({});
102
102
  }
103
- function track(maybeKey, maybeTT, maybeEvent, maybeEventValue, maybeProperties) {
104
- var key = (0, inputValidation_1.validateKey)(log, maybeKey, constants_1.TRACK_FN_LABEL);
105
- var tt = (0, inputValidation_1.validateTrafficType)(log, maybeTT, constants_1.TRACK_FN_LABEL);
106
- var event = (0, inputValidation_1.validateEvent)(log, maybeEvent, constants_1.TRACK_FN_LABEL);
107
- var eventValue = (0, inputValidation_1.validateEventValue)(log, maybeEventValue, constants_1.TRACK_FN_LABEL);
108
- var _a = (0, inputValidation_1.validateEventProperties)(log, maybeProperties, constants_1.TRACK_FN_LABEL), properties = _a.properties, size = _a.size;
109
- var isNotDestroyed = (0, inputValidation_1.validateIfNotDestroyed)(log, readinessManager, constants_1.TRACK_FN_LABEL);
110
- return isNotDestroyed && key && tt && event && eventValue !== false && properties !== false ? // @ts-expect-error
111
- client.track(key, tt, event, eventValue, properties, size) :
112
- wrapResult(false);
113
- }
114
103
  return {
115
104
  getTreatment: getTreatment,
116
105
  getTreatmentWithConfig: getTreatmentWithConfig,
@@ -120,7 +109,7 @@ function clientInputValidationDecorator(settings, client, readinessManager, fall
120
109
  getTreatmentsWithConfigByFlagSets: getTreatmentsWithConfigByFlagSets,
121
110
  getTreatmentsByFlagSet: getTreatmentsByFlagSet,
122
111
  getTreatmentsWithConfigByFlagSet: getTreatmentsWithConfigByFlagSet,
123
- track: track
112
+ track: client.track,
124
113
  };
125
114
  }
126
115
  exports.clientInputValidationDecorator = clientInputValidationDecorator;
@@ -2,75 +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
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, impressionsTracker = params.impressionsTracker;
14
- var hasInit = false;
15
- var lastActionTime = 0;
16
- function __cooldown(func, time) {
17
- var now = Date.now();
18
- //get the actual time elapsed in ms
19
- var timeElapsed = now - lastActionTime;
20
- //check if the time elapsed is less than desired cooldown
21
- if (timeElapsed < time) {
22
- //if yes, return message with remaining time in seconds
23
- settings.log.warn("Flush cooldown, remaining time ".concat((time - timeElapsed) / 1000, " seconds"));
24
- return Promise.resolve();
25
- }
26
- else {
27
- //Do the requested action and re-assign the lastActionTime
28
- lastActionTime = now;
29
- return func();
30
- }
31
- }
32
- function __flush() {
33
- return syncManager ? syncManager.flush() : Promise.resolve();
34
- }
12
+ var sdkReadinessManager = params.sdkReadinessManager, settings = params.settings;
35
13
  return (0, objectAssign_1.objectAssign)(
36
14
  // Proto-linkage of the readiness Event Emitter
37
15
  Object.create(sdkReadinessManager.sdkStatus),
38
16
  // Client API (getTreatment* & track methods)
39
- (0, clientInputValidation_1.clientInputValidationDecorator)(settings, (0, client_1.clientFactory)(params), sdkReadinessManager.readinessManager, params.fallbackTreatmentsCalculator), {
40
- init: function () {
41
- if (hasInit)
42
- return;
43
- hasInit = true;
44
- if (!isSharedClient) {
45
- (0, apiKey_1.validateAndTrackApiKey)(settings.log, settings.core.authorizationKey);
46
- sdkReadinessManager.readinessManager.init();
47
- impressionsTracker.start();
48
- syncManager && syncManager.start();
49
- signalListener && signalListener.start();
50
- }
51
- },
52
- flush: function () {
53
- // @TODO define cooldown time
54
- return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
55
- },
56
- destroy: function () {
57
- hasInit = false;
58
- // Mark the SDK as destroyed immediately
59
- sdkReadinessManager.readinessManager.destroy();
60
- // For main client, cleanup the SDK Key, listeners and scheduled jobs, and record stat before flushing data
61
- if (!isSharedClient) {
62
- (0, apiKey_1.releaseApiKey)(settings.core.authorizationKey);
63
- telemetryTracker.sessionLength();
64
- signalListener && signalListener.stop();
65
- impressionsTracker.stop();
66
- }
67
- // Stop background jobs
68
- syncManager && syncManager.stop();
69
- return __flush().then(function () {
70
- // Cleanup storage
71
- return storage.destroy();
72
- });
73
- }
74
- });
17
+ (0, clientInputValidation_1.clientInputValidationDecorator)(settings, (0, client_1.clientFactory)(params), sdkReadinessManager.readinessManager, params.fallbackCalculator), (0, sdkLifecycle_1.sdkLifecycleFactory)(params, isSharedClient));
75
18
  }
76
19
  exports.sdkClientFactory = sdkClientFactory;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sdkLifecycleFactory = void 0;
4
+ var apiKey_1 = require("../utils/inputValidation/apiKey");
5
+ var constants_1 = require("../utils/constants");
6
+ var COOLDOWN_TIME_IN_MILLIS = 1000;
7
+ /**
8
+ * Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
9
+ */
10
+ function sdkLifecycleFactory(params, isSharedClient) {
11
+ var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, settings = params.settings, telemetryTracker = params.telemetryTracker, impressionsTracker = params.impressionsTracker, platform = params.platform, serviceApi = params.serviceApi;
12
+ var hasInit = false;
13
+ var lastActionTime = 0;
14
+ var signalListener = platform.SignalListener && settings.mode !== constants_1.LOCALHOST_MODE ? new platform.SignalListener(params) : undefined;
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 ".concat((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
+ }
34
+ return {
35
+ init: function () {
36
+ if (hasInit)
37
+ return;
38
+ hasInit = true;
39
+ if (!isSharedClient) {
40
+ (0, apiKey_1.validateAndTrackApiKey)(settings.log, settings.core.authorizationKey);
41
+ sdkReadinessManager.readinessManager.init();
42
+ impressionsTracker.start();
43
+ syncManager && syncManager.start();
44
+ signalListener && signalListener.start();
45
+ }
46
+ },
47
+ flush: function () {
48
+ // @TODO define cooldown time
49
+ return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
50
+ },
51
+ destroy: function () {
52
+ hasInit = false;
53
+ // Mark the SDK as destroyed immediately
54
+ sdkReadinessManager.readinessManager.destroy();
55
+ // For main client, cleanup the SDK Key, listeners and scheduled jobs, and record stat before flushing data
56
+ if (!isSharedClient) {
57
+ (0, apiKey_1.releaseApiKey)(settings.core.authorizationKey);
58
+ telemetryTracker.sessionLength();
59
+ signalListener && signalListener.stop();
60
+ impressionsTracker.stop();
61
+ }
62
+ // Stop background jobs
63
+ syncManager && syncManager.stop();
64
+ // Stop the service API (the auth provider backoff retries specifically) before flushing,
65
+ // so that a pending/never-resolved auth retry doesn't block the flush forever
66
+ serviceApi && serviceApi.stop();
67
+ return __flush().then(function () {
68
+ // Cleanup storage
69
+ return storage.destroy();
70
+ });
71
+ }
72
+ };
73
+ }
74
+ exports.sdkLifecycleFactory = sdkLifecycleFactory;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.trackMethodFactory = void 0;
4
+ var thenable_1 = require("../utils/promise/thenable");
5
+ var key_1 = require("../utils/key");
6
+ var trafficTypeExistence_1 = require("../utils/inputValidation/trafficTypeExistence");
7
+ var inputValidation_1 = require("../utils/inputValidation");
8
+ var constants_1 = require("../utils/constants");
9
+ var mode_1 = require("../utils/settingsValidation/mode");
10
+ /**
11
+ * Creates a standalone `track` function with input validation.
12
+ * Reusable by FF SDK client, Configs SDK, and thin-client SDK.
13
+ */
14
+ function trackMethodFactory(params, warnTTExistence) {
15
+ if (warnTTExistence === void 0) { warnTTExistence = true; }
16
+ var settings = params.settings, definitions = params.storage.definitions, telemetryTracker = params.telemetryTracker, eventTracker = params.eventTracker, readinessManager = params.sdkReadinessManager.readinessManager;
17
+ var log = settings.log, mode = settings.mode;
18
+ var isAsync = (0, mode_1.isConsumerMode)(mode);
19
+ return function track(maybeKey, maybeTT, maybeEvent, maybeEventValue, maybeProperties) {
20
+ // Input validation
21
+ var key = (0, inputValidation_1.validateKey)(log, maybeKey, constants_1.TRACK_FN_LABEL);
22
+ var trafficTypeName = (0, inputValidation_1.validateTrafficType)(log, maybeTT, constants_1.TRACK_FN_LABEL);
23
+ var eventTypeId = (0, inputValidation_1.validateEvent)(log, maybeEvent, constants_1.TRACK_FN_LABEL);
24
+ var value = (0, inputValidation_1.validateEventValue)(log, maybeEventValue, constants_1.TRACK_FN_LABEL);
25
+ var _a = (0, inputValidation_1.validateEventProperties)(log, maybeProperties, constants_1.TRACK_FN_LABEL), properties = _a.properties, size = _a.size;
26
+ var isNotDestroyed = (0, inputValidation_1.validateIfNotDestroyed)(log, readinessManager, constants_1.TRACK_FN_LABEL);
27
+ if (!(isNotDestroyed && key && trafficTypeName && eventTypeId && value !== false && properties !== false)) {
28
+ return isAsync ? Promise.resolve(false) : false;
29
+ }
30
+ // Core logic
31
+ var stopTelemetryTracker = telemetryTracker.trackEval(constants_1.TRACK);
32
+ var eventData = {
33
+ eventTypeId: eventTypeId,
34
+ trafficTypeName: trafficTypeName,
35
+ value: value,
36
+ timestamp: Date.now(),
37
+ key: (0, key_1.getMatching)(key),
38
+ properties: properties
39
+ };
40
+ // 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.
41
+ if (warnTTExistence)
42
+ (0, trafficTypeExistence_1.validateTrafficTypeExistence)(log, readinessManager, definitions, mode, trafficTypeName, constants_1.TRACK_FN_LABEL);
43
+ var result = eventTracker.track(eventData, size);
44
+ if ((0, thenable_1.thenable)(result)) {
45
+ return result.then(function (result) {
46
+ stopTelemetryTracker();
47
+ return result;
48
+ });
49
+ }
50
+ else {
51
+ stopTelemetryTracker();
52
+ return result;
53
+ }
54
+ };
55
+ }
56
+ exports.trackMethodFactory = trackMethodFactory;