@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
|
@@ -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
|
|
6
|
-
var
|
|
7
|
-
var
|
|
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,
|
|
13
|
-
(0,
|
|
14
|
-
// @TODO add telemetry submitter
|
|
11
|
+
(0, impressionsSubmitter_1.impressionsSubmitterFactory)(params),
|
|
12
|
+
(0, eventsSubmitter_1.eventsSubmitterFactory)(params)
|
|
15
13
|
];
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
32
|
-
|
|
33
|
-
// publish evaluations each
|
|
34
|
-
impressionsRefreshRate:
|
|
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
|
|
5
|
+
var st = now();
|
|
6
6
|
return function stop() {
|
|
7
|
-
return Math.round(now
|
|
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, ['
|
|
23
|
+
log.warn(ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
var newConsentStatus = consent ? CONSENT_GRANTED : CONSENT_DECLINED;
|
package/esm/listeners/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { fromImpressionsCollector } from '../sync/submitters/
|
|
2
|
-
import { fromImpressionCountsCollector } from '../sync/submitters/
|
|
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)
|
package/esm/logger/constants.js
CHANGED
|
@@ -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';
|