@splitsoftware/splitio-commons 1.2.1-rc.1 → 1.2.1-rc.12
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/index.js +10 -0
- package/cjs/consent/sdkUserConsent.js +58 -0
- package/cjs/evaluator/Engine.js +6 -6
- package/cjs/evaluator/combiners/and.js +1 -1
- package/cjs/evaluator/combiners/ifelseif.js +2 -2
- package/cjs/evaluator/condition/engineUtils.js +2 -2
- package/cjs/evaluator/condition/index.js +4 -4
- package/cjs/evaluator/index.js +5 -5
- package/cjs/evaluator/matchers/cont_all.js +1 -1
- package/cjs/evaluator/matchers/cont_any.js +1 -1
- package/cjs/evaluator/matchers/cont_str.js +1 -1
- package/cjs/evaluator/matchers/dependency.js +1 -1
- package/cjs/evaluator/matchers/eq_set.js +1 -1
- package/cjs/evaluator/matchers/ew.js +1 -1
- package/cjs/evaluator/matchers/part_of.js +1 -1
- package/cjs/evaluator/matchers/segment.js +1 -1
- package/cjs/evaluator/matchers/sw.js +1 -1
- package/cjs/evaluator/matchers/whitelist.js +1 -1
- package/cjs/evaluator/matchersTransform/index.js +12 -12
- package/cjs/evaluator/parser/index.js +6 -6
- package/cjs/evaluator/treatments/index.js +1 -1
- package/cjs/evaluator/value/index.js +1 -1
- package/cjs/evaluator/value/sanitize.js +4 -4
- package/cjs/integrations/browser.js +3 -3
- package/cjs/integrations/ga/GaToSplit.js +14 -14
- package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +5 -3
- package/cjs/integrations/ga/SplitToGa.js +1 -1
- package/cjs/integrations/ga/SplitToGoogleAnalytics.js +4 -2
- package/cjs/listeners/browser.js +15 -11
- package/cjs/listeners/node.js +1 -1
- package/cjs/logger/constants.js +9 -3
- package/cjs/logger/index.js +2 -2
- package/cjs/logger/messages/debug.js +4 -4
- package/cjs/logger/messages/error.js +5 -4
- package/cjs/logger/messages/info.js +8 -5
- package/cjs/logger/messages/warn.js +1 -1
- package/cjs/logger/sdkLogger.js +1 -1
- package/cjs/readiness/readinessManager.js +2 -2
- package/cjs/readiness/sdkReadinessManager.js +4 -4
- package/cjs/sdkClient/client.js +12 -11
- package/cjs/sdkClient/clientAttributesDecoration.js +4 -4
- package/cjs/sdkClient/clientCS.js +3 -3
- package/cjs/sdkClient/clientInputValidation.js +20 -22
- package/cjs/sdkClient/sdkClient.js +6 -9
- package/cjs/sdkClient/sdkClientMethod.js +1 -1
- package/cjs/sdkClient/sdkClientMethodCS.js +7 -13
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +8 -18
- package/cjs/sdkFactory/index.js +16 -13
- package/cjs/sdkManager/index.js +11 -11
- package/cjs/services/splitApi.js +3 -2
- package/cjs/services/splitHttpClient.js +2 -2
- package/cjs/storages/KeyBuilder.js +2 -6
- package/cjs/storages/KeyBuilderCS.js +13 -3
- package/cjs/storages/KeyBuilderSS.js +1 -1
- package/cjs/storages/findLatencyIndex.js +1 -1
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +24 -4
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +12 -12
- package/cjs/storages/inLocalStorage/index.js +4 -4
- package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/ImpressionsCacheInMemory.js +15 -1
- package/cjs/storages/inMemory/InMemoryStorage.js +1 -1
- package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -1
- package/cjs/storages/inMemory/LatenciesCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +2 -2
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/LatenciesCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RedisAdapter.js +24 -11
- package/cjs/storages/inRedis/SegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +3 -3
- package/cjs/storages/inRedis/index.js +1 -1
- package/cjs/storages/pluggable/SegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/SplitsCachePluggable.js +3 -3
- package/cjs/storages/pluggable/inMemoryWrapper.js +4 -4
- package/cjs/storages/pluggable/index.js +6 -6
- package/cjs/sync/offline/LocalhostFromFile.js +1 -1
- package/cjs/sync/offline/LocalhostFromObject.js +1 -1
- package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
- package/cjs/sync/offline/splitsParser/splitsParserFromFile.js +13 -13
- package/cjs/sync/offline/splitsParser/splitsParserFromSettings.js +3 -3
- package/cjs/sync/offline/syncManagerOffline.js +1 -1
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +2 -2
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/pollingManagerCS.js +6 -6
- package/cjs/sync/polling/pollingManagerSS.js +3 -3
- package/cjs/sync/polling/syncTasks/mySegmentsSyncTask.js +1 -1
- package/cjs/sync/polling/syncTasks/segmentsSyncTask.js +1 -1
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +1 -1
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +1 -1
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +2 -2
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +2 -2
- package/cjs/sync/streaming/AuthClient/index.js +3 -3
- package/cjs/sync/streaming/SSEClient/index.js +2 -1
- package/cjs/sync/streaming/SSEHandler/NotificationParser.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +3 -3
- package/cjs/sync/streaming/mySegmentsV2utils.js +1 -1
- package/cjs/sync/streaming/pushManager.js +24 -17
- package/cjs/sync/submitters/eventsSyncTask.js +17 -5
- package/cjs/sync/submitters/impressionCountsSyncTask.js +1 -1
- package/cjs/sync/submitters/impressionsSyncTask.js +15 -3
- package/cjs/sync/submitters/metricsSyncTask.js +3 -3
- package/cjs/sync/submitters/submitterManager.js +4 -4
- package/cjs/sync/submitters/submitterSyncTask.js +1 -1
- package/cjs/sync/syncManagerOnline.js +12 -8
- package/cjs/trackers/eventTracker.js +11 -4
- package/cjs/trackers/impressionObserver/impressionObserverCS.js +1 -1
- package/cjs/trackers/impressionObserver/impressionObserverSS.js +1 -1
- package/cjs/trackers/impressionObserver/utils.js +8 -1
- package/cjs/trackers/impressionsTracker.js +9 -8
- package/cjs/utils/MinEvents.js +2 -1
- package/cjs/utils/constants/index.js +5 -1
- package/cjs/utils/inputValidation/apiKey.js +1 -1
- package/cjs/utils/inputValidation/attribute.js +4 -4
- package/cjs/utils/inputValidation/attributes.js +2 -2
- package/cjs/utils/inputValidation/event.js +1 -1
- package/cjs/utils/inputValidation/eventProperties.js +5 -5
- package/cjs/utils/inputValidation/eventValue.js +1 -1
- package/cjs/utils/inputValidation/key.js +6 -5
- package/cjs/utils/inputValidation/preloadedData.js +8 -8
- package/cjs/utils/inputValidation/split.js +1 -1
- package/cjs/utils/inputValidation/splits.js +2 -2
- package/cjs/utils/inputValidation/trafficType.js +1 -1
- package/cjs/utils/inputValidation/trafficTypeExistance.js +1 -1
- package/cjs/utils/jwt/index.js +1 -1
- package/cjs/utils/key/index.js +3 -3
- package/cjs/utils/lang/index.js +13 -4
- package/cjs/utils/lang/maps.js +16 -2
- package/cjs/utils/murmur3/common.js +1 -1
- package/cjs/utils/murmur3/murmur3.js +10 -10
- package/cjs/utils/murmur3/murmur3_128.js +1 -1
- package/cjs/utils/murmur3/murmur3_128_x86.js +37 -37
- package/cjs/utils/murmur3/murmur3_64.js +1 -1
- package/cjs/utils/settingsValidation/consent.js +16 -0
- package/cjs/utils/settingsValidation/impressionsMode.js +6 -6
- package/cjs/utils/settingsValidation/index.js +32 -14
- package/cjs/utils/settingsValidation/integrations/configurable.js +1 -1
- package/cjs/utils/settingsValidation/integrations/pluggable.js +1 -1
- package/cjs/utils/settingsValidation/localhost/builtin.js +2 -2
- package/cjs/utils/settingsValidation/logger/builtinLogger.js +3 -3
- package/cjs/utils/settingsValidation/logger/commons.js +1 -1
- package/cjs/utils/settingsValidation/logger/pluggableLogger.js +1 -1
- package/cjs/utils/settingsValidation/runtime.js +11 -0
- package/cjs/utils/settingsValidation/splitFilters.js +1 -1
- package/cjs/utils/settingsValidation/storage/storageCS.js +1 -1
- package/cjs/utils/timeTracker/index.js +3 -3
- package/esm/consent/index.js +6 -0
- package/esm/consent/sdkUserConsent.js +54 -0
- package/esm/integrations/ga/GoogleAnalyticsToSplit.js +4 -2
- package/esm/integrations/ga/SplitToGoogleAnalytics.js +4 -2
- package/esm/listeners/browser.js +14 -10
- package/esm/logger/constants.js +6 -2
- package/esm/logger/messages/debug.js +3 -3
- package/esm/logger/messages/error.js +4 -3
- package/esm/logger/messages/info.js +7 -4
- package/esm/sdkClient/client.js +3 -2
- package/esm/sdkClient/clientCS.js +1 -1
- package/esm/sdkClient/clientInputValidation.js +6 -8
- package/esm/sdkClient/sdkClient.js +4 -7
- package/esm/sdkClient/sdkClientMethodCS.js +3 -9
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +3 -13
- package/esm/sdkFactory/index.js +10 -7
- package/esm/services/splitApi.js +2 -1
- package/esm/storages/KeyBuilder.js +2 -6
- package/esm/storages/KeyBuilderCS.js +11 -1
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +23 -3
- package/esm/storages/inLocalStorage/index.js +1 -1
- package/esm/storages/inMemory/ImpressionsCacheInMemory.js +15 -1
- package/esm/storages/inMemory/InMemoryStorage.js +1 -1
- package/esm/storages/inMemory/InMemoryStorageCS.js +1 -1
- package/esm/storages/inRedis/RedisAdapter.js +15 -2
- package/esm/storages/pluggable/index.js +2 -2
- package/esm/sync/offline/splitsParser/splitsParserFromFile.js +1 -1
- package/esm/sync/polling/fetchers/segmentChangesFetcher.js +2 -2
- package/esm/sync/streaming/SSEClient/index.js +2 -1
- package/esm/sync/streaming/pushManager.js +9 -2
- package/esm/sync/submitters/eventsSyncTask.js +18 -6
- package/esm/sync/submitters/impressionsSyncTask.js +13 -1
- package/esm/sync/syncManagerOnline.js +11 -7
- package/esm/trackers/eventTracker.js +8 -1
- package/esm/trackers/impressionObserver/utils.js +7 -1
- package/esm/trackers/impressionsTracker.js +6 -5
- package/esm/utils/constants/index.js +4 -0
- package/esm/utils/inputValidation/attributes.js +1 -1
- package/esm/utils/inputValidation/key.js +2 -1
- package/esm/utils/lang/index.js +12 -4
- package/esm/utils/lang/maps.js +14 -1
- package/esm/utils/settingsValidation/consent.js +12 -0
- package/esm/utils/settingsValidation/impressionsMode.js +7 -7
- package/esm/utils/settingsValidation/index.js +28 -10
- package/esm/utils/settingsValidation/runtime.js +7 -0
- package/package.json +8 -8
- package/src/consent/index.ts +8 -0
- package/src/consent/sdkUserConsent.ts +58 -0
- package/src/evaluator/parser/index.ts +1 -1
- package/src/evaluator/types.ts +2 -2
- package/src/evaluator/value/index.ts +2 -2
- package/src/evaluator/value/sanitize.ts +2 -2
- package/src/integrations/ga/GoogleAnalyticsToSplit.ts +7 -4
- package/src/integrations/ga/SplitToGoogleAnalytics.ts +7 -4
- package/src/integrations/pluggable.ts +2 -2
- package/src/integrations/types.ts +5 -0
- package/src/listeners/browser.ts +13 -9
- package/src/logger/constants.ts +6 -2
- package/src/logger/messages/debug.ts +3 -3
- package/src/logger/messages/error.ts +4 -3
- package/src/logger/messages/info.ts +7 -4
- package/src/logger/types.ts +4 -0
- package/src/sdkClient/client.ts +5 -5
- package/src/sdkClient/clientCS.ts +1 -1
- package/src/sdkClient/clientInputValidation.ts +8 -7
- package/src/sdkClient/sdkClient.ts +6 -9
- package/src/sdkClient/sdkClientMethod.ts +2 -2
- package/src/sdkClient/sdkClientMethodCS.ts +5 -11
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +6 -16
- package/src/sdkFactory/index.ts +11 -8
- package/src/sdkFactory/types.ts +14 -3
- package/src/storages/KeyBuilder.ts +2 -6
- package/src/storages/KeyBuilderCS.ts +13 -1
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +23 -3
- package/src/storages/inLocalStorage/index.ts +1 -1
- package/src/storages/inMemory/ImpressionsCacheInMemory.ts +22 -1
- package/src/storages/inMemory/InMemoryStorage.ts +1 -1
- package/src/storages/inMemory/InMemoryStorageCS.ts +1 -1
- package/src/storages/inRedis/RedisAdapter.ts +8 -2
- package/src/storages/pluggable/index.ts +2 -2
- package/src/storages/types.ts +6 -2
- package/src/sync/offline/splitsParser/splitsParserFromFile.ts +1 -1
- package/src/sync/streaming/SSEClient/index.ts +2 -1
- package/src/sync/streaming/pushManager.ts +11 -2
- package/src/sync/submitters/eventsSyncTask.ts +19 -6
- package/src/sync/submitters/impressionsSyncTask.ts +16 -1
- package/src/sync/syncManagerOnline.ts +13 -7
- package/src/sync/types.ts +4 -1
- package/src/trackers/eventTracker.ts +11 -3
- package/src/trackers/impressionObserver/utils.ts +8 -1
- package/src/trackers/impressionsTracker.ts +7 -8
- package/src/types.ts +22 -1
- package/src/utils/constants/index.ts +5 -0
- package/src/utils/inputValidation/attributes.ts +1 -2
- package/src/utils/lang/index.ts +15 -4
- package/src/utils/lang/maps.ts +15 -1
- package/src/utils/settingsValidation/consent.ts +16 -0
- package/src/utils/settingsValidation/impressionsMode.ts +8 -8
- package/src/utils/settingsValidation/index.ts +29 -10
- package/src/utils/settingsValidation/runtime.ts +9 -0
- package/src/utils/settingsValidation/types.ts +12 -6
- package/types/consent/index.d.ts +2 -0
- package/types/consent/sdkUserConsent.d.ts +13 -0
- package/types/evaluator/types.d.ts +2 -2
- package/types/evaluator/value/index.d.ts +1 -1
- package/types/evaluator/value/sanitize.d.ts +1 -1
- package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +2 -2
- package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +2 -3
- package/types/integrations/types.d.ts +4 -0
- package/types/logger/constants.d.ts +6 -2
- package/types/logger/types.d.ts +4 -0
- package/types/sdkClient/client.d.ts +2 -2
- package/types/sdkClient/clientAttributesDecoration.d.ts +1 -1
- package/types/sdkClient/clientInputValidation.d.ts +2 -3
- package/types/sdkClient/sdkClient.d.ts +2 -2
- package/types/sdkClient/sdkClientMethod.d.ts +2 -2
- package/types/sdkClient/sdkClientMethodCS.d.ts +2 -2
- package/types/sdkClient/sdkClientMethodCSWithTT.d.ts +2 -2
- package/types/sdkFactory/types.d.ts +12 -3
- package/types/sdkFactory/userConsentProps.d.ts +6 -0
- package/types/storages/KeyBuilderCS.d.ts +2 -0
- package/types/storages/inMemory/ImpressionsCacheInMemory.d.ts +9 -0
- package/types/storages/inRedis/RedisAdapter.d.ts +1 -1
- package/types/storages/types.d.ts +3 -1
- package/types/sync/types.d.ts +3 -0
- package/types/trackers/eventTracker.d.ts +2 -2
- package/types/trackers/impressionObserver/utils.d.ts +4 -0
- package/types/trackers/impressionsTracker.d.ts +2 -3
- package/types/types.d.ts +22 -1
- package/types/utils/consent.d.ts +2 -0
- package/types/utils/constants/index.d.ts +3 -0
- package/types/utils/lang/index.d.ts +6 -1
- package/types/utils/lang/maps.d.ts +7 -0
- package/types/utils/settingsValidation/consent.d.ts +6 -0
- package/types/utils/settingsValidation/impressionsMode.d.ts +1 -1
- package/types/utils/settingsValidation/runtime/browser.d.ts +2 -0
- package/types/utils/settingsValidation/runtime/node.d.ts +2 -0
- package/types/utils/settingsValidation/runtime.d.ts +2 -0
- package/types/utils/settingsValidation/types.d.ts +12 -6
- package/types/utils/settingsValidation/userConsent.d.ts +5 -0
- package/cjs/sdkClient/types.js +0 -2
- package/esm/sdkClient/types.js +0 -1
- package/src/sdkClient/types.ts +0 -21
|
@@ -6,6 +6,8 @@ var mode_1 = require("./mode");
|
|
|
6
6
|
var splitFilters_1 = require("./splitFilters");
|
|
7
7
|
var constants_1 = require("../constants");
|
|
8
8
|
var impressionsMode_1 = require("./impressionsMode");
|
|
9
|
+
var key_1 = require("../inputValidation/key");
|
|
10
|
+
var trafficType_1 = require("../inputValidation/trafficType");
|
|
9
11
|
var base = {
|
|
10
12
|
// Define which kind of object you want to retrieve from SplitFactory
|
|
11
13
|
mode: constants_1.STANDALONE_MODE,
|
|
@@ -36,6 +38,8 @@ var base = {
|
|
|
36
38
|
eventsPushRate: 60,
|
|
37
39
|
// how many events will be queued before flushing
|
|
38
40
|
eventsQueueSize: 500,
|
|
41
|
+
// how many impressions will be queued before flushing
|
|
42
|
+
impressionsQueueSize: 30000,
|
|
39
43
|
// backoff base seconds to wait before re attempting to connect to push notifications
|
|
40
44
|
pushRetryBackoffBase: 1,
|
|
41
45
|
},
|
|
@@ -67,10 +71,6 @@ var base = {
|
|
|
67
71
|
impressionsMode: constants_1.OPTIMIZED,
|
|
68
72
|
localhostMode: undefined
|
|
69
73
|
},
|
|
70
|
-
runtime: {
|
|
71
|
-
ip: false,
|
|
72
|
-
hostname: false
|
|
73
|
-
},
|
|
74
74
|
// Logger
|
|
75
75
|
log: undefined
|
|
76
76
|
};
|
|
@@ -85,9 +85,9 @@ function fromSecondsToMillis(n) {
|
|
|
85
85
|
* @param validationParams defaults and fields validators used to validate and creates a settings object from a given config
|
|
86
86
|
*/
|
|
87
87
|
function settingsValidation(config, validationParams) {
|
|
88
|
-
var defaults = validationParams.defaults, runtime = validationParams.runtime, storage = validationParams.storage, integrations = validationParams.integrations, logger = validationParams.logger, localhost = validationParams.localhost;
|
|
88
|
+
var defaults = validationParams.defaults, runtime = validationParams.runtime, storage = validationParams.storage, integrations = validationParams.integrations, logger = validationParams.logger, localhost = validationParams.localhost, consent = validationParams.consent;
|
|
89
89
|
// creates a settings object merging base, defaults and config objects.
|
|
90
|
-
var withDefaults = lang_1.merge({}, base, defaults, config);
|
|
90
|
+
var withDefaults = (0, lang_1.merge)({}, base, defaults, config);
|
|
91
91
|
// ensure a valid logger.
|
|
92
92
|
// First thing to validate, since other validators might use the logger.
|
|
93
93
|
var log = logger(withDefaults); // @ts-ignore, modify readonly prop
|
|
@@ -106,19 +106,34 @@ function settingsValidation(config, validationParams) {
|
|
|
106
106
|
startup.eventsFirstPushWindow = fromSecondsToMillis(startup.eventsFirstPushWindow);
|
|
107
107
|
// ensure a valid SDK mode
|
|
108
108
|
// @ts-ignore, modify readonly prop
|
|
109
|
-
withDefaults.mode = mode_1.mode(withDefaults.core.authorizationKey, withDefaults.mode);
|
|
109
|
+
withDefaults.mode = (0, mode_1.mode)(withDefaults.core.authorizationKey, withDefaults.mode);
|
|
110
110
|
// ensure a valid Storage based on mode defined.
|
|
111
111
|
// @ts-ignore, modify readonly prop
|
|
112
112
|
if (storage)
|
|
113
113
|
withDefaults.storage = storage(withDefaults);
|
|
114
|
-
//
|
|
115
|
-
if (
|
|
116
|
-
withDefaults.core.key
|
|
114
|
+
// Validate key and TT (for client-side)
|
|
115
|
+
if (validationParams.acceptKey) {
|
|
116
|
+
var maybeKey = withDefaults.core.key;
|
|
117
|
+
// Although `key` is required in client-side, it can be omitted in LOCALHOST mode. In that case, the value `localhost_key` is used.
|
|
118
|
+
if (withDefaults.mode === constants_1.LOCALHOST_MODE && maybeKey === undefined) {
|
|
119
|
+
withDefaults.core.key = 'localhost_key';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Keeping same behaviour than JS SDK: if settings key or TT are invalid,
|
|
123
|
+
// `false` value is used as binded key/TT of the default client, which leads to some issues.
|
|
124
|
+
// @ts-ignore, @TODO handle invalid keys as a non-recoverable error?
|
|
125
|
+
withDefaults.core.key = (0, key_1.validateKey)(log, maybeKey, 'Client instantiation');
|
|
126
|
+
}
|
|
127
|
+
if (validationParams.acceptTT) {
|
|
128
|
+
var maybeTT = withDefaults.core.trafficType;
|
|
129
|
+
if (maybeTT !== undefined) { // @ts-ignore
|
|
130
|
+
withDefaults.core.trafficType = (0, trafficType_1.validateTrafficType)(log, maybeTT, 'Client instantiation');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
117
133
|
}
|
|
118
134
|
// Current ip/hostname information
|
|
119
135
|
// @ts-ignore, modify readonly prop
|
|
120
|
-
|
|
121
|
-
withDefaults.runtime = runtime(withDefaults);
|
|
136
|
+
withDefaults.runtime = runtime(withDefaults);
|
|
122
137
|
// ensure a valid list of integrations.
|
|
123
138
|
// `integrations` returns an array of valid integration items.
|
|
124
139
|
// @ts-ignore, modify readonly prop
|
|
@@ -134,11 +149,14 @@ function settingsValidation(config, validationParams) {
|
|
|
134
149
|
scheduler.pushRetryBackoffBase = fromSecondsToMillis(scheduler.pushRetryBackoffBase);
|
|
135
150
|
}
|
|
136
151
|
// validate the `splitFilters` settings and parse splits query
|
|
137
|
-
var splitFiltersValidation = splitFilters_1.validateSplitFilters(log, withDefaults.sync.splitFilters, withDefaults.mode);
|
|
152
|
+
var splitFiltersValidation = (0, splitFilters_1.validateSplitFilters)(log, withDefaults.sync.splitFilters, withDefaults.mode);
|
|
138
153
|
withDefaults.sync.splitFilters = splitFiltersValidation.validFilters;
|
|
139
154
|
withDefaults.sync.__splitFiltersValidation = splitFiltersValidation;
|
|
140
155
|
// ensure a valid impressionsMode
|
|
141
|
-
withDefaults.sync.impressionsMode = impressionsMode_1.validImpressionsMode(log, withDefaults.sync.impressionsMode);
|
|
156
|
+
withDefaults.sync.impressionsMode = (0, impressionsMode_1.validImpressionsMode)(log, withDefaults.sync.impressionsMode);
|
|
157
|
+
// ensure a valid user consent value
|
|
158
|
+
// @ts-ignore, modify readonly prop
|
|
159
|
+
withDefaults.userConsent = consent(withDefaults);
|
|
142
160
|
return withDefaults;
|
|
143
161
|
}
|
|
144
162
|
exports.settingsValidation = settingsValidation;
|
|
@@ -13,6 +13,6 @@ var lang_1 = require("../../lang");
|
|
|
13
13
|
*/
|
|
14
14
|
function validateConfigurableIntegrations(settings, validIntegrationTypes) {
|
|
15
15
|
if (validIntegrationTypes === void 0) { validIntegrationTypes = []; }
|
|
16
|
-
return common_1.validateIntegrations(settings, function (integration) { return integration && lang_1.isString(integration.type) && validIntegrationTypes.indexOf(integration.type) > -1; }, 'Integration items must have a valid "type" value');
|
|
16
|
+
return (0, common_1.validateIntegrations)(settings, function (integration) { return integration && (0, lang_1.isString)(integration.type) && validIntegrationTypes.indexOf(integration.type) > -1; }, 'Integration items must have a valid "type" value');
|
|
17
17
|
}
|
|
18
18
|
exports.validateConfigurableIntegrations = validateConfigurableIntegrations;
|
|
@@ -10,6 +10,6 @@ var common_1 = require("./common");
|
|
|
10
10
|
* @returns {Array} array of valid integration factories. The array might be empty if `settings` object does not have valid integrations.
|
|
11
11
|
*/
|
|
12
12
|
function validatePluggableIntegrations(settings) {
|
|
13
|
-
return common_1.validateIntegrations(settings, function (integration) { return typeof integration === 'function'; }, 'Integration items must be functions that initialize the integrations');
|
|
13
|
+
return (0, common_1.validateIntegrations)(settings, function (integration) { return typeof integration === 'function'; }, 'Integration items must be functions that initialize the integrations');
|
|
14
14
|
}
|
|
15
15
|
exports.validatePluggableIntegrations = validatePluggableIntegrations;
|
|
@@ -12,7 +12,7 @@ var pluggable_1 = require("./pluggable");
|
|
|
12
12
|
*/
|
|
13
13
|
function validateLocalhostWithDefault(settings) {
|
|
14
14
|
if (!settings.sync.localhostMode)
|
|
15
|
-
return LocalhostFromObject_1.LocalhostFromObject();
|
|
16
|
-
return pluggable_1.validateLocalhost(settings) || LocalhostFromObject_1.LocalhostFromObject();
|
|
15
|
+
return (0, LocalhostFromObject_1.LocalhostFromObject)();
|
|
16
|
+
return (0, pluggable_1.validateLocalhost)(settings) || (0, LocalhostFromObject_1.LocalhostFromObject)();
|
|
17
17
|
}
|
|
18
18
|
exports.validateLocalhostWithDefault = validateLocalhostWithDefault;
|
|
@@ -19,14 +19,14 @@ var ENV_VAR_KEY = 'SPLITIO_DEBUG';
|
|
|
19
19
|
*/
|
|
20
20
|
var initialState = String(
|
|
21
21
|
// eslint-disable-next-line no-undef
|
|
22
|
-
isNode_1.isNode ? process.env[ENV_VAR_KEY] : isLocalStorageAvailable_1.isLocalStorageAvailable() ? localStorage.getItem(LS_KEY) : '');
|
|
22
|
+
isNode_1.isNode ? process.env[ENV_VAR_KEY] : (0, isLocalStorageAvailable_1.isLocalStorageAvailable)() ? localStorage.getItem(LS_KEY) : '');
|
|
23
23
|
// By default it starts disabled.
|
|
24
24
|
var initialLogLevel = logger_1.LogLevels.NONE;
|
|
25
25
|
// Kept to avoid a breaking change ('on', 'enable' and 'enabled' are equivalent)
|
|
26
26
|
if (/^(enabled?|on)/i.test(initialState)) {
|
|
27
27
|
initialLogLevel = logger_1.LogLevels.DEBUG;
|
|
28
28
|
}
|
|
29
|
-
else if (logger_1.isLogLevelString(initialState)) {
|
|
29
|
+
else if ((0, logger_1.isLogLevelString)(initialState)) {
|
|
30
30
|
initialLogLevel = initialState;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
@@ -37,7 +37,7 @@ else if (logger_1.isLogLevelString(initialState)) {
|
|
|
37
37
|
*/
|
|
38
38
|
function validateLogger(settings) {
|
|
39
39
|
var debug = settings.debug;
|
|
40
|
-
var logLevel = debug !== undefined ? commons_1.getLogLevel(debug) : initialLogLevel;
|
|
40
|
+
var logLevel = debug !== undefined ? (0, commons_1.getLogLevel)(debug) : initialLogLevel;
|
|
41
41
|
var log = new logger_1.Logger({ logLevel: logLevel || initialLogLevel }, allCodes);
|
|
42
42
|
// @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
|
|
43
43
|
if (!logLevel)
|
|
@@ -18,7 +18,7 @@ function getLogLevel(debugValue) {
|
|
|
18
18
|
return logger_1.LogLevels.NONE;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
else if (typeof debugValue === 'string' && logger_1.isLogLevelString(debugValue)) {
|
|
21
|
+
else if (typeof debugValue === 'string' && (0, logger_1.isLogLevelString)(debugValue)) {
|
|
22
22
|
return debugValue;
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
@@ -21,7 +21,7 @@ function validateLogger(settings) {
|
|
|
21
21
|
if (debug !== undefined) {
|
|
22
22
|
if (isLogger(debug))
|
|
23
23
|
return debug;
|
|
24
|
-
logLevel = commons_1.getLogLevel(settings.debug);
|
|
24
|
+
logLevel = (0, commons_1.getLogLevel)(settings.debug);
|
|
25
25
|
}
|
|
26
26
|
var log = new logger_1.Logger({ logLevel: logLevel || initialLogLevel });
|
|
27
27
|
// @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateRuntime = void 0;
|
|
4
|
+
// For client-side SDKs, machine IP and Hostname are not captured and sent to Split backend.
|
|
5
|
+
function validateRuntime() {
|
|
6
|
+
return {
|
|
7
|
+
ip: false,
|
|
8
|
+
hostname: false
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
exports.validateRuntime = validateRuntime;
|
|
@@ -36,7 +36,7 @@ function validateFilterType(maybeFilterType) {
|
|
|
36
36
|
*/
|
|
37
37
|
function validateSplitFilter(log, type, values, maxLength) {
|
|
38
38
|
// validate and remove invalid and duplicated values
|
|
39
|
-
var result = splits_1.validateSplits(log, values, constants_2.LOG_PREFIX_SETTINGS, type + " filter", type + " filter value");
|
|
39
|
+
var result = (0, splits_1.validateSplits)(log, values, constants_2.LOG_PREFIX_SETTINGS, type + " filter", type + " filter value");
|
|
40
40
|
if (result) {
|
|
41
41
|
// check max length
|
|
42
42
|
if (result.length > maxLength)
|
|
@@ -5,7 +5,7 @@ var InMemoryStorageCS_1 = require("../../../storages/inMemory/InMemoryStorageCS"
|
|
|
5
5
|
var constants_1 = require("../../../logger/constants");
|
|
6
6
|
var constants_2 = require("../../../utils/constants");
|
|
7
7
|
function __InLocalStorageMockFactory(params) {
|
|
8
|
-
var result = InMemoryStorageCS_1.InMemoryStorageCSFactory(params);
|
|
8
|
+
var result = (0, InMemoryStorageCS_1.InMemoryStorageCSFactory)(params);
|
|
9
9
|
result.splits.checkCache = function () { return true; }; // to emit SDK_READY_FROM_CACHE
|
|
10
10
|
return result;
|
|
11
11
|
}
|
|
@@ -125,12 +125,12 @@ 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
|
-
var taskUniqueId = lang_1.uniqueId();
|
|
128
|
+
var taskUniqueId = (0, lang_1.uniqueId)();
|
|
129
129
|
var taskCollector = getCollectorForTask(task, collectors);
|
|
130
130
|
var result;
|
|
131
131
|
// If we are registering a promise with this task, we should count the status and the exceptions as well
|
|
132
132
|
// as stopping the task when the promise resolves. Then return the promise
|
|
133
|
-
if (thenable_1.thenable(promise)) {
|
|
133
|
+
if ((0, thenable_1.thenable)(promise)) {
|
|
134
134
|
result = this.__attachToPromise(log, promise, task, taskCollector, taskUniqueId);
|
|
135
135
|
}
|
|
136
136
|
else {
|
|
@@ -147,7 +147,7 @@ exports.TrackerAPI = {
|
|
|
147
147
|
var cb = getCallbackForTask(task, taskCollector);
|
|
148
148
|
timers[trackingKey] = {
|
|
149
149
|
cb: cb,
|
|
150
|
-
timer: timer_1.timer(now)
|
|
150
|
+
timer: (0, timer_1.timer)(now)
|
|
151
151
|
};
|
|
152
152
|
return result;
|
|
153
153
|
},
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ERROR_NOT_BOOLEAN, USER_CONSENT_UPDATED, USER_CONSENT_NOT_UPDATED, USER_CONSENT_INITIAL } from '../logger/constants';
|
|
2
|
+
import { isConsentGranted } from './index';
|
|
3
|
+
import { CONSENT_GRANTED, CONSENT_DECLINED, CONSENT_UNKNOWN } from '../utils/constants';
|
|
4
|
+
import { isBoolean } from '../utils/lang';
|
|
5
|
+
// User consent enum
|
|
6
|
+
var ConsentStatus = {
|
|
7
|
+
GRANTED: CONSENT_GRANTED,
|
|
8
|
+
DECLINED: CONSENT_DECLINED,
|
|
9
|
+
UNKNOWN: CONSENT_UNKNOWN,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* The public user consent API exposed via SplitFactory, used to control if the SDK tracks and sends impressions and events or not.
|
|
13
|
+
*/
|
|
14
|
+
export function createUserConsentAPI(params) {
|
|
15
|
+
var settings = params.settings, log = params.settings.log, syncManager = params.syncManager, _a = params.storage, events = _a.events, impressions = _a.impressions, impressionCounts = _a.impressionCounts;
|
|
16
|
+
if (!isConsentGranted(settings))
|
|
17
|
+
log.info(USER_CONSENT_INITIAL, [settings.userConsent]);
|
|
18
|
+
return {
|
|
19
|
+
setStatus: function (consent) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
// validate input param
|
|
22
|
+
if (!isBoolean(consent)) {
|
|
23
|
+
log.warn(ERROR_NOT_BOOLEAN, ['setUserConsent']);
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
var newConsentStatus = consent ? CONSENT_GRANTED : CONSENT_DECLINED;
|
|
27
|
+
if (settings.userConsent !== newConsentStatus) {
|
|
28
|
+
log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); // @ts-ignore, modify readonly prop
|
|
29
|
+
settings.userConsent = newConsentStatus;
|
|
30
|
+
if (consent) { // resumes submitters if transitioning to GRANTED
|
|
31
|
+
(_a = syncManager === null || syncManager === void 0 ? void 0 : syncManager.submitter) === null || _a === void 0 ? void 0 : _a.start();
|
|
32
|
+
}
|
|
33
|
+
else { // pauses submitters and drops tracked data if transitioning to DECLINED
|
|
34
|
+
(_b = syncManager === null || syncManager === void 0 ? void 0 : syncManager.submitter) === null || _b === void 0 ? void 0 : _b.stop();
|
|
35
|
+
// @ts-ignore, clear method is present in storage for standalone and partial consumer mode
|
|
36
|
+
if (events.clear)
|
|
37
|
+
events.clear(); // @ts-ignore
|
|
38
|
+
if (impressions.clear)
|
|
39
|
+
impressions.clear();
|
|
40
|
+
if (impressionCounts)
|
|
41
|
+
impressionCounts.clear();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
log.info(USER_CONSENT_NOT_UPDATED, [newConsentStatus]);
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
getStatus: function () {
|
|
50
|
+
return settings.userConsent;
|
|
51
|
+
},
|
|
52
|
+
Status: ConsentStatus
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { GaToSplit } from './GaToSplit';
|
|
2
2
|
export function GoogleAnalyticsToSplit(options) {
|
|
3
3
|
// GaToSplit integration factory
|
|
4
|
-
|
|
4
|
+
function GoogleAnalyticsToSplitFactory(params) {
|
|
5
5
|
return GaToSplit(options, params);
|
|
6
|
-
}
|
|
6
|
+
}
|
|
7
|
+
GoogleAnalyticsToSplitFactory.type = 'GOOGLE_ANALYTICS_TO_SPLIT';
|
|
8
|
+
return GoogleAnalyticsToSplitFactory;
|
|
7
9
|
}
|
|
@@ -2,7 +2,9 @@ import { SplitToGa } from './SplitToGa';
|
|
|
2
2
|
export function SplitToGoogleAnalytics(options) {
|
|
3
3
|
if (options === void 0) { options = {}; }
|
|
4
4
|
// SplitToGa integration factory
|
|
5
|
-
|
|
5
|
+
function SplitToGoogleAnalyticsFactory(params) {
|
|
6
6
|
return new SplitToGa(params.settings.log, options);
|
|
7
|
-
}
|
|
7
|
+
}
|
|
8
|
+
SplitToGoogleAnalyticsFactory.type = 'SPLIT_TO_GOOGLE_ANALYTICS';
|
|
9
|
+
return SplitToGoogleAnalyticsFactory;
|
|
8
10
|
}
|
package/esm/listeners/browser.js
CHANGED
|
@@ -3,6 +3,7 @@ import { fromImpressionCountsCollector } from '../sync/submitters/impressionCoun
|
|
|
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';
|
|
6
|
+
import { isConsentGranted } from '../consent';
|
|
6
7
|
// 'unload' event is used instead of 'beforeunload', since 'unload' is not a cancelable event, so no other listeners can stop the event from occurring.
|
|
7
8
|
var UNLOAD_DOM_EVENT = 'unload';
|
|
8
9
|
var EVENT_NAME = 'for unload page event.';
|
|
@@ -48,15 +49,18 @@ var BrowserSignalListener = /** @class */ (function () {
|
|
|
48
49
|
BrowserSignalListener.prototype.flushData = function () {
|
|
49
50
|
if (!this.syncManager)
|
|
50
51
|
return; // In consumer mode there is not sync manager and data to flush
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this._flushData(eventsUrl + '/
|
|
52
|
+
// Flush data if there is user consent
|
|
53
|
+
if (isConsentGranted(this.settings)) {
|
|
54
|
+
var eventsUrl = this.settings.urls.events;
|
|
55
|
+
var extraMetadata = {
|
|
56
|
+
// sim stands for Sync/Split Impressions Mode
|
|
57
|
+
sim: this.settings.sync.impressionsMode === OPTIMIZED ? OPTIMIZED : DEBUG
|
|
58
|
+
};
|
|
59
|
+
this._flushData(eventsUrl + '/testImpressions/beacon', this.storage.impressions, this.serviceApi.postTestImpressionsBulk, this.fromImpressionsCollector, extraMetadata);
|
|
60
|
+
this._flushData(eventsUrl + '/events/beacon', this.storage.events, this.serviceApi.postEventsBulk);
|
|
61
|
+
if (this.storage.impressionCounts)
|
|
62
|
+
this._flushData(eventsUrl + '/testImpressions/count/beacon', this.storage.impressionCounts, this.serviceApi.postTestImpressionsCount, fromImpressionCountsCollector);
|
|
63
|
+
}
|
|
60
64
|
// Close streaming connection
|
|
61
65
|
if (this.syncManager.pushManager)
|
|
62
66
|
this.syncManager.pushManager.stop();
|
|
@@ -66,7 +70,7 @@ var BrowserSignalListener = /** @class */ (function () {
|
|
|
66
70
|
if (!cache.isEmpty()) {
|
|
67
71
|
var dataPayload = fromCacheToPayload ? fromCacheToPayload(cache.state()) : cache.state();
|
|
68
72
|
if (!this._sendBeacon(url, dataPayload, extraMetadata)) {
|
|
69
|
-
postService(JSON.stringify(dataPayload)).catch(function () { }); // no-op just to catch a possible
|
|
73
|
+
postService(JSON.stringify(dataPayload)).catch(function () { }); // no-op just to catch a possible exception
|
|
70
74
|
}
|
|
71
75
|
cache.clear();
|
|
72
76
|
}
|
package/esm/logger/constants.js
CHANGED
|
@@ -60,13 +60,16 @@ export var STREAMING_RECONNECT = 111;
|
|
|
60
60
|
export var STREAMING_CONNECTING = 112;
|
|
61
61
|
export var STREAMING_DISABLED = 113;
|
|
62
62
|
export var STREAMING_DISCONNECTING = 114;
|
|
63
|
-
export var
|
|
63
|
+
export var SUBMITTERS_PUSH_FULL_QUEUE = 115;
|
|
64
64
|
export var SUBMITTERS_PUSH = 116;
|
|
65
65
|
export var SYNC_START_POLLING = 117;
|
|
66
66
|
export var SYNC_CONTINUE_POLLING = 118;
|
|
67
67
|
export var SYNC_STOP_POLLING = 119;
|
|
68
68
|
export var EVENTS_TRACKER_SUCCESS = 120;
|
|
69
69
|
export var IMPRESSIONS_TRACKER_SUCCESS = 121;
|
|
70
|
+
export var USER_CONSENT_UPDATED = 122;
|
|
71
|
+
export var USER_CONSENT_NOT_UPDATED = 123;
|
|
72
|
+
export var USER_CONSENT_INITIAL = 124;
|
|
70
73
|
export var ENGINE_VALUE_INVALID = 200;
|
|
71
74
|
export var ENGINE_VALUE_NO_ATTRIBUTES = 201;
|
|
72
75
|
export var CLIENT_NO_LISTENER = 202;
|
|
@@ -112,10 +115,11 @@ export var ERROR_INVALID_KEY_OBJECT = 317;
|
|
|
112
115
|
export var ERROR_INVALID = 318;
|
|
113
116
|
export var ERROR_EMPTY = 319;
|
|
114
117
|
export var ERROR_EMPTY_ARRAY = 320;
|
|
115
|
-
export var
|
|
118
|
+
export var ERROR_INVALID_CONFIG_PARAM = 321;
|
|
116
119
|
export var ERROR_HTTP = 322;
|
|
117
120
|
export var ERROR_LOCALHOST_MODULE_REQUIRED = 323;
|
|
118
121
|
export var ERROR_STORAGE_INVALID = 324;
|
|
122
|
+
export var ERROR_NOT_BOOLEAN = 325;
|
|
119
123
|
// Log prefixes (a.k.a. tags or categories)
|
|
120
124
|
export var LOG_PREFIX_SETTINGS = 'settings';
|
|
121
125
|
export var LOG_PREFIX_INSTANTIATION = 'Factory instantiation';
|
|
@@ -30,9 +30,9 @@ export var codesDebug = codesInfo.concat([
|
|
|
30
30
|
// SDK
|
|
31
31
|
[c.CLEANUP_REGISTERING, c.LOG_PREFIX_CLEANUP + 'Registering cleanup handler %s'],
|
|
32
32
|
[c.CLEANUP_DEREGISTERING, c.LOG_PREFIX_CLEANUP + 'Deregistering cleanup handler %s'],
|
|
33
|
-
[c.RETRIEVE_CLIENT_DEFAULT, '
|
|
34
|
-
[c.RETRIEVE_CLIENT_EXISTING, '
|
|
35
|
-
[c.RETRIEVE_MANAGER, '
|
|
33
|
+
[c.RETRIEVE_CLIENT_DEFAULT, 'Retrieving default SDK client.'],
|
|
34
|
+
[c.RETRIEVE_CLIENT_EXISTING, 'Retrieving existing SDK client.'],
|
|
35
|
+
[c.RETRIEVE_MANAGER, 'Retrieving manager instance.'],
|
|
36
36
|
// synchronizer
|
|
37
37
|
[c.SYNC_OFFLINE_DATA, c.LOG_PREFIX_SYNC_OFFLINE + 'Splits data: \n%s'],
|
|
38
38
|
[c.SYNC_SPLITS_FETCH, c.LOG_PREFIX_SYNC_SPLITS + 'Spin up split update using since = %s'],
|
|
@@ -4,7 +4,7 @@ export var codesError = [
|
|
|
4
4
|
[c.ERROR_ENGINE_COMBINER_IFELSEIF, c.LOG_PREFIX_ENGINE_COMBINER + 'Invalid Split, no valid rules found'],
|
|
5
5
|
// SDK
|
|
6
6
|
[c.ERROR_LOGLEVEL_INVALID, 'logger: Invalid Log Level - No changes to the logs will be applied.'],
|
|
7
|
-
[c.ERROR_CLIENT_CANNOT_GET_READY, '
|
|
7
|
+
[c.ERROR_CLIENT_CANNOT_GET_READY, 'The SDK will not get ready. Reason: %s'],
|
|
8
8
|
[c.ERROR_IMPRESSIONS_TRACKER, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Could not store impressions bulk with %s impression(s). Error: %s'],
|
|
9
9
|
[c.ERROR_IMPRESSIONS_LISTENER, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Impression listener logImpression method threw: %s.'],
|
|
10
10
|
[c.ERROR_EVENTS_TRACKER, c.LOG_PREFIX_EVENTS_TRACKER + 'Failed to queue %s'],
|
|
@@ -12,7 +12,7 @@ export var codesError = [
|
|
|
12
12
|
[c.ERROR_SYNC_OFFLINE_LOADING, c.LOG_PREFIX_SYNC_OFFLINE + 'There was an issue loading the mock Splits data, no changes will be applied to the current cache. %s'],
|
|
13
13
|
[c.ERROR_STREAMING_SSE, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to connect or error on streaming connection, with error message: %s'],
|
|
14
14
|
[c.ERROR_STREAMING_AUTH, c.LOG_PREFIX_SYNC_STREAMING + 'Failed to authenticate for streaming. Error: %s.'],
|
|
15
|
-
[c.ERROR_HTTP, '
|
|
15
|
+
[c.ERROR_HTTP, 'Response status is not OK. Status: %s. URL: %s. Message: %s'],
|
|
16
16
|
// client status
|
|
17
17
|
[c.ERROR_CLIENT_LISTENER, 'A listener was added for %s on the SDK, which has already fired and won\'t be emitted again. The callback won\'t be executed.'],
|
|
18
18
|
[c.ERROR_CLIENT_DESTROYED, '%s: Client has already been destroyed - no calls possible.'],
|
|
@@ -27,8 +27,9 @@ export var codesError = [
|
|
|
27
27
|
[c.ERROR_INVALID, '%s: you passed an invalid %s. It must be a non-empty string.'],
|
|
28
28
|
[c.ERROR_EMPTY, '%s: you passed an empty %s. It must be a non-empty string.'],
|
|
29
29
|
[c.ERROR_EMPTY_ARRAY, '%s: %s must be a non-empty array.'],
|
|
30
|
+
[c.ERROR_NOT_BOOLEAN, '%s: provided param must be a boolean value.'],
|
|
30
31
|
// initialization / settings validation
|
|
31
|
-
[c.
|
|
32
|
+
[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".'],
|
|
32
33
|
[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.'],
|
|
33
34
|
[c.ERROR_STORAGE_INVALID, c.LOG_PREFIX_SETTINGS + ': The provided storage is invalid.%s Fallbacking into default MEMORY storage'],
|
|
34
35
|
];
|
|
@@ -8,16 +8,19 @@ export var codesInfo = codesWarn.concat([
|
|
|
8
8
|
// SDK
|
|
9
9
|
[c.IMPRESSION, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Split: %s. Key: %s. Evaluation: %s. Label: %s'],
|
|
10
10
|
[c.IMPRESSION_QUEUEING, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Queueing corresponding impression.'],
|
|
11
|
-
[c.NEW_SHARED_CLIENT, '
|
|
12
|
-
[c.NEW_FACTORY, '
|
|
11
|
+
[c.NEW_SHARED_CLIENT, 'New shared client instance created.'],
|
|
12
|
+
[c.NEW_FACTORY, 'New Split SDK instance created.'],
|
|
13
13
|
[c.EVENTS_TRACKER_SUCCESS, c.LOG_PREFIX_EVENTS_TRACKER + 'Successfully queued %s'],
|
|
14
14
|
[c.IMPRESSIONS_TRACKER_SUCCESS, c.LOG_PREFIX_IMPRESSIONS_TRACKER + 'Successfully stored %s impression(s).'],
|
|
15
|
+
[c.USER_CONSENT_UPDATED, 'setUserConsent: consent status changed from %s to %s.'],
|
|
16
|
+
[c.USER_CONSENT_NOT_UPDATED, 'setUserConsent: call had no effect because it was the current consent status (%s).'],
|
|
17
|
+
[c.USER_CONSENT_INITIAL, 'Starting the SDK with %s user consent. No data will be sent.'],
|
|
15
18
|
// synchronizer
|
|
16
19
|
[c.POLLING_SMART_PAUSING, c.LOG_PREFIX_SYNC_POLLING + 'Turning segments data polling %s.'],
|
|
17
20
|
[c.POLLING_START, c.LOG_PREFIX_SYNC_POLLING + 'Starting polling'],
|
|
18
21
|
[c.POLLING_STOP, c.LOG_PREFIX_SYNC_POLLING + 'Stopping polling'],
|
|
19
22
|
[c.SYNC_SPLITS_FETCH_RETRY, c.LOG_PREFIX_SYNC_SPLITS + 'Retrying download of splits #%s. Reason: %s'],
|
|
20
|
-
[c.
|
|
23
|
+
[c.SUBMITTERS_PUSH_FULL_QUEUE, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Flushing full %s queue and reseting timer.'],
|
|
21
24
|
[c.SUBMITTERS_PUSH, c.LOG_PREFIX_SYNC_SUBMITTERS + 'Pushing %s %s.'],
|
|
22
25
|
[c.STREAMING_REFRESH_TOKEN, c.LOG_PREFIX_SYNC_STREAMING + 'Refreshing streaming token in %s seconds, and connecting streaming in %s seconds.'],
|
|
23
26
|
[c.STREAMING_RECONNECT, c.LOG_PREFIX_SYNC_STREAMING + 'Attempting to reconnect streaming in %s seconds.'],
|
|
@@ -26,5 +29,5 @@ export var codesInfo = codesWarn.concat([
|
|
|
26
29
|
[c.STREAMING_DISCONNECTING, c.LOG_PREFIX_SYNC_STREAMING + 'Disconnecting streaming.'],
|
|
27
30
|
[c.SYNC_START_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming not available. Starting polling.'],
|
|
28
31
|
[c.SYNC_CONTINUE_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming couldn\'t connect. Continue polling.'],
|
|
29
|
-
[c.SYNC_STOP_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming
|
|
32
|
+
[c.SYNC_STOP_POLLING, c.LOG_PREFIX_SYNC_MANAGER + 'Streaming connected. Syncing and stopping polling.'],
|
|
30
33
|
]);
|
package/esm/sdkClient/client.js
CHANGED
|
@@ -11,7 +11,8 @@ import { IMPRESSION, IMPRESSION_QUEUEING } from '../logger/constants';
|
|
|
11
11
|
*/
|
|
12
12
|
// @TODO missing time tracking to collect telemetry
|
|
13
13
|
export function clientFactory(params) {
|
|
14
|
-
var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage,
|
|
14
|
+
var readinessManager = params.sdkReadinessManager.readinessManager, storage = params.storage, settings = params.settings, impressionsTracker = params.impressionsTracker, eventTracker = params.eventTracker;
|
|
15
|
+
var log = settings.log, mode = settings.mode;
|
|
15
16
|
function getTreatment(key, splitName, attributes, withConfig) {
|
|
16
17
|
if (withConfig === void 0) { withConfig = false; }
|
|
17
18
|
var wrapUp = function (evaluationResult) {
|
|
@@ -96,6 +97,6 @@ export function clientFactory(params) {
|
|
|
96
97
|
getTreatments: getTreatments,
|
|
97
98
|
getTreatmentsWithConfig: getTreatmentsWithConfig,
|
|
98
99
|
track: track,
|
|
99
|
-
|
|
100
|
+
isClientSide: false
|
|
100
101
|
};
|
|
101
102
|
}
|
|
@@ -17,6 +17,6 @@ export function clientCSDecorator(log, client, key, trafficType) {
|
|
|
17
17
|
getTreatmentsWithConfig: clientCS.getTreatmentsWithConfig.bind(clientCS, key),
|
|
18
18
|
// Key is bound to the `track` method. Same thing happens with trafficType but only if provided
|
|
19
19
|
track: trafficType ? clientCS.track.bind(clientCS, key, trafficType) : clientCS.track.bind(clientCS, key),
|
|
20
|
-
|
|
20
|
+
isClientSide: true
|
|
21
21
|
});
|
|
22
22
|
}
|
|
@@ -2,12 +2,14 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
2
2
|
import { validateAttributes, validateEvent, validateEventValue, validateEventProperties, validateKey, validateSplit, validateSplits, validateTrafficType, validateIfNotDestroyed, validateIfOperational } from '../utils/inputValidation';
|
|
3
3
|
import { startsWith } from '../utils/lang';
|
|
4
4
|
import { CONTROL, CONTROL_WITH_CONFIG } from '../utils/constants';
|
|
5
|
+
import { isStorageSync } from '../trackers/impressionObserver/utils';
|
|
5
6
|
/**
|
|
6
7
|
* Decorator that validates the input before actually executing the client methods.
|
|
7
8
|
* We should "guard" the client here, while not polluting the "real" implementation of those methods.
|
|
8
9
|
*/
|
|
9
|
-
export function clientInputValidationDecorator(
|
|
10
|
-
|
|
10
|
+
export function clientInputValidationDecorator(settings, client, readinessManager) {
|
|
11
|
+
var log = settings.log;
|
|
12
|
+
var isSync = isStorageSync(settings);
|
|
11
13
|
/**
|
|
12
14
|
* Avoid repeating this validations code
|
|
13
15
|
*/
|
|
@@ -27,9 +29,7 @@ export function clientInputValidationDecorator(log, client, readinessManager, is
|
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
function wrapResult(value) {
|
|
30
|
-
|
|
31
|
-
return value;
|
|
32
|
-
return Promise.resolve(value);
|
|
32
|
+
return isSync ? value : Promise.resolve(value);
|
|
33
33
|
}
|
|
34
34
|
function getTreatment(maybeKey, maybeSplit, maybeAttributes) {
|
|
35
35
|
var params = validateEvaluationParams(maybeKey, maybeSplit, maybeAttributes, 'getTreatment');
|
|
@@ -84,9 +84,7 @@ export function clientInputValidationDecorator(log, client, readinessManager, is
|
|
|
84
84
|
return client.track(key, tt, event, eventValue, properties, size);
|
|
85
85
|
}
|
|
86
86
|
else {
|
|
87
|
-
|
|
88
|
-
return false;
|
|
89
|
-
return Promise.resolve(false);
|
|
87
|
+
return isSync ? false : Promise.resolve(false);
|
|
90
88
|
}
|
|
91
89
|
}
|
|
92
90
|
return {
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
|
-
import { CONSUMER_MODE, CONSUMER_PARTIAL_MODE } from '../utils/constants';
|
|
3
2
|
import { releaseApiKey } from '../utils/inputValidation/apiKey';
|
|
4
3
|
import { clientFactory } from './client';
|
|
5
4
|
import { clientInputValidationDecorator } from './clientInputValidation';
|
|
6
5
|
/**
|
|
7
6
|
* Creates an Sdk client, i.e., a base client with status and destroy interface
|
|
8
7
|
*/
|
|
9
|
-
export function sdkClientFactory(params) {
|
|
10
|
-
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, signalListener = params.signalListener, settings = params.settings
|
|
8
|
+
export function sdkClientFactory(params, isSharedClient) {
|
|
9
|
+
var sdkReadinessManager = params.sdkReadinessManager, syncManager = params.syncManager, storage = params.storage, signalListener = params.signalListener, settings = params.settings;
|
|
11
10
|
return objectAssign(
|
|
12
11
|
// Proto-linkage of the readiness Event Emitter
|
|
13
12
|
Object.create(sdkReadinessManager.sdkStatus),
|
|
14
13
|
// Client API (getTreatment* & track methods)
|
|
15
|
-
clientInputValidationDecorator(settings
|
|
16
|
-
// storage is async if and only if mode is consumer or partial consumer
|
|
17
|
-
[CONSUMER_MODE, CONSUMER_PARTIAL_MODE].indexOf(settings.mode) === -1 ? true : false),
|
|
14
|
+
clientInputValidationDecorator(settings, clientFactory(params), sdkReadinessManager.readinessManager),
|
|
18
15
|
// Sdk destroy
|
|
19
16
|
{
|
|
20
17
|
destroy: function () {
|
|
@@ -26,7 +23,7 @@ export function sdkClientFactory(params) {
|
|
|
26
23
|
sdkReadinessManager.readinessManager.destroy();
|
|
27
24
|
signalListener && signalListener.stop();
|
|
28
25
|
// Release the API Key if it is the main client
|
|
29
|
-
if (!
|
|
26
|
+
if (!isSharedClient)
|
|
30
27
|
releaseApiKey(settings.core.authorizationKey);
|
|
31
28
|
// Cleanup storage
|
|
32
29
|
return storage.destroy();
|
|
@@ -16,12 +16,7 @@ var method = 'Client instantiation';
|
|
|
16
16
|
*/
|
|
17
17
|
export function sdkClientMethodCSFactory(params) {
|
|
18
18
|
var storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, readyTimeout = _a.startup.readyTimeout, log = _a.log;
|
|
19
|
-
|
|
20
|
-
// `false` value is used as binded key of the default client, but trafficType is ignored
|
|
21
|
-
// @TODO handle as a non-recoverable error
|
|
22
|
-
var validKey = validateKey(log, key, method);
|
|
23
|
-
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), // @ts-ignore
|
|
24
|
-
validKey);
|
|
19
|
+
var mainClientInstance = clientCSDecorator(log, sdkClientFactory(params), key);
|
|
25
20
|
var parsedDefaultKey = keyParser(key);
|
|
26
21
|
var defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
27
22
|
// Cache instances created per factory.
|
|
@@ -59,9 +54,8 @@ export function sdkClientMethodCSFactory(params) {
|
|
|
59
54
|
sdkReadinessManager: sharedSdkReadiness_1,
|
|
60
55
|
storage: sharedStorage || storage,
|
|
61
56
|
syncManager: sharedSyncManager,
|
|
62
|
-
signalListener: undefined,
|
|
63
|
-
|
|
64
|
-
})), validKey);
|
|
57
|
+
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
58
|
+
}), true), validKey);
|
|
65
59
|
sharedSyncManager && sharedSyncManager.start();
|
|
66
60
|
log.info(NEW_SHARED_CLIENT);
|
|
67
61
|
}
|