@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
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.firstPushWindowDecorator = exports.submitterFactory = void 0;
4
+ var syncTask_1 = require("../syncTask");
5
+ var constants_1 = require("../../logger/constants");
6
+ /**
7
+ * Base function to create submitters, such as ImpressionsSubmitter and EventsSubmitter
8
+ */
9
+ function submitterFactory(log, postClient, sourceCache, postRate, dataName, fromCacheToPayload, maxRetries, debugLogs // true for telemetry submitters
10
+ ) {
11
+ if (maxRetries === void 0) { maxRetries = 0; }
12
+ var retries = 0;
13
+ function postData() {
14
+ if (sourceCache.isEmpty())
15
+ return Promise.resolve();
16
+ var data = sourceCache.state();
17
+ // @ts-ignore
18
+ var dataCountMessage = typeof data.length === 'number' ? data.length + " " + dataName : dataName;
19
+ log[debugLogs ? 'debug' : 'info'](constants_1.SUBMITTERS_PUSH, [dataCountMessage]);
20
+ var jsonPayload = JSON.stringify(fromCacheToPayload ? fromCacheToPayload(data) : data);
21
+ if (!maxRetries)
22
+ sourceCache.clear();
23
+ return postClient(jsonPayload).then(function () {
24
+ retries = 0;
25
+ sourceCache.clear(); // we clear the queue if request successes.
26
+ }).catch(function (err) {
27
+ if (!maxRetries) {
28
+ log[debugLogs ? 'debug' : 'warn'](constants_1.SUBMITTERS_PUSH_FAILS, [dataCountMessage, err]);
29
+ }
30
+ else if (retries === maxRetries) {
31
+ retries = 0;
32
+ sourceCache.clear(); // we clear the queue if request fails after retries.
33
+ log[debugLogs ? 'debug' : 'warn'](constants_1.SUBMITTERS_PUSH_FAILS, [dataCountMessage, err]);
34
+ }
35
+ else {
36
+ retries++;
37
+ log[debugLogs ? 'debug' : 'warn'](constants_1.SUBMITTERS_PUSH_RETRY, [dataCountMessage, err]);
38
+ }
39
+ });
40
+ }
41
+ return (0, syncTask_1.syncTaskFactory)(log, postData, postRate, dataName + ' submitter');
42
+ }
43
+ exports.submitterFactory = submitterFactory;
44
+ /**
45
+ * Decorates a provided submitter with a first execution window
46
+ */
47
+ function firstPushWindowDecorator(submitter, firstPushWindow) {
48
+ var running = false;
49
+ var stopEventPublisherTimeout;
50
+ var originalStart = submitter.start;
51
+ submitter.start = function () {
52
+ running = true;
53
+ stopEventPublisherTimeout = setTimeout(originalStart, firstPushWindow);
54
+ };
55
+ var originalStop = submitter.stop;
56
+ submitter.stop = function () {
57
+ running = false;
58
+ clearTimeout(stopEventPublisherTimeout);
59
+ originalStop();
60
+ };
61
+ submitter.isRunning = function () {
62
+ return running;
63
+ };
64
+ return submitter;
65
+ }
66
+ exports.firstPushWindowDecorator = firstPushWindowDecorator;
@@ -2,19 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.submitterManagerFactory = void 0;
4
4
  var syncTaskComposite_1 = require("../syncTaskComposite");
5
- var eventsSyncTask_1 = require("./eventsSyncTask");
6
- var impressionsSyncTask_1 = require("./impressionsSyncTask");
7
- var impressionCountsSyncTask_1 = require("./impressionCountsSyncTask");
5
+ var eventsSubmitter_1 = require("./eventsSubmitter");
6
+ var impressionsSubmitter_1 = require("./impressionsSubmitter");
7
+ var impressionCountsSubmitter_1 = require("./impressionCountsSubmitter");
8
+ var telemetrySubmitter_1 = require("./telemetrySubmitter");
8
9
  function submitterManagerFactory(params) {
9
- var settings = params.settings, storage = params.storage, splitApi = params.splitApi;
10
- var log = settings.log;
11
10
  var submitters = [
12
- (0, impressionsSyncTask_1.impressionsSyncTaskFactory)(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
13
- (0, eventsSyncTask_1.eventsSyncTaskFactory)(log, splitApi.postEventsBulk, storage.events, settings.scheduler.eventsPushRate, settings.startup.eventsFirstPushWindow)
14
- // @TODO add telemetry submitter
11
+ (0, impressionsSubmitter_1.impressionsSubmitterFactory)(params),
12
+ (0, eventsSubmitter_1.eventsSubmitterFactory)(params)
15
13
  ];
16
- if (storage.impressionCounts)
17
- submitters.push((0, impressionCountsSyncTask_1.impressionCountsSyncTaskFactory)(log, splitApi.postTestImpressionsCount, storage.impressionCounts));
14
+ var impressionCountsSubmitter = (0, impressionCountsSubmitter_1.impressionCountsSubmitterFactory)(params);
15
+ if (impressionCountsSubmitter)
16
+ submitters.push(impressionCountsSubmitter);
17
+ var telemetrySubmitter = (0, telemetrySubmitter_1.telemetrySubmitterFactory)(params);
18
+ if (telemetrySubmitter)
19
+ submitters.push(telemetrySubmitter);
18
20
  return (0, syncTaskComposite_1.syncTaskComposite)(submitters);
19
21
  }
20
22
  exports.submitterManagerFactory = submitterManagerFactory;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.telemetrySubmitterFactory = exports.telemetryCacheConfigAdapter = exports.telemetryCacheStatsAdapter = void 0;
5
+ var submitter_1 = require("./submitter");
6
+ var constants_1 = require("../../utils/constants");
7
+ var constants_2 = require("../../readiness/constants");
8
+ var settingsValidation_1 = require("../../utils/settingsValidation");
9
+ var apiKey_1 = require("../../utils/inputValidation/apiKey");
10
+ var timer_1 = require("../../utils/timeTracker/timer");
11
+ /**
12
+ * Converts data from telemetry cache into /metrics/usage request payload.
13
+ */
14
+ function telemetryCacheStatsAdapter(telemetry, splits, segments) {
15
+ return {
16
+ isEmpty: function () { return false; },
17
+ clear: function () { },
18
+ // @TODO consider moving inside telemetry cache for code size reduction
19
+ state: function () {
20
+ return {
21
+ lS: telemetry.getLastSynchronization(),
22
+ mL: telemetry.popLatencies(),
23
+ mE: telemetry.popExceptions(),
24
+ hE: telemetry.popHttpErrors(),
25
+ hL: telemetry.popHttpLatencies(),
26
+ tR: telemetry.popTokenRefreshes(),
27
+ aR: telemetry.popAuthRejections(),
28
+ iQ: telemetry.getImpressionStats(constants_1.QUEUED),
29
+ iDe: telemetry.getImpressionStats(constants_1.DEDUPED),
30
+ iDr: telemetry.getImpressionStats(constants_1.DROPPED),
31
+ spC: splits.getSplitNames().length,
32
+ seC: segments.getRegisteredSegments().length,
33
+ skC: segments.getKeysCount(),
34
+ sL: telemetry.getSessionLength(),
35
+ eQ: telemetry.getEventStats(constants_1.QUEUED),
36
+ eD: telemetry.getEventStats(constants_1.DROPPED),
37
+ sE: telemetry.popStreamingEvents(),
38
+ t: telemetry.popTags(),
39
+ };
40
+ }
41
+ };
42
+ }
43
+ exports.telemetryCacheStatsAdapter = telemetryCacheStatsAdapter;
44
+ var OPERATION_MODE_MAP = (_a = {},
45
+ _a[constants_1.STANDALONE_MODE] = constants_1.STANDALONE_ENUM,
46
+ _a[constants_1.CONSUMER_MODE] = constants_1.CONSUMER_ENUM,
47
+ _a[constants_1.CONSUMER_PARTIAL_MODE] = constants_1.CONSUMER_PARTIAL_ENUM,
48
+ _a);
49
+ var IMPRESSIONS_MODE_MAP = (_b = {},
50
+ _b[constants_1.OPTIMIZED] = constants_1.OPTIMIZED_ENUM,
51
+ _b[constants_1.DEBUG] = constants_1.DEBUG_ENUM,
52
+ _b);
53
+ function getActiveFactories() {
54
+ return Object.keys(apiKey_1.usedKeysMap).length;
55
+ }
56
+ function getRedundantActiveFactories() {
57
+ return Object.keys(apiKey_1.usedKeysMap).reduce(function (acum, apiKey) {
58
+ return acum + apiKey_1.usedKeysMap[apiKey] - 1;
59
+ }, 0);
60
+ }
61
+ /**
62
+ * Converts data from telemetry cache and settings into /metrics/config request payload.
63
+ */
64
+ function telemetryCacheConfigAdapter(telemetry, settings) {
65
+ return {
66
+ isEmpty: function () { return false; },
67
+ clear: function () { },
68
+ state: function () {
69
+ var urls = settings.urls, scheduler = settings.scheduler;
70
+ return {
71
+ oM: OPERATION_MODE_MAP[settings.mode],
72
+ st: settings.storage.type.toLowerCase(),
73
+ sE: settings.streamingEnabled,
74
+ rR: {
75
+ sp: scheduler.featuresRefreshRate,
76
+ se: scheduler.segmentsRefreshRate,
77
+ im: scheduler.impressionsRefreshRate,
78
+ ev: scheduler.eventsPushRate,
79
+ te: scheduler.telemetryRefreshRate,
80
+ },
81
+ uO: {
82
+ s: urls.sdk !== settingsValidation_1.base.urls.sdk,
83
+ e: urls.events !== settingsValidation_1.base.urls.events,
84
+ a: urls.auth !== settingsValidation_1.base.urls.auth,
85
+ st: urls.streaming !== settingsValidation_1.base.urls.streaming,
86
+ t: urls.telemetry !== settingsValidation_1.base.urls.telemetry,
87
+ },
88
+ iQ: scheduler.impressionsQueueSize,
89
+ eQ: scheduler.eventsQueueSize,
90
+ iM: IMPRESSIONS_MODE_MAP[settings.sync.impressionsMode],
91
+ iL: settings.impressionListener ? true : false,
92
+ hP: false,
93
+ aF: getActiveFactories(),
94
+ rF: getRedundantActiveFactories(),
95
+ tR: telemetry.getTimeUntilReady(),
96
+ tC: telemetry.getTimeUntilReadyFromCache(),
97
+ nR: telemetry.getNonReadyUsage(),
98
+ t: telemetry.popTags(),
99
+ i: settings.integrations && settings.integrations.map(function (int) { return int.type; }),
100
+ };
101
+ }
102
+ };
103
+ }
104
+ exports.telemetryCacheConfigAdapter = telemetryCacheConfigAdapter;
105
+ /**
106
+ * Submitter that periodically posts telemetry data
107
+ */
108
+ function telemetrySubmitterFactory(params) {
109
+ var _a = params.storage, splits = _a.splits, segments = _a.segments, telemetry = _a.telemetry;
110
+ if (!telemetry)
111
+ return; // No submitter created if telemetry cache is not defined
112
+ var settings = params.settings, _b = params.settings, log = _b.log, telemetryRefreshRate = _b.scheduler.telemetryRefreshRate, splitApi = params.splitApi, now = params.platform.now, readiness = params.readiness;
113
+ var startTime = (0, timer_1.timer)(now || Date.now);
114
+ var submitter = (0, submitter_1.firstPushWindowDecorator)((0, submitter_1.submitterFactory)(log, splitApi.postMetricsUsage, telemetryCacheStatsAdapter(telemetry, splits, segments), telemetryRefreshRate, 'telemetry stats', undefined, 0, true), telemetryRefreshRate);
115
+ readiness.gate.once(constants_2.SDK_READY_FROM_CACHE, function () {
116
+ telemetry.recordTimeUntilReadyFromCache(startTime());
117
+ });
118
+ readiness.gate.once(constants_2.SDK_READY, function () {
119
+ telemetry.recordTimeUntilReady(startTime());
120
+ // Post config data when the SDK is ready and if the telemetry submitter was started
121
+ if (submitter.isRunning()) {
122
+ var postMetricsConfigTask = (0, submitter_1.submitterFactory)(log, splitApi.postMetricsConfig, telemetryCacheConfigAdapter(telemetry, settings), 0, 'telemetry config', undefined, 0, true);
123
+ postMetricsConfigTask.execute();
124
+ }
125
+ });
126
+ return submitter;
127
+ }
128
+ exports.telemetrySubmitterFactory = telemetrySubmitterFactory;
@@ -5,6 +5,7 @@ var submitterManager_1 = require("./submitters/submitterManager");
5
5
  var constants_1 = require("./streaming/constants");
6
6
  var constants_2 = require("../logger/constants");
7
7
  var consent_1 = require("../consent");
8
+ var constants_3 = require("../utils/constants");
8
9
  /**
9
10
  * Online SyncManager factory.
10
11
  * Can be used for server-side API, and client-side API with or without multiple clients.
@@ -18,7 +19,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
18
19
  * SyncManager factory for modular SDK
19
20
  */
20
21
  return function (params) {
21
- var settings = params.settings, _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
22
+ var settings = params.settings, _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled, telemetryTracker = params.telemetryTracker;
22
23
  /** Polling Manager */
23
24
  var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
24
25
  /** Push Manager */
@@ -36,13 +37,16 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
36
37
  else {
37
38
  log.info(constants_2.SYNC_START_POLLING);
38
39
  pollingManager.start();
40
+ telemetryTracker.streamingEvent(constants_3.SYNC_MODE_UPDATE, constants_3.POLLING);
39
41
  }
40
42
  }
41
43
  function stopPollingAndSyncAll() {
42
44
  log.info(constants_2.SYNC_STOP_POLLING);
43
45
  // if polling, stop
44
- if (pollingManager.isRunning())
46
+ if (pollingManager.isRunning()) {
45
47
  pollingManager.stop();
48
+ telemetryTracker.streamingEvent(constants_3.SYNC_MODE_UPDATE, constants_3.STREAMING);
49
+ }
46
50
  // fetch splits and segments. There is no need to catch this promise (it is always resolved)
47
51
  pollingManager.syncAll();
48
52
  }
@@ -12,7 +12,7 @@ var utils_1 = require("./impressionObserver/utils");
12
12
  * @param eventsCache cache to save events
13
13
  * @param integrationsManager optional event handler used for integrations
14
14
  */
15
- function eventTrackerFactory(settings, eventsCache, integrationsManager) {
15
+ function eventTrackerFactory(settings, eventsCache, integrationsManager, telemetryCache) {
16
16
  var log = settings.log;
17
17
  var isSync = (0, utils_1.isStorageSync)(settings);
18
18
  function queueEventsCallback(eventData, tracked) {
@@ -48,6 +48,10 @@ function eventTrackerFactory(settings, eventsCache, integrationsManager) {
48
48
  return tracked.then(queueEventsCallback.bind(null, eventData));
49
49
  }
50
50
  else {
51
+ // Record when eventsCache is sync only (standalone mode)
52
+ // @TODO we are not dropping events on full queue yet, so `tracked` is always true ATM
53
+ if (telemetryCache)
54
+ telemetryCache.recordEventStats(tracked ? constants_2.QUEUED : constants_2.DROPPED, 1);
51
55
  return queueEventsCallback(eventData, tracked);
52
56
  }
53
57
  }
@@ -20,7 +20,7 @@ function impressionsTrackerFactory(settings, impressionsCache, integrationsManag
20
20
  // if observer is provided, it implies `shouldAddPreviousTime` flag (i.e., if impressions previous time should be added or not)
21
21
  observer,
22
22
  // if countsCache is provided, it implies `isOptimized` flag (i.e., if impressions should be deduped or not)
23
- countsCache) {
23
+ countsCache, telemetryCache) {
24
24
  var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
25
25
  return {
26
26
  track: function (impressions, attributes) {
@@ -53,6 +53,14 @@ countsCache) {
53
53
  log.error(constants_1.ERROR_IMPRESSIONS_TRACKER, [impressionsCount, err]);
54
54
  });
55
55
  }
56
+ else {
57
+ // Record when impressionsCache is sync only (standalone mode)
58
+ // @TODO we are not dropping impressions on full queue yet, so DROPPED stats are not recorded
59
+ if (telemetryCache) {
60
+ telemetryCache.recordImpressionStats(constants_2.QUEUED, impressionsToStore.length);
61
+ telemetryCache.recordImpressionStats(constants_2.DEDUPED, impressions.length - impressionsToStore.length);
62
+ }
63
+ }
56
64
  // @TODO next block might be handled by the integration manager. In that case, the metadata object doesn't need to be passed in the constructor
57
65
  if (impressionListener || integrationsManager) {
58
66
  var _loop_1 = function (i) {
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.telemetryTrackerFactory = void 0;
4
+ var labels_1 = require("../utils/labels");
5
+ var timer_1 = require("../utils/timeTracker/timer");
6
+ var constants_1 = require("../utils/constants");
7
+ function telemetryTrackerFactory(telemetryCache, now) {
8
+ if (telemetryCache && now) {
9
+ var startTime_1 = (0, timer_1.timer)(now);
10
+ return {
11
+ trackEval: function (method) {
12
+ var evalTime = (0, timer_1.timer)(now);
13
+ return function (label) {
14
+ switch (label) {
15
+ case labels_1.EXCEPTION:
16
+ telemetryCache.recordException(method);
17
+ return; // Don't track latency on exceptions
18
+ case labels_1.SDK_NOT_READY: // @ts-ignore ITelemetryCacheAsync doesn't implement the method
19
+ if (telemetryCache.recordNonReadyUsage)
20
+ telemetryCache.recordNonReadyUsage();
21
+ }
22
+ telemetryCache.recordLatency(method, evalTime());
23
+ };
24
+ },
25
+ trackHttp: function (operation) {
26
+ var httpTime = (0, timer_1.timer)(now);
27
+ return function (error) {
28
+ telemetryCache.recordHttpLatency(operation, httpTime());
29
+ if (error && error.statusCode)
30
+ telemetryCache.recordHttpError(operation, error.statusCode);
31
+ else
32
+ telemetryCache.recordSuccessfulSync(operation, now());
33
+ };
34
+ },
35
+ sessionLength: function () {
36
+ if (telemetryCache.recordSessionLength)
37
+ telemetryCache.recordSessionLength(startTime_1());
38
+ },
39
+ streamingEvent: function (e, d) {
40
+ if (e === constants_1.AUTH_REJECTION) {
41
+ telemetryCache.recordAuthRejections();
42
+ }
43
+ else {
44
+ telemetryCache.recordStreamingEvents({
45
+ e: e,
46
+ d: d,
47
+ t: now()
48
+ });
49
+ if (e === constants_1.TOKEN_REFRESH)
50
+ telemetryCache.recordTokenRefreshes();
51
+ }
52
+ }
53
+ };
54
+ }
55
+ else { // If there is not `telemetryCache` or `now` time tracker, return a no-op telemetry tracker
56
+ var noopTrack = function () { return function () { }; };
57
+ return {
58
+ trackEval: noopTrack,
59
+ trackHttp: noopTrack,
60
+ sessionLength: function () { },
61
+ streamingEvent: function () { },
62
+ };
63
+ }
64
+ }
65
+ exports.telemetryTrackerFactory = telemetryTrackerFactory;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
3
+ exports.AUTH_REJECTION = exports.SYNC_MODE_UPDATE = exports.ABLY_ERROR = exports.TOKEN_REFRESH = exports.SSE_CONNECTION_ERROR = exports.STREAMING_STATUS = exports.OCCUPANCY_SEC = exports.OCCUPANCY_PRI = exports.CONNECTION_ESTABLISHED = exports.TRACK = exports.TREATMENTS_WITH_CONFIG = exports.TREATMENT_WITH_CONFIG = exports.TREATMENTS = exports.TREATMENT = exports.MY_SEGMENT = exports.SEGMENT = exports.TOKEN = exports.TELEMETRY = exports.EVENTS = exports.IMPRESSIONS_COUNT = exports.IMPRESSIONS = exports.SPLITS = exports.DEBUG_ENUM = exports.OPTIMIZED_ENUM = exports.CONSUMER_PARTIAL_ENUM = exports.CONSUMER_ENUM = exports.STANDALONE_ENUM = exports.DEDUPED = exports.DROPPED = exports.QUEUED = exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
4
+ exports.PAUSED = exports.ENABLED = exports.DISABLED = exports.NON_REQUESTED = exports.REQUESTED = exports.POLLING = exports.STREAMING = void 0;
4
5
  // Special treatments
5
6
  exports.CONTROL = 'control';
6
7
  exports.CONTROL_WITH_CONFIG = {
@@ -31,3 +32,41 @@ exports.STORAGE_PLUGGABLE = 'PLUGGABLE';
31
32
  exports.CONSENT_GRANTED = 'GRANTED'; // The user has granted consent for tracking events and impressions
32
33
  exports.CONSENT_DECLINED = 'DECLINED'; // The user has declined consent for tracking events and impressions
33
34
  exports.CONSENT_UNKNOWN = 'UNKNOWN'; // The user has neither granted nor declined consent for tracking events and impressions
35
+ // Telemetry
36
+ exports.QUEUED = 0;
37
+ exports.DROPPED = 1;
38
+ exports.DEDUPED = 2;
39
+ exports.STANDALONE_ENUM = 0;
40
+ exports.CONSUMER_ENUM = 1;
41
+ exports.CONSUMER_PARTIAL_ENUM = 2;
42
+ exports.OPTIMIZED_ENUM = 0;
43
+ exports.DEBUG_ENUM = 1;
44
+ exports.SPLITS = 'sp';
45
+ exports.IMPRESSIONS = 'im';
46
+ exports.IMPRESSIONS_COUNT = 'ic';
47
+ exports.EVENTS = 'ev';
48
+ exports.TELEMETRY = 'te';
49
+ exports.TOKEN = 'to';
50
+ exports.SEGMENT = 'se';
51
+ exports.MY_SEGMENT = 'ms';
52
+ exports.TREATMENT = 't';
53
+ exports.TREATMENTS = 'ts';
54
+ exports.TREATMENT_WITH_CONFIG = 'tc';
55
+ exports.TREATMENTS_WITH_CONFIG = 'tcs';
56
+ exports.TRACK = 'tr';
57
+ exports.CONNECTION_ESTABLISHED = 0;
58
+ exports.OCCUPANCY_PRI = 10;
59
+ exports.OCCUPANCY_SEC = 20;
60
+ exports.STREAMING_STATUS = 30;
61
+ exports.SSE_CONNECTION_ERROR = 40;
62
+ exports.TOKEN_REFRESH = 50;
63
+ exports.ABLY_ERROR = 60;
64
+ exports.SYNC_MODE_UPDATE = 70;
65
+ exports.AUTH_REJECTION = 80;
66
+ exports.STREAMING = 0;
67
+ exports.POLLING = 1;
68
+ exports.REQUESTED = 0;
69
+ exports.NON_REQUESTED = 1;
70
+ exports.DISABLED = 0;
71
+ exports.ENABLED = 1;
72
+ exports.PAUSED = 2;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.releaseApiKey = exports.validateAndTrackApiKey = exports.validateApiKey = void 0;
3
+ exports.releaseApiKey = exports.validateAndTrackApiKey = exports.usedKeysMap = exports.validateApiKey = void 0;
4
4
  var constants_1 = require("../../logger/constants");
5
5
  var lang_1 = require("../lang");
6
6
  var item = 'api_key';
@@ -22,31 +22,32 @@ function validateApiKey(log, maybeApiKey) {
22
22
  return apiKey;
23
23
  }
24
24
  exports.validateApiKey = validateApiKey;
25
- var usedKeysMap = {};
25
+ // Exported for telemetry
26
+ exports.usedKeysMap = {};
26
27
  /** validates the given api key and also warns if it is in use */
27
28
  function validateAndTrackApiKey(log, maybeApiKey) {
28
29
  var apiKey = validateApiKey(log, maybeApiKey);
29
30
  // If the apiKey is correct, we'll save it as the instance creation should work.
30
31
  if (apiKey) {
31
- if (!usedKeysMap[apiKey]) {
32
+ if (!exports.usedKeysMap[apiKey]) {
32
33
  // If this key is not present, only warning scenarios is that we have factories for other keys.
33
- usedKeysMap[apiKey] = 1;
34
- if (Object.keys(usedKeysMap).length > 1) {
34
+ exports.usedKeysMap[apiKey] = 1;
35
+ if (Object.keys(exports.usedKeysMap).length > 1) {
35
36
  log.warn(constants_1.WARN_API_KEY, ['an instance of the Split factory']);
36
37
  }
37
38
  }
38
39
  else {
39
- log.warn(constants_1.WARN_API_KEY, [usedKeysMap[apiKey] + " factory/ies with this API Key"]);
40
- usedKeysMap[apiKey]++;
40
+ log.warn(constants_1.WARN_API_KEY, [exports.usedKeysMap[apiKey] + " factory/ies with this API Key"]);
41
+ exports.usedKeysMap[apiKey]++;
41
42
  }
42
43
  }
43
44
  return apiKey;
44
45
  }
45
46
  exports.validateAndTrackApiKey = validateAndTrackApiKey;
46
47
  function releaseApiKey(apiKey) {
47
- if (usedKeysMap[apiKey])
48
- usedKeysMap[apiKey]--;
49
- if (usedKeysMap[apiKey] === 0)
50
- delete usedKeysMap[apiKey];
48
+ if (exports.usedKeysMap[apiKey])
49
+ exports.usedKeysMap[apiKey]--;
50
+ if (exports.usedKeysMap[apiKey] === 0)
51
+ delete exports.usedKeysMap[apiKey];
51
52
  }
52
53
  exports.releaseApiKey = releaseApiKey;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.settingsValidation = void 0;
3
+ exports.settingsValidation = exports.base = void 0;
4
4
  var lang_1 = require("../lang");
5
5
  var mode_1 = require("./mode");
6
6
  var splitFilters_1 = require("./splitFilters");
@@ -8,7 +8,9 @@ var constants_1 = require("../constants");
8
8
  var impressionsMode_1 = require("./impressionsMode");
9
9
  var key_1 = require("../inputValidation/key");
10
10
  var trafficType_1 = require("../inputValidation/trafficType");
11
- var base = {
11
+ var constants_2 = require("../../logger/constants");
12
+ // Exported for telemetry
13
+ exports.base = {
12
14
  // Define which kind of object you want to retrieve from SplitFactory
13
15
  mode: constants_1.STANDALONE_MODE,
14
16
  core: {
@@ -28,10 +30,10 @@ var base = {
28
30
  featuresRefreshRate: 30,
29
31
  // fetch segments updates each 60 sec
30
32
  segmentsRefreshRate: 60,
31
- // publish metrics each 120 sec
32
- metricsRefreshRate: 120,
33
- // publish evaluations each 60 sec
34
- impressionsRefreshRate: 60,
33
+ // publish telemetry stats each 3600 secs (1 hour)
34
+ telemetryRefreshRate: 3600,
35
+ // publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
36
+ impressionsRefreshRate: 300,
35
37
  // fetch offline changes each 15 sec
36
38
  offlineRefreshRate: 15,
37
39
  // publish events every 60 seconds after the first flush
@@ -52,6 +54,8 @@ var base = {
52
54
  auth: 'https://auth.split.io/api',
53
55
  // Streaming Server
54
56
  streaming: 'https://streaming.split.io',
57
+ // Telemetry Server
58
+ telemetry: 'https://telemetry.split.io/api',
55
59
  },
56
60
  // Defines which kind of storage we should instanciate.
57
61
  storage: undefined,
@@ -87,19 +91,41 @@ function fromSecondsToMillis(n) {
87
91
  function settingsValidation(config, validationParams) {
88
92
  var defaults = validationParams.defaults, runtime = validationParams.runtime, storage = validationParams.storage, integrations = validationParams.integrations, logger = validationParams.logger, localhost = validationParams.localhost, consent = validationParams.consent;
89
93
  // creates a settings object merging base, defaults and config objects.
90
- var withDefaults = (0, lang_1.merge)({}, base, defaults, config);
94
+ var withDefaults = (0, lang_1.merge)({}, exports.base, defaults, config);
91
95
  // ensure a valid logger.
92
96
  // First thing to validate, since other validators might use the logger.
93
97
  var log = logger(withDefaults); // @ts-ignore, modify readonly prop
94
98
  withDefaults.log = log;
99
+ // ensure a valid impressionsMode
100
+ withDefaults.sync.impressionsMode = (0, impressionsMode_1.validImpressionsMode)(log, withDefaults.sync.impressionsMode);
101
+ function validateMinValue(paramName, actualValue, minValue) {
102
+ if (actualValue >= minValue)
103
+ return actualValue;
104
+ // actualValue is not a number or is lower than minValue
105
+ log.error(constants_2.ERROR_MIN_CONFIG_PARAM, [paramName, minValue]);
106
+ return minValue;
107
+ }
95
108
  // Scheduler periods
96
109
  var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
97
110
  scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
98
111
  scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
99
- scheduler.metricsRefreshRate = fromSecondsToMillis(scheduler.metricsRefreshRate);
100
- scheduler.impressionsRefreshRate = fromSecondsToMillis(scheduler.impressionsRefreshRate);
101
112
  scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
102
113
  scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
114
+ scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
115
+ if (scheduler.impressionsRefreshRate !== exports.base.scheduler.impressionsRefreshRate) {
116
+ // Validate impressionsRefreshRate defined by user
117
+ scheduler.impressionsRefreshRate = validateMinValue('impressionsRefreshRate', scheduler.impressionsRefreshRate, withDefaults.sync.impressionsMode === constants_1.DEBUG ? 1 : 60 // Min is 1 sec for DEBUG and 60 secs for OPTIMIZED
118
+ );
119
+ }
120
+ else {
121
+ // Default impressionsRefreshRate for DEBUG mode is 60 secs
122
+ if (withDefaults.sync.impressionsMode === constants_1.DEBUG)
123
+ scheduler.impressionsRefreshRate = 60;
124
+ }
125
+ scheduler.impressionsRefreshRate = fromSecondsToMillis(scheduler.impressionsRefreshRate);
126
+ // Log deprecation for old telemetry param
127
+ if (scheduler.metricsRefreshRate)
128
+ log.warn('`metricsRefreshRate` will be deprecated soon. For configuring telemetry rates, update `telemetryRefreshRate` value in configs');
103
129
  // Startup periods
104
130
  startup.requestTimeoutBeforeReady = fromSecondsToMillis(startup.requestTimeoutBeforeReady);
105
131
  startup.readyTimeout = fromSecondsToMillis(startup.readyTimeout);
@@ -152,8 +178,6 @@ function settingsValidation(config, validationParams) {
152
178
  var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, withDefaults.sync.splitFilters, withDefaults.mode);
153
179
  withDefaults.sync.splitFilters = splitFiltersValidation.validFilters;
154
180
  withDefaults.sync.__splitFiltersValidation = splitFiltersValidation;
155
- // ensure a valid impressionsMode
156
- withDefaults.sync.impressionsMode = (0, impressionsMode_1.validImpressionsMode)(log, withDefaults.sync.impressionsMode);
157
181
  // ensure a valid user consent value
158
182
  // @ts-ignore, modify readonly prop
159
183
  withDefaults.userConsent = consent(withDefaults);
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.url = void 0;
4
+ var telemetryEndpointMatcher = /^\/v1\/metrics\/(config|usage)/;
4
5
  var eventsEndpointMatcher = /^\/(testImpressions|metrics|events)/;
5
6
  var authEndpointMatcher = /^\/v2\/auth/;
6
7
  var streamingEndpointMatcher = /^\/(sse|event-stream)/;
@@ -13,6 +14,9 @@ var streamingEndpointMatcher = /^\/(sse|event-stream)/;
13
14
  * @return complete url
14
15
  */
15
16
  function url(settings, target) {
17
+ if (telemetryEndpointMatcher.test(target)) {
18
+ return "" + settings.urls.telemetry + target;
19
+ }
16
20
  if (eventsEndpointMatcher.test(target)) {
17
21
  return "" + settings.urls.events + target;
18
22
  }
@@ -125,6 +125,7 @@ exports.TrackerAPI = {
125
125
  * @return {Function | Promise} The stop function for this specific task or the promise received with the callbacks registered.
126
126
  */
127
127
  start: function (log, task, collectors, promise, now) {
128
+ if (now === void 0) { now = Date.now; }
128
129
  var taskUniqueId = (0, lang_1.uniqueId)();
129
130
  var taskCollector = getCollectorForTask(task, collectors);
130
131
  var result;
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.timer = void 0;
4
4
  function timer(now) {
5
- var st = now ? now() : Date.now();
5
+ var st = now();
6
6
  return function stop() {
7
- return Math.round(now ? now() : Date.now() - st);
7
+ return Math.round(now() - st);
8
8
  };
9
9
  }
10
10
  exports.timer = timer;
@@ -20,7 +20,7 @@ export function createUserConsentAPI(params) {
20
20
  var _a, _b;
21
21
  // validate input param
22
22
  if (!isBoolean(consent)) {
23
- log.warn(ERROR_NOT_BOOLEAN, ['setUserConsent']);
23
+ log.warn(ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
24
24
  return false;
25
25
  }
26
26
  var newConsentStatus = consent ? CONSENT_GRANTED : CONSENT_DECLINED;
@@ -1,5 +1,5 @@
1
- import { fromImpressionsCollector } from '../sync/submitters/impressionsSyncTask';
2
- import { fromImpressionCountsCollector } from '../sync/submitters/impressionCountsSyncTask';
1
+ import { fromImpressionsCollector } from '../sync/submitters/impressionsSubmitter';
2
+ import { fromImpressionCountsCollector } from '../sync/submitters/impressionCountsSubmitter';
3
3
  import { OPTIMIZED, DEBUG } from '../utils/constants';
4
4
  import { objectAssign } from '../utils/lang/objectAssign';
5
5
  import { CLEANUP_REGISTERING, CLEANUP_DEREGISTERING } from '../logger/constants';
@@ -60,6 +60,7 @@ var BrowserSignalListener = /** @class */ (function () {
60
60
  this._flushData(eventsUrl + '/events/beacon', this.storage.events, this.serviceApi.postEventsBulk);
61
61
  if (this.storage.impressionCounts)
62
62
  this._flushData(eventsUrl + '/testImpressions/count/beacon', this.storage.impressionCounts, this.serviceApi.postTestImpressionsCount, fromImpressionCountsCollector);
63
+ // No beacon endpoint for `/metrics/usage`
63
64
  }
64
65
  // Close streaming connection
65
66
  if (this.syncManager.pushManager)
@@ -120,6 +120,7 @@ export var ERROR_HTTP = 322;
120
120
  export var ERROR_LOCALHOST_MODULE_REQUIRED = 323;
121
121
  export var ERROR_STORAGE_INVALID = 324;
122
122
  export var ERROR_NOT_BOOLEAN = 325;
123
+ export var ERROR_MIN_CONFIG_PARAM = 326;
123
124
  // Log prefixes (a.k.a. tags or categories)
124
125
  export var LOG_PREFIX_SETTINGS = 'settings';
125
126
  export var LOG_PREFIX_INSTANTIATION = 'Factory instantiation';