@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.
- package/cjs/consent/sdkUserConsent.js +1 -1
- package/cjs/listeners/browser.js +5 -4
- package/cjs/logger/constants.js +2 -1
- package/cjs/logger/messages/error.js +2 -1
- package/cjs/logger/messages/info.js +3 -3
- package/cjs/logger/messages/warn.js +2 -2
- package/cjs/sdkClient/client.js +17 -3
- package/cjs/sdkClient/sdkClient.js +4 -1
- package/cjs/sdkFactory/index.js +16 -19
- package/cjs/services/splitApi.js +15 -14
- package/cjs/services/splitHttpClient.js +4 -1
- package/cjs/storages/AbstractSegmentsCacheSync.js +0 -5
- package/cjs/storages/KeyBuilderSS.js +12 -19
- package/cjs/storages/findLatencyIndex.js +11 -6
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +13 -1
- package/cjs/storages/inLocalStorage/index.js +4 -1
- package/cjs/storages/inMemory/InMemoryStorage.js +2 -0
- package/cjs/storages/inMemory/InMemoryStorageCS.js +3 -0
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +6 -0
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +6 -0
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +165 -0
- package/cjs/storages/inRedis/TelemetryCacheInRedis.js +29 -0
- package/cjs/storages/inRedis/index.js +2 -4
- package/cjs/storages/pluggable/TelemetryCachePluggable.js +27 -0
- package/cjs/storages/pluggable/index.js +2 -1
- package/cjs/sync/polling/pollingManagerCS.js +1 -1
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +2 -2
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +0 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +1 -8
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +3 -6
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +20 -13
- package/cjs/sync/streaming/SSEHandler/index.js +21 -15
- package/cjs/sync/streaming/pushManager.js +7 -4
- package/cjs/sync/submitters/eventsSubmitter.js +28 -0
- package/cjs/sync/submitters/{impressionCountsSyncTask.js → impressionCountsSubmitter.js} +10 -7
- package/cjs/sync/submitters/{impressionsSyncTask.js → impressionsSubmitter.js} +8 -8
- package/cjs/sync/submitters/submitter.js +66 -0
- package/cjs/sync/submitters/submitterManager.js +12 -10
- package/cjs/sync/submitters/telemetrySubmitter.js +128 -0
- package/cjs/sync/syncManagerOnline.js +6 -2
- package/cjs/trackers/eventTracker.js +5 -1
- package/cjs/trackers/impressionsTracker.js +9 -1
- package/cjs/trackers/telemetryTracker.js +65 -0
- package/cjs/utils/constants/index.js +40 -1
- package/cjs/utils/inputValidation/apiKey.js +12 -11
- package/cjs/utils/settingsValidation/index.js +35 -11
- package/cjs/utils/settingsValidation/url.js +4 -0
- package/cjs/utils/timeTracker/index.js +1 -0
- package/cjs/utils/timeTracker/timer.js +2 -2
- package/esm/consent/sdkUserConsent.js +1 -1
- package/esm/listeners/browser.js +3 -2
- package/esm/logger/constants.js +1 -0
- package/esm/logger/messages/error.js +2 -1
- package/esm/logger/messages/info.js +3 -3
- package/esm/logger/messages/warn.js +2 -2
- package/esm/sdkClient/client.js +18 -4
- package/esm/sdkClient/sdkClient.js +4 -1
- package/esm/sdkFactory/index.js +16 -19
- package/esm/services/splitApi.js +15 -14
- package/esm/services/splitHttpClient.js +4 -1
- package/esm/storages/AbstractSegmentsCacheSync.js +0 -5
- package/esm/storages/KeyBuilderSS.js +12 -19
- package/esm/storages/findLatencyIndex.js +11 -6
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +13 -1
- package/esm/storages/inLocalStorage/index.js +5 -2
- package/esm/storages/inMemory/InMemoryStorage.js +3 -1
- package/esm/storages/inMemory/InMemoryStorageCS.js +4 -1
- package/esm/storages/inMemory/MySegmentsCacheInMemory.js +6 -0
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +6 -0
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +161 -0
- package/esm/storages/inRedis/TelemetryCacheInRedis.js +26 -0
- package/esm/storages/inRedis/index.js +2 -4
- package/esm/storages/pluggable/TelemetryCachePluggable.js +24 -0
- package/esm/storages/pluggable/index.js +2 -1
- package/esm/sync/polling/pollingManagerCS.js +1 -1
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +2 -2
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +0 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +1 -8
- package/esm/sync/polling/updaters/splitChangesUpdater.js +3 -6
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +8 -1
- package/esm/sync/streaming/SSEHandler/index.js +21 -15
- package/esm/sync/streaming/pushManager.js +7 -4
- package/esm/sync/submitters/eventsSubmitter.js +24 -0
- package/esm/sync/submitters/{impressionCountsSyncTask.js → impressionCountsSubmitter.js} +8 -5
- package/esm/sync/submitters/{impressionsSyncTask.js → impressionsSubmitter.js} +6 -6
- package/esm/sync/submitters/submitter.js +61 -0
- package/esm/sync/submitters/submitterManager.js +12 -10
- package/esm/sync/submitters/telemetrySubmitter.js +122 -0
- package/esm/sync/syncManagerOnline.js +6 -2
- package/esm/trackers/eventTracker.js +6 -2
- package/esm/trackers/impressionsTracker.js +10 -2
- package/esm/trackers/telemetryTracker.js +61 -0
- package/esm/utils/constants/index.js +38 -0
- package/esm/utils/inputValidation/apiKey.js +2 -1
- package/esm/utils/settingsValidation/index.js +34 -10
- package/esm/utils/settingsValidation/url.js +4 -0
- package/esm/utils/timeTracker/index.js +1 -0
- package/esm/utils/timeTracker/timer.js +2 -2
- package/package.json +1 -1
- package/src/consent/sdkUserConsent.ts +1 -1
- package/src/listeners/browser.ts +3 -2
- package/src/logger/constants.ts +1 -0
- package/src/logger/messages/error.ts +2 -1
- package/src/logger/messages/info.ts +3 -3
- package/src/logger/messages/warn.ts +2 -2
- package/src/sdkClient/client.ts +23 -4
- package/src/sdkClient/sdkClient.ts +4 -1
- package/src/sdkFactory/index.ts +22 -24
- package/src/sdkFactory/types.ts +32 -15
- package/src/services/splitApi.ts +17 -14
- package/src/services/splitHttpClient.ts +6 -3
- package/src/services/types.ts +7 -5
- package/src/storages/AbstractSegmentsCacheSync.ts +8 -3
- package/src/storages/KeyBuilderSS.ts +13 -50
- package/src/storages/findLatencyIndex.ts +12 -3
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +13 -1
- package/src/storages/inLocalStorage/index.ts +5 -2
- package/src/storages/inMemory/InMemoryStorage.ts +3 -1
- package/src/storages/inMemory/InMemoryStorageCS.ts +4 -1
- package/src/storages/inMemory/MySegmentsCacheInMemory.ts +8 -0
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +6 -0
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +210 -0
- package/src/storages/inRedis/TelemetryCacheInRedis.ts +29 -0
- package/src/storages/inRedis/index.ts +2 -4
- package/src/storages/pluggable/TelemetryCachePluggable.ts +26 -0
- package/src/storages/pluggable/index.ts +2 -1
- package/src/storages/types.ts +84 -32
- package/src/sync/offline/syncManagerOffline.ts +4 -3
- package/src/sync/polling/pollingManagerCS.ts +3 -3
- package/src/sync/polling/pollingManagerSS.ts +2 -2
- package/src/sync/polling/syncTasks/splitsSyncTask.ts +2 -0
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +0 -4
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +2 -10
- package/src/sync/polling/updaters/splitChangesUpdater.ts +3 -6
- package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +11 -1
- package/src/sync/streaming/SSEHandler/index.ts +21 -14
- package/src/sync/streaming/pushManager.ts +11 -7
- package/src/sync/submitters/eventsSubmitter.ts +35 -0
- package/src/sync/submitters/{impressionCountsSyncTask.ts → impressionCountsSubmitter.ts} +15 -15
- package/src/sync/submitters/{impressionsSyncTask.ts → impressionsSubmitter.ts} +12 -16
- package/src/sync/submitters/{submitterSyncTask.ts → submitter.ts} +34 -16
- package/src/sync/submitters/submitterManager.ts +14 -11
- package/src/sync/submitters/telemetrySubmitter.ts +143 -0
- package/src/sync/submitters/types.ts +123 -0
- package/src/sync/syncManagerOnline.ts +13 -7
- package/src/sync/types.ts +0 -15
- package/src/trackers/eventTracker.ts +7 -3
- package/src/trackers/impressionsTracker.ts +11 -3
- package/src/trackers/telemetryTracker.ts +63 -0
- package/src/trackers/types.ts +24 -0
- package/src/types.ts +35 -6
- package/src/utils/constants/index.ts +45 -0
- package/src/utils/inputValidation/apiKey.ts +2 -1
- package/src/utils/settingsValidation/index.ts +35 -11
- package/src/utils/settingsValidation/url.ts +4 -0
- package/src/utils/timeTracker/index.ts +1 -1
- package/src/utils/timeTracker/timer.ts +3 -3
- package/types/logger/constants.d.ts +1 -0
- package/types/sdkFactory/types.d.ts +29 -14
- package/types/services/splitApi.d.ts +2 -1
- package/types/services/types.d.ts +8 -5
- package/types/storages/AbstractSegmentsCacheSync.d.ts +7 -3
- package/types/storages/KeyBuilderSS.d.ts +3 -3
- package/types/storages/findLatencyIndex.d.ts +7 -1
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +2 -0
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +2 -0
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +1 -0
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +6 -2
- package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +3 -3
- package/types/storages/pluggable/TelemetryCachePluggable.d.ts +2 -2
- package/types/storages/types.d.ts +71 -22
- package/types/sync/offline/syncManagerOffline.d.ts +3 -2
- package/types/sync/polling/pollingManagerCS.d.ts +2 -2
- package/types/sync/polling/pollingManagerSS.d.ts +2 -2
- package/types/sync/polling/syncTasks/splitsSyncTask.d.ts +1 -1
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -1
- package/types/sync/streaming/SSEHandler/NotificationKeeper.d.ts +2 -1
- package/types/sync/streaming/SSEHandler/index.d.ts +2 -1
- package/types/sync/streaming/pushManager.d.ts +2 -2
- package/types/sync/submitters/eventsSubmitter.d.ts +5 -0
- package/types/sync/submitters/impressionCountsSubmitter.d.ts +10 -0
- package/types/sync/submitters/impressionsSubmitter.d.ts +11 -0
- package/types/sync/submitters/submitter.d.ts +12 -0
- package/types/sync/submitters/submitterManager.d.ts +2 -2
- package/types/sync/submitters/telemetrySubmitter.d.ts +24 -0
- package/types/sync/submitters/telemetrySyncTask.d.ts +0 -27
- package/types/sync/submitters/types.d.ts +107 -0
- package/types/sync/syncManagerOnline.d.ts +3 -2
- package/types/sync/types.d.ts +0 -13
- package/types/trackers/eventTracker.d.ts +2 -2
- package/types/trackers/impressionsTracker.d.ts +2 -2
- package/types/trackers/telemetryTracker.d.ts +2 -3
- package/types/trackers/types.d.ts +22 -0
- package/types/types.d.ts +33 -4
- package/types/utils/constants/index.d.ts +37 -0
- package/types/utils/inputValidation/apiKey.d.ts +1 -0
- package/types/utils/settingsValidation/index.d.ts +40 -0
- package/types/utils/timeTracker/index.d.ts +1 -1
- package/types/utils/timeTracker/timer.d.ts +1 -1
- package/cjs/storages/inMemory/CountsCacheInMemory.js +0 -38
- package/cjs/storages/inMemory/LatenciesCacheInMemory.js +0 -43
- package/cjs/storages/inRedis/CountsCacheInRedis.js +0 -16
- package/cjs/storages/inRedis/LatenciesCacheInRedis.js +0 -18
- package/cjs/sync/submitters/eventsSyncTask.js +0 -44
- package/cjs/sync/submitters/metricsSyncTask.js +0 -31
- package/cjs/sync/submitters/submitterSyncTask.js +0 -44
- package/esm/storages/inMemory/CountsCacheInMemory.js +0 -35
- package/esm/storages/inMemory/LatenciesCacheInMemory.js +0 -40
- package/esm/storages/inRedis/CountsCacheInRedis.js +0 -13
- package/esm/storages/inRedis/LatenciesCacheInRedis.js +0 -15
- package/esm/sync/submitters/eventsSyncTask.js +0 -40
- package/esm/sync/submitters/metricsSyncTask.js +0 -26
- package/esm/sync/submitters/submitterSyncTask.js +0 -40
- package/src/storages/inMemory/CountsCacheInMemory.ts +0 -37
- package/src/storages/inMemory/LatenciesCacheInMemory.ts +0 -45
- package/src/storages/inRedis/CountsCacheInRedis.ts +0 -20
- package/src/storages/inRedis/LatenciesCacheInRedis.ts +0 -23
- package/src/sync/submitters/eventsSyncTask.ts +0 -57
- package/src/sync/submitters/metricsSyncTask.ts +0 -49
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { syncTaskComposite } from '../syncTaskComposite';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
// @TODO add telemetry submitter
|
|
8
|
+
impressionsSubmitterFactory(params),
|
|
9
|
+
eventsSubmitterFactory(params)
|
|
12
10
|
];
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
29
|
-
|
|
30
|
-
// publish evaluations each
|
|
31
|
-
impressionsRefreshRate:
|
|
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;
|
package/package.json
CHANGED
|
@@ -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, ['
|
|
26
|
+
log.warn(ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
|
|
27
27
|
return false;
|
|
28
28
|
}
|
|
29
29
|
|
package/src/listeners/browser.ts
CHANGED
|
@@ -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/
|
|
6
|
-
import { fromImpressionCountsCollector } from '../sync/submitters/
|
|
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
|
package/src/logger/constants.ts
CHANGED
|
@@ -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+':
|
|
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, '
|
|
18
|
-
[c.USER_CONSENT_NOT_UPDATED, '
|
|
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
|
|
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
|
|
15
|
-
[c.SUBMITTERS_PUSH_RETRY, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Failed to push %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.'],
|