@splitsoftware/splitio-commons 1.6.2-rc.2 → 1.6.2-rc.3
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/listeners/browser.js +1 -2
- package/cjs/logger/constants.js +1 -2
- package/cjs/sdkFactory/index.js +6 -14
- package/cjs/services/splitApi.js +1 -20
- package/cjs/storages/inLocalStorage/index.js +0 -4
- package/cjs/storages/inMemory/InMemoryStorage.js +1 -5
- package/cjs/storages/inMemory/InMemoryStorageCS.js +1 -5
- package/cjs/sync/submitters/submitterManager.js +0 -3
- package/cjs/sync/submitters/telemetrySubmitter.js +0 -1
- package/cjs/trackers/impressionsTracker.js +28 -7
- package/cjs/utils/constants/index.js +2 -4
- package/cjs/utils/key/index.js +1 -1
- package/cjs/utils/settingsValidation/impressionsMode.js +2 -2
- package/cjs/utils/settingsValidation/index.js +1 -3
- package/esm/listeners/browser.js +2 -3
- package/esm/logger/constants.js +0 -1
- package/esm/sdkFactory/index.js +6 -14
- package/esm/services/splitApi.js +1 -20
- package/esm/storages/inLocalStorage/index.js +1 -5
- package/esm/storages/inMemory/InMemoryStorage.js +2 -6
- package/esm/storages/inMemory/InMemoryStorageCS.js +2 -6
- package/esm/sync/submitters/submitterManager.js +0 -3
- package/esm/sync/submitters/telemetrySubmitter.js +1 -2
- package/esm/trackers/impressionsTracker.js +28 -7
- package/esm/utils/constants/index.js +0 -2
- package/esm/utils/key/index.js +1 -1
- package/esm/utils/settingsValidation/impressionsMode.js +3 -3
- package/esm/utils/settingsValidation/index.js +1 -3
- package/package.json +2 -2
- package/src/consent/sdkUserConsent.ts +4 -3
- package/src/dtos/types.ts +0 -8
- package/src/evaluator/Engine.ts +3 -3
- package/src/evaluator/combiners/and.ts +1 -1
- package/src/evaluator/combiners/ifelseif.ts +3 -3
- package/src/evaluator/condition/engineUtils.ts +1 -1
- package/src/evaluator/condition/index.ts +6 -6
- package/src/evaluator/index.ts +10 -10
- package/src/evaluator/matchers/all.ts +1 -1
- package/src/evaluator/matchers/between.ts +1 -1
- package/src/evaluator/matchers/boolean.ts +1 -1
- package/src/evaluator/matchers/cont_all.ts +1 -1
- package/src/evaluator/matchers/cont_any.ts +1 -1
- package/src/evaluator/matchers/cont_str.ts +1 -1
- package/src/evaluator/matchers/dependency.ts +1 -1
- package/src/evaluator/matchers/eq.ts +1 -1
- package/src/evaluator/matchers/eq_set.ts +1 -1
- package/src/evaluator/matchers/ew.ts +1 -1
- package/src/evaluator/matchers/gte.ts +1 -1
- package/src/evaluator/matchers/index.ts +1 -1
- package/src/evaluator/matchers/lte.ts +1 -1
- package/src/evaluator/matchers/part_of.ts +1 -1
- package/src/evaluator/matchers/segment.ts +1 -1
- package/src/evaluator/matchers/string.ts +1 -1
- package/src/evaluator/matchers/sw.ts +1 -1
- package/src/evaluator/matchers/whitelist.ts +1 -1
- package/src/evaluator/parser/index.ts +3 -3
- package/src/evaluator/types.ts +6 -6
- package/src/evaluator/value/index.ts +4 -4
- package/src/evaluator/value/sanitize.ts +4 -4
- package/src/integrations/ga/GaToSplit.ts +6 -6
- package/src/integrations/ga/SplitToGa.ts +10 -10
- package/src/integrations/ga/types.ts +4 -4
- package/src/integrations/pluggable.ts +3 -3
- package/src/integrations/types.ts +2 -2
- package/src/listeners/browser.ts +2 -3
- package/src/logger/.DS_Store +0 -0
- package/src/logger/constants.ts +0 -1
- package/src/logger/index.ts +3 -3
- package/src/logger/sdkLogger.ts +1 -2
- package/src/logger/types.ts +0 -16
- package/src/readiness/sdkReadinessManager.ts +1 -1
- package/src/readiness/types.ts +2 -9
- package/src/sdkClient/client.ts +13 -13
- package/src/sdkClient/clientAttributesDecoration.ts +9 -9
- package/src/sdkClient/clientCS.ts +3 -4
- package/src/sdkClient/clientInputValidation.ts +15 -15
- package/src/sdkClient/sdkClient.ts +2 -2
- package/src/sdkClient/sdkClientMethod.ts +2 -2
- package/src/sdkClient/sdkClientMethodCS.ts +9 -9
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +9 -9
- package/src/sdkFactory/index.ts +8 -18
- package/src/sdkFactory/types.ts +8 -11
- package/src/sdkManager/index.ts +5 -5
- package/src/services/splitApi.ts +1 -22
- package/src/services/types.ts +0 -6
- package/src/storages/dataLoader.ts +2 -2
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +1 -1
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +2 -2
- package/src/storages/inLocalStorage/index.ts +4 -6
- package/src/storages/inMemory/EventsCacheInMemory.ts +4 -4
- package/src/storages/inMemory/InMemoryStorage.ts +2 -5
- package/src/storages/inMemory/InMemoryStorageCS.ts +2 -6
- package/src/storages/inRedis/EventsCacheInRedis.ts +4 -4
- package/src/storages/inRedis/ImpressionsCacheInRedis.ts +1 -1
- package/src/storages/inRedis/RedisAdapter.ts +1 -1
- package/src/storages/inRedis/SegmentsCacheInRedis.ts +1 -1
- package/src/storages/inRedis/SplitsCacheInRedis.ts +1 -1
- package/src/storages/inRedis/TelemetryCacheInRedis.ts +1 -1
- package/src/storages/inRedis/index.ts +3 -2
- package/src/storages/pluggable/EventsCachePluggable.ts +4 -4
- package/src/storages/pluggable/ImpressionsCachePluggable.ts +1 -1
- package/src/storages/pluggable/SegmentsCachePluggable.ts +1 -1
- package/src/storages/pluggable/SplitsCachePluggable.ts +1 -1
- package/src/storages/pluggable/TelemetryCachePluggable.ts +1 -1
- package/src/storages/pluggable/index.ts +3 -3
- package/src/storages/pluggable/wrapperAdapter.ts +1 -1
- package/src/storages/types.ts +48 -40
- package/src/sync/offline/LocalhostFromObject.ts +4 -4
- package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +8 -8
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +1 -1
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +1 -1
- package/src/sync/polling/updaters/splitChangesUpdater.ts +1 -1
- package/src/sync/streaming/SSEHandler/index.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.ts +1 -1
- package/src/sync/streaming/UpdateWorkers/SplitsUpdateWorker.ts +1 -1
- package/src/sync/submitters/submitter.ts +1 -1
- package/src/sync/submitters/submitterManager.ts +0 -2
- package/src/sync/submitters/telemetrySubmitter.ts +3 -4
- package/src/sync/submitters/types.ts +3 -22
- package/src/sync/syncTask.ts +1 -1
- package/src/trackers/eventTracker.ts +3 -3
- package/src/trackers/impressionsTracker.ts +38 -15
- package/src/trackers/types.ts +4 -30
- package/src/types.d.ts +1646 -0
- package/src/utils/constants/index.ts +1 -3
- package/src/utils/inputValidation/apiKey.ts +1 -1
- package/src/utils/inputValidation/attribute.ts +1 -1
- package/src/utils/inputValidation/attributes.ts +3 -3
- package/src/utils/inputValidation/event.ts +1 -1
- package/src/utils/inputValidation/eventProperties.ts +3 -3
- package/src/utils/inputValidation/eventValue.ts +1 -1
- package/src/utils/inputValidation/isOperational.ts +1 -1
- package/src/utils/inputValidation/key.ts +3 -3
- package/src/utils/inputValidation/preloadedData.ts +3 -3
- package/src/utils/inputValidation/split.ts +1 -1
- package/src/utils/inputValidation/splitExistance.ts +1 -1
- package/src/utils/inputValidation/splits.ts +1 -1
- package/src/utils/inputValidation/trafficType.ts +1 -1
- package/src/utils/inputValidation/trafficTypeExistance.ts +1 -1
- package/src/utils/key/index.ts +9 -9
- package/src/utils/settingsValidation/consent.ts +1 -2
- package/src/utils/settingsValidation/impressionsMode.ts +6 -6
- package/src/utils/settingsValidation/index.ts +1 -4
- package/src/utils/settingsValidation/integrations/common.ts +1 -1
- package/src/utils/settingsValidation/integrations/configurable.ts +1 -1
- package/src/utils/settingsValidation/integrations/pluggable.ts +1 -2
- package/src/utils/settingsValidation/localhost/builtin.ts +1 -2
- package/src/utils/settingsValidation/localhost/pluggable.ts +1 -2
- package/src/utils/settingsValidation/logger/builtinLogger.ts +1 -2
- package/src/utils/settingsValidation/logger/pluggableLogger.ts +1 -2
- package/src/utils/settingsValidation/splitFilters.ts +7 -9
- package/src/utils/settingsValidation/storage/storageCS.ts +1 -2
- package/types/consent/sdkUserConsent.d.ts +2 -9
- package/types/dtos/types.d.ts +0 -6
- package/types/evaluator/Engine.d.ts +3 -3
- package/types/evaluator/combiners/and.d.ts +1 -1
- package/types/evaluator/combiners/ifelseif.d.ts +1 -1
- package/types/evaluator/condition/engineUtils.d.ts +1 -1
- package/types/evaluator/condition/index.d.ts +1 -1
- package/types/evaluator/index.d.ts +4 -4
- package/types/evaluator/matchers/all.d.ts +1 -1
- package/types/evaluator/matchers/between.d.ts +1 -1
- package/types/evaluator/matchers/boolean.d.ts +1 -1
- package/types/evaluator/matchers/cont_all.d.ts +1 -1
- package/types/evaluator/matchers/cont_any.d.ts +1 -1
- package/types/evaluator/matchers/cont_str.d.ts +1 -1
- package/types/evaluator/matchers/dependency.d.ts +1 -1
- package/types/evaluator/matchers/eq.d.ts +1 -1
- package/types/evaluator/matchers/eq_set.d.ts +1 -1
- package/types/evaluator/matchers/ew.d.ts +1 -1
- package/types/evaluator/matchers/gte.d.ts +1 -1
- package/types/evaluator/matchers/index.d.ts +1 -1
- package/types/evaluator/matchers/lte.d.ts +1 -1
- package/types/evaluator/matchers/part_of.d.ts +1 -1
- package/types/evaluator/matchers/segment.d.ts +1 -1
- package/types/evaluator/matchers/string.d.ts +1 -1
- package/types/evaluator/matchers/sw.d.ts +1 -1
- package/types/evaluator/matchers/whitelist.d.ts +1 -1
- package/types/evaluator/parser/index.d.ts +1 -1
- package/types/evaluator/types.d.ts +6 -6
- package/types/evaluator/value/index.d.ts +3 -3
- package/types/evaluator/value/sanitize.d.ts +3 -3
- package/types/integrations/ga/GaToSplit.d.ts +4 -4
- package/types/integrations/ga/SplitToGa.d.ts +4 -4
- package/types/integrations/ga/types.d.ts +4 -4
- package/types/integrations/types.d.ts +2 -2
- package/types/logger/constants.d.ts +0 -1
- package/types/logger/index.d.ts +3 -5
- package/types/logger/sdkLogger.d.ts +1 -2
- package/types/logger/types.d.ts +0 -11
- package/types/readiness/sdkReadinessManager.d.ts +1 -1
- package/types/readiness/types.d.ts +2 -8
- package/types/sdkClient/client.d.ts +2 -2
- package/types/sdkClient/clientAttributesDecoration.d.ts +8 -8
- package/types/sdkClient/clientCS.d.ts +2 -3
- package/types/sdkClient/clientInputValidation.d.ts +2 -2
- 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/index.d.ts +2 -2
- package/types/sdkFactory/types.d.ts +8 -10
- package/types/sdkManager/index.d.ts +3 -3
- package/types/services/types.d.ts +0 -4
- package/types/storages/dataLoader.d.ts +2 -2
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +1 -1
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +1 -2
- package/types/storages/inLocalStorage/index.d.ts +2 -2
- package/types/storages/inMemory/EventsCacheInMemory.d.ts +3 -3
- package/types/storages/inMemory/InMemoryStorage.d.ts +1 -1
- package/types/storages/inMemory/InMemoryStorageCS.d.ts +1 -1
- package/types/storages/inRedis/EventsCacheInRedis.d.ts +3 -3
- package/types/storages/inRedis/ImpressionsCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/RedisAdapter.d.ts +1 -1
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/SplitsCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +1 -1
- package/types/storages/inRedis/index.d.ts +2 -2
- package/types/storages/pluggable/EventsCachePluggable.d.ts +3 -3
- package/types/storages/pluggable/ImpressionsCachePluggable.d.ts +1 -1
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +1 -1
- package/types/storages/pluggable/SplitsCachePluggable.d.ts +1 -1
- package/types/storages/pluggable/TelemetryCachePluggable.d.ts +1 -1
- package/types/storages/pluggable/index.d.ts +3 -2
- package/types/storages/pluggable/wrapperAdapter.d.ts +1 -1
- package/types/storages/types.d.ts +46 -30
- package/types/sync/offline/LocalhostFromObject.d.ts +2 -2
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +1 -1
- package/types/sync/polling/updaters/segmentChangesUpdater.d.ts +1 -1
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -1
- package/types/sync/streaming/SSEHandler/index.d.ts +1 -1
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +1 -1
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +1 -1
- package/types/sync/submitters/submitter.d.ts +1 -1
- package/types/sync/submitters/types.d.ts +3 -20
- package/types/sync/syncTask.d.ts +1 -1
- package/types/trackers/impressionsTracker.d.ts +6 -4
- package/types/trackers/types.d.ts +4 -25
- package/types/utils/constants/index.d.ts +1 -3
- package/types/utils/inputValidation/apiKey.d.ts +1 -1
- package/types/utils/inputValidation/attribute.d.ts +1 -1
- package/types/utils/inputValidation/attributes.d.ts +3 -3
- package/types/utils/inputValidation/event.d.ts +1 -1
- package/types/utils/inputValidation/eventProperties.d.ts +3 -3
- package/types/utils/inputValidation/eventValue.d.ts +1 -1
- package/types/utils/inputValidation/isOperational.d.ts +1 -1
- package/types/utils/inputValidation/key.d.ts +3 -3
- package/types/utils/inputValidation/preloadedData.d.ts +3 -3
- package/types/utils/inputValidation/split.d.ts +1 -1
- package/types/utils/inputValidation/splitExistance.d.ts +1 -1
- package/types/utils/inputValidation/splits.d.ts +1 -1
- package/types/utils/inputValidation/trafficType.d.ts +1 -1
- package/types/utils/inputValidation/trafficTypeExistance.d.ts +1 -1
- package/types/utils/key/index.d.ts +4 -4
- package/types/utils/settingsValidation/consent.d.ts +1 -2
- package/types/utils/settingsValidation/impressionsMode.d.ts +3 -3
- package/types/utils/settingsValidation/index.d.ts +0 -1
- package/types/utils/settingsValidation/integrations/common.d.ts +1 -1
- package/types/utils/settingsValidation/integrations/configurable.d.ts +1 -1
- package/types/utils/settingsValidation/integrations/pluggable.d.ts +1 -2
- package/types/utils/settingsValidation/localhost/builtin.d.ts +1 -2
- package/types/utils/settingsValidation/localhost/pluggable.d.ts +1 -2
- package/types/utils/settingsValidation/logger/builtinLogger.d.ts +1 -1
- package/types/utils/settingsValidation/logger/pluggableLogger.d.ts +1 -1
- package/types/utils/settingsValidation/splitFilters.d.ts +1 -2
- package/types/utils/settingsValidation/storage/storageCS.d.ts +2 -3
- package/cjs/storages/inMemory/uniqueKeysCacheInMemory.js +0 -73
- package/cjs/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -78
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +0 -26
- package/cjs/trackers/strategy/strategyDebug.js +0 -25
- package/cjs/trackers/strategy/strategyNone.js +0 -29
- package/cjs/trackers/strategy/strategyOptimized.js +0 -34
- package/cjs/trackers/uniqueKeysTracker.js +0 -31
- package/cjs/types.js +0 -2
- package/esm/storages/inMemory/uniqueKeysCacheInMemory.js +0 -70
- package/esm/storages/inMemory/uniqueKeysCacheInMemoryCS.js +0 -75
- package/esm/sync/submitters/uniqueKeysSubmitter.js +0 -22
- package/esm/trackers/strategy/strategyDebug.js +0 -21
- package/esm/trackers/strategy/strategyNone.js +0 -25
- package/esm/trackers/strategy/strategyOptimized.js +0 -30
- package/esm/trackers/uniqueKeysTracker.js +0 -27
- package/esm/types.js +0 -1
- package/src/storages/inMemory/uniqueKeysCacheInMemory.ts +0 -83
- package/src/storages/inMemory/uniqueKeysCacheInMemoryCS.ts +0 -89
- package/src/sync/submitters/uniqueKeysSubmitter.ts +0 -35
- package/src/trackers/strategy/strategyDebug.ts +0 -28
- package/src/trackers/strategy/strategyNone.ts +0 -34
- package/src/trackers/strategy/strategyOptimized.ts +0 -42
- package/src/trackers/uniqueKeysTracker.ts +0 -37
- package/src/types.ts +0 -1265
- package/types/sdkClient/types.d.ts +0 -18
- package/types/storages/inMemory/CountsCacheInMemory.d.ts +0 -20
- package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +0 -20
- package/types/storages/inMemory/uniqueKeysCacheInMemory.d.ts +0 -32
- package/types/storages/inMemory/uniqueKeysCacheInMemoryCS.d.ts +0 -37
- package/types/storages/inRedis/CountsCacheInRedis.d.ts +0 -9
- package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +0 -9
- package/types/sync/offline/LocalhostFromFile.d.ts +0 -2
- package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +0 -2
- package/types/sync/submitters/eventsSyncTask.d.ts +0 -8
- package/types/sync/submitters/impressionCountsSyncTask.d.ts +0 -13
- package/types/sync/submitters/impressionsSyncTask.d.ts +0 -14
- package/types/sync/submitters/metricsSyncTask.d.ts +0 -12
- package/types/sync/submitters/submitterSyncTask.d.ts +0 -10
- package/types/sync/submitters/uniqueKeysSubmitter.d.ts +0 -5
- package/types/sync/syncTaskComposite.d.ts +0 -5
- package/types/trackers/filter/bloomFilter.d.ts +0 -10
- package/types/trackers/filter/dictionaryFilter.d.ts +0 -8
- package/types/trackers/filter/types.d.ts +0 -5
- package/types/trackers/strategy/strategyDebug.d.ts +0 -9
- package/types/trackers/strategy/strategyNone.d.ts +0 -10
- package/types/trackers/strategy/strategyOptimized.d.ts +0 -11
- package/types/trackers/uniqueKeysTracker.d.ts +0 -13
- package/types/types.d.ts +0 -1263
- package/types/utils/timeTracker/index.d.ts +0 -70
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
5
5
|
import { IPluggableStorageWrapper, ISegmentsCacheAsync } from '../types';
|
|
6
|
-
import { ILogger } from '../../
|
|
6
|
+
import { ILogger } from '../../types';
|
|
7
7
|
import { LOG_PREFIX } from './constants';
|
|
8
8
|
import { _Set } from '../../utils/lang/sets';
|
|
9
9
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
|
|
2
2
|
import { KeyBuilder } from '../KeyBuilder';
|
|
3
3
|
import { IPluggableStorageWrapper } from '../types';
|
|
4
|
-
import { ILogger } from '../../
|
|
4
|
+
import { ILogger } from '../../types';
|
|
5
5
|
import { ISplit } from '../../dtos/types';
|
|
6
6
|
import { LOG_PREFIX } from './constants';
|
|
7
7
|
import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IPluggableStorageWrapper, IStorageAsync,
|
|
2
|
-
|
|
1
|
+
import { IPluggableStorageWrapper, IStorageAsync, IStorageFactoryParams } from '../types';
|
|
2
|
+
import { StorageAsyncFactory } from '../../types';
|
|
3
3
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
4
4
|
import { SplitsCachePluggable } from './SplitsCachePluggable';
|
|
5
5
|
import { SegmentsCachePluggable } from './SegmentsCachePluggable';
|
|
@@ -58,7 +58,7 @@ function promisifyEventsTrack(events: any) {
|
|
|
58
58
|
/**
|
|
59
59
|
* Pluggable storage factory for consumer server-side & client-side SplitFactory.
|
|
60
60
|
*/
|
|
61
|
-
export function PluggableStorage(options: PluggableStorageOptions):
|
|
61
|
+
export function PluggableStorage(options: PluggableStorageOptions): StorageAsyncFactory {
|
|
62
62
|
|
|
63
63
|
validatePluggableStorageOptions(options);
|
|
64
64
|
|
package/src/storages/types.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { MaybeThenable, IMetadata
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { SplitIO, ImpressionDTO, SDKMode } from '../types';
|
|
1
|
+
import { MaybeThenable, IMetadata } from '../dtos/types';
|
|
2
|
+
import { EventDataType, HttpErrors, HttpLatencies, ImpressionDataType, LastSync, Method, MethodExceptions, MethodLatencies, OperationType, StoredEventWithMetadata, StoredImpressionWithMetadata, StreamingEvent } from '../sync/submitters/types';
|
|
3
|
+
import { ImpressionDTO, SDKMode, ILogger, EventData, ISplitFiltersValidation } from '../types';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Interface of a pluggable storage wrapper.
|
|
@@ -289,7 +288,7 @@ export interface IImpressionsCacheBase {
|
|
|
289
288
|
|
|
290
289
|
export interface IEventsCacheBase {
|
|
291
290
|
// Consumer API method, used by events tracker, in standalone and consumer modes, to push events into the storage.
|
|
292
|
-
track(data:
|
|
291
|
+
track(data: EventData, size?: number): MaybeThenable<boolean>
|
|
293
292
|
}
|
|
294
293
|
|
|
295
294
|
/** Impressions and events cache for standalone mode (sync) */
|
|
@@ -312,8 +311,8 @@ export interface IImpressionsCacheSync extends IImpressionsCacheBase, IRecorderC
|
|
|
312
311
|
setOnFullQueueCb(cb: () => void): void
|
|
313
312
|
}
|
|
314
313
|
|
|
315
|
-
export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<
|
|
316
|
-
track(data:
|
|
314
|
+
export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<EventData[]> {
|
|
315
|
+
track(data: EventData, size?: number): boolean
|
|
317
316
|
/* Registers callback for full queue */
|
|
318
317
|
setOnFullQueueCb(cb: () => void): void
|
|
319
318
|
}
|
|
@@ -339,7 +338,7 @@ export interface IImpressionsCacheAsync extends IImpressionsCacheBase, IRecorder
|
|
|
339
338
|
export interface IEventsCacheAsync extends IEventsCacheBase, IRecorderCacheProducerAsync<StoredEventWithMetadata[]> {
|
|
340
339
|
// Consumer API method, used by events tracker (in standalone and consumer modes) to push data into.
|
|
341
340
|
// The result promise cannot reject.
|
|
342
|
-
track(data:
|
|
341
|
+
track(data: EventData, size?: number): Promise<boolean>
|
|
343
342
|
}
|
|
344
343
|
|
|
345
344
|
/**
|
|
@@ -352,20 +351,9 @@ export interface IImpressionCountsCacheSync extends IRecorderCacheProducerSync<R
|
|
|
352
351
|
|
|
353
352
|
// Used by impressions count submitter in standalone and producer mode
|
|
354
353
|
isEmpty(): boolean // check if cache is empty. Return true if the cache was just created or cleared.
|
|
355
|
-
pop(toMerge?: Record<string, number>
|
|
354
|
+
pop(toMerge?: Record<string, number>): Record<string, number> // pop cache data
|
|
356
355
|
}
|
|
357
356
|
|
|
358
|
-
export interface IUniqueKeysCacheBase {
|
|
359
|
-
// Used by unique Keys tracker
|
|
360
|
-
track(key: string, value: string): void
|
|
361
|
-
|
|
362
|
-
// Used by unique keys submitter in standalone and producer mode
|
|
363
|
-
isEmpty(): boolean // check if cache is empty. Return true if the cache was just created or cleared.
|
|
364
|
-
pop(): UniqueKeysPayloadSs | UniqueKeysPayloadCs // pop cache data
|
|
365
|
-
/* Registers callback for full queue */
|
|
366
|
-
setOnFullQueueCb(cb: () => void): void,
|
|
367
|
-
clear(): void
|
|
368
|
-
}
|
|
369
357
|
|
|
370
358
|
/**
|
|
371
359
|
* Telemetry storage interface for standalone and partial consumer modes.
|
|
@@ -456,16 +444,14 @@ export interface IStorageBase<
|
|
|
456
444
|
TSegmentsCache extends ISegmentsCacheBase,
|
|
457
445
|
TImpressionsCache extends IImpressionsCacheBase,
|
|
458
446
|
TEventsCache extends IEventsCacheBase,
|
|
459
|
-
TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync
|
|
460
|
-
TUniqueKeysCache extends IUniqueKeysCacheBase
|
|
447
|
+
TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync
|
|
461
448
|
> {
|
|
462
449
|
splits: TSplitsCache,
|
|
463
450
|
segments: TSegmentsCache,
|
|
464
451
|
impressions: TImpressionsCache,
|
|
465
452
|
impressionCounts?: IImpressionCountsCacheSync,
|
|
466
453
|
events: TEventsCache,
|
|
467
|
-
telemetry?: TTelemetryCache
|
|
468
|
-
uniqueKeys?: TUniqueKeysCache,
|
|
454
|
+
telemetry?: TTelemetryCache
|
|
469
455
|
destroy(): void | Promise<void>,
|
|
470
456
|
shared?: (matchingKey: string, onReadyCb: (error?: any) => void) => this
|
|
471
457
|
}
|
|
@@ -475,8 +461,7 @@ export interface IStorageSync extends IStorageBase<
|
|
|
475
461
|
ISegmentsCacheSync,
|
|
476
462
|
IImpressionsCacheSync,
|
|
477
463
|
IEventsCacheSync,
|
|
478
|
-
ITelemetryCacheSync
|
|
479
|
-
IUniqueKeysCacheBase
|
|
464
|
+
ITelemetryCacheSync
|
|
480
465
|
> { }
|
|
481
466
|
|
|
482
467
|
export interface IStorageAsync extends IStorageBase<
|
|
@@ -484,8 +469,7 @@ export interface IStorageAsync extends IStorageBase<
|
|
|
484
469
|
ISegmentsCacheAsync,
|
|
485
470
|
IImpressionsCacheAsync | IImpressionsCacheSync,
|
|
486
471
|
IEventsCacheAsync | IEventsCacheSync,
|
|
487
|
-
ITelemetryCacheAsync
|
|
488
|
-
IUniqueKeysCacheBase
|
|
472
|
+
ITelemetryCacheAsync
|
|
489
473
|
> { }
|
|
490
474
|
|
|
491
475
|
/** StorageFactory */
|
|
@@ -495,11 +479,10 @@ export type DataLoader = (storage: IStorageSync, matchingKey: string) => void
|
|
|
495
479
|
export interface IStorageFactoryParams {
|
|
496
480
|
log: ILogger,
|
|
497
481
|
impressionsQueueSize?: number,
|
|
498
|
-
uniqueKeysCacheSize?: number;
|
|
499
482
|
eventsQueueSize?: number,
|
|
500
483
|
optimize?: boolean /* whether create the `impressionCounts` cache (OPTIMIZED impression mode) or not (DEBUG impression mode) */,
|
|
501
484
|
mode: SDKMode,
|
|
502
|
-
|
|
485
|
+
|
|
503
486
|
// ATM, only used by InLocalStorage
|
|
504
487
|
matchingKey?: string, /* undefined on server-side SDKs */
|
|
505
488
|
splitFiltersValidation?: ISplitFiltersValidation,
|
|
@@ -511,14 +494,39 @@ export interface IStorageFactoryParams {
|
|
|
511
494
|
metadata: IMetadata,
|
|
512
495
|
}
|
|
513
496
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
497
|
+
/**
|
|
498
|
+
* Defines the format of Split data to preload on the factory storage (cache).
|
|
499
|
+
*/
|
|
500
|
+
export interface PreloadedData {
|
|
501
|
+
/**
|
|
502
|
+
* Timestamp of the last moment the data was synchronized with Split servers.
|
|
503
|
+
* If this value is older than 10 days ago (expiration time policy), the data is not used to update the storage content.
|
|
504
|
+
* @TODO configurable expiration time policy?
|
|
505
|
+
*/
|
|
506
|
+
lastUpdated: number,
|
|
507
|
+
/**
|
|
508
|
+
* Change number of the preloaded data.
|
|
509
|
+
* If this value is older than the current changeNumber at the storage, the data is not used to update the storage content.
|
|
510
|
+
*/
|
|
511
|
+
since: number,
|
|
512
|
+
/**
|
|
513
|
+
* Map of splits to their serialized definitions.
|
|
514
|
+
*/
|
|
515
|
+
splitsData: {
|
|
516
|
+
[splitName: string]: string
|
|
517
|
+
},
|
|
518
|
+
/**
|
|
519
|
+
* Optional map of user keys to their list of segments.
|
|
520
|
+
* @TODO remove when releasing first version
|
|
521
|
+
*/
|
|
522
|
+
mySegmentsData?: {
|
|
523
|
+
[key: string]: string[]
|
|
524
|
+
},
|
|
525
|
+
/**
|
|
526
|
+
* Optional map of segments to their serialized definitions.
|
|
527
|
+
* This property is ignored if `mySegmentsData` was provided.
|
|
528
|
+
*/
|
|
529
|
+
segmentsData?: {
|
|
530
|
+
[segmentName: string]: string
|
|
531
|
+
},
|
|
524
532
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { splitsParserFromSettingsFactory } from './splitsParser/splitsParserFromSettings';
|
|
2
2
|
import { syncManagerOfflineFactory } from './syncManagerOffline';
|
|
3
|
-
import {
|
|
3
|
+
import { LocalhostFactory } from '../../types';
|
|
4
4
|
|
|
5
5
|
// Singleton instance of the factory function for offline SyncManager from object (a.k.a. localhostFromObject)
|
|
6
6
|
// SDK instances instantiate their SyncManagers with the same factory
|
|
7
|
-
const localhostFromObject = syncManagerOfflineFactory(splitsParserFromSettingsFactory)
|
|
7
|
+
const localhostFromObject: any = syncManagerOfflineFactory(splitsParserFromSettingsFactory);
|
|
8
8
|
localhostFromObject.type = 'LocalhostFromObject';
|
|
9
9
|
|
|
10
|
-
export function LocalhostFromObject()
|
|
11
|
-
return localhostFromObject;
|
|
10
|
+
export function LocalhostFromObject() {
|
|
11
|
+
return localhostFromObject as LocalhostFactory;
|
|
12
12
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { ISplitPartial } from '../../../dtos/types';
|
|
2
|
-
import { ISettings,
|
|
2
|
+
import { ISettings, MockedFeaturesMap, TreatmentWithConfig } from '../../../types';
|
|
3
3
|
import { isObject, forOwn } from '../../../utils/lang';
|
|
4
4
|
import { parseCondition } from './parseCondition';
|
|
5
5
|
|
|
6
|
-
function hasTreatmentChanged(prev: string |
|
|
6
|
+
function hasTreatmentChanged(prev: string | TreatmentWithConfig, curr: string | TreatmentWithConfig) {
|
|
7
7
|
if (typeof prev !== typeof curr) return true;
|
|
8
8
|
|
|
9
9
|
if (typeof prev === 'string') { // strings treatments, just compare
|
|
10
10
|
return prev !== curr;
|
|
11
11
|
} else { // has treatment and config, compare both
|
|
12
|
-
return prev.treatment !== (curr as
|
|
12
|
+
return prev.treatment !== (curr as TreatmentWithConfig).treatment || prev.config !== (curr as TreatmentWithConfig).config;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function splitsParserFromSettingsFactory() {
|
|
17
17
|
|
|
18
|
-
let previousMock:
|
|
18
|
+
let previousMock: MockedFeaturesMap = { 'emptyMock': '1' };
|
|
19
19
|
|
|
20
|
-
function mockUpdated(currentData:
|
|
20
|
+
function mockUpdated(currentData: MockedFeaturesMap) {
|
|
21
21
|
const names = Object.keys(currentData);
|
|
22
22
|
|
|
23
23
|
// Different amount of items
|
|
@@ -42,7 +42,7 @@ export function splitsParserFromSettingsFactory() {
|
|
|
42
42
|
* @param settings validated object with mocked features mapping.
|
|
43
43
|
*/
|
|
44
44
|
return function splitsParserFromSettings(settings: ISettings): false | Record<string, ISplitPartial> {
|
|
45
|
-
const features = settings.features as
|
|
45
|
+
const features = settings.features as MockedFeaturesMap || {};
|
|
46
46
|
|
|
47
47
|
if (!mockUpdated(features)) return false;
|
|
48
48
|
|
|
@@ -53,8 +53,8 @@ export function splitsParserFromSettingsFactory() {
|
|
|
53
53
|
let config = null;
|
|
54
54
|
|
|
55
55
|
if (isObject(data)) {
|
|
56
|
-
treatment = (data as
|
|
57
|
-
config = (data as
|
|
56
|
+
treatment = (data as TreatmentWithConfig).treatment;
|
|
57
|
+
config = (data as TreatmentWithConfig).config || config;
|
|
58
58
|
}
|
|
59
59
|
const configurations: Record<string, string> = {};
|
|
60
60
|
if (config !== null) configurations[treatment as string] = config;
|
|
@@ -3,7 +3,7 @@ import { ISegmentsCacheSync, ISplitsCacheSync } from '../../../storages/types';
|
|
|
3
3
|
import { ISegmentsEventEmitter } from '../../../readiness/types';
|
|
4
4
|
import { timeout } from '../../../utils/promise/timeout';
|
|
5
5
|
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
6
|
-
import { ILogger } from '../../../
|
|
6
|
+
import { ILogger } from '../../../types';
|
|
7
7
|
import { SYNC_MYSEGMENTS_FETCH_RETRY } from '../../../logger/constants';
|
|
8
8
|
import { MySegmentsData } from '../types';
|
|
9
9
|
|
|
@@ -4,7 +4,7 @@ import { IReadinessManager } from '../../../readiness/types';
|
|
|
4
4
|
import { MaybeThenable } from '../../../dtos/types';
|
|
5
5
|
import { findIndex } from '../../../utils/lang';
|
|
6
6
|
import { SDK_SEGMENTS_ARRIVED } from '../../../readiness/constants';
|
|
7
|
-
import { ILogger } from '../../../
|
|
7
|
+
import { ILogger } from '../../../types';
|
|
8
8
|
import { LOG_PREFIX_INSTANTIATION, LOG_PREFIX_SYNC_SEGMENTS } from '../../../logger/constants';
|
|
9
9
|
import { thenable } from '../../../utils/promise/thenable';
|
|
10
10
|
|
|
@@ -5,7 +5,7 @@ import { ISplit, ISplitChangesResponse } from '../../../dtos/types';
|
|
|
5
5
|
import { ISplitsEventEmitter } from '../../../readiness/types';
|
|
6
6
|
import { timeout } from '../../../utils/promise/timeout';
|
|
7
7
|
import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
|
|
8
|
-
import { ILogger } from '../../../
|
|
8
|
+
import { ILogger } from '../../../types';
|
|
9
9
|
import { SYNC_SPLITS_FETCH, SYNC_SPLITS_NEW, SYNC_SPLITS_REMOVED, SYNC_SPLITS_SEGMENTS, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
|
|
10
10
|
|
|
11
11
|
type ISplitChangesUpdater = (noCache?: boolean, till?: number) => Promise<boolean>
|
|
@@ -4,7 +4,7 @@ import { PUSH_RETRYABLE_ERROR, PUSH_NONRETRYABLE_ERROR, OCCUPANCY, CONTROL, MY_S
|
|
|
4
4
|
import { IPushEventEmitter } from '../types';
|
|
5
5
|
import { ISseEventHandler } from '../SSEClient/types';
|
|
6
6
|
import { INotificationError, INotificationMessage } from './types';
|
|
7
|
-
import { ILogger } from '../../../
|
|
7
|
+
import { ILogger } from '../../../types';
|
|
8
8
|
import { STREAMING_PARSING_ERROR_FAILS, ERROR_STREAMING_SSE, STREAMING_PARSING_MESSAGE_FAILS, STREAMING_NEW_MESSAGE } from '../../../logger/constants';
|
|
9
9
|
import { ABLY_ERROR, NON_REQUESTED, SSE_CONNECTION_ERROR } from '../../../utils/constants';
|
|
10
10
|
import { ITelemetryTracker } from '../../../trackers/types';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ILogger } from '../../../
|
|
1
|
+
import { ILogger } from '../../../types';
|
|
2
2
|
import { SDK_SPLITS_ARRIVED } from '../../../readiness/constants';
|
|
3
3
|
import { ISplitsEventEmitter } from '../../../readiness/types';
|
|
4
4
|
import { ISplitsCacheSync } from '../../../storages/types';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { syncTaskFactory } from '../syncTask';
|
|
2
2
|
import { ISyncTask } from '../types';
|
|
3
3
|
import { IRecorderCacheProducerSync } from '../../storages/types';
|
|
4
|
-
import { ILogger } from '../../
|
|
4
|
+
import { ILogger } from '../../types';
|
|
5
5
|
import { SUBMITTERS_PUSH, SUBMITTERS_PUSH_FAILS, SUBMITTERS_PUSH_RETRY } from '../../logger/constants';
|
|
6
6
|
import { IResponse } from '../../services/types';
|
|
7
7
|
|
|
@@ -4,7 +4,6 @@ import { impressionCountsSubmitterFactory } from './impressionCountsSubmitter';
|
|
|
4
4
|
import { telemetrySubmitterFactory } from './telemetrySubmitter';
|
|
5
5
|
import { ISdkFactoryContextSync } from '../../sdkFactory/types';
|
|
6
6
|
import { ISubmitterManager } from './types';
|
|
7
|
-
import { uniqueKeysSubmitterFactory } from './uniqueKeysSubmitter';
|
|
8
7
|
|
|
9
8
|
export function submitterManagerFactory(params: ISdkFactoryContextSync): ISubmitterManager {
|
|
10
9
|
|
|
@@ -16,7 +15,6 @@ export function submitterManagerFactory(params: ISdkFactoryContextSync): ISubmit
|
|
|
16
15
|
const impressionCountsSubmitter = impressionCountsSubmitterFactory(params);
|
|
17
16
|
if (impressionCountsSubmitter) submitters.push(impressionCountsSubmitter);
|
|
18
17
|
const telemetrySubmitter = telemetrySubmitterFactory(params);
|
|
19
|
-
if (params.uniqueKeysTracker) submitters.push(uniqueKeysSubmitterFactory(params));
|
|
20
18
|
|
|
21
19
|
return {
|
|
22
20
|
// `onlyTelemetry` true if SDK is created with userConsent not GRANTED
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ISegmentsCacheSync, ISplitsCacheSync, ITelemetryCacheSync } from '../../storages/types';
|
|
2
2
|
import { submitterFactory, firstPushWindowDecorator } from './submitter';
|
|
3
3
|
import { TelemetryUsageStatsPayload, TelemetryConfigStatsPayload, TelemetryConfigStats } from './types';
|
|
4
|
-
import { QUEUED, DEDUPED, DROPPED, CONSUMER_MODE, CONSUMER_ENUM, STANDALONE_MODE, CONSUMER_PARTIAL_MODE, STANDALONE_ENUM, CONSUMER_PARTIAL_ENUM, OPTIMIZED, DEBUG,
|
|
4
|
+
import { QUEUED, DEDUPED, DROPPED, CONSUMER_MODE, CONSUMER_ENUM, STANDALONE_MODE, CONSUMER_PARTIAL_MODE, STANDALONE_ENUM, CONSUMER_PARTIAL_ENUM, OPTIMIZED, DEBUG, DEBUG_ENUM, OPTIMIZED_ENUM, CONSENT_GRANTED, CONSENT_DECLINED, CONSENT_UNKNOWN } from '../../utils/constants';
|
|
5
5
|
import { SDK_READY, SDK_READY_FROM_CACHE } from '../../readiness/constants';
|
|
6
6
|
import { ConsentStatus, ISettings, SDKMode } from '../../types';
|
|
7
7
|
import { base } from '../../utils/settingsValidation';
|
|
@@ -52,9 +52,8 @@ const OPERATION_MODE_MAP = {
|
|
|
52
52
|
|
|
53
53
|
const IMPRESSIONS_MODE_MAP = {
|
|
54
54
|
[OPTIMIZED]: OPTIMIZED_ENUM,
|
|
55
|
-
[DEBUG]: DEBUG_ENUM
|
|
56
|
-
|
|
57
|
-
} as Record<ISettings['sync']['impressionsMode'], (0 | 1 | 2)>;
|
|
55
|
+
[DEBUG]: DEBUG_ENUM
|
|
56
|
+
} as Record<ISettings['sync']['impressionsMode'], (0 | 1)>;
|
|
58
57
|
|
|
59
58
|
const USER_CONSENT_MAP = {
|
|
60
59
|
[CONSENT_UNKNOWN]: 1,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IMetadata } from '../../dtos/types';
|
|
2
|
-
import {
|
|
2
|
+
import { EventData } from '../../types';
|
|
3
3
|
import { ISyncTask } from '../types';
|
|
4
4
|
|
|
5
5
|
export type ImpressionsPayload = {
|
|
@@ -35,24 +35,6 @@ export type ImpressionCountsPayload = {
|
|
|
35
35
|
}[]
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
export type UniqueKeysPayloadSs = {
|
|
39
|
-
keys: {
|
|
40
|
-
/** Split name */
|
|
41
|
-
f: string
|
|
42
|
-
/** keyNames */
|
|
43
|
-
ks: string[]
|
|
44
|
-
}[]
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export type UniqueKeysPayloadCs = {
|
|
48
|
-
keys: {
|
|
49
|
-
/** keyNames */
|
|
50
|
-
k: string
|
|
51
|
-
/** Split name */
|
|
52
|
-
fs: string[]
|
|
53
|
-
}[]
|
|
54
|
-
}
|
|
55
|
-
|
|
56
38
|
export type StoredImpressionWithMetadata = {
|
|
57
39
|
/** Metadata */
|
|
58
40
|
m: IMetadata,
|
|
@@ -79,7 +61,7 @@ export type StoredEventWithMetadata = {
|
|
|
79
61
|
/** Metadata */
|
|
80
62
|
m: IMetadata,
|
|
81
63
|
/** Stored event */
|
|
82
|
-
e:
|
|
64
|
+
e: EventData
|
|
83
65
|
}
|
|
84
66
|
|
|
85
67
|
/**
|
|
@@ -166,8 +148,7 @@ export type OperationMode = STANDALONE_ENUM | CONSUMER_ENUM | CONSUMER_PARTIAL_E
|
|
|
166
148
|
|
|
167
149
|
export type OPTIMIZED_ENUM = 0;
|
|
168
150
|
export type DEBUG_ENUM = 1;
|
|
169
|
-
export type
|
|
170
|
-
export type ImpressionsMode = OPTIMIZED_ENUM | DEBUG_ENUM | NONE_ENUM;
|
|
151
|
+
export type ImpressionsMode = OPTIMIZED_ENUM | DEBUG_ENUM;
|
|
171
152
|
|
|
172
153
|
export type RefreshRates = {
|
|
173
154
|
sp: number, // splits
|
package/src/sync/syncTask.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { objectAssign } from '../utils/lang/objectAssign';
|
|
|
2
2
|
import { thenable } from '../utils/promise/thenable';
|
|
3
3
|
import { IEventsCacheBase, ITelemetryCacheAsync, ITelemetryCacheSync } from '../storages/types';
|
|
4
4
|
import { IEventsHandler, IEventTracker } from './types';
|
|
5
|
-
import { ISettings,
|
|
5
|
+
import { ISettings, EventData } from '../types';
|
|
6
6
|
import { EVENTS_TRACKER_SUCCESS, ERROR_EVENTS_TRACKER } from '../logger/constants';
|
|
7
7
|
import { CONSENT_DECLINED, DROPPED, QUEUED } from '../utils/constants';
|
|
8
8
|
import { isStorageSync } from './impressionObserver/utils';
|
|
@@ -23,7 +23,7 @@ export function eventTrackerFactory(
|
|
|
23
23
|
const log = settings.log;
|
|
24
24
|
const isSync = isStorageSync(settings);
|
|
25
25
|
|
|
26
|
-
function queueEventsCallback(eventData:
|
|
26
|
+
function queueEventsCallback(eventData: EventData, tracked: boolean) {
|
|
27
27
|
const { eventTypeId, trafficTypeName, key, value, timestamp, properties } = eventData;
|
|
28
28
|
// Logging every prop would be too much.
|
|
29
29
|
const msg = `event of type "${eventTypeId}" for traffic type "${trafficTypeName}". Key: ${key}. Value: ${value}. Timestamp: ${timestamp}. ${properties ? 'With properties.' : 'With no properties.'}`;
|
|
@@ -48,7 +48,7 @@ export function eventTrackerFactory(
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
return {
|
|
51
|
-
track(eventData:
|
|
51
|
+
track(eventData: EventData, size?: number) {
|
|
52
52
|
if (settings.userConsent === CONSENT_DECLINED) {
|
|
53
53
|
return isSync ? false : Promise.resolve(false);
|
|
54
54
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
2
2
|
import { thenable } from '../utils/promise/thenable';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { truncateTimeFrame } from '../utils/time';
|
|
4
|
+
import { IImpressionCountsCacheSync, IImpressionsCacheBase, ITelemetryCacheSync, ITelemetryCacheAsync } from '../storages/types';
|
|
5
|
+
import { IImpressionsHandler, IImpressionsTracker } from './types';
|
|
6
|
+
import { ImpressionDTO, ISettings, Attributes, ImpressionData } from '../types';
|
|
7
|
+
import { IImpressionObserver } from './impressionObserver/types';
|
|
6
8
|
import { IMPRESSIONS_TRACKER_SUCCESS, ERROR_IMPRESSIONS_TRACKER, ERROR_IMPRESSIONS_LISTENER } from '../logger/constants';
|
|
7
9
|
import { CONSENT_DECLINED, DEDUPED, QUEUED } from '../utils/constants';
|
|
8
10
|
|
|
@@ -13,27 +15,48 @@ import { CONSENT_DECLINED, DEDUPED, QUEUED } from '../utils/constants';
|
|
|
13
15
|
* @param metadata runtime metadata (ip, hostname and version)
|
|
14
16
|
* @param impressionListener optional impression listener
|
|
15
17
|
* @param integrationsManager optional integrations manager
|
|
16
|
-
* @param
|
|
18
|
+
* @param observer optional impression observer. If provided, previous time (pt property) is included in impression instances
|
|
19
|
+
* @param countsCache optional cache to save impressions count. If provided, impressions will be deduped (OPTIMIZED mode)
|
|
17
20
|
*/
|
|
18
21
|
export function impressionsTrackerFactory(
|
|
19
22
|
settings: ISettings,
|
|
20
23
|
impressionsCache: IImpressionsCacheBase,
|
|
21
|
-
strategy: IStrategy,
|
|
22
24
|
integrationsManager?: IImpressionsHandler,
|
|
23
|
-
|
|
25
|
+
// if observer is provided, it implies `shouldAddPreviousTime` flag (i.e., if impressions previous time should be added or not)
|
|
26
|
+
observer?: IImpressionObserver,
|
|
27
|
+
// if countsCache is provided, it implies `isOptimized` flag (i.e., if impressions should be deduped or not)
|
|
28
|
+
countsCache?: IImpressionCountsCacheSync,
|
|
29
|
+
telemetryCache?: ITelemetryCacheSync | ITelemetryCacheAsync
|
|
24
30
|
): IImpressionsTracker {
|
|
25
31
|
|
|
26
32
|
const { log, impressionListener, runtime: { ip, hostname }, version } = settings;
|
|
27
33
|
|
|
28
34
|
return {
|
|
29
|
-
track(impressions: ImpressionDTO[], attributes?:
|
|
35
|
+
track(impressions: ImpressionDTO[], attributes?: Attributes) {
|
|
30
36
|
if (settings.userConsent === CONSENT_DECLINED) return;
|
|
31
37
|
|
|
32
38
|
const impressionsCount = impressions.length;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
|
|
40
|
+
const impressionsToStore: ImpressionDTO[] = []; // Track only the impressions that are going to be stored
|
|
41
|
+
// Wraps impressions to store and adds previousTime if it corresponds
|
|
42
|
+
impressions.forEach((impression) => {
|
|
43
|
+
if (observer) {
|
|
44
|
+
// Adds previous time if it is enabled
|
|
45
|
+
impression.pt = observer.testAndSet(impression);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
if (countsCache) {
|
|
50
|
+
// Increments impression counter per featureName
|
|
51
|
+
countsCache.track(impression.feature, now, 1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Checks if the impression should be added in queue to be sent
|
|
55
|
+
if (!countsCache || !impression.pt || impression.pt < truncateTimeFrame(now)) {
|
|
56
|
+
impressionsToStore.push(impression);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
37
60
|
const res = impressionsCache.track(impressionsToStore);
|
|
38
61
|
|
|
39
62
|
// If we're on an async storage, handle error and log it.
|
|
@@ -48,16 +71,16 @@ export function impressionsTrackerFactory(
|
|
|
48
71
|
// @TODO we are not dropping impressions on full queue yet, so DROPPED stats are not recorded
|
|
49
72
|
if (telemetryCache) {
|
|
50
73
|
(telemetryCache as ITelemetryCacheSync).recordImpressionStats(QUEUED, impressionsToStore.length);
|
|
51
|
-
(telemetryCache as ITelemetryCacheSync).recordImpressionStats(DEDUPED,
|
|
74
|
+
(telemetryCache as ITelemetryCacheSync).recordImpressionStats(DEDUPED, impressions.length - impressionsToStore.length);
|
|
52
75
|
}
|
|
53
76
|
}
|
|
54
77
|
|
|
55
78
|
// @TODO next block might be handled by the integration manager. In that case, the metadata object doesn't need to be passed in the constructor
|
|
56
79
|
if (impressionListener || integrationsManager) {
|
|
57
|
-
for (let i = 0; i <
|
|
58
|
-
const impressionData:
|
|
80
|
+
for (let i = 0; i < impressionsCount; i++) {
|
|
81
|
+
const impressionData: ImpressionData = {
|
|
59
82
|
// copy of impression, to avoid unexpected behaviour if modified by integrations or impressionListener
|
|
60
|
-
impression: objectAssign({},
|
|
83
|
+
impression: objectAssign({}, impressions[i]),
|
|
61
84
|
attributes,
|
|
62
85
|
ip,
|
|
63
86
|
hostname,
|
package/src/trackers/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ImpressionDTO, EventData, ImpressionData, Attributes } from '../types';
|
|
2
2
|
import { StreamingEventType, Method, OperationType } from '../sync/submitters/types';
|
|
3
3
|
import { IEventsCacheBase } from '../storages/types';
|
|
4
4
|
import { NetworkError } from '../services/types';
|
|
@@ -6,7 +6,7 @@ import { NetworkError } from '../services/types';
|
|
|
6
6
|
/** Events tracker */
|
|
7
7
|
|
|
8
8
|
export interface IEventsHandler {
|
|
9
|
-
handleEvent(eventData:
|
|
9
|
+
handleEvent(eventData: EventData): any
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export type IEventTracker = IEventsCacheBase
|
|
@@ -14,11 +14,11 @@ export type IEventTracker = IEventsCacheBase
|
|
|
14
14
|
/** Impressions tracker */
|
|
15
15
|
|
|
16
16
|
export interface IImpressionsHandler {
|
|
17
|
-
handleImpression(impressionData:
|
|
17
|
+
handleImpression(impressionData: ImpressionData): any
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export interface IImpressionsTracker {
|
|
21
|
-
track(impressions: ImpressionDTO[], attributes?:
|
|
21
|
+
track(impressions: ImpressionDTO[], attributes?: Attributes): void
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/** Telemetry tracker */
|
|
@@ -42,29 +42,3 @@ export interface ITelemetryTracker {
|
|
|
42
42
|
*/
|
|
43
43
|
streamingEvent(e: StreamingEventType | AUTH_REJECTION, d?: number): void
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
export interface IFilterAdapter {
|
|
47
|
-
add(key: string, featureName: string): boolean;
|
|
48
|
-
contains(key: string, featureName: string): boolean;
|
|
49
|
-
clear(): void;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export interface IImpressionSenderAdapter {
|
|
53
|
-
recordUniqueKeys(data: Object): void;
|
|
54
|
-
recordImpressionCounts(data: Object): void
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Unique keys tracker */
|
|
58
|
-
export interface IUniqueKeysTracker {
|
|
59
|
-
track(key: string, featureName: string): void;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface IStrategyResult {
|
|
63
|
-
impressionsToStore: ImpressionDTO[],
|
|
64
|
-
impressionsToListener: ImpressionDTO[],
|
|
65
|
-
deduped: number
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface IStrategy {
|
|
69
|
-
process(impressions: ImpressionDTO[]): IStrategyResult
|
|
70
|
-
}
|