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