@splitsoftware/splitio-commons 1.2.1-rc.1 → 1.2.1-rc.10
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/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 +8 -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 +7 -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 +3 -6
- package/cjs/sdkClient/sdkClientMethod.js +1 -1
- package/cjs/sdkClient/sdkClientMethodCS.js +6 -10
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +7 -15
- package/cjs/sdkFactory/index.js +14 -12
- package/cjs/sdkFactory/userConsentProps.js +37 -0
- 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/consent.js +10 -0
- 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/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 +5 -2
- package/esm/logger/messages/debug.js +3 -3
- package/esm/logger/messages/error.js +4 -3
- package/esm/logger/messages/info.js +6 -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 +1 -4
- package/esm/sdkClient/sdkClientMethodCS.js +1 -5
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +1 -9
- package/esm/sdkFactory/index.js +8 -6
- package/esm/sdkFactory/userConsentProps.js +33 -0
- 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/consent.js +6 -0
- 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/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 +5 -2
- package/src/logger/messages/debug.ts +3 -3
- package/src/logger/messages/error.ts +4 -3
- package/src/logger/messages/info.ts +6 -4
- package/src/logger/types.ts +4 -0
- package/src/sdkClient/client.ts +3 -2
- package/src/sdkClient/clientCS.ts +1 -1
- package/src/sdkClient/clientInputValidation.ts +8 -7
- package/src/sdkClient/sdkClient.ts +2 -5
- package/src/sdkClient/sdkClientMethodCS.ts +1 -6
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +2 -11
- package/src/sdkFactory/index.ts +9 -7
- package/src/sdkFactory/types.ts +2 -1
- package/src/sdkFactory/userConsentProps.ts +40 -0
- 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/consent.ts +8 -0
- 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/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 +5 -2
- package/types/logger/types.d.ts +4 -0
- package/types/sdkClient/clientAttributesDecoration.d.ts +1 -1
- package/types/sdkClient/clientInputValidation.d.ts +2 -3
- package/types/sdkFactory/types.d.ts +1 -1
- 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
|
@@ -25,7 +25,7 @@ function isRetryableError(error) {
|
|
|
25
25
|
* @param pushEmitter emitter for events related to streaming support
|
|
26
26
|
*/
|
|
27
27
|
function SSEHandlerFactory(log, pushEmitter) {
|
|
28
|
-
var notificationKeeper = NotificationKeeper_1.notificationKeeperFactory(pushEmitter);
|
|
28
|
+
var notificationKeeper = (0, NotificationKeeper_1.notificationKeeperFactory)(pushEmitter);
|
|
29
29
|
return {
|
|
30
30
|
handleOpen: function () {
|
|
31
31
|
notificationKeeper.handleOpen();
|
|
@@ -34,7 +34,7 @@ function SSEHandlerFactory(log, pushEmitter) {
|
|
|
34
34
|
handleError: function (error) {
|
|
35
35
|
var errorWithParsedData = error;
|
|
36
36
|
try {
|
|
37
|
-
errorWithParsedData = NotificationParser_1.errorParser(error);
|
|
37
|
+
errorWithParsedData = (0, NotificationParser_1.errorParser)(error);
|
|
38
38
|
}
|
|
39
39
|
catch (err) {
|
|
40
40
|
log.warn(constants_2.STREAMING_PARSING_ERROR_FAILS, [err]);
|
|
@@ -52,7 +52,7 @@ function SSEHandlerFactory(log, pushEmitter) {
|
|
|
52
52
|
handleMessage: function (message) {
|
|
53
53
|
var messageWithParsedData;
|
|
54
54
|
try {
|
|
55
|
-
messageWithParsedData = NotificationParser_1.messageParser(message);
|
|
55
|
+
messageWithParsedData = (0, NotificationParser_1.messageParser)(message);
|
|
56
56
|
if (!messageWithParsedData)
|
|
57
57
|
return; // Messages with empty data are ignored
|
|
58
58
|
}
|
|
@@ -21,7 +21,7 @@ function StringToUint8Array(myString) {
|
|
|
21
21
|
* @throws if data string cannot be decoded, decompressed or the provided compression value is invalid (not 1 or 2)
|
|
22
22
|
*/
|
|
23
23
|
function decompress(data, compression) {
|
|
24
|
-
var compressData = base64_1.decodeFromBase64(data);
|
|
24
|
+
var compressData = (0, base64_1.decodeFromBase64)(data);
|
|
25
25
|
var binData = StringToUint8Array(compressData);
|
|
26
26
|
if (typeof decompress_1.algorithms === 'string')
|
|
27
27
|
throw new Error(decompress_1.algorithms);
|
|
@@ -26,7 +26,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
26
26
|
var settings = params.settings, storage = params.storage, splitApi = params.splitApi, readiness = params.readiness, platform = params.platform;
|
|
27
27
|
// `userKey` is the matching key of main client in client-side SDK.
|
|
28
28
|
// It can be used to check if running on client-side or server-side SDK.
|
|
29
|
-
var userKey = settings.core.key ? key_1.getMatching(settings.core.key) : undefined;
|
|
29
|
+
var userKey = settings.core.key ? (0, key_1.getMatching)(settings.core.key) : undefined;
|
|
30
30
|
var log = settings.log;
|
|
31
31
|
var sseClient;
|
|
32
32
|
try {
|
|
@@ -37,10 +37,10 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
37
37
|
log.warn(constants_2.STREAMING_FALLBACK, [e]);
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
|
-
var authenticate = AuthClient_1.authenticateFactory(splitApi.fetchAuth);
|
|
40
|
+
var authenticate = (0, AuthClient_1.authenticateFactory)(splitApi.fetchAuth);
|
|
41
41
|
// init feedback loop
|
|
42
42
|
var pushEmitter = new platform.EventEmitter();
|
|
43
|
-
var sseHandler = SSEHandler_1.SSEHandlerFactory(log, pushEmitter);
|
|
43
|
+
var sseHandler = (0, SSEHandler_1.SSEHandlerFactory)(log, pushEmitter);
|
|
44
44
|
sseClient.setEventHandler(sseHandler);
|
|
45
45
|
// init workers
|
|
46
46
|
// MySegmentsUpdateWorker (client-side) are initiated in `add` method
|
|
@@ -58,6 +58,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
58
58
|
// It is used to halt the `connectPush` process if it was in progress.
|
|
59
59
|
var disconnected;
|
|
60
60
|
// flag that indicates a PUSH_NONRETRYABLE_ERROR, condition with which starting pushManager again is ignored.
|
|
61
|
+
// true if STREAMING_DISABLED control event, or 'pushEnabled: false', or non-recoverable SSE or Auth errors.
|
|
61
62
|
var disabled; // `disabled` implies `disconnected === true`
|
|
62
63
|
/** PushManager functions related to initialization */
|
|
63
64
|
var connectPushRetryBackoff = new Backoff_1.Backoff(connectPush, settings.scheduler.pushRetryBackoffBase);
|
|
@@ -138,7 +139,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
138
139
|
function stopWorkers() {
|
|
139
140
|
splitsUpdateWorker.backoff.reset();
|
|
140
141
|
if (userKey)
|
|
141
|
-
lang_1.forOwn(clients, function (_a) {
|
|
142
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
142
143
|
var worker = _a.worker;
|
|
143
144
|
return worker.backoff.reset();
|
|
144
145
|
});
|
|
@@ -194,15 +195,15 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
194
195
|
case types_1.UpdateStrategy.BoundedFetchRequest: {
|
|
195
196
|
var bitmap_1;
|
|
196
197
|
try {
|
|
197
|
-
bitmap_1 = mySegmentsV2utils_1.parseBitmap(parsedData.d, parsedData.c);
|
|
198
|
+
bitmap_1 = (0, mySegmentsV2utils_1.parseBitmap)(parsedData.d, parsedData.c);
|
|
198
199
|
}
|
|
199
200
|
catch (e) {
|
|
200
201
|
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['BoundedFetchRequest', e]);
|
|
201
202
|
break;
|
|
202
203
|
}
|
|
203
|
-
lang_1.forOwn(clients, function (_a) {
|
|
204
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
204
205
|
var hash64 = _a.hash64, worker = _a.worker;
|
|
205
|
-
if (mySegmentsV2utils_1.isInBitmap(bitmap_1, hash64.hex)) {
|
|
206
|
+
if ((0, mySegmentsV2utils_1.isInBitmap)(bitmap_1, hash64.hex)) {
|
|
206
207
|
worker.put(parsedData.changeNumber); // fetch mySegments
|
|
207
208
|
}
|
|
208
209
|
});
|
|
@@ -211,7 +212,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
211
212
|
case types_1.UpdateStrategy.KeyList: {
|
|
212
213
|
var keyList = void 0, added_1, removed_1;
|
|
213
214
|
try {
|
|
214
|
-
keyList = mySegmentsV2utils_1.parseKeyList(parsedData.d, parsedData.c);
|
|
215
|
+
keyList = (0, mySegmentsV2utils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
215
216
|
added_1 = new sets_1._Set(keyList.a);
|
|
216
217
|
removed_1 = new sets_1._Set(keyList.r);
|
|
217
218
|
}
|
|
@@ -219,7 +220,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
219
220
|
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['KeyList', e]);
|
|
220
221
|
break;
|
|
221
222
|
}
|
|
222
|
-
lang_1.forOwn(clients, function (_a) {
|
|
223
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
223
224
|
var hash64 = _a.hash64, worker = _a.worker;
|
|
224
225
|
var add = added_1.has(hash64.dec) ? true : removed_1.has(hash64.dec) ? false : undefined;
|
|
225
226
|
if (add !== undefined) {
|
|
@@ -236,7 +237,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
236
237
|
log.warn(constants_2.STREAMING_PARSING_MY_SEGMENTS_UPDATE_V2, ['SegmentRemoval', 'No segment name was provided']);
|
|
237
238
|
break;
|
|
238
239
|
}
|
|
239
|
-
lang_1.forOwn(clients, function (_a) {
|
|
240
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
240
241
|
var worker = _a.worker;
|
|
241
242
|
return worker.put(parsedData.changeNumber, {
|
|
242
243
|
name: parsedData.segmentName,
|
|
@@ -246,7 +247,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
246
247
|
return;
|
|
247
248
|
}
|
|
248
249
|
// `UpdateStrategy.UnboundedFetchRequest` and fallbacks of other cases
|
|
249
|
-
lang_1.forOwn(clients, function (_a) {
|
|
250
|
+
(0, lang_1.forOwn)(clients, function (_a) {
|
|
250
251
|
var worker = _a.worker;
|
|
251
252
|
worker.put(parsedData.changeNumber);
|
|
252
253
|
});
|
|
@@ -255,16 +256,18 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
255
256
|
else {
|
|
256
257
|
pushEmitter.on(constants_1.SEGMENT_UPDATE, segmentsUpdateWorker.put);
|
|
257
258
|
}
|
|
258
|
-
return objectAssign_1.objectAssign(
|
|
259
|
+
return (0, objectAssign_1.objectAssign)(
|
|
259
260
|
// Expose Event Emitter functionality and Event constants
|
|
260
261
|
Object.create(pushEmitter), {
|
|
261
|
-
// Stop/pause push mode
|
|
262
|
+
// Stop/pause push mode.
|
|
263
|
+
// It doesn't emit events. Neither PUSH_SUBSYSTEM_DOWN to start polling.
|
|
262
264
|
stop: function () {
|
|
263
265
|
disconnectPush(); // `handleNonRetryableError` cannot be used as `stop`, because it emits PUSH_SUBSYSTEM_DOWN event, which starts polling.
|
|
264
266
|
if (userKey)
|
|
265
267
|
this.remove(userKey); // Necessary to properly resume streaming in client-side (e.g., RN SDK transition to foreground).
|
|
266
268
|
},
|
|
267
|
-
// Start/resume push mode
|
|
269
|
+
// Start/resume push mode.
|
|
270
|
+
// It eventually emits PUSH_SUBSYSTEM_DOWN, that starts polling, or PUSH_SUBSYSTEM_UP, that executes a syncAll
|
|
268
271
|
start: function () {
|
|
269
272
|
// Guard condition to avoid calling `connectPush` again if the `start` method is called multiple times or if push has been disabled.
|
|
270
273
|
if (disabled || disconnected === false)
|
|
@@ -275,12 +278,16 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
275
278
|
else
|
|
276
279
|
setTimeout(connectPush); // server-side runs in next cycle as in client-side, for consistency with client-side
|
|
277
280
|
},
|
|
281
|
+
// true/false if start or stop was called last respectively
|
|
282
|
+
isRunning: function () {
|
|
283
|
+
return disconnected === false;
|
|
284
|
+
},
|
|
278
285
|
// [Only for client-side]
|
|
279
286
|
add: function (userKey, mySegmentsSyncTask) {
|
|
280
|
-
var hash = AuthClient_1.hashUserKey(userKey);
|
|
287
|
+
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
281
288
|
if (!userKeyHashes[hash]) {
|
|
282
289
|
userKeyHashes[hash] = userKey;
|
|
283
|
-
clients[userKey] = { hash64: murmur3_64_1.hash64(userKey), worker: new MySegmentsUpdateWorker_1.MySegmentsUpdateWorker(mySegmentsSyncTask) };
|
|
290
|
+
clients[userKey] = { hash64: (0, murmur3_64_1.hash64)(userKey), worker: new MySegmentsUpdateWorker_1.MySegmentsUpdateWorker(mySegmentsSyncTask) };
|
|
284
291
|
connectForNewClient = true; // we must reconnect on start, to listen the channel for the new user key
|
|
285
292
|
// Reconnects in case of a new client.
|
|
286
293
|
// Run in next event-loop cycle to save authentication calls
|
|
@@ -295,7 +302,7 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
295
302
|
},
|
|
296
303
|
// [Only for client-side]
|
|
297
304
|
remove: function (userKey) {
|
|
298
|
-
var hash = AuthClient_1.hashUserKey(userKey);
|
|
305
|
+
var hash = (0, AuthClient_1.hashUserKey)(userKey);
|
|
299
306
|
delete userKeyHashes[hash];
|
|
300
307
|
delete clients[userKey];
|
|
301
308
|
}
|
|
@@ -3,29 +3,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.eventsSyncTaskFactory = void 0;
|
|
4
4
|
var submitterSyncTask_1 = require("./submitterSyncTask");
|
|
5
5
|
var constants_1 = require("../../logger/constants");
|
|
6
|
+
var DATA_NAME = 'events';
|
|
6
7
|
/**
|
|
7
8
|
* Sync task that periodically posts tracked events
|
|
8
9
|
*/
|
|
9
10
|
function eventsSyncTaskFactory(log, postEventsBulk, eventsCache, eventsPushRate, eventsFirstPushWindow, latencyTracker) {
|
|
10
11
|
// don't retry events.
|
|
11
|
-
var syncTask = submitterSyncTask_1.submitterSyncTaskFactory(log, postEventsBulk, eventsCache, eventsPushRate,
|
|
12
|
-
// Set a timer for the first push of events
|
|
12
|
+
var syncTask = (0, submitterSyncTask_1.submitterSyncTaskFactory)(log, postEventsBulk, eventsCache, eventsPushRate, DATA_NAME, latencyTracker);
|
|
13
|
+
// Set a timer for the first push window of events.
|
|
14
|
+
// Not implemented in the base submitter or sync task, since this feature is only used by the events submitter.
|
|
13
15
|
if (eventsFirstPushWindow > 0) {
|
|
16
|
+
var running_1 = false;
|
|
14
17
|
var stopEventPublisherTimeout_1;
|
|
15
18
|
var originalStart_1 = syncTask.start;
|
|
16
19
|
syncTask.start = function () {
|
|
20
|
+
running_1 = true;
|
|
17
21
|
stopEventPublisherTimeout_1 = setTimeout(originalStart_1, eventsFirstPushWindow);
|
|
18
22
|
};
|
|
19
23
|
var originalStop_1 = syncTask.stop;
|
|
20
24
|
syncTask.stop = function () {
|
|
25
|
+
running_1 = false;
|
|
21
26
|
clearTimeout(stopEventPublisherTimeout_1);
|
|
22
27
|
originalStop_1();
|
|
23
28
|
};
|
|
29
|
+
syncTask.isRunning = function () {
|
|
30
|
+
return running_1;
|
|
31
|
+
};
|
|
24
32
|
}
|
|
25
|
-
// register
|
|
33
|
+
// register events submitter to be executed when events cache is full
|
|
26
34
|
eventsCache.setOnFullQueueCb(function () {
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
if (syncTask.isRunning()) {
|
|
36
|
+
log.info(constants_1.SUBMITTERS_PUSH_FULL_QUEUE, [DATA_NAME]);
|
|
37
|
+
syncTask.execute();
|
|
38
|
+
}
|
|
39
|
+
// If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
|
|
40
|
+
// Data will be sent when submitter is resumed.
|
|
29
41
|
});
|
|
30
42
|
return syncTask;
|
|
31
43
|
}
|
|
@@ -30,6 +30,6 @@ var IMPRESSIONS_COUNT_RATE = 1800000; // 30 minutes
|
|
|
30
30
|
*/
|
|
31
31
|
function impressionCountsSyncTaskFactory(log, postTestImpressionsCount, impressionCountsCache, latencyTracker) {
|
|
32
32
|
// retry impressions counts only once.
|
|
33
|
-
return submitterSyncTask_1.submitterSyncTaskFactory(log, postTestImpressionsCount, impressionCountsCache, IMPRESSIONS_COUNT_RATE, 'impression counts', latencyTracker, fromImpressionCountsCollector, 1);
|
|
33
|
+
return (0, submitterSyncTask_1.submitterSyncTaskFactory)(log, postTestImpressionsCount, impressionCountsCache, IMPRESSIONS_COUNT_RATE, 'impression counts', latencyTracker, fromImpressionCountsCollector, 1);
|
|
34
34
|
}
|
|
35
35
|
exports.impressionCountsSyncTaskFactory = impressionCountsSyncTaskFactory;
|
|
@@ -3,14 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.impressionsSyncTaskFactory = exports.fromImpressionsCollector = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
5
|
var submitterSyncTask_1 = require("./submitterSyncTask");
|
|
6
|
+
var constants_1 = require("../../logger/constants");
|
|
7
|
+
var DATA_NAME = 'impressions';
|
|
6
8
|
/**
|
|
7
9
|
* Converts `impressions` data from cache into request payload.
|
|
8
10
|
*/
|
|
9
11
|
function fromImpressionsCollector(sendLabels, data) {
|
|
10
|
-
var groupedByFeature = lang_1.groupBy(data, 'feature');
|
|
12
|
+
var groupedByFeature = (0, lang_1.groupBy)(data, 'feature');
|
|
11
13
|
var dto = [];
|
|
12
14
|
// using forOwn instead of for...in since the last also iterates over prototype enumerables
|
|
13
|
-
lang_1.forOwn(groupedByFeature, function (value, name) {
|
|
15
|
+
(0, lang_1.forOwn)(groupedByFeature, function (value, name) {
|
|
14
16
|
dto.push({
|
|
15
17
|
f: name,
|
|
16
18
|
i: value.map(function (entry) {
|
|
@@ -36,6 +38,16 @@ exports.fromImpressionsCollector = fromImpressionsCollector;
|
|
|
36
38
|
function impressionsSyncTaskFactory(log, postTestImpressionsBulk, impressionsCache, impressionsRefreshRate, sendLabels, latencyTracker) {
|
|
37
39
|
if (sendLabels === void 0) { sendLabels = false; }
|
|
38
40
|
// retry impressions only once.
|
|
39
|
-
|
|
41
|
+
var syncTask = (0, submitterSyncTask_1.submitterSyncTaskFactory)(log, postTestImpressionsBulk, impressionsCache, impressionsRefreshRate, DATA_NAME, latencyTracker, fromImpressionsCollector.bind(undefined, sendLabels), 1);
|
|
42
|
+
// register impressions submitter to be executed when impressions cache is full
|
|
43
|
+
impressionsCache.setOnFullQueueCb(function () {
|
|
44
|
+
if (syncTask.isRunning()) {
|
|
45
|
+
log.info(constants_1.SUBMITTERS_PUSH_FULL_QUEUE, [DATA_NAME]);
|
|
46
|
+
syncTask.execute();
|
|
47
|
+
}
|
|
48
|
+
// If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
|
|
49
|
+
// Data will be sent when submitter is resumed.
|
|
50
|
+
});
|
|
51
|
+
return syncTask;
|
|
40
52
|
}
|
|
41
53
|
exports.impressionsSyncTaskFactory = impressionsSyncTaskFactory;
|
|
@@ -7,7 +7,7 @@ var submitterSyncTask_1 = require("./submitterSyncTask");
|
|
|
7
7
|
function fromCache(propertyName) {
|
|
8
8
|
return function (data) {
|
|
9
9
|
var result = [];
|
|
10
|
-
lang_1.forOwn(data, function (value, key) {
|
|
10
|
+
(0, lang_1.forOwn)(data, function (value, key) {
|
|
11
11
|
var _a;
|
|
12
12
|
result.push((_a = { name: key }, _a[propertyName] = value, _a));
|
|
13
13
|
});
|
|
@@ -18,7 +18,7 @@ function fromCache(propertyName) {
|
|
|
18
18
|
* Sync task that periodically posts telemetry counts
|
|
19
19
|
*/
|
|
20
20
|
function countsSyncTaskFactory(log, postMetricsCounters, countsCache, metricsRefreshRate, latencyTracker) {
|
|
21
|
-
return submitterSyncTask_1.submitterSyncTaskFactory(log, postMetricsCounters, countsCache, metricsRefreshRate, 'count metrics', latencyTracker, fromCache('delta'));
|
|
21
|
+
return (0, submitterSyncTask_1.submitterSyncTaskFactory)(log, postMetricsCounters, countsCache, metricsRefreshRate, 'count metrics', latencyTracker, fromCache('delta'));
|
|
22
22
|
}
|
|
23
23
|
exports.countsSyncTaskFactory = countsSyncTaskFactory;
|
|
24
24
|
/**
|
|
@@ -26,6 +26,6 @@ exports.countsSyncTaskFactory = countsSyncTaskFactory;
|
|
|
26
26
|
*/
|
|
27
27
|
function latenciesSyncTaskFactory(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, latencyTracker) {
|
|
28
28
|
// don't retry metrics.
|
|
29
|
-
return submitterSyncTask_1.submitterSyncTaskFactory(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, 'latency metrics', latencyTracker, fromCache('latencies'), 0, true);
|
|
29
|
+
return (0, submitterSyncTask_1.submitterSyncTaskFactory)(log, postMetricsLatencies, latenciesCache, metricsRefreshRate, 'latency metrics', latencyTracker, fromCache('latencies'), 0, true);
|
|
30
30
|
}
|
|
31
31
|
exports.latenciesSyncTaskFactory = latenciesSyncTaskFactory;
|
|
@@ -9,12 +9,12 @@ function submitterManagerFactory(params) {
|
|
|
9
9
|
var settings = params.settings, storage = params.storage, splitApi = params.splitApi;
|
|
10
10
|
var log = settings.log;
|
|
11
11
|
var submitters = [
|
|
12
|
-
impressionsSyncTask_1.impressionsSyncTaskFactory(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
|
|
13
|
-
eventsSyncTask_1.eventsSyncTaskFactory(log, splitApi.postEventsBulk, storage.events, settings.scheduler.eventsPushRate, settings.startup.eventsFirstPushWindow)
|
|
12
|
+
(0, impressionsSyncTask_1.impressionsSyncTaskFactory)(log, splitApi.postTestImpressionsBulk, storage.impressions, settings.scheduler.impressionsRefreshRate, settings.core.labelsEnabled),
|
|
13
|
+
(0, eventsSyncTask_1.eventsSyncTaskFactory)(log, splitApi.postEventsBulk, storage.events, settings.scheduler.eventsPushRate, settings.startup.eventsFirstPushWindow)
|
|
14
14
|
// @TODO add telemetry submitter
|
|
15
15
|
];
|
|
16
16
|
if (storage.impressionCounts)
|
|
17
|
-
submitters.push(impressionCountsSyncTask_1.impressionCountsSyncTaskFactory(log, splitApi.postTestImpressionsCount, storage.impressionCounts));
|
|
18
|
-
return syncTaskComposite_1.syncTaskComposite(submitters);
|
|
17
|
+
submitters.push((0, impressionCountsSyncTask_1.impressionCountsSyncTaskFactory)(log, splitApi.postTestImpressionsCount, storage.impressionCounts));
|
|
18
|
+
return (0, syncTaskComposite_1.syncTaskComposite)(submitters);
|
|
19
19
|
}
|
|
20
20
|
exports.submitterManagerFactory = submitterManagerFactory;
|
|
@@ -39,6 +39,6 @@ function submitterSyncTaskFactory(log, postClient, sourceCache, postRate, dataNa
|
|
|
39
39
|
// if latencyTracker provided, attach stop callback to postEventsPromise
|
|
40
40
|
return latencyTrackerStop ? postPromise.then(latencyTrackerStop).catch(latencyTrackerStop) : postPromise;
|
|
41
41
|
}
|
|
42
|
-
return syncTask_1.syncTaskFactory(log, postData, postRate, dataName + ' submitter');
|
|
42
|
+
return (0, syncTask_1.syncTaskFactory)(log, postData, postRate, dataName + ' submitter');
|
|
43
43
|
}
|
|
44
44
|
exports.submitterSyncTaskFactory = submitterSyncTaskFactory;
|
|
@@ -4,6 +4,7 @@ exports.syncManagerOnlineFactory = void 0;
|
|
|
4
4
|
var submitterManager_1 = require("./submitters/submitterManager");
|
|
5
5
|
var constants_1 = require("./streaming/constants");
|
|
6
6
|
var constants_2 = require("../logger/constants");
|
|
7
|
+
var consent_1 = require("../utils/consent");
|
|
7
8
|
/**
|
|
8
9
|
* Online SyncManager factory.
|
|
9
10
|
* Can be used for server-side API, and client-side API with or without multiple clients.
|
|
@@ -17,7 +18,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
17
18
|
* SyncManager factory for modular SDK
|
|
18
19
|
*/
|
|
19
20
|
return function (params) {
|
|
20
|
-
var _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
|
|
21
|
+
var settings = params.settings, _a = params.settings, log = _a.log, streamingEnabled = _a.streamingEnabled;
|
|
21
22
|
/** Polling Manager */
|
|
22
23
|
var pollingManager = pollingManagerFactory && pollingManagerFactory(params);
|
|
23
24
|
/** Push Manager */
|
|
@@ -26,7 +27,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
26
27
|
undefined;
|
|
27
28
|
/** Submitter Manager */
|
|
28
29
|
// It is not inyected as push and polling managers, because at the moment it is required
|
|
29
|
-
var submitter = submitterManager_1.submitterManagerFactory(params);
|
|
30
|
+
var submitter = (0, submitterManager_1.submitterManagerFactory)(params);
|
|
30
31
|
/** Sync Manager logic */
|
|
31
32
|
function startPolling() {
|
|
32
33
|
if (pollingManager.isRunning()) {
|
|
@@ -52,11 +53,16 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
52
53
|
var running = false; // flag that indicates whether the syncManager has been started (true) or stopped (false)
|
|
53
54
|
var startFirstTime = true; // flag to distinguish calling the `start` method for the first time, to support pausing and resuming the synchronization
|
|
54
55
|
return {
|
|
56
|
+
// Exposed for fine-grained control of synchronization.
|
|
57
|
+
// E.g.: user consent, app state changes (Page hide, Foreground/Background, Online/Offline).
|
|
58
|
+
pollingManager: pollingManager,
|
|
55
59
|
pushManager: pushManager,
|
|
60
|
+
submitter: submitter,
|
|
56
61
|
/**
|
|
57
62
|
* Method used to start the syncManager for the first time, or resume it after being stopped.
|
|
58
63
|
*/
|
|
59
64
|
start: function () {
|
|
65
|
+
running = true;
|
|
60
66
|
// start syncing splits and segments
|
|
61
67
|
if (pollingManager) {
|
|
62
68
|
if (pushManager) {
|
|
@@ -72,29 +78,27 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
|
|
|
72
78
|
}
|
|
73
79
|
}
|
|
74
80
|
// start periodic data recording (events, impressions, telemetry).
|
|
75
|
-
if (
|
|
81
|
+
if ((0, consent_1.isConsentGranted)(settings))
|
|
76
82
|
submitter.start();
|
|
77
|
-
running = true;
|
|
78
83
|
},
|
|
79
84
|
/**
|
|
80
85
|
* Method used to stop/pause the syncManager.
|
|
81
86
|
*/
|
|
82
87
|
stop: function () {
|
|
88
|
+
running = false;
|
|
83
89
|
// stop syncing
|
|
84
90
|
if (pushManager)
|
|
85
91
|
pushManager.stop();
|
|
86
92
|
if (pollingManager && pollingManager.isRunning())
|
|
87
93
|
pollingManager.stop();
|
|
88
94
|
// stop periodic data recording (events, impressions, telemetry).
|
|
89
|
-
|
|
90
|
-
submitter.stop();
|
|
91
|
-
running = false;
|
|
95
|
+
submitter.stop();
|
|
92
96
|
},
|
|
93
97
|
isRunning: function () {
|
|
94
98
|
return running;
|
|
95
99
|
},
|
|
96
100
|
flush: function () {
|
|
97
|
-
if (
|
|
101
|
+
if ((0, consent_1.isConsentGranted)(settings))
|
|
98
102
|
return submitter.execute();
|
|
99
103
|
else
|
|
100
104
|
return Promise.resolve();
|
|
@@ -4,13 +4,17 @@ exports.eventTrackerFactory = void 0;
|
|
|
4
4
|
var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
5
5
|
var thenable_1 = require("../utils/promise/thenable");
|
|
6
6
|
var constants_1 = require("../logger/constants");
|
|
7
|
+
var constants_2 = require("../utils/constants");
|
|
8
|
+
var utils_1 = require("./impressionObserver/utils");
|
|
7
9
|
/**
|
|
8
10
|
* Event tracker stores events in cache and pass them to the integrations manager if provided.
|
|
9
11
|
*
|
|
10
12
|
* @param eventsCache cache to save events
|
|
11
13
|
* @param integrationsManager optional event handler used for integrations
|
|
12
14
|
*/
|
|
13
|
-
function eventTrackerFactory(
|
|
15
|
+
function eventTrackerFactory(settings, eventsCache, integrationsManager) {
|
|
16
|
+
var log = settings.log;
|
|
17
|
+
var isSync = (0, utils_1.isStorageSync)(settings);
|
|
14
18
|
function queueEventsCallback(eventData, tracked) {
|
|
15
19
|
var eventTypeId = eventData.eventTypeId, trafficTypeName = eventData.trafficTypeName, key = eventData.key, value = eventData.value, timestamp = eventData.timestamp, properties = eventData.properties;
|
|
16
20
|
// Logging every prop would be too much.
|
|
@@ -21,9 +25,9 @@ function eventTrackerFactory(log, eventsCache, integrationsManager) {
|
|
|
21
25
|
// Wrap in a timeout because we don't want it to be blocking.
|
|
22
26
|
setTimeout(function () {
|
|
23
27
|
// copy of event, to avoid unexpected behaviour if modified by integrations
|
|
24
|
-
var eventDataCopy = objectAssign_1.objectAssign({}, eventData);
|
|
28
|
+
var eventDataCopy = (0, objectAssign_1.objectAssign)({}, eventData);
|
|
25
29
|
if (eventData.properties)
|
|
26
|
-
eventDataCopy.properties = objectAssign_1.objectAssign({}, eventData.properties);
|
|
30
|
+
eventDataCopy.properties = (0, objectAssign_1.objectAssign)({}, eventData.properties);
|
|
27
31
|
// integrationsManager does not throw errors (they are internally handled by each integration module)
|
|
28
32
|
integrationsManager.handleEvent(eventDataCopy);
|
|
29
33
|
}, 0);
|
|
@@ -36,8 +40,11 @@ function eventTrackerFactory(log, eventsCache, integrationsManager) {
|
|
|
36
40
|
}
|
|
37
41
|
return {
|
|
38
42
|
track: function (eventData, size) {
|
|
43
|
+
if (settings.userConsent === constants_2.CONSENT_DECLINED) {
|
|
44
|
+
return isSync ? false : Promise.resolve(false);
|
|
45
|
+
}
|
|
39
46
|
var tracked = eventsCache.track(eventData, size);
|
|
40
|
-
if (thenable_1.thenable(tracked)) {
|
|
47
|
+
if ((0, thenable_1.thenable)(tracked)) {
|
|
41
48
|
return tracked.then(queueEventsCallback.bind(null, eventData));
|
|
42
49
|
}
|
|
43
50
|
else {
|
|
@@ -5,7 +5,7 @@ var ImpressionObserver_1 = require("./ImpressionObserver");
|
|
|
5
5
|
var murmur3_1 = require("../../utils/murmur3/murmur3");
|
|
6
6
|
var buildKey_1 = require("./buildKey");
|
|
7
7
|
function hashImpression32(impression) {
|
|
8
|
-
return murmur3_1.hash(buildKey_1.buildKey(impression));
|
|
8
|
+
return (0, murmur3_1.hash)((0, buildKey_1.buildKey)(impression));
|
|
9
9
|
}
|
|
10
10
|
exports.hashImpression32 = hashImpression32;
|
|
11
11
|
var LAST_SEEN_CACHE_SIZE = 500; // cache up to 500 impression hashes
|
|
@@ -5,7 +5,7 @@ var ImpressionObserver_1 = require("./ImpressionObserver");
|
|
|
5
5
|
var murmur3_128_x86_1 = require("../../utils/murmur3/murmur3_128_x86");
|
|
6
6
|
var buildKey_1 = require("./buildKey");
|
|
7
7
|
function hashImpression128(impression) {
|
|
8
|
-
return murmur3_128_x86_1.hash128(buildKey_1.buildKey(impression));
|
|
8
|
+
return (0, murmur3_128_x86_1.hash128)((0, buildKey_1.buildKey)(impression));
|
|
9
9
|
}
|
|
10
10
|
exports.hashImpression128 = hashImpression128;
|
|
11
11
|
var LAST_SEEN_CACHE_SIZE = 500000; // cache up to 500k impression hashes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.shouldBeOptimized = exports.shouldAddPt = void 0;
|
|
3
|
+
exports.isStorageSync = exports.shouldBeOptimized = exports.shouldAddPt = void 0;
|
|
4
4
|
var constants_1 = require("../../utils/constants");
|
|
5
5
|
/**
|
|
6
6
|
* Checks if impressions previous time should be added or not.
|
|
@@ -18,3 +18,10 @@ function shouldBeOptimized(settings) {
|
|
|
18
18
|
return settings.sync.impressionsMode === constants_1.OPTIMIZED ? true : false;
|
|
19
19
|
}
|
|
20
20
|
exports.shouldBeOptimized = shouldBeOptimized;
|
|
21
|
+
/**
|
|
22
|
+
* Storage is async if mode is consumer or partial consumer
|
|
23
|
+
*/
|
|
24
|
+
function isStorageSync(settings) {
|
|
25
|
+
return [constants_1.CONSUMER_MODE, constants_1.CONSUMER_PARTIAL_MODE].indexOf(settings.mode) === -1 ? true : false;
|
|
26
|
+
}
|
|
27
|
+
exports.isStorageSync = isStorageSync;
|
|
@@ -5,6 +5,7 @@ var objectAssign_1 = require("../utils/lang/objectAssign");
|
|
|
5
5
|
var thenable_1 = require("../utils/promise/thenable");
|
|
6
6
|
var time_1 = require("../utils/time");
|
|
7
7
|
var constants_1 = require("../logger/constants");
|
|
8
|
+
var constants_2 = require("../utils/constants");
|
|
8
9
|
/**
|
|
9
10
|
* Impressions tracker stores impressions in cache and pass them to the listener and integrations manager if provided.
|
|
10
11
|
*
|
|
@@ -15,16 +16,16 @@ var constants_1 = require("../logger/constants");
|
|
|
15
16
|
* @param observer optional impression observer. If provided, previous time (pt property) is included in impression instances
|
|
16
17
|
* @param countsCache optional cache to save impressions count. If provided, impressions will be deduped (OPTIMIZED mode)
|
|
17
18
|
*/
|
|
18
|
-
function impressionsTrackerFactory(
|
|
19
|
-
// @TODO consider passing only an optional integrationsManager to handle impressions
|
|
20
|
-
_a, impressionListener, integrationsManager,
|
|
19
|
+
function impressionsTrackerFactory(settings, impressionsCache, integrationsManager,
|
|
21
20
|
// if observer is provided, it implies `shouldAddPreviousTime` flag (i.e., if impressions previous time should be added or not)
|
|
22
21
|
observer,
|
|
23
22
|
// if countsCache is provided, it implies `isOptimized` flag (i.e., if impressions should be deduped or not)
|
|
24
23
|
countsCache) {
|
|
25
|
-
var
|
|
24
|
+
var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version;
|
|
26
25
|
return {
|
|
27
26
|
track: function (impressions, attributes) {
|
|
27
|
+
if (settings.userConsent === constants_2.CONSENT_DECLINED)
|
|
28
|
+
return;
|
|
28
29
|
var impressionsCount = impressions.length;
|
|
29
30
|
var impressionsToStore = []; // Track only the impressions that are going to be stored
|
|
30
31
|
// Wraps impressions to store and adds previousTime if it corresponds
|
|
@@ -39,13 +40,13 @@ countsCache) {
|
|
|
39
40
|
countsCache.track(impression.feature, now, 1);
|
|
40
41
|
}
|
|
41
42
|
// Checks if the impression should be added in queue to be sent
|
|
42
|
-
if (!countsCache || !impression.pt || impression.pt < time_1.truncateTimeFrame(now)) {
|
|
43
|
+
if (!countsCache || !impression.pt || impression.pt < (0, time_1.truncateTimeFrame)(now)) {
|
|
43
44
|
impressionsToStore.push(impression);
|
|
44
45
|
}
|
|
45
46
|
});
|
|
46
47
|
var res = impressionsCache.track(impressionsToStore);
|
|
47
48
|
// If we're on an async storage, handle error and log it.
|
|
48
|
-
if (thenable_1.thenable(res)) {
|
|
49
|
+
if ((0, thenable_1.thenable)(res)) {
|
|
49
50
|
res.then(function () {
|
|
50
51
|
log.info(constants_1.IMPRESSIONS_TRACKER_SUCCESS, [impressionsCount]);
|
|
51
52
|
}).catch(function (err) {
|
|
@@ -57,7 +58,7 @@ countsCache) {
|
|
|
57
58
|
var _loop_1 = function (i) {
|
|
58
59
|
var impressionData = {
|
|
59
60
|
// copy of impression, to avoid unexpected behaviour if modified by integrations or impressionListener
|
|
60
|
-
impression: objectAssign_1.objectAssign({}, impressions[i]),
|
|
61
|
+
impression: (0, objectAssign_1.objectAssign)({}, impressions[i]),
|
|
61
62
|
attributes: attributes,
|
|
62
63
|
ip: ip,
|
|
63
64
|
hostname: hostname,
|
|
@@ -68,7 +69,7 @@ countsCache) {
|
|
|
68
69
|
// integrationsManager.handleImpression does not throw errors
|
|
69
70
|
if (integrationsManager)
|
|
70
71
|
integrationsManager.handleImpression(impressionData);
|
|
71
|
-
try { // An exception on the listeners should not break the SDK.
|
|
72
|
+
try { // @ts-ignore. An exception on the listeners should not break the SDK.
|
|
72
73
|
if (impressionListener)
|
|
73
74
|
impressionListener.logImpression(impressionData);
|
|
74
75
|
}
|
package/cjs/utils/MinEvents.js
CHANGED
|
@@ -38,9 +38,10 @@ var ReflectApply = R && typeof R.apply === 'function'
|
|
|
38
38
|
: function ReflectApply(target, receiver, args) {
|
|
39
39
|
return Function.prototype.apply.call(target, receiver, args);
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
var EventEmitter = function EventEmitter() {
|
|
42
42
|
EventEmitter.init.call(this);
|
|
43
43
|
};
|
|
44
|
+
exports.EventEmitter = EventEmitter;
|
|
44
45
|
exports.EventEmitter.prototype._events = undefined;
|
|
45
46
|
exports.EventEmitter.prototype._eventsCount = 0;
|
|
46
47
|
function checkListener(listener) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isConsentGranted = void 0;
|
|
4
|
+
var constants_1 = require("./constants");
|
|
5
|
+
function isConsentGranted(settings) {
|
|
6
|
+
var userConsent = settings.userConsent;
|
|
7
|
+
// undefined userConsent is handled as granted (default)
|
|
8
|
+
return !userConsent || userConsent === constants_1.CONSENT_GRANTED;
|
|
9
|
+
}
|
|
10
|
+
exports.isConsentGranted = isConsentGranted;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
3
|
+
exports.CONSENT_UNKNOWN = exports.CONSENT_DECLINED = exports.CONSENT_GRANTED = exports.STORAGE_PLUGGABLE = exports.STORAGE_REDIS = exports.STORAGE_LOCALSTORAGE = exports.STORAGE_MEMORY = exports.CONSUMER_PARTIAL_MODE = exports.CONSUMER_MODE = exports.PRODUCER_MODE = exports.STANDALONE_MODE = exports.LOCALHOST_MODE = exports.OPTIMIZED = exports.DEBUG = exports.SPLIT_EVENT = exports.SPLIT_IMPRESSION = exports.NA = exports.UNKNOWN = exports.CONTROL_WITH_CONFIG = exports.CONTROL = void 0;
|
|
4
4
|
// Special treatments
|
|
5
5
|
exports.CONTROL = 'control';
|
|
6
6
|
exports.CONTROL_WITH_CONFIG = {
|
|
@@ -27,3 +27,7 @@ exports.STORAGE_MEMORY = 'MEMORY';
|
|
|
27
27
|
exports.STORAGE_LOCALSTORAGE = 'LOCALSTORAGE';
|
|
28
28
|
exports.STORAGE_REDIS = 'REDIS';
|
|
29
29
|
exports.STORAGE_PLUGGABLE = 'PLUGGABLE';
|
|
30
|
+
// User consent
|
|
31
|
+
exports.CONSENT_GRANTED = 'GRANTED'; // The user has granted consent for tracking events and impressions
|
|
32
|
+
exports.CONSENT_DECLINED = 'DECLINED'; // The user has declined consent for tracking events and impressions
|
|
33
|
+
exports.CONSENT_UNKNOWN = 'UNKNOWN'; // The user has neither granted nor declined consent for tracking events and impressions
|
|
@@ -10,7 +10,7 @@ function validateApiKey(log, maybeApiKey) {
|
|
|
10
10
|
if (maybeApiKey == undefined) { // eslint-disable-line eqeqeq
|
|
11
11
|
log.error(constants_1.ERROR_NULL, [constants_1.LOG_PREFIX_INSTANTIATION, item]);
|
|
12
12
|
}
|
|
13
|
-
else if (lang_1.isString(maybeApiKey)) {
|
|
13
|
+
else if ((0, lang_1.isString)(maybeApiKey)) {
|
|
14
14
|
if (maybeApiKey.length > 0)
|
|
15
15
|
apiKey = maybeApiKey;
|
|
16
16
|
else
|
|
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validateAttribute = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
5
|
function validateAttribute(log, attributeKey, attributeValue, method) {
|
|
6
|
-
if (!lang_1.isString(attributeKey) || attributeKey.length === 0) {
|
|
6
|
+
if (!(0, lang_1.isString)(attributeKey) || attributeKey.length === 0) {
|
|
7
7
|
log.warn(method + ": you passed an invalid attribute name, attribute name must be a non-empty string.");
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
var isStringVal = lang_1.isString(attributeValue);
|
|
11
|
-
var isFiniteVal = lang_1.isFiniteNumber(attributeValue);
|
|
12
|
-
var isBoolVal = lang_1.isBoolean(attributeValue);
|
|
10
|
+
var isStringVal = (0, lang_1.isString)(attributeValue);
|
|
11
|
+
var isFiniteVal = (0, lang_1.isFiniteNumber)(attributeValue);
|
|
12
|
+
var isBoolVal = (0, lang_1.isBoolean)(attributeValue);
|
|
13
13
|
var isArrayVal = Array.isArray(attributeValue);
|
|
14
14
|
if (!(isStringVal || isFiniteVal || isBoolVal || isArrayVal)) { // If it's not of valid type.
|
|
15
15
|
log.warn(method + ": you passed an invalid attribute value for " + attributeKey + ". Acceptable types are: string, number, boolean and array of strings.");
|