@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
@@ -1,16 +1,18 @@
1
1
  import { syncTaskComposite } from '../syncTaskComposite';
2
- import { eventsSyncTaskFactory } from './eventsSyncTask';
3
- import { impressionsSyncTaskFactory } from './impressionsSyncTask';
4
- import { impressionCountsSyncTaskFactory } from './impressionCountsSyncTask';
2
+ import { eventsSubmitterFactory } from './eventsSubmitter';
3
+ import { impressionsSubmitterFactory } from './impressionsSubmitter';
4
+ import { impressionCountsSubmitterFactory } from './impressionCountsSubmitter';
5
+ import { telemetrySubmitterFactory } from './telemetrySubmitter';
5
6
  export function submitterManagerFactory(params) {
6
- var settings = params.settings, storage = params.storage, splitApi = params.splitApi;
7
- var log = settings.log;
8
7
  var submitters = [
9
- impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
10
- eventsSyncTaskFactory(log, splitApi.postEventsBulk, storage.events, settings.scheduler.eventsPushRate, settings.startup.eventsFirstPushWindow)
11
- // @TODO add telemetry submitter
8
+ impressionsSubmitterFactory(params),
9
+ eventsSubmitterFactory(params)
12
10
  ];
13
- if (storage.impressionCounts)
14
- submitters.push(impressionCountsSyncTaskFactory(log, splitApi.postTestImpressionsCount, storage.impressionCounts));
11
+ var impressionCountsSubmitter = impressionCountsSubmitterFactory(params);
12
+ if (impressionCountsSubmitter)
13
+ submitters.push(impressionCountsSubmitter);
14
+ var telemetrySubmitter = telemetrySubmitterFactory(params);
15
+ if (telemetrySubmitter)
16
+ submitters.push(telemetrySubmitter);
15
17
  return syncTaskComposite(submitters);
16
18
  }
@@ -0,0 +1,122 @@
1
+ var _a, _b;
2
+ import { submitterFactory, firstPushWindowDecorator } from './submitter';
3
+ import { QUEUED, DEDUPED, DROPPED, CONSUMER_MODE, CONSUMER_ENUM, STANDALONE_MODE, CONSUMER_PARTIAL_MODE, STANDALONE_ENUM, CONSUMER_PARTIAL_ENUM, OPTIMIZED, DEBUG, DEBUG_ENUM, OPTIMIZED_ENUM } from '../../utils/constants';
4
+ import { SDK_READY, SDK_READY_FROM_CACHE } from '../../readiness/constants';
5
+ import { base } from '../../utils/settingsValidation';
6
+ import { usedKeysMap } from '../../utils/inputValidation/apiKey';
7
+ import { timer } from '../../utils/timeTracker/timer';
8
+ /**
9
+ * Converts data from telemetry cache into /metrics/usage request payload.
10
+ */
11
+ export function telemetryCacheStatsAdapter(telemetry, splits, segments) {
12
+ return {
13
+ isEmpty: function () { return false; },
14
+ clear: function () { },
15
+ // @TODO consider moving inside telemetry cache for code size reduction
16
+ state: function () {
17
+ return {
18
+ lS: telemetry.getLastSynchronization(),
19
+ mL: telemetry.popLatencies(),
20
+ mE: telemetry.popExceptions(),
21
+ hE: telemetry.popHttpErrors(),
22
+ hL: telemetry.popHttpLatencies(),
23
+ tR: telemetry.popTokenRefreshes(),
24
+ aR: telemetry.popAuthRejections(),
25
+ iQ: telemetry.getImpressionStats(QUEUED),
26
+ iDe: telemetry.getImpressionStats(DEDUPED),
27
+ iDr: telemetry.getImpressionStats(DROPPED),
28
+ spC: splits.getSplitNames().length,
29
+ seC: segments.getRegisteredSegments().length,
30
+ skC: segments.getKeysCount(),
31
+ sL: telemetry.getSessionLength(),
32
+ eQ: telemetry.getEventStats(QUEUED),
33
+ eD: telemetry.getEventStats(DROPPED),
34
+ sE: telemetry.popStreamingEvents(),
35
+ t: telemetry.popTags(),
36
+ };
37
+ }
38
+ };
39
+ }
40
+ var OPERATION_MODE_MAP = (_a = {},
41
+ _a[STANDALONE_MODE] = STANDALONE_ENUM,
42
+ _a[CONSUMER_MODE] = CONSUMER_ENUM,
43
+ _a[CONSUMER_PARTIAL_MODE] = CONSUMER_PARTIAL_ENUM,
44
+ _a);
45
+ var IMPRESSIONS_MODE_MAP = (_b = {},
46
+ _b[OPTIMIZED] = OPTIMIZED_ENUM,
47
+ _b[DEBUG] = DEBUG_ENUM,
48
+ _b);
49
+ function getActiveFactories() {
50
+ return Object.keys(usedKeysMap).length;
51
+ }
52
+ function getRedundantActiveFactories() {
53
+ return Object.keys(usedKeysMap).reduce(function (acum, apiKey) {
54
+ return acum + usedKeysMap[apiKey] - 1;
55
+ }, 0);
56
+ }
57
+ /**
58
+ * Converts data from telemetry cache and settings into /metrics/config request payload.
59
+ */
60
+ export function telemetryCacheConfigAdapter(telemetry, settings) {
61
+ return {
62
+ isEmpty: function () { return false; },
63
+ clear: function () { },
64
+ state: function () {
65
+ var urls = settings.urls, scheduler = settings.scheduler;
66
+ return {
67
+ oM: OPERATION_MODE_MAP[settings.mode],
68
+ st: settings.storage.type.toLowerCase(),
69
+ sE: settings.streamingEnabled,
70
+ rR: {
71
+ sp: scheduler.featuresRefreshRate,
72
+ se: scheduler.segmentsRefreshRate,
73
+ im: scheduler.impressionsRefreshRate,
74
+ ev: scheduler.eventsPushRate,
75
+ te: scheduler.telemetryRefreshRate,
76
+ },
77
+ uO: {
78
+ s: urls.sdk !== base.urls.sdk,
79
+ e: urls.events !== base.urls.events,
80
+ a: urls.auth !== base.urls.auth,
81
+ st: urls.streaming !== base.urls.streaming,
82
+ t: urls.telemetry !== base.urls.telemetry,
83
+ },
84
+ iQ: scheduler.impressionsQueueSize,
85
+ eQ: scheduler.eventsQueueSize,
86
+ iM: IMPRESSIONS_MODE_MAP[settings.sync.impressionsMode],
87
+ iL: settings.impressionListener ? true : false,
88
+ hP: false,
89
+ aF: getActiveFactories(),
90
+ rF: getRedundantActiveFactories(),
91
+ tR: telemetry.getTimeUntilReady(),
92
+ tC: telemetry.getTimeUntilReadyFromCache(),
93
+ nR: telemetry.getNonReadyUsage(),
94
+ t: telemetry.popTags(),
95
+ i: settings.integrations && settings.integrations.map(function (int) { return int.type; }),
96
+ };
97
+ }
98
+ };
99
+ }
100
+ /**
101
+ * Submitter that periodically posts telemetry data
102
+ */
103
+ export function telemetrySubmitterFactory(params) {
104
+ var _a = params.storage, splits = _a.splits, segments = _a.segments, telemetry = _a.telemetry;
105
+ if (!telemetry)
106
+ return; // No submitter created if telemetry cache is not defined
107
+ var settings = params.settings, _b = params.settings, log = _b.log, telemetryRefreshRate = _b.scheduler.telemetryRefreshRate, splitApi = params.splitApi, now = params.platform.now, readiness = params.readiness;
108
+ var startTime = timer(now || Date.now);
109
+ var submitter = firstPushWindowDecorator(submitterFactory(log, splitApi.postMetricsUsage, telemetryCacheStatsAdapter(telemetry, splits, segments), telemetryRefreshRate, 'telemetry stats', undefined, 0, true), telemetryRefreshRate);
110
+ readiness.gate.once(SDK_READY_FROM_CACHE, function () {
111
+ telemetry.recordTimeUntilReadyFromCache(startTime());
112
+ });
113
+ readiness.gate.once(SDK_READY, function () {
114
+ telemetry.recordTimeUntilReady(startTime());
115
+ // Post config data when the SDK is ready and if the telemetry submitter was started
116
+ if (submitter.isRunning()) {
117
+ var postMetricsConfigTask = submitterFactory(log, splitApi.postMetricsConfig, telemetryCacheConfigAdapter(telemetry, settings), 0, 'telemetry config', undefined, 0, true);
118
+ postMetricsConfigTask.execute();
119
+ }
120
+ });
121
+ return submitter;
122
+ }
@@ -2,6 +2,7 @@ import { submitterManagerFactory } from './submitters/submitterManager';
2
2
  import { PUSH_SUBSYSTEM_UP, PUSH_SUBSYSTEM_DOWN } from './streaming/constants';
3
3
  import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '../logger/constants';
4
4
  import { isConsentGranted } from '../consent';
5
+ import { POLLING, STREAMING, SYNC_MODE_UPDATE } from '../utils/constants';
5
6
  /**
6
7
  * Online SyncManager factory.
7
8
  * Can be used for server-side API, and client-side API with or without multiple clients.
@@ -15,7 +16,7 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
15
16
  * SyncManager factory for modular SDK
16
17
  */
17
18
  return function (params) {
18
- var settings = params.settings, _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
19
+ var settings = params.settings, _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled, telemetryTracker = params.telemetryTracker;
19
20
  /** Polling Manager */
20
21
  var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
21
22
  /** Push Manager */
@@ -33,13 +34,16 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
33
34
  else {
34
35
  log.info(SYNC_START_POLLING);
35
36
  pollingManager.start();
37
+ telemetryTracker.streamingEvent(SYNC_MODE_UPDATE, POLLING);
36
38
  }
37
39
  }
38
40
  function stopPollingAndSyncAll() {
39
41
  log.info(SYNC_STOP_POLLING);
40
42
  // if polling, stop
41
- if (pollingManager.isRunning())
43
+ if (pollingManager.isRunning()) {
42
44
  pollingManager.stop();
45
+ telemetryTracker.streamingEvent(SYNC_MODE_UPDATE, STREAMING);
46
+ }
43
47
  // fetch splits and segments. There is no need to catch this promise (it is always resolved)
44
48
  pollingManager.syncAll();
45
49
  }
@@ -1,7 +1,7 @@
1
1
  import { objectAssign } from '../utils/lang/objectAssign';
2
2
  import { thenable } from '../utils/promise/thenable';
3
3
  import { EVENTS_TRACKER_SUCCESS, ERROR_EVENTS_TRACKER } from '../logger/constants';
4
- import { CONSENT_DECLINED } from '../utils/constants';
4
+ import { CONSENT_DECLINED, DROPPED, QUEUED } from '../utils/constants';
5
5
  import { isStorageSync } from './impressionObserver/utils';
6
6
  /**
7
7
  * Event tracker stores events in cache and pass them to the integrations manager if provided.
@@ -9,7 +9,7 @@ import { isStorageSync } from './impressionObserver/utils';
9
9
  * @param eventsCache cache to save events
10
10
  * @param integrationsManager optional event handler used for integrations
11
11
  */
12
- export function eventTrackerFactory(settings, eventsCache, integrationsManager) {
12
+ export function eventTrackerFactory(settings, eventsCache, integrationsManager, telemetryCache) {
13
13
  var log = settings.log;
14
14
  var isSync = isStorageSync(settings);
15
15
  function queueEventsCallback(eventData, tracked) {
@@ -45,6 +45,10 @@ export function eventTrackerFactory(settings, eventsCache, integrationsManager)
45
45
  return tracked.then(queueEventsCallback.bind(null, eventData));
46
46
  }
47
47
  else {
48
+ // Record when eventsCache is sync only (standalone mode)
49
+ // @TODO we are not dropping events on full queue yet, so `tracked` is always true ATM
50
+ if (telemetryCache)
51
+ telemetryCache.recordEventStats(tracked ? QUEUED : DROPPED, 1);
48
52
  return queueEventsCallback(eventData, tracked);
49
53
  }
50
54
  }
@@ -2,7 +2,7 @@ import { objectAssign } from '../utils/lang/objectAssign';
2
2
  import { thenable } from '../utils/promise/thenable';
3
3
  import { truncateTimeFrame } from '../utils/time';
4
4
  import { IMPRESSIONS_TRACKER_SUCCESS, ERROR_IMPRESSIONS_TRACKER, ERROR_IMPRESSIONS_LISTENER } from '../logger/constants';
5
- import { CONSENT_DECLINED } from '../utils/constants';
5
+ import { CONSENT_DECLINED, DEDUPED, QUEUED } from '../utils/constants';
6
6
  /**
7
7
  * Impressions tracker stores impressions in cache and pass them to the listener and integrations manager if provided.
8
8
  *
@@ -17,7 +17,7 @@ export function impressionsTrackerFactory(settings, impressionsCache, integratio
17
17
  // if observer is provided, it implies `shouldAddPreviousTime` flag (i.e., if impressions previous time should be added or not)
18
18
  observer,
19
19
  // if countsCache is provided, it implies `isOptimized` flag (i.e., if impressions should be deduped or not)
20
- countsCache) {
20
+ countsCache, telemetryCache) {
21
21
  var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
22
22
  return {
23
23
  track: function (impressions, attributes) {
@@ -50,6 +50,14 @@ countsCache) {
50
50
  log.error(ERROR_IMPRESSIONS_TRACKER, [impressionsCount, err]);
51
51
  });
52
52
  }
53
+ else {
54
+ // Record when impressionsCache is sync only (standalone mode)
55
+ // @TODO we are not dropping impressions on full queue yet, so DROPPED stats are not recorded
56
+ if (telemetryCache) {
57
+ telemetryCache.recordImpressionStats(QUEUED, impressionsToStore.length);
58
+ telemetryCache.recordImpressionStats(DEDUPED, impressions.length - impressionsToStore.length);
59
+ }
60
+ }
53
61
  // @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
54
62
  if (impressionListener || integrationsManager) {
55
63
  var _loop_1 = function (i) {
@@ -0,0 +1,61 @@
1
+ import { EXCEPTION, SDK_NOT_READY } from '../utils/labels';
2
+ import { timer } from '../utils/timeTracker/timer';
3
+ import { TOKEN_REFRESH, AUTH_REJECTION } from '../utils/constants';
4
+ export function telemetryTrackerFactory(telemetryCache, now) {
5
+ if (telemetryCache && now) {
6
+ var startTime_1 = timer(now);
7
+ return {
8
+ trackEval: function (method) {
9
+ var evalTime = timer(now);
10
+ return function (label) {
11
+ switch (label) {
12
+ case EXCEPTION:
13
+ telemetryCache.recordException(method);
14
+ return; // Don't track latency on exceptions
15
+ case SDK_NOT_READY: // @ts-ignore ITelemetryCacheAsync doesn't implement the method
16
+ if (telemetryCache.recordNonReadyUsage)
17
+ telemetryCache.recordNonReadyUsage();
18
+ }
19
+ telemetryCache.recordLatency(method, evalTime());
20
+ };
21
+ },
22
+ trackHttp: function (operation) {
23
+ var httpTime = timer(now);
24
+ return function (error) {
25
+ telemetryCache.recordHttpLatency(operation, httpTime());
26
+ if (error && error.statusCode)
27
+ telemetryCache.recordHttpError(operation, error.statusCode);
28
+ else
29
+ telemetryCache.recordSuccessfulSync(operation, now());
30
+ };
31
+ },
32
+ sessionLength: function () {
33
+ if (telemetryCache.recordSessionLength)
34
+ telemetryCache.recordSessionLength(startTime_1());
35
+ },
36
+ streamingEvent: function (e, d) {
37
+ if (e === AUTH_REJECTION) {
38
+ telemetryCache.recordAuthRejections();
39
+ }
40
+ else {
41
+ telemetryCache.recordStreamingEvents({
42
+ e: e,
43
+ d: d,
44
+ t: now()
45
+ });
46
+ if (e === TOKEN_REFRESH)
47
+ telemetryCache.recordTokenRefreshes();
48
+ }
49
+ }
50
+ };
51
+ }
52
+ else { // If there is not `telemetryCache` or `now` time tracker, return a no-op telemetry tracker
53
+ var noopTrack = function () { return function () { }; };
54
+ return {
55
+ trackEval: noopTrack,
56
+ trackHttp: noopTrack,
57
+ sessionLength: function () { },
58
+ streamingEvent: function () { },
59
+ };
60
+ }
61
+ }
@@ -28,3 +28,41 @@ export var STORAGE_PLUGGABLE = 'PLUGGABLE';
28
28
  export var CONSENT_GRANTED = 'GRANTED'; // The user has granted consent for tracking events and impressions
29
29
  export var CONSENT_DECLINED = 'DECLINED'; // The user has declined consent for tracking events and impressions
30
30
  export var CONSENT_UNKNOWN = 'UNKNOWN'; // The user has neither granted nor declined consent for tracking events and impressions
31
+ // Telemetry
32
+ export var QUEUED = 0;
33
+ export var DROPPED = 1;
34
+ export var DEDUPED = 2;
35
+ export var STANDALONE_ENUM = 0;
36
+ export var CONSUMER_ENUM = 1;
37
+ export var CONSUMER_PARTIAL_ENUM = 2;
38
+ export var OPTIMIZED_ENUM = 0;
39
+ export var DEBUG_ENUM = 1;
40
+ export var SPLITS = 'sp';
41
+ export var IMPRESSIONS = 'im';
42
+ export var IMPRESSIONS_COUNT = 'ic';
43
+ export var EVENTS = 'ev';
44
+ export var TELEMETRY = 'te';
45
+ export var TOKEN = 'to';
46
+ export var SEGMENT = 'se';
47
+ export var MY_SEGMENT = 'ms';
48
+ export var TREATMENT = 't';
49
+ export var TREATMENTS = 'ts';
50
+ export var TREATMENT_WITH_CONFIG = 'tc';
51
+ export var TREATMENTS_WITH_CONFIG = 'tcs';
52
+ export var TRACK = 'tr';
53
+ export var CONNECTION_ESTABLISHED = 0;
54
+ export var OCCUPANCY_PRI = 10;
55
+ export var OCCUPANCY_SEC = 20;
56
+ export var STREAMING_STATUS = 30;
57
+ export var SSE_CONNECTION_ERROR = 40;
58
+ export var TOKEN_REFRESH = 50;
59
+ export var ABLY_ERROR = 60;
60
+ export var SYNC_MODE_UPDATE = 70;
61
+ export var AUTH_REJECTION = 80;
62
+ export var STREAMING = 0;
63
+ export var POLLING = 1;
64
+ export var REQUESTED = 0;
65
+ export var NON_REQUESTED = 1;
66
+ export var DISABLED = 0;
67
+ export var ENABLED = 1;
68
+ export var PAUSED = 2;
@@ -18,7 +18,8 @@ export function validateApiKey(log, maybeApiKey) {
18
18
  }
19
19
  return apiKey;
20
20
  }
21
- var usedKeysMap = {};
21
+ // Exported for telemetry
22
+ export var usedKeysMap = {};
22
23
  /** validates the given api key and also warns if it is in use */
23
24
  export function validateAndTrackApiKey(log, maybeApiKey) {
24
25
  var apiKey = validateApiKey(log, maybeApiKey);
@@ -1,11 +1,13 @@
1
1
  import { merge } from '../lang';
2
2
  import { mode } from './mode';
3
3
  import { validateSplitFilters } from './splitFilters';
4
- import { STANDALONE_MODE, OPTIMIZED, LOCALHOST_MODE } from '../constants';
4
+ import { STANDALONE_MODE, OPTIMIZED, LOCALHOST_MODE, DEBUG } from '../constants';
5
5
  import { validImpressionsMode } from './impressionsMode';
6
6
  import { validateKey } from '../inputValidation/key';
7
7
  import { validateTrafficType } from '../inputValidation/trafficType';
8
- var base = {
8
+ import { ERROR_MIN_CONFIG_PARAM } from '../../logger/constants';
9
+ // Exported for telemetry
10
+ export var base = {
9
11
  // Define which kind of object you want to retrieve from SplitFactory
10
12
  mode: STANDALONE_MODE,
11
13
  core: {
@@ -25,10 +27,10 @@ var base = {
25
27
  featuresRefreshRate: 30,
26
28
  // fetch segments updates each 60 sec
27
29
  segmentsRefreshRate: 60,
28
- // publish metrics each 120 sec
29
- metricsRefreshRate: 120,
30
- // publish evaluations each 60 sec
31
- impressionsRefreshRate: 60,
30
+ // publish telemetry stats each 3600 secs (1 hour)
31
+ telemetryRefreshRate: 3600,
32
+ // publish evaluations each 300 sec (default value for OPTIMIZED impressions mode)
33
+ impressionsRefreshRate: 300,
32
34
  // fetch offline changes each 15 sec
33
35
  offlineRefreshRate: 15,
34
36
  // publish events every 60 seconds after the first flush
@@ -49,6 +51,8 @@ var base = {
49
51
  auth: 'https://auth.split.io/api',
50
52
  // Streaming Server
51
53
  streaming: 'https://streaming.split.io',
54
+ // Telemetry Server
55
+ telemetry: 'https://telemetry.split.io/api',
52
56
  },
53
57
  // Defines which kind of storage we should instanciate.
54
58
  storage: undefined,
@@ -89,14 +93,36 @@ export function settingsValidation(config, validationParams) {
89
93
  // First thing to validate, since other validators might use the logger.
90
94
  var log = logger(withDefaults); // @ts-ignore, modify readonly prop
91
95
  withDefaults.log = log;
96
+ // ensure a valid impressionsMode
97
+ withDefaults.sync.impressionsMode = validImpressionsMode(log, withDefaults.sync.impressionsMode);
98
+ function validateMinValue(paramName, actualValue, minValue) {
99
+ if (actualValue >= minValue)
100
+ return actualValue;
101
+ // actualValue is not a number or is lower than minValue
102
+ log.error(ERROR_MIN_CONFIG_PARAM, [paramName, minValue]);
103
+ return minValue;
104
+ }
92
105
  // Scheduler periods
93
106
  var scheduler = withDefaults.scheduler, startup = withDefaults.startup;
94
107
  scheduler.featuresRefreshRate = fromSecondsToMillis(scheduler.featuresRefreshRate);
95
108
  scheduler.segmentsRefreshRate = fromSecondsToMillis(scheduler.segmentsRefreshRate);
96
- scheduler.metricsRefreshRate = fromSecondsToMillis(scheduler.metricsRefreshRate);
97
- scheduler.impressionsRefreshRate = fromSecondsToMillis(scheduler.impressionsRefreshRate);
98
109
  scheduler.offlineRefreshRate = fromSecondsToMillis(scheduler.offlineRefreshRate);
99
110
  scheduler.eventsPushRate = fromSecondsToMillis(scheduler.eventsPushRate);
111
+ scheduler.telemetryRefreshRate = fromSecondsToMillis(validateMinValue('telemetryRefreshRate', scheduler.telemetryRefreshRate, 60));
112
+ if (scheduler.impressionsRefreshRate !== base.scheduler.impressionsRefreshRate) {
113
+ // Validate impressionsRefreshRate defined by user
114
+ scheduler.impressionsRefreshRate = validateMinValue('impressionsRefreshRate', scheduler.impressionsRefreshRate, withDefaults.sync.impressionsMode === DEBUG ? 1 : 60 // Min is 1 sec for DEBUG and 60 secs for OPTIMIZED
115
+ );
116
+ }
117
+ else {
118
+ // Default impressionsRefreshRate for DEBUG mode is 60 secs
119
+ if (withDefaults.sync.impressionsMode === DEBUG)
120
+ scheduler.impressionsRefreshRate = 60;
121
+ }
122
+ scheduler.impressionsRefreshRate = fromSecondsToMillis(scheduler.impressionsRefreshRate);
123
+ // Log deprecation for old telemetry param
124
+ if (scheduler.metricsRefreshRate)
125
+ log.warn('`metricsRefreshRate` will be deprecated soon. For configuring telemetry rates, update `telemetryRefreshRate` value in configs');
100
126
  // Startup periods
101
127
  startup.requestTimeoutBeforeReady = fromSecondsToMillis(startup.requestTimeoutBeforeReady);
102
128
  startup.readyTimeout = fromSecondsToMillis(startup.readyTimeout);
@@ -149,8 +175,6 @@ export function settingsValidation(config, validationParams) {
149
175
  var splitFiltersValidation = validateSplitFilters(log, withDefaults.sync.splitFilters, withDefaults.mode);
150
176
  withDefaults.sync.splitFilters = splitFiltersValidation.validFilters;
151
177
  withDefaults.sync.__splitFiltersValidation = splitFiltersValidation;
152
- // ensure a valid impressionsMode
153
- withDefaults.sync.impressionsMode = validImpressionsMode(log, withDefaults.sync.impressionsMode);
154
178
  // ensure a valid user consent value
155
179
  // @ts-ignore, modify readonly prop
156
180
  withDefaults.userConsent = consent(withDefaults);
@@ -1,3 +1,4 @@
1
+ var telemetryEndpointMatcher = /^\/v1\/metrics\/(config|usage)/;
1
2
  var eventsEndpointMatcher = /^\/(testImpressions|metrics|events)/;
2
3
  var authEndpointMatcher = /^\/v2\/auth/;
3
4
  var streamingEndpointMatcher = /^\/(sse|event-stream)/;
@@ -10,6 +11,9 @@ var streamingEndpointMatcher = /^\/(sse|event-stream)/;
10
11
  * @return complete url
11
12
  */
12
13
  export function url(settings, target) {
14
+ if (telemetryEndpointMatcher.test(target)) {
15
+ return "" + settings.urls.telemetry + target;
16
+ }
13
17
  if (eventsEndpointMatcher.test(target)) {
14
18
  return "" + settings.urls.events + target;
15
19
  }
@@ -122,6 +122,7 @@ export var TrackerAPI = {
122
122
  * @return {Function | Promise} The stop function for this specific task or the promise received with the callbacks registered.
123
123
  */
124
124
  start: function (log, task, collectors, promise, now) {
125
+ if (now === void 0) { now = Date.now; }
125
126
  var taskUniqueId = uniqueId();
126
127
  var taskCollector = getCollectorForTask(task, collectors);
127
128
  var result;
@@ -1,6 +1,6 @@
1
1
  export function timer(now) {
2
- var st = now ? now() : Date.now();
2
+ var st = now();
3
3
  return function stop() {
4
- return Math.round(now ? now() : Date.now() - st);
4
+ return Math.round(now() - st);
5
5
  };
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "1.3.1",
3
+ "version": "1.3.2-rc.2",
4
4
  "description": "Split Javascript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -23,7 +23,7 @@ export function createUserConsentAPI(params: ISdkFactoryContext) {
23
23
  setStatus(consent: unknown) {
24
24
  // validate input param
25
25
  if (!isBoolean(consent)) {
26
- log.warn(ERROR_NOT_BOOLEAN, ['setUserConsent']);
26
+ log.warn(ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
27
27
  return false;
28
28
  }
29
29
 
@@ -2,8 +2,8 @@
2
2
  // @TODO eventually migrate to JS-Browser-SDK package.
3
3
  import { ISignalListener } from './types';
4
4
  import { IRecorderCacheProducerSync, IStorageSync } from '../storages/types';
5
- import { fromImpressionsCollector } from '../sync/submitters/impressionsSyncTask';
6
- import { fromImpressionCountsCollector } from '../sync/submitters/impressionCountsSyncTask';
5
+ import { fromImpressionsCollector } from '../sync/submitters/impressionsSubmitter';
6
+ import { fromImpressionCountsCollector } from '../sync/submitters/impressionCountsSubmitter';
7
7
  import { IResponse, ISplitApi } from '../services/types';
8
8
  import { ImpressionDTO, ISettings } from '../types';
9
9
  import { ImpressionsPayload } from '../sync/submitters/types';
@@ -77,6 +77,7 @@ export class BrowserSignalListener implements ISignalListener {
77
77
  this._flushData(eventsUrl + '/testImpressions/beacon', this.storage.impressions, this.serviceApi.postTestImpressionsBulk, this.fromImpressionsCollector, extraMetadata);
78
78
  this._flushData(eventsUrl + '/events/beacon', this.storage.events, this.serviceApi.postEventsBulk);
79
79
  if (this.storage.impressionCounts) this._flushData(eventsUrl + '/testImpressions/count/beacon', this.storage.impressionCounts, this.serviceApi.postTestImpressionsCount, fromImpressionCountsCollector);
80
+ // No beacon endpoint for `/metrics/usage`
80
81
  }
81
82
 
82
83
  // Close streaming connection
@@ -123,6 +123,7 @@ export const ERROR_HTTP = 322;
123
123
  export const ERROR_LOCALHOST_MODULE_REQUIRED = 323;
124
124
  export const ERROR_STORAGE_INVALID = 324;
125
125
  export const ERROR_NOT_BOOLEAN = 325;
126
+ export const ERROR_MIN_CONFIG_PARAM = 326;
126
127
 
127
128
  // Log prefixes (a.k.a. tags or categories)
128
129
  export const LOG_PREFIX_SETTINGS = 'settings';
@@ -32,5 +32,6 @@ export const codesError: [number, string][] = [
32
32
  // initialization / settings validation
33
33
  [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".'],
34
34
  [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.'],
35
- [c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS+': The provided storage is invalid.%s Fallbacking into default MEMORY storage'],
35
+ [c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS+': the provided storage is invalid.%s Falling back into default MEMORY storage'],
36
+ [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'],
36
37
  ];
@@ -14,8 +14,8 @@ export const codesInfo: [number, string][] = codesWarn.concat([
14
14
  [c.NEW_FACTORY, 'New Split SDK instance created.'],
15
15
  [c.EVENTS_TRACKER_SUCCESS, c.LOG_PREFIX_EVENTS_TRACKER + 'Successfully queued %s'],
16
16
  [c.IMPRESSIONS_TRACKER_SUCCESS, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Successfully stored %s impression(s).'],
17
- [c.USER_CONSENT_UPDATED, 'setUserConsent: consent status changed from %s to %s.'],
18
- [c.USER_CONSENT_NOT_UPDATED, 'setUserConsent: call had no effect because it was the current consent status (%s).'],
17
+ [c.USER_CONSENT_UPDATED, 'UserConsent: consent status changed from %s to %s.'],
18
+ [c.USER_CONSENT_NOT_UPDATED, 'UserConsent: call had no effect because it was the current consent status (%s).'],
19
19
  [c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
20
20
 
21
21
  // synchronizer
@@ -24,7 +24,7 @@ export const codesInfo: [number, string][] = codesWarn.concat([
24
24
  [c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
25
25
  [c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of splits #%s. Reason: %s'],
26
26
  [c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
27
- [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s %s.'],
27
+ [c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s.'],
28
28
  [c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
29
29
  [c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
30
30
  [c.STREAMING_CONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Connecting streaming.'],
@@ -11,8 +11,8 @@ export const codesWarn: [number, string][] = codesError.concat([
11
11
  [c.STREAMING_PARSING_ERROR_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE error notification: %s'],
12
12
  [c.STREAMING_PARSING_MESSAGE_FAILS, c.LOG_PREFIX_SYNC_STREAMING + 'Error parsing SSE message notification: %s'],
13
13
  [c.STREAMING_FALLBACK, c.LOG_PREFIX_SYNC_STREAMING + 'Falling back to polling mode. Reason: %s'],
14
- [c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Droping %s %s after retry. Reason: %s.'],
15
- [c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s %s, keeping data to retry on next iteration. Reason: %s.'],
14
+ [c.SUBMITTERS_PUSH_FAILS, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Droping %s after retry. Reason: %s.'],
15
+ [c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %s, keeping data to retry on next iteration. Reason: %s.'],
16
16
  // client status
17
17
  [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.'],
18
18
  [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.'],