@splitsoftware/splitio-commons 1.3.1 → 1.3.2-rc.2

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 (219) hide show
  1. package/cjs/consent/sdkUserConsent.js +1 -1
  2. package/cjs/listeners/browser.js +5 -4
  3. package/cjs/logger/constants.js +2 -1
  4. package/cjs/logger/messages/error.js +2 -1
  5. package/cjs/logger/messages/info.js +3 -3
  6. package/cjs/logger/messages/warn.js +2 -2
  7. package/cjs/sdkClient/client.js +17 -3
  8. package/cjs/sdkClient/sdkClient.js +4 -1
  9. package/cjs/sdkFactory/index.js +16 -19
  10. package/cjs/services/splitApi.js +15 -14
  11. package/cjs/services/splitHttpClient.js +4 -1
  12. package/cjs/storages/AbstractSegmentsCacheSync.js +0 -5
  13. package/cjs/storages/KeyBuilderSS.js +12 -19
  14. package/cjs/storages/findLatencyIndex.js +11 -6
  15. package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +13 -1
  16. package/cjs/storages/inLocalStorage/index.js +4 -1
  17. package/cjs/storages/inMemory/InMemoryStorage.js +2 -0
  18. package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -0
  19. package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +6 -0
  20. package/cjs/storages/inMemory/SegmentsCacheInMemory.js +6 -0
  21. package/cjs/storages/inMemory/TelemetryCacheInMemory.js +165 -0
  22. package/cjs/storages/inRedis/TelemetryCacheInRedis.js +29 -0
  23. package/cjs/storages/inRedis/index.js +2 -4
  24. package/cjs/storages/pluggable/TelemetryCachePluggable.js +27 -0
  25. package/cjs/storages/pluggable/index.js +2 -1
  26. package/cjs/sync/polling/pollingManagerCS.js +1 -1
  27. package/cjs/sync/polling/syncTasks/splitsSyncTask.js +2 -2
  28. package/cjs/sync/polling/updaters/mySegmentsUpdater.js +0 -3
  29. package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -8
  30. package/cjs/sync/polling/updaters/splitChangesUpdater.js +3 -6
  31. package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +20 -13
  32. package/cjs/sync/streaming/SSEHandler/index.js +21 -15
  33. package/cjs/sync/streaming/pushManager.js +7 -4
  34. package/cjs/sync/submitters/eventsSubmitter.js +28 -0
  35. package/cjs/sync/submitters/{impressionCountsSyncTask.js → impressionCountsSubmitter.js} +10 -7
  36. package/cjs/sync/submitters/{impressionsSyncTask.js → impressionsSubmitter.js} +8 -8
  37. package/cjs/sync/submitters/submitter.js +66 -0
  38. package/cjs/sync/submitters/submitterManager.js +12 -10
  39. package/cjs/sync/submitters/telemetrySubmitter.js +128 -0
  40. package/cjs/sync/syncManagerOnline.js +6 -2
  41. package/cjs/trackers/eventTracker.js +5 -1
  42. package/cjs/trackers/impressionsTracker.js +9 -1
  43. package/cjs/trackers/telemetryTracker.js +65 -0
  44. package/cjs/utils/constants/index.js +40 -1
  45. package/cjs/utils/inputValidation/apiKey.js +12 -11
  46. package/cjs/utils/settingsValidation/index.js +35 -11
  47. package/cjs/utils/settingsValidation/url.js +4 -0
  48. package/cjs/utils/timeTracker/index.js +1 -0
  49. package/cjs/utils/timeTracker/timer.js +2 -2
  50. package/esm/consent/sdkUserConsent.js +1 -1
  51. package/esm/listeners/browser.js +3 -2
  52. package/esm/logger/constants.js +1 -0
  53. package/esm/logger/messages/error.js +2 -1
  54. package/esm/logger/messages/info.js +3 -3
  55. package/esm/logger/messages/warn.js +2 -2
  56. package/esm/sdkClient/client.js +18 -4
  57. package/esm/sdkClient/sdkClient.js +4 -1
  58. package/esm/sdkFactory/index.js +16 -19
  59. package/esm/services/splitApi.js +15 -14
  60. package/esm/services/splitHttpClient.js +4 -1
  61. package/esm/storages/AbstractSegmentsCacheSync.js +0 -5
  62. package/esm/storages/KeyBuilderSS.js +12 -19
  63. package/esm/storages/findLatencyIndex.js +11 -6
  64. package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +13 -1
  65. package/esm/storages/inLocalStorage/index.js +5 -2
  66. package/esm/storages/inMemory/InMemoryStorage.js +3 -1
  67. package/esm/storages/inMemory/InMemoryStorageCS.js +4 -1
  68. package/esm/storages/inMemory/MySegmentsCacheInMemory.js +6 -0
  69. package/esm/storages/inMemory/SegmentsCacheInMemory.js +6 -0
  70. package/esm/storages/inMemory/TelemetryCacheInMemory.js +161 -0
  71. package/esm/storages/inRedis/TelemetryCacheInRedis.js +26 -0
  72. package/esm/storages/inRedis/index.js +2 -4
  73. package/esm/storages/pluggable/TelemetryCachePluggable.js +24 -0
  74. package/esm/storages/pluggable/index.js +2 -1
  75. package/esm/sync/polling/pollingManagerCS.js +1 -1
  76. package/esm/sync/polling/syncTasks/splitsSyncTask.js +2 -2
  77. package/esm/sync/polling/updaters/mySegmentsUpdater.js +0 -3
  78. package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -8
  79. package/esm/sync/polling/updaters/splitChangesUpdater.js +3 -6
  80. package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +8 -1
  81. package/esm/sync/streaming/SSEHandler/index.js +21 -15
  82. package/esm/sync/streaming/pushManager.js +7 -4
  83. package/esm/sync/submitters/eventsSubmitter.js +24 -0
  84. package/esm/sync/submitters/{impressionCountsSyncTask.js → impressionCountsSubmitter.js} +8 -5
  85. package/esm/sync/submitters/{impressionsSyncTask.js → impressionsSubmitter.js} +6 -6
  86. package/esm/sync/submitters/submitter.js +61 -0
  87. package/esm/sync/submitters/submitterManager.js +12 -10
  88. package/esm/sync/submitters/telemetrySubmitter.js +122 -0
  89. package/esm/sync/syncManagerOnline.js +6 -2
  90. package/esm/trackers/eventTracker.js +6 -2
  91. package/esm/trackers/impressionsTracker.js +10 -2
  92. package/esm/trackers/telemetryTracker.js +61 -0
  93. package/esm/utils/constants/index.js +38 -0
  94. package/esm/utils/inputValidation/apiKey.js +2 -1
  95. package/esm/utils/settingsValidation/index.js +34 -10
  96. package/esm/utils/settingsValidation/url.js +4 -0
  97. package/esm/utils/timeTracker/index.js +1 -0
  98. package/esm/utils/timeTracker/timer.js +2 -2
  99. package/package.json +1 -1
  100. package/src/consent/sdkUserConsent.ts +1 -1
  101. package/src/listeners/browser.ts +3 -2
  102. package/src/logger/constants.ts +1 -0
  103. package/src/logger/messages/error.ts +2 -1
  104. package/src/logger/messages/info.ts +3 -3
  105. package/src/logger/messages/warn.ts +2 -2
  106. package/src/sdkClient/client.ts +23 -4
  107. package/src/sdkClient/sdkClient.ts +4 -1
  108. package/src/sdkFactory/index.ts +22 -24
  109. package/src/sdkFactory/types.ts +32 -15
  110. package/src/services/splitApi.ts +17 -14
  111. package/src/services/splitHttpClient.ts +6 -3
  112. package/src/services/types.ts +7 -5
  113. package/src/storages/AbstractSegmentsCacheSync.ts +8 -3
  114. package/src/storages/KeyBuilderSS.ts +13 -50
  115. package/src/storages/findLatencyIndex.ts +12 -3
  116. package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +13 -1
  117. package/src/storages/inLocalStorage/index.ts +5 -2
  118. package/src/storages/inMemory/InMemoryStorage.ts +3 -1
  119. package/src/storages/inMemory/InMemoryStorageCS.ts +4 -1
  120. package/src/storages/inMemory/MySegmentsCacheInMemory.ts +8 -0
  121. package/src/storages/inMemory/SegmentsCacheInMemory.ts +6 -0
  122. package/src/storages/inMemory/TelemetryCacheInMemory.ts +210 -0
  123. package/src/storages/inRedis/TelemetryCacheInRedis.ts +29 -0
  124. package/src/storages/inRedis/index.ts +2 -4
  125. package/src/storages/pluggable/TelemetryCachePluggable.ts +26 -0
  126. package/src/storages/pluggable/index.ts +2 -1
  127. package/src/storages/types.ts +84 -32
  128. package/src/sync/offline/syncManagerOffline.ts +4 -3
  129. package/src/sync/polling/pollingManagerCS.ts +3 -3
  130. package/src/sync/polling/pollingManagerSS.ts +2 -2
  131. package/src/sync/polling/syncTasks/splitsSyncTask.ts +2 -0
  132. package/src/sync/polling/updaters/mySegmentsUpdater.ts +0 -4
  133. package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -10
  134. package/src/sync/polling/updaters/splitChangesUpdater.ts +3 -6
  135. package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +11 -1
  136. package/src/sync/streaming/SSEHandler/index.ts +21 -14
  137. package/src/sync/streaming/pushManager.ts +11 -7
  138. package/src/sync/submitters/eventsSubmitter.ts +35 -0
  139. package/src/sync/submitters/{impressionCountsSyncTask.ts → impressionCountsSubmitter.ts} +15 -15
  140. package/src/sync/submitters/{impressionsSyncTask.ts → impressionsSubmitter.ts} +12 -16
  141. package/src/sync/submitters/{submitterSyncTask.ts → submitter.ts} +34 -16
  142. package/src/sync/submitters/submitterManager.ts +14 -11
  143. package/src/sync/submitters/telemetrySubmitter.ts +143 -0
  144. package/src/sync/submitters/types.ts +123 -0
  145. package/src/sync/syncManagerOnline.ts +13 -7
  146. package/src/sync/types.ts +0 -15
  147. package/src/trackers/eventTracker.ts +7 -3
  148. package/src/trackers/impressionsTracker.ts +11 -3
  149. package/src/trackers/telemetryTracker.ts +63 -0
  150. package/src/trackers/types.ts +24 -0
  151. package/src/types.ts +35 -6
  152. package/src/utils/constants/index.ts +45 -0
  153. package/src/utils/inputValidation/apiKey.ts +2 -1
  154. package/src/utils/settingsValidation/index.ts +35 -11
  155. package/src/utils/settingsValidation/url.ts +4 -0
  156. package/src/utils/timeTracker/index.ts +1 -1
  157. package/src/utils/timeTracker/timer.ts +3 -3
  158. package/types/logger/constants.d.ts +1 -0
  159. package/types/sdkFactory/types.d.ts +29 -14
  160. package/types/services/splitApi.d.ts +2 -1
  161. package/types/services/types.d.ts +8 -5
  162. package/types/storages/AbstractSegmentsCacheSync.d.ts +7 -3
  163. package/types/storages/KeyBuilderSS.d.ts +3 -3
  164. package/types/storages/findLatencyIndex.d.ts +7 -1
  165. package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -0
  166. package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +2 -0
  167. package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -0
  168. package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -2
  169. package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +3 -3
  170. package/types/storages/pluggable/TelemetryCachePluggable.d.ts +2 -2
  171. package/types/storages/types.d.ts +71 -22
  172. package/types/sync/offline/syncManagerOffline.d.ts +3 -2
  173. package/types/sync/polling/pollingManagerCS.d.ts +2 -2
  174. package/types/sync/polling/pollingManagerSS.d.ts +2 -2
  175. package/types/sync/polling/syncTasks/splitsSyncTask.d.ts +1 -1
  176. package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -1
  177. package/types/sync/streaming/SSEHandler/NotificationKeeper.d.ts +2 -1
  178. package/types/sync/streaming/SSEHandler/index.d.ts +2 -1
  179. package/types/sync/streaming/pushManager.d.ts +2 -2
  180. package/types/sync/submitters/eventsSubmitter.d.ts +5 -0
  181. package/types/sync/submitters/impressionCountsSubmitter.d.ts +10 -0
  182. package/types/sync/submitters/impressionsSubmitter.d.ts +11 -0
  183. package/types/sync/submitters/submitter.d.ts +12 -0
  184. package/types/sync/submitters/submitterManager.d.ts +2 -2
  185. package/types/sync/submitters/telemetrySubmitter.d.ts +24 -0
  186. package/types/sync/submitters/telemetrySyncTask.d.ts +0 -27
  187. package/types/sync/submitters/types.d.ts +107 -0
  188. package/types/sync/syncManagerOnline.d.ts +3 -2
  189. package/types/sync/types.d.ts +0 -13
  190. package/types/trackers/eventTracker.d.ts +2 -2
  191. package/types/trackers/impressionsTracker.d.ts +2 -2
  192. package/types/trackers/telemetryTracker.d.ts +2 -3
  193. package/types/trackers/types.d.ts +22 -0
  194. package/types/types.d.ts +33 -4
  195. package/types/utils/constants/index.d.ts +37 -0
  196. package/types/utils/inputValidation/apiKey.d.ts +1 -0
  197. package/types/utils/settingsValidation/index.d.ts +40 -0
  198. package/types/utils/timeTracker/index.d.ts +1 -1
  199. package/types/utils/timeTracker/timer.d.ts +1 -1
  200. package/cjs/storages/inMemory/CountsCacheInMemory.js +0 -38
  201. package/cjs/storages/inMemory/LatenciesCacheInMemory.js +0 -43
  202. package/cjs/storages/inRedis/CountsCacheInRedis.js +0 -16
  203. package/cjs/storages/inRedis/LatenciesCacheInRedis.js +0 -18
  204. package/cjs/sync/submitters/eventsSyncTask.js +0 -44
  205. package/cjs/sync/submitters/metricsSyncTask.js +0 -31
  206. package/cjs/sync/submitters/submitterSyncTask.js +0 -44
  207. package/esm/storages/inMemory/CountsCacheInMemory.js +0 -35
  208. package/esm/storages/inMemory/LatenciesCacheInMemory.js +0 -40
  209. package/esm/storages/inRedis/CountsCacheInRedis.js +0 -13
  210. package/esm/storages/inRedis/LatenciesCacheInRedis.js +0 -15
  211. package/esm/sync/submitters/eventsSyncTask.js +0 -40
  212. package/esm/sync/submitters/metricsSyncTask.js +0 -26
  213. package/esm/sync/submitters/submitterSyncTask.js +0 -40
  214. package/src/storages/inMemory/CountsCacheInMemory.ts +0 -37
  215. package/src/storages/inMemory/LatenciesCacheInMemory.ts +0 -45
  216. package/src/storages/inRedis/CountsCacheInRedis.ts +0 -20
  217. package/src/storages/inRedis/LatenciesCacheInRedis.ts +0 -23
  218. package/src/sync/submitters/eventsSyncTask.ts +0 -57
  219. package/src/sync/submitters/metricsSyncTask.ts +0 -49
@@ -23,7 +23,7 @@ function createUserConsentAPI(params) {
23
23
  var _a, _b;
24
24
  // validate input param
25
25
  if (!(0, lang_1.isBoolean)(consent)) {
26
- log.warn(constants_1.ERROR_NOT_BOOLEAN, ['setUserConsent']);
26
+ log.warn(constants_1.ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
27
27
  return false;
28
28
  }
29
29
  var newConsentStatus = consent ? constants_2.CONSENT_GRANTED : constants_2.CONSENT_DECLINED;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrowserSignalListener = void 0;
4
- var impressionsSyncTask_1 = require("../sync/submitters/impressionsSyncTask");
5
- var impressionCountsSyncTask_1 = require("../sync/submitters/impressionCountsSyncTask");
4
+ var impressionsSubmitter_1 = require("../sync/submitters/impressionsSubmitter");
5
+ var impressionCountsSubmitter_1 = require("../sync/submitters/impressionCountsSubmitter");
6
6
  var constants_1 = require("../utils/constants");
7
7
  var objectAssign_1 = require("../utils/lang/objectAssign");
8
8
  var constants_2 = require("../logger/constants");
@@ -20,7 +20,7 @@ var BrowserSignalListener = /** @class */ (function () {
20
20
  this.storage = storage;
21
21
  this.serviceApi = serviceApi;
22
22
  this.flushData = this.flushData.bind(this);
23
- this.fromImpressionsCollector = impressionsSyncTask_1.fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled);
23
+ this.fromImpressionsCollector = impressionsSubmitter_1.fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled);
24
24
  }
25
25
  /**
26
26
  * start method.
@@ -62,7 +62,8 @@ var BrowserSignalListener = /** @class */ (function () {
62
62
  this._flushData(eventsUrl + '/testImpressions/beacon', this.storage.impressions, this.serviceApi.postTestImpressionsBulk, this.fromImpressionsCollector, extraMetadata);
63
63
  this._flushData(eventsUrl + '/events/beacon', this.storage.events, this.serviceApi.postEventsBulk);
64
64
  if (this.storage.impressionCounts)
65
- this._flushData(eventsUrl + '/testImpressions/count/beacon', this.storage.impressionCounts, this.serviceApi.postTestImpressionsCount, impressionCountsSyncTask_1.fromImpressionCountsCollector);
65
+ this._flushData(eventsUrl + '/testImpressions/count/beacon', this.storage.impressionCounts, this.serviceApi.postTestImpressionsCount, impressionCountsSubmitter_1.fromImpressionCountsCollector);
66
+ // No beacon endpoint for `/metrics/usage`
66
67
  }
67
68
  // Close streaming connection
68
69
  if (this.syncManager.pushManager)
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SYNC_SPLITS_FETCH_RETRY = exports.POLLING_STOP = exports.POLLING_START = exports.POLLING_SMART_PAUSING = exports.NEW_FACTORY = exports.NEW_SHARED_CLIENT = exports.IMPRESSION_QUEUEING = exports.IMPRESSION = exports.CLIENT_READY = exports.CLIENT_READY_FROM_CACHE = exports.SETTINGS_SPLITS_FILTER = exports.SYNC_TASK_STOP = exports.SYNC_TASK_EXECUTE = exports.SYNC_TASK_START = exports.STREAMING_NEW_MESSAGE = exports.SYNC_SPLITS_SEGMENTS = exports.SYNC_SPLITS_REMOVED = exports.SYNC_SPLITS_NEW = exports.SYNC_SPLITS_FETCH = exports.SYNC_OFFLINE_DATA = exports.RETRIEVE_MANAGER = exports.RETRIEVE_CLIENT_EXISTING = exports.RETRIEVE_CLIENT_DEFAULT = exports.CLEANUP_DEREGISTERING = exports.CLEANUP_REGISTERING = exports.ENGINE_SANITIZE = exports.ENGINE_VALUE = exports.ENGINE_MATCHER_WHITELIST = exports.ENGINE_MATCHER_STARTS_WITH = exports.ENGINE_MATCHER_STRING_INVALID = exports.ENGINE_MATCHER_STRING = exports.ENGINE_MATCHER_SEGMENT = exports.ENGINE_MATCHER_PART_OF = exports.ENGINE_MATCHER_LESS = exports.ENGINE_MATCHER_GREATER = exports.ENGINE_MATCHER_ENDS_WITH = exports.ENGINE_MATCHER_EQUAL_TO_SET = exports.ENGINE_MATCHER_EQUAL = exports.ENGINE_MATCHER_DEPENDENCY_PRE = exports.ENGINE_MATCHER_DEPENDENCY = exports.ENGINE_MATCHER_CONTAINS_STRING = exports.ENGINE_MATCHER_CONTAINS_ANY = exports.ENGINE_MATCHER_CONTAINS_ALL = exports.ENGINE_MATCHER_BOOLEAN = exports.ENGINE_MATCHER_BETWEEN = exports.ENGINE_MATCHER_ALL = exports.ENGINE_BUCKET = exports.ENGINE_COMBINER_IFELSEIF_NO_TREATMENT = exports.ENGINE_COMBINER_IFELSEIF = exports.ENGINE_COMBINER_AND = void 0;
4
4
  exports.ERROR_EVENT_TYPE_FORMAT = exports.ERROR_EVENTS_TRACKER = exports.ERROR_IMPRESSIONS_LISTENER = exports.ERROR_IMPRESSIONS_TRACKER = exports.ERROR_STREAMING_AUTH = exports.ERROR_STREAMING_SSE = exports.ERROR_SYNC_OFFLINE_LOADING = exports.ERROR_CLIENT_CANNOT_GET_READY = exports.ERROR_CLIENT_LISTENER = exports.ERROR_LOGLEVEL_INVALID = exports.ERROR_ENGINE_COMBINER_IFELSEIF = exports.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2 = exports.WARN_API_KEY = exports.WARN_SPLITS_FILTER_EMPTY = exports.WARN_SPLITS_FILTER_INVALID = exports.WARN_SPLITS_FILTER_IGNORED = exports.WARN_INTEGRATION_INVALID = exports.WARN_NOT_EXISTENT_TT = exports.WARN_LOWERCASE_TRAFFIC_TYPE = exports.WARN_NOT_EXISTENT_SPLIT = exports.WARN_TRIMMING = exports.WARN_CONVERTING = exports.WARN_TRIMMING_PROPERTIES = exports.WARN_SETTING_NULL = exports.SUBMITTERS_PUSH_RETRY = exports.SUBMITTERS_PUSH_FAILS = exports.STREAMING_FALLBACK = exports.STREAMING_PARSING_MESSAGE_FAILS = exports.STREAMING_PARSING_ERROR_FAILS = exports.SYNC_SPLITS_FETCH_FAILS = exports.SYNC_MYSEGMENTS_FETCH_RETRY = exports.CLIENT_NOT_READY = exports.CLIENT_NO_LISTENER = exports.ENGINE_VALUE_NO_ATTRIBUTES = exports.ENGINE_VALUE_INVALID = exports.USER_CONSENT_INITIAL = exports.USER_CONSENT_NOT_UPDATED = exports.USER_CONSENT_UPDATED = exports.IMPRESSIONS_TRACKER_SUCCESS = exports.EVENTS_TRACKER_SUCCESS = exports.SYNC_STOP_POLLING = exports.SYNC_CONTINUE_POLLING = exports.SYNC_START_POLLING = exports.SUBMITTERS_PUSH = exports.SUBMITTERS_PUSH_FULL_QUEUE = exports.STREAMING_DISCONNECTING = exports.STREAMING_DISABLED = exports.STREAMING_CONNECTING = exports.STREAMING_RECONNECT = exports.STREAMING_REFRESH_TOKEN = void 0;
5
- exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = void 0;
5
+ exports.LOG_PREFIX_CLEANUP = exports.LOG_PREFIX_EVENTS_TRACKER = exports.LOG_PREFIX_IMPRESSIONS_TRACKER = exports.LOG_PREFIX_SYNC_SUBMITTERS = exports.LOG_PREFIX_SYNC_POLLING = exports.LOG_PREFIX_SYNC_MYSEGMENTS = exports.LOG_PREFIX_SYNC_SEGMENTS = exports.LOG_PREFIX_SYNC_SPLITS = exports.LOG_PREFIX_SYNC_STREAMING = exports.LOG_PREFIX_SYNC_OFFLINE = exports.LOG_PREFIX_SYNC_MANAGER = exports.LOG_PREFIX_SYNC = exports.LOG_PREFIX_ENGINE_VALUE = exports.LOG_PREFIX_ENGINE_MATCHER = exports.LOG_PREFIX_ENGINE_COMBINER = exports.LOG_PREFIX_ENGINE = exports.LOG_PREFIX_INSTANTIATION = exports.LOG_PREFIX_SETTINGS = exports.ERROR_MIN_CONFIG_PARAM = exports.ERROR_NOT_BOOLEAN = exports.ERROR_STORAGE_INVALID = exports.ERROR_LOCALHOST_MODULE_REQUIRED = exports.ERROR_HTTP = exports.ERROR_INVALID_CONFIG_PARAM = exports.ERROR_EMPTY_ARRAY = exports.ERROR_EMPTY = exports.ERROR_INVALID = exports.ERROR_INVALID_KEY_OBJECT = exports.ERROR_TOO_LONG = exports.ERROR_NULL = exports.ERROR_CLIENT_DESTROYED = exports.ERROR_NOT_FINITE = exports.ERROR_SIZE_EXCEEDED = exports.ERROR_NOT_PLAIN_OBJECT = void 0;
6
6
  /**
7
7
  * Message codes used to trim string log messages from commons and client-side API modules,
8
8
  * in order to reduce the minimal SDK size for Browser and eventually other client-side environments.
@@ -125,6 +125,7 @@ exports.ERROR_HTTP = 322;
125
125
  exports.ERROR_LOCALHOST_MODULE_REQUIRED = 323;
126
126
  exports.ERROR_STORAGE_INVALID = 324;
127
127
  exports.ERROR_NOT_BOOLEAN = 325;
128
+ exports.ERROR_MIN_CONFIG_PARAM = 326;
128
129
  // Log prefixes (a.k.a. tags or categories)
129
130
  exports.LOG_PREFIX_SETTINGS = 'settings';
130
131
  exports.LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
@@ -35,5 +35,6 @@ exports.codesError = [
35
35
  // initialization / settings validation
36
36
  [c.ERROR_INVALID_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': you passed an invalid "%s" config param. It should be one of the following values: %s. Defaulting to "%s".'],
37
37
  [c.ERROR_LOCALHOST_MODULE_REQUIRED, c.LOG_PREFIX_SETTINGS + ': an invalid value was received for "sync.localhostMode" config. A valid entity should be provided for localhost mode.'],
38
- [c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS + ': The provided storage is invalid.%s Fallbacking into default MEMORY storage'],
38
+ [c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS + ': the provided storage is invalid.%s Falling back into default MEMORY storage'],
39
+ [c.ERROR_MIN_CONFIG_PARAM, c.LOG_PREFIX_SETTINGS + ': the provided "%s" config param is lower than allowed. Setting to the minimum value %s seconds'],
39
40
  ];
@@ -16,8 +16,8 @@ exports.codesInfo = warn_1.codesWarn.concat([
16
16
  [c.NEW_FACTORY, 'New Split SDK instance created.'],
17
17
  [c.EVENTS_TRACKER_SUCCESS, c.LOG_PREFIX_EVENTS_TRACKER + 'Successfully queued %s'],
18
18
  [c.IMPRESSIONS_TRACKER_SUCCESS, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Successfully stored %s impression(s).'],
19
- [c.USER_CONSENT_UPDATED, 'setUserConsent: consent status changed from %s to %s.'],
20
- [c.USER_CONSENT_NOT_UPDATED, 'setUserConsent: call had no effect because it was the current consent status (%s).'],
19
+ [c.USER_CONSENT_UPDATED, 'UserConsent: consent status changed from %s to %s.'],
20
+ [c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
21
21
  [c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
22
22
  // synchronizer
23
23
  [c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
@@ -25,7 +25,7 @@ exports.codesInfo = warn_1.codesWarn.concat([
25
25
  [c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
26
26
  [c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of splits #%s. Reason: %s'],
27
27
  [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
28
- [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s %s.'],
28
+ [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
29
29
  [c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
30
30
  [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
31
31
  [c.STREAMING_CONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Connecting streaming.'],
@@ -14,8 +14,8 @@ exports.codesWarn = error_1.codesError.concat([
14
14
  [c.STREAMING_PARSING_ERROR_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE error notification: %s'],
15
15
  [c.STREAMING_PARSING_MESSAGE_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE message notification: %s'],
16
16
  [c.STREAMING_FALLBACK, c.LOG_PREFIX_SYNC_STREAMING + 'Falling back to polling mode. Reason: %s'],
17
- [c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Droping %s %s after retry. Reason: %s.'],
18
- [c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s %s, keeping data to retry on next iteration. Reason: %s.'],
17
+ [c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Droping %s after retry. Reason: %s.'],
18
+ [c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s, keeping data to retry on next iteration. Reason: %s.'],
19
19
  // client status
20
20
  [c.CLIENT_NOT_READY, '%s: the SDK is not ready, results may be incorrect. Make sure to wait for SDK readiness before using this method.'],
21
21
  [c.CLIENT_NO_LISTENER, 'No listeners for SDK Readiness detected. Incorrect control treatments could have been logged if you called getTreatment/s while the SDK was not yet ready.'],
@@ -12,16 +12,17 @@ var constants_2 = require("../logger/constants");
12
12
  /**
13
13
  * Creator of base client with getTreatments and track methods.
14
14
  */
15
- // @TODO missing time tracking to collect telemetry
16
15
  function clientFactory(params) {
17
- var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, eventTracker = params.eventTracker;
16
+ var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, eventTracker = params.eventTracker, telemetryTracker = params.telemetryTracker;
18
17
  var log = settings.log, mode = settings.mode;
19
18
  function getTreatment(key, splitName, attributes, withConfig) {
20
19
  if (withConfig === void 0) { withConfig = false; }
20
+ var stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? constants_1.TREATMENT_WITH_CONFIG : constants_1.TREATMENT);
21
21
  var wrapUp = function (evaluationResult) {
22
22
  var queue = [];
23
23
  var treatment = processEvaluation(evaluationResult, splitName, key, attributes, withConfig, "getTreatment" + (withConfig ? 'withConfig' : ''), queue);
24
24
  impressionsTracker.track(queue, attributes);
25
+ stopTelemetryTracker(queue[0] && queue[0].label);
25
26
  return treatment;
26
27
  };
27
28
  var evaluation = (0, evaluator_1.evaluateFeature)(log, key, splitName, attributes, storage);
@@ -32,6 +33,7 @@ function clientFactory(params) {
32
33
  }
33
34
  function getTreatments(key, splitNames, attributes, withConfig) {
34
35
  if (withConfig === void 0) { withConfig = false; }
36
+ var stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? constants_1.TREATMENTS_WITH_CONFIG : constants_1.TREATMENTS);
35
37
  var wrapUp = function (evaluationResults) {
36
38
  var queue = [];
37
39
  var treatments = {};
@@ -39,6 +41,7 @@ function clientFactory(params) {
39
41
  treatments[splitName] = processEvaluation(evaluationResults[splitName], splitName, key, attributes, withConfig, "getTreatments" + (withConfig ? 'withConfig' : ''), queue);
40
42
  });
41
43
  impressionsTracker.track(queue, attributes);
44
+ stopTelemetryTracker(queue[0] && queue[0].label);
42
45
  return treatments;
43
46
  };
44
47
  var evaluations = (0, evaluator_1.evaluateFeatures)(log, key, splitNames, attributes, storage);
@@ -80,6 +83,7 @@ function clientFactory(params) {
80
83
  }
81
84
  function track(key, trafficTypeName, eventTypeId, value, properties, size) {
82
85
  if (size === void 0) { size = 1024; }
86
+ var stopTelemetryTracker = telemetryTracker.trackEval(constants_1.TRACK);
83
87
  var matchingKey = (0, key_1.getMatching)(key);
84
88
  var timestamp = Date.now();
85
89
  var eventData = {
@@ -92,7 +96,17 @@ function clientFactory(params) {
92
96
  };
93
97
  // 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.
94
98
  (0, trafficTypeExistance_1.validateTrafficTypeExistance)(log, readinessManager, storage.splits, mode, trafficTypeName, 'track');
95
- return eventTracker.track(eventData, size);
99
+ var result = eventTracker.track(eventData, size);
100
+ if ((0, thenable_1.thenable)(result)) {
101
+ return result.then(function (result) {
102
+ stopTelemetryTracker();
103
+ return result;
104
+ });
105
+ }
106
+ else {
107
+ stopTelemetryTracker();
108
+ return result;
109
+ }
96
110
  }
97
111
  return {
98
112
  getTreatment: getTreatment,
@@ -9,7 +9,7 @@ var clientInputValidation_1 = require("./clientInputValidation");
9
9
  * Creates an Sdk client, i.e., a base client with status and destroy interface
10
10
  */
11
11
  function sdkClientFactory(params, isSharedClient) {
12
- var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, signalListener = params.signalListener, settings = params.settings;
12
+ var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, signalListener = params.signalListener, settings = params.settings, telemetryTracker = params.telemetryTracker;
13
13
  return (0, objectAssign_1.objectAssign)(
14
14
  // Proto-linkage of the readiness Event Emitter
15
15
  Object.create(sdkReadinessManager.sdkStatus),
@@ -18,6 +18,9 @@ function sdkClientFactory(params, isSharedClient) {
18
18
  // Sdk destroy
19
19
  {
20
20
  destroy: function () {
21
+ // record stat before flushing data
22
+ if (!isSharedClient)
23
+ telemetryTracker.sessionLength();
21
24
  // Stop background jobs
22
25
  syncManager && syncManager.stop();
23
26
  var flush = syncManager ? syncManager.flush() : Promise.resolve();
@@ -4,6 +4,7 @@ exports.sdkFactory = void 0;
4
4
  var sdkReadinessManager_1 = require("../readiness/sdkReadinessManager");
5
5
  var impressionsTracker_1 = require("../trackers/impressionsTracker");
6
6
  var eventTracker_1 = require("../trackers/eventTracker");
7
+ var telemetryTracker_1 = require("../trackers/telemetryTracker");
7
8
  var key_1 = require("../utils/key");
8
9
  var utils_1 = require("../trackers/impressionObserver/utils");
9
10
  var apiKey_1 = require("../utils/inputValidation/apiKey");
@@ -18,12 +19,12 @@ var objectAssign_1 = require("../utils/lang/objectAssign");
18
19
  function sdkFactory(params) {
19
20
  var settings = params.settings, platform = params.platform, storageFactory = params.storageFactory, splitApiFactory = params.splitApiFactory, extraProps = params.extraProps, syncManagerFactory = params.syncManagerFactory, SignalListener = params.SignalListener, impressionsObserverFactory = params.impressionsObserverFactory, integrationsManagerFactory = params.integrationsManagerFactory, sdkManagerFactory = params.sdkManagerFactory, sdkClientMethodFactory = params.sdkClientMethodFactory;
20
21
  var log = settings.log;
21
- // @TODO handle non-recoverable errors: not start sync, mark the SDK as destroyed, etc.
22
+ // @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid API Key, etc.
23
+ // On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
22
24
  // We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
23
25
  (0, apiKey_1.validateAndTrackApiKey)(log, settings.core.authorizationKey);
24
- // @TODO handle non-recoverable error, such as, `fetch` api not available, invalid API Key, etc.
25
26
  var sdkReadinessManager = (0, sdkReadinessManager_1.sdkReadinessManagerFactory)(log, platform.EventEmitter, settings.startup.readyTimeout);
26
- var readinessManager = sdkReadinessManager.readinessManager;
27
+ var readiness = sdkReadinessManager.readinessManager;
27
28
  // @TODO consider passing the settings object, so that each storage access only what it needs
28
29
  var storageFactoryParams = {
29
30
  impressionsQueueSize: settings.scheduler.impressionsQueueSize,
@@ -39,32 +40,28 @@ function sdkFactory(params) {
39
40
  onReadyCb: function (error) {
40
41
  if (error)
41
42
  return; // Don't emit SDK_READY if storage failed to connect. Error message is logged by wrapperAdapter
42
- readinessManager.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
43
- readinessManager.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
43
+ readiness.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
44
+ readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
44
45
  },
45
46
  metadata: (0, metadataBuilder_1.metadataBuilder)(settings),
46
47
  log: log
47
48
  };
48
49
  var storage = storageFactory(storageFactoryParams);
49
50
  // @TODO add support for dataloader: `if (params.dataLoader) params.dataLoader(storage);`
50
- // splitApi is used by SyncManager and Browser signal listener
51
- var splitApi = splitApiFactory && splitApiFactory(settings, platform);
52
- var syncManager = syncManagerFactory && syncManagerFactory({
53
- settings: settings,
54
- splitApi: splitApi,
55
- storage: storage,
56
- readiness: sdkReadinessManager.readinessManager,
57
- platform: platform
58
- });
59
51
  var integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings: settings, storage: storage });
60
52
  // trackers
61
53
  var observer = impressionsObserverFactory && impressionsObserverFactory();
62
- var impressionsTracker = (0, impressionsTracker_1.impressionsTrackerFactory)(settings, storage.impressions, integrationsManager, observer, storage.impressionCounts);
63
- var eventTracker = (0, eventTracker_1.eventTrackerFactory)(settings, storage.events, integrationsManager);
64
- // signal listener
54
+ var impressionsTracker = (0, impressionsTracker_1.impressionsTrackerFactory)(settings, storage.impressions, integrationsManager, observer, storage.impressionCounts, storage.telemetry);
55
+ var eventTracker = (0, eventTracker_1.eventTrackerFactory)(settings, storage.events, integrationsManager, storage.telemetry);
56
+ var telemetryTracker = (0, telemetryTracker_1.telemetryTrackerFactory)(storage.telemetry, platform.now);
57
+ // splitApi is used by SyncManager and Browser signal listener
58
+ var splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
59
+ var ctx = { splitApi: splitApi, eventTracker: eventTracker, impressionsTracker: impressionsTracker, telemetryTracker: telemetryTracker, sdkReadinessManager: sdkReadinessManager, readiness: readiness, settings: settings, storage: storage, platform: platform };
60
+ var syncManager = syncManagerFactory && syncManagerFactory(ctx);
61
+ ctx.syncManager = syncManager;
65
62
  var signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
66
- // Sdk client and manager
67
- var ctx = { eventTracker: eventTracker, impressionsTracker: impressionsTracker, sdkReadinessManager: sdkReadinessManager, settings: settings, storage: storage, syncManager: syncManager, signalListener: signalListener };
63
+ ctx.signalListener = signalListener;
64
+ // SDK client and manager
68
65
  var clientMethod = sdkClientMethodFactory(ctx);
69
66
  var managerInstance = sdkManagerFactory(log, storage.splits, sdkReadinessManager);
70
67
  syncManager && syncManager.start();
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.splitApiFactory = void 0;
4
4
  var splitHttpClient_1 = require("./splitHttpClient");
5
5
  var objectAssign_1 = require("../utils/lang/objectAssign");
6
+ var constants_1 = require("../utils/constants");
6
7
  var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } };
7
8
  function userKeyToQueryParam(userKey) {
8
9
  return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported.
@@ -13,7 +14,7 @@ function userKeyToQueryParam(userKey) {
13
14
  * @param settings validated settings object
14
15
  * @param platform object containing environment-specific `getFetch` and `getOptions` dependencies
15
16
  */
16
- function splitApiFactory(settings, platform) {
17
+ function splitApiFactory(settings, platform, telemetryTracker) {
17
18
  var urls = settings.urls;
18
19
  var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
19
20
  var SplitSDKImpressionsMode = settings.sync.impressionsMode;
@@ -34,15 +35,15 @@ function splitApiFactory(settings, platform) {
34
35
  if (queryParams) // accounting the possibility that `userKeys` and thus `queryParams` are empty
35
36
  url += '?' + queryParams;
36
37
  }
37
- return splitHttpClient(url);
38
+ return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN));
38
39
  },
39
40
  fetchSplitChanges: function (since, noCache) {
40
41
  var url = urls.sdk + "/splitChanges?since=" + since + (filterQueryString || '');
41
- return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
42
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS));
42
43
  },
43
44
  fetchSegmentChanges: function (since, segmentName, noCache) {
44
45
  var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since;
45
- return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
46
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SEGMENT));
46
47
  },
47
48
  fetchMySegments: function (userMatchingKey, noCache) {
48
49
  /**
@@ -52,7 +53,7 @@ function splitApiFactory(settings, platform) {
52
53
  * - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar'
53
54
  */
54
55
  var url = urls.sdk + "/mySegments/" + encodeURIComponent(userMatchingKey);
55
- return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined);
56
+ return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MY_SEGMENT));
56
57
  },
57
58
  /**
58
59
  * Post events.
@@ -62,7 +63,7 @@ function splitApiFactory(settings, platform) {
62
63
  */
63
64
  postEventsBulk: function (body, headers) {
64
65
  var url = urls.events + "/events/bulk";
65
- return splitHttpClient(url, { method: 'POST', body: body, headers: headers });
66
+ return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.EVENTS));
66
67
  },
67
68
  /**
68
69
  * Post impressions.
@@ -77,7 +78,7 @@ function splitApiFactory(settings, platform) {
77
78
  method: 'POST',
78
79
  body: body,
79
80
  headers: (0, objectAssign_1.objectAssign)({ SplitSDKImpressionsMode: SplitSDKImpressionsMode }, headers)
80
- });
81
+ }, telemetryTracker.trackHttp(constants_1.IMPRESSIONS));
81
82
  },
82
83
  /**
83
84
  * Post impressions counts.
@@ -87,15 +88,15 @@ function splitApiFactory(settings, platform) {
87
88
  */
88
89
  postTestImpressionsCount: function (body, headers) {
89
90
  var url = urls.events + "/testImpressions/count";
90
- return splitHttpClient(url, { method: 'POST', body: body, headers: headers });
91
+ return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.IMPRESSIONS_COUNT));
91
92
  },
92
- postMetricsCounters: function (body) {
93
- var url = urls.events + "/metrics/counters";
94
- return splitHttpClient(url, { method: 'POST', body: body }, true);
93
+ postMetricsConfig: function (body) {
94
+ var url = urls.telemetry + "/v1/metrics/config";
95
+ return splitHttpClient(url, { method: 'POST', body: body }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true);
95
96
  },
96
- postMetricsTimes: function (body) {
97
- var url = urls.events + "/metrics/times";
98
- return splitHttpClient(url, { method: 'POST', body: body }, true);
97
+ postMetricsUsage: function (body) {
98
+ var url = urls.telemetry + "/v1/metrics/usage";
99
+ return splitHttpClient(url, { method: 'POST', body: body }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true);
99
100
  }
100
101
  };
101
102
  }
@@ -28,8 +28,9 @@ function splitHttpClientFactory(settings, getFetch, getOptions) {
28
28
  headers['SplitSDKMachineIP'] = ip;
29
29
  if (hostname)
30
30
  headers['SplitSDKMachineName'] = hostname;
31
- return function httpClient(url, reqOpts, logErrorsAsInfo) {
31
+ return function httpClient(url, reqOpts, latencyTracker, logErrorsAsInfo) {
32
32
  if (reqOpts === void 0) { reqOpts = {}; }
33
+ if (latencyTracker === void 0) { latencyTracker = function () { }; }
33
34
  if (logErrorsAsInfo === void 0) { logErrorsAsInfo = false; }
34
35
  var request = (0, objectAssign_1.objectAssign)({
35
36
  headers: reqOpts.headers ? (0, objectAssign_1.objectAssign)({}, headers, reqOpts.headers) : headers,
@@ -43,6 +44,7 @@ function splitHttpClientFactory(settings, getFetch, getOptions) {
43
44
  if (!response.ok) {
44
45
  return response.text().then(function (message) { return Promise.reject({ response: response, message: message }); });
45
46
  }
47
+ latencyTracker();
46
48
  return response;
47
49
  })
48
50
  .catch(function (error) {
@@ -68,6 +70,7 @@ function splitHttpClientFactory(settings, getFetch, getOptions) {
68
70
  var networkError = new Error(msg);
69
71
  // passes `undefined` as statusCode if not an HTTP error (resp === undefined)
70
72
  networkError.statusCode = resp && resp.status;
73
+ latencyTracker(networkError);
71
74
  throw networkError;
72
75
  }) : Promise.reject(new Error(messageNoFetch));
73
76
  };
@@ -13,11 +13,6 @@ var AbstractSegmentsCacheSync = /** @class */ (function () {
13
13
  * For client-side synchronizer: the method is not used.
14
14
  */
15
15
  AbstractSegmentsCacheSync.prototype.registerSegments = function (names) { return false; };
16
- /**
17
- * For server-side synchronizer: get the list of segments in the cache.
18
- * For client-side synchronizer: the method is not used.
19
- */
20
- AbstractSegmentsCacheSync.prototype.getRegisteredSegments = function () { return []; };
21
16
  /**
22
17
  * For server-side synchronizer: set the change number of `name` segment.
23
18
  * For client-side synchronizer: the method is not used.
@@ -3,9 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KeyBuilderSS = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var KeyBuilder_1 = require("./KeyBuilder");
6
- // NOT USED
7
- // const everythingAfterCount = /count\.([^/]+)$/;
8
- // const latencyMetricNameAndBucket = /latency\.([^/]+)\.bucket\.([0-9]+)$/;
6
+ var methodNames = {
7
+ t: 'treatment',
8
+ ts: 'treatments',
9
+ tc: 'treatmentWithConfig',
10
+ tcs: 'treatmentsWithConfig',
11
+ tr: 'track'
12
+ };
9
13
  var KeyBuilderSS = /** @class */ (function (_super) {
10
14
  (0, tslib_1.__extends)(KeyBuilderSS, _super);
11
15
  function KeyBuilderSS(prefix, metadata) {
@@ -17,7 +21,7 @@ var KeyBuilderSS = /** @class */ (function (_super) {
17
21
  return this.prefix + ".segments.registered";
18
22
  };
19
23
  KeyBuilderSS.prototype.buildVersionablePrefix = function () {
20
- return this.prefix + "/" + this.metadata.s + "/" + this.metadata.i;
24
+ return this.metadata.s + "/" + this.metadata.n + "/" + this.metadata.i;
21
25
  };
22
26
  KeyBuilderSS.prototype.buildImpressionsKey = function () {
23
27
  return this.prefix + ".impressions";
@@ -25,23 +29,12 @@ var KeyBuilderSS = /** @class */ (function (_super) {
25
29
  KeyBuilderSS.prototype.buildEventsKey = function () {
26
30
  return this.prefix + ".events";
27
31
  };
28
- KeyBuilderSS.prototype.buildLatencyKeyPrefix = function () {
29
- return this.buildVersionablePrefix() + "/latency";
32
+ KeyBuilderSS.prototype.buildLatencyKey = function (method, bucket) {
33
+ return this.prefix + ".telemetry.latencies::" + this.buildVersionablePrefix() + "/" + methodNames[method] + "/" + bucket;
30
34
  };
31
- KeyBuilderSS.prototype.buildLatencyKey = function (metricName, bucketNumber) {
32
- return this.buildLatencyKeyPrefix() + "." + metricName + ".bucket." + bucketNumber;
35
+ KeyBuilderSS.prototype.buildExceptionKey = function (method) {
36
+ return this.prefix + ".telemetry.exceptions::" + this.buildVersionablePrefix() + "/" + methodNames[method];
33
37
  };
34
- KeyBuilderSS.prototype.buildCountKey = function (metricName) {
35
- return this.buildVersionablePrefix() + "/count." + metricName;
36
- };
37
- // NOT USED
38
- // buildGaugeKey(metricName: string) {
39
- // return `${this.buildVersionablePrefix()}/gauge.${metricName}`;
40
- // }
41
- // NOT USED
42
- // searchPatternForCountKeys() {
43
- // return `${this.buildVersionablePrefix()}/count.*`;
44
- // }
45
38
  KeyBuilderSS.prototype.searchPatternForSplitKeys = function () {
46
39
  return this.buildSplitKeyPrefix() + "*";
47
40
  };
@@ -2,12 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findLatencyIndex = void 0;
4
4
  var lang_1 = require("../utils/lang");
5
- // @TODO add unit tests
6
- function findLatencyIndex(latency, min, max, base) {
7
- if (min === void 0) { min = 0; }
8
- if (max === void 0) { max = 23; }
9
- if (base === void 0) { base = 1.5; }
10
- var index = Math.min(max, Math.max(min, Math.floor(Math.log(latency) / Math.log(base))));
5
+ var MIN = 0;
6
+ var MAX = 22;
7
+ var BASE = 1.5;
8
+ /**
9
+ * Calculates buckets from latency in milliseconds
10
+ *
11
+ * @param latencyInMs
12
+ * @returns a bucket index from 0 to 22 inclusive
13
+ */
14
+ function findLatencyIndex(latencyInMs) {
15
+ var index = Math.min(MAX, Math.max(MIN, Math.ceil(Math.log(latencyInMs) / Math.log(BASE))));
11
16
  return (0, lang_1.isNaNNumber)(index) ? 0 : index; // index is NaN if latency is not a positive number
12
17
  }
13
18
  exports.findLatencyIndex = findLatencyIndex;
@@ -65,7 +65,7 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
65
65
  accum.push(segmentName);
66
66
  }
67
67
  else {
68
- // @BREAKING: This is only to clean up "old" keys. Remove this whole else code block.
68
+ // @TODO @BREAKING: This is only to clean up "old" keys. Remove this whole else code block and reuse `getRegisteredSegments` method.
69
69
  segmentName = _this.keys.extractOldSegmentKey(key);
70
70
  if (segmentName) { // this was an old segment key, let's clean up.
71
71
  var newSegmentKey = _this.keys.buildSegmentNameKey(segmentName);
@@ -107,6 +107,18 @@ var MySegmentsCacheInLocal = /** @class */ (function (_super) {
107
107
  }
108
108
  return isDiff;
109
109
  };
110
+ MySegmentsCacheInLocal.prototype.getRegisteredSegments = function () {
111
+ var _this = this;
112
+ return Object.keys(localStorage).reduce(function (accum, key) {
113
+ var segmentName = _this.keys.extractSegmentName(key);
114
+ if (segmentName)
115
+ accum.push(segmentName);
116
+ return accum;
117
+ }, []);
118
+ };
119
+ MySegmentsCacheInLocal.prototype.getKeysCount = function () {
120
+ return 1;
121
+ };
110
122
  return MySegmentsCacheInLocal;
111
123
  }(AbstractSegmentsCacheSync_1.AbstractSegmentsCacheSync));
112
124
  exports.MySegmentsCacheInLocal = MySegmentsCacheInLocal;
@@ -15,6 +15,7 @@ var browser_1 = require("../../utils/constants/browser");
15
15
  var InMemoryStorageCS_1 = require("../inMemory/InMemoryStorageCS");
16
16
  var constants_1 = require("./constants");
17
17
  var constants_2 = require("../../utils/constants");
18
+ var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
18
19
  /**
19
20
  * InLocal storage factory for standalone client-side SplitFactory
20
21
  */
@@ -24,7 +25,7 @@ function InLocalStorage(options) {
24
25
  function InLocalStorageCSFactory(params) {
25
26
  // Fallback to InMemoryStorage if LocalStorage API is not available
26
27
  if (!(0, isLocalStorageAvailable_1.isLocalStorageAvailable)()) {
27
- params.log.warn(constants_1.LOG_PREFIX + 'LocalStorage API is unavailable. Fallbacking into default MEMORY storage');
28
+ params.log.warn(constants_1.LOG_PREFIX + 'LocalStorage API is unavailable. Falling back to default MEMORY storage');
28
29
  return (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
29
30
  }
30
31
  var log = params.log;
@@ -36,6 +37,7 @@ function InLocalStorage(options) {
36
37
  impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(params.impressionsQueueSize),
37
38
  impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
38
39
  events: new EventsCacheInMemory_1.EventsCacheInMemory(params.eventsQueueSize),
40
+ telemetry: params.mode !== constants_2.LOCALHOST_MODE && (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)() ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory() : undefined,
39
41
  destroy: function () {
40
42
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory();
41
43
  this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
@@ -52,6 +54,7 @@ function InLocalStorage(options) {
52
54
  impressions: this.impressions,
53
55
  impressionCounts: this.impressionCounts,
54
56
  events: this.events,
57
+ telemetry: this.telemetry,
55
58
  destroy: function () {
56
59
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory();
57
60
  this.segments = new MySegmentsCacheInMemory_1.MySegmentsCacheInMemory();
@@ -7,6 +7,7 @@ var ImpressionsCacheInMemory_1 = require("./ImpressionsCacheInMemory");
7
7
  var EventsCacheInMemory_1 = require("./EventsCacheInMemory");
8
8
  var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory");
9
9
  var constants_1 = require("../../utils/constants");
10
+ var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
10
11
  /**
11
12
  * InMemory storage factory for standalone server-side SplitFactory
12
13
  *
@@ -19,6 +20,7 @@ function InMemoryStorageFactory(params) {
19
20
  impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(params.impressionsQueueSize),
20
21
  impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
21
22
  events: new EventsCacheInMemory_1.EventsCacheInMemory(params.eventsQueueSize),
23
+ telemetry: params.mode !== constants_1.LOCALHOST_MODE ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory() : undefined,
22
24
  // When using MEMORY we should clean all the caches to leave them empty
23
25
  destroy: function () {
24
26
  this.splits.clear();
@@ -7,6 +7,7 @@ var ImpressionsCacheInMemory_1 = require("./ImpressionsCacheInMemory");
7
7
  var EventsCacheInMemory_1 = require("./EventsCacheInMemory");
8
8
  var ImpressionCountsCacheInMemory_1 = require("./ImpressionCountsCacheInMemory");
9
9
  var constants_1 = require("../../utils/constants");
10
+ var TelemetryCacheInMemory_1 = require("./TelemetryCacheInMemory");
10
11
  /**
11
12
  * InMemory storage factory for standalone client-side SplitFactory
12
13
  *
@@ -19,6 +20,7 @@ function InMemoryStorageCSFactory(params) {
19
20
  impressions: new ImpressionsCacheInMemory_1.ImpressionsCacheInMemory(params.impressionsQueueSize),
20
21
  impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory_1.ImpressionCountsCacheInMemory() : undefined,
21
22
  events: new EventsCacheInMemory_1.EventsCacheInMemory(params.eventsQueueSize),
23
+ telemetry: params.mode !== constants_1.LOCALHOST_MODE && (0, TelemetryCacheInMemory_1.shouldRecordTelemetry)() ? new TelemetryCacheInMemory_1.TelemetryCacheInMemory() : undefined,
22
24
  // When using MEMORY we should clean all the caches to leave them empty
23
25
  destroy: function () {
24
26
  this.splits.clear();
@@ -35,6 +37,7 @@ function InMemoryStorageCSFactory(params) {
35
37
  impressions: this.impressions,
36
38
  impressionCounts: this.impressionCounts,
37
39
  events: this.events,
40
+ telemetry: this.telemetry,
38
41
  // Set a new splits cache to clean it for the client without affecting other clients
39
42
  destroy: function () {
40
43
  this.splits = new SplitsCacheInMemory_1.SplitsCacheInMemory();
@@ -66,6 +66,12 @@ var MySegmentsCacheInMemory = /** @class */ (function (_super) {
66
66
  }
67
67
  return isDiff;
68
68
  };
69
+ MySegmentsCacheInMemory.prototype.getRegisteredSegments = function () {
70
+ return Object.keys(this.segmentCache);
71
+ };
72
+ MySegmentsCacheInMemory.prototype.getKeysCount = function () {
73
+ return 1;
74
+ };
69
75
  return MySegmentsCacheInMemory;
70
76
  }(AbstractSegmentsCacheSync_1.AbstractSegmentsCacheSync));
71
77
  exports.MySegmentsCacheInMemory = MySegmentsCacheInMemory;
@@ -57,6 +57,12 @@ var SegmentsCacheInMemory = /** @class */ (function (_super) {
57
57
  SegmentsCacheInMemory.prototype.getRegisteredSegments = function () {
58
58
  return Object.keys(this.segmentCache);
59
59
  };
60
+ SegmentsCacheInMemory.prototype.getKeysCount = function () {
61
+ var _this = this;
62
+ return Object.keys(this.segmentCache).reduce(function (acum, segmentName) {
63
+ return acum + _this.segmentCache[segmentName].size;
64
+ }, 0);
65
+ };
60
66
  SegmentsCacheInMemory.prototype.setChangeNumber = function (name, changeNumber) {
61
67
  this.segmentChangeNumber[name] = changeNumber;
62
68
  return true;