@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { clientCSDecorator } from './clientCS';
|
|
2
|
-
import {
|
|
2
|
+
import { IClientSS, IClientWithKey, SplitKey } from '../types';
|
|
3
3
|
import { validateKey } from '../utils/inputValidation/key';
|
|
4
4
|
import { getMatching, keyParser } from '../utils/key';
|
|
5
5
|
import { sdkClientFactory } from './sdkClient';
|
|
@@ -9,7 +9,7 @@ import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING }
|
|
|
9
9
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
10
10
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
11
11
|
|
|
12
|
-
function buildInstanceId(key:
|
|
12
|
+
function buildInstanceId(key: SplitKey) {
|
|
13
13
|
// @ts-ignore
|
|
14
14
|
return `${key.matchingKey ? key.matchingKey : key}-${key.bucketingKey ? key.bucketingKey : key}-`;
|
|
15
15
|
}
|
|
@@ -20,23 +20,23 @@ const method = 'Client instantiation';
|
|
|
20
20
|
* Factory of client method for the client-side API variant where TT is ignored and thus
|
|
21
21
|
* clients don't have a binded TT for the track method.
|
|
22
22
|
*/
|
|
23
|
-
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?:
|
|
23
|
+
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: SplitKey) => IClientWithKey {
|
|
24
24
|
const { storage, syncManager, sdkReadinessManager, settings: { core: { key }, startup: { readyTimeout }, log } } = params;
|
|
25
25
|
|
|
26
26
|
const mainClientInstance = clientCSDecorator(
|
|
27
27
|
log,
|
|
28
|
-
sdkClientFactory(params) as
|
|
29
|
-
key
|
|
28
|
+
sdkClientFactory(params) as IClientSS,
|
|
29
|
+
key!
|
|
30
30
|
);
|
|
31
31
|
|
|
32
|
-
const parsedDefaultKey = keyParser(key);
|
|
32
|
+
const parsedDefaultKey = keyParser(key!);
|
|
33
33
|
const defaultInstanceId = buildInstanceId(parsedDefaultKey);
|
|
34
34
|
|
|
35
35
|
// Cache instances created per factory.
|
|
36
|
-
const clientInstances: Record<string,
|
|
36
|
+
const clientInstances: Record<string, IClientWithKey> = {};
|
|
37
37
|
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
38
38
|
|
|
39
|
-
return function client(key?:
|
|
39
|
+
return function client(key?: SplitKey) {
|
|
40
40
|
if (key === undefined) {
|
|
41
41
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
42
42
|
return mainClientInstance;
|
|
@@ -76,7 +76,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
76
76
|
storage: sharedStorage || storage,
|
|
77
77
|
syncManager: sharedSyncManager,
|
|
78
78
|
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
79
|
-
}), true) as
|
|
79
|
+
}), true) as IClientSS,
|
|
80
80
|
validKey
|
|
81
81
|
);
|
|
82
82
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { clientCSDecorator } from './clientCS';
|
|
2
|
-
import {
|
|
2
|
+
import { IClientSS, IClientWithKeyLegacy, SplitKey } from '../types';
|
|
3
3
|
import { validateKey } from '../utils/inputValidation/key';
|
|
4
4
|
import { validateTrafficType } from '../utils/inputValidation/trafficType';
|
|
5
5
|
import { getMatching, keyParser } from '../utils/key';
|
|
@@ -10,7 +10,7 @@ import { RETRIEVE_CLIENT_DEFAULT, NEW_SHARED_CLIENT, RETRIEVE_CLIENT_EXISTING }
|
|
|
10
10
|
import { SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
11
11
|
import { ISdkFactoryContext } from '../sdkFactory/types';
|
|
12
12
|
|
|
13
|
-
function buildInstanceId(key:
|
|
13
|
+
function buildInstanceId(key: SplitKey, trafficType?: string) {
|
|
14
14
|
// @ts-ignore
|
|
15
15
|
return `${key.matchingKey ? key.matchingKey : key}-${key.bucketingKey ? key.bucketingKey : key}-${trafficType !== undefined ? trafficType : ''}`;
|
|
16
16
|
}
|
|
@@ -22,24 +22,24 @@ const method = 'Client instantiation';
|
|
|
22
22
|
* where clients can have a binded TT for the track method, which is provided via the settings
|
|
23
23
|
* (default client) or the client method (shared clients).
|
|
24
24
|
*/
|
|
25
|
-
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?:
|
|
25
|
+
export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: SplitKey, trafficType?: string) => IClientWithKeyLegacy {
|
|
26
26
|
const { storage, syncManager, sdkReadinessManager, settings: { core: { key, trafficType }, startup: { readyTimeout }, log } } = params;
|
|
27
27
|
|
|
28
28
|
const mainClientInstance = clientCSDecorator(
|
|
29
29
|
log,
|
|
30
|
-
sdkClientFactory(params) as
|
|
31
|
-
key
|
|
30
|
+
sdkClientFactory(params) as IClientSS,
|
|
31
|
+
key!,
|
|
32
32
|
trafficType
|
|
33
33
|
);
|
|
34
34
|
|
|
35
|
-
const parsedDefaultKey = keyParser(key);
|
|
35
|
+
const parsedDefaultKey = keyParser(key!);
|
|
36
36
|
const defaultInstanceId = buildInstanceId(parsedDefaultKey, trafficType);
|
|
37
37
|
|
|
38
38
|
// Cache instances created per factory.
|
|
39
|
-
const clientInstances: Record<string,
|
|
39
|
+
const clientInstances: Record<string, IClientWithKeyLegacy> = {};
|
|
40
40
|
clientInstances[defaultInstanceId] = mainClientInstance;
|
|
41
41
|
|
|
42
|
-
return function client(key?:
|
|
42
|
+
return function client(key?: SplitKey, trafficType?: string) {
|
|
43
43
|
if (key === undefined) {
|
|
44
44
|
log.debug(RETRIEVE_CLIENT_DEFAULT);
|
|
45
45
|
return mainClientInstance;
|
|
@@ -86,7 +86,7 @@ export function sdkClientMethodCSFactory(params: ISdkFactoryContext): (key?: Spl
|
|
|
86
86
|
storage: sharedStorage || storage,
|
|
87
87
|
syncManager: sharedSyncManager,
|
|
88
88
|
signalListener: undefined, // only the main client "destroy" method stops the signal listener
|
|
89
|
-
}), true) as
|
|
89
|
+
}), true) as IClientSS,
|
|
90
90
|
validKey,
|
|
91
91
|
validTrafficType
|
|
92
92
|
);
|
package/src/sdkFactory/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { impressionsTrackerFactory } from '../trackers/impressionsTracker';
|
|
|
4
4
|
import { eventTrackerFactory } from '../trackers/eventTracker';
|
|
5
5
|
import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
|
|
6
6
|
import { IStorageFactoryParams } from '../storages/types';
|
|
7
|
-
import {
|
|
7
|
+
import { IBasicSDK } from '../types';
|
|
8
8
|
import { getMatching } from '../utils/key';
|
|
9
9
|
import { shouldBeOptimized } from '../trackers/impressionObserver/utils';
|
|
10
10
|
import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
|
|
@@ -13,21 +13,15 @@ import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
|
|
|
13
13
|
import { metadataBuilder } from '../storages/metadataBuilder';
|
|
14
14
|
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../readiness/constants';
|
|
15
15
|
import { objectAssign } from '../utils/lang/objectAssign';
|
|
16
|
-
import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
|
|
17
|
-
import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
|
|
18
|
-
import { strategyNoneFactory } from '../trackers/strategy/strategyNone';
|
|
19
|
-
import { uniqueKeysTrackerFactory } from '../trackers/uniqueKeysTracker';
|
|
20
|
-
import { NONE } from '../utils/constants';
|
|
21
16
|
|
|
22
17
|
/**
|
|
23
18
|
* Modular SDK factory
|
|
24
19
|
*/
|
|
25
|
-
export function sdkFactory(params: ISdkFactoryParams):
|
|
20
|
+
export function sdkFactory(params: ISdkFactoryParams): IBasicSDK<any, any> {
|
|
26
21
|
|
|
27
22
|
const { settings, platform, storageFactory, splitApiFactory, extraProps,
|
|
28
23
|
syncManagerFactory, SignalListener, impressionsObserverFactory,
|
|
29
|
-
integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory
|
|
30
|
-
filterAdapterFactory } = params;
|
|
24
|
+
integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory } = params;
|
|
31
25
|
const log = settings.log;
|
|
32
26
|
|
|
33
27
|
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid API Key, etc.
|
|
@@ -43,16 +37,15 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.
|
|
|
43
37
|
const storageFactoryParams: IStorageFactoryParams = {
|
|
44
38
|
impressionsQueueSize: settings.scheduler.impressionsQueueSize,
|
|
45
39
|
eventsQueueSize: settings.scheduler.eventsQueueSize,
|
|
46
|
-
uniqueKeysCacheSize: settings.scheduler.uniqueKeysCacheSize,
|
|
47
40
|
optimize: shouldBeOptimized(settings),
|
|
48
41
|
|
|
49
42
|
// ATM, only used by InLocalStorage
|
|
50
43
|
matchingKey: getMatching(settings.core.key),
|
|
44
|
+
// @ts-ignore
|
|
51
45
|
splitFiltersValidation: settings.sync.__splitFiltersValidation,
|
|
52
46
|
|
|
53
47
|
// ATM, only used by PluggableStorage
|
|
54
48
|
mode: settings.mode,
|
|
55
|
-
impressionsMode: settings.sync.impressionsMode,
|
|
56
49
|
|
|
57
50
|
// Callback used to emit SDK_READY in consumer mode, where `syncManagerFactory` is undefined,
|
|
58
51
|
// or partial consumer mode, where it only has submitters, and therefore it doesn't emit readiness events.
|
|
@@ -70,19 +63,16 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ICsSDK | SplitIO.
|
|
|
70
63
|
|
|
71
64
|
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage });
|
|
72
65
|
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
(storageFactoryParams.impressionsMode === NONE) ? strategyNoneFactory(storage.impressionCounts!, uniqueKeysTracker!) : strategyDebugFactory(observer);
|
|
77
|
-
|
|
78
|
-
const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, strategy, integrationsManager, storage.telemetry);
|
|
66
|
+
// trackers
|
|
67
|
+
const observer = impressionsObserverFactory && impressionsObserverFactory();
|
|
68
|
+
const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, integrationsManager, observer, storage.impressionCounts, storage.telemetry);
|
|
79
69
|
const eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
|
|
80
70
|
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
|
|
81
71
|
|
|
82
72
|
// splitApi is used by SyncManager and Browser signal listener
|
|
83
73
|
const splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
|
|
84
74
|
|
|
85
|
-
const ctx: ISdkFactoryContext = { splitApi, eventTracker, impressionsTracker, telemetryTracker,
|
|
75
|
+
const ctx: ISdkFactoryContext = { splitApi, eventTracker, impressionsTracker, telemetryTracker, sdkReadinessManager, readiness, settings, storage, platform };
|
|
86
76
|
|
|
87
77
|
const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
|
|
88
78
|
ctx.syncManager = syncManager;
|
package/src/sdkFactory/types.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { IIntegrationManager, IIntegrationFactoryParams } from '../integrations/types';
|
|
2
2
|
import { ISignalListener } from '../listeners/types';
|
|
3
|
-
import { ILogger } from '../
|
|
3
|
+
import { IAsyncClientSS, IAsyncManager, IClientSS, IClientWithKey, ILogger, IManager, SplitKey } from '../types';
|
|
4
4
|
import { IReadinessManager, ISdkReadinessManager } from '../readiness/types';
|
|
5
5
|
import { IFetch, ISplitApi, IEventSourceConstructor } from '../services/types';
|
|
6
6
|
import { IStorageAsync, IStorageSync, ISplitsCacheSync, ISplitsCacheAsync, IStorageFactoryParams } from '../storages/types';
|
|
7
7
|
import { ISyncManager } from '../sync/types';
|
|
8
8
|
import { IImpressionObserver } from '../trackers/impressionObserver/types';
|
|
9
|
-
import { IImpressionsTracker, IEventTracker, ITelemetryTracker
|
|
10
|
-
import {
|
|
9
|
+
import { IImpressionsTracker, IEventTracker, ITelemetryTracker } from '../trackers/types';
|
|
10
|
+
import { ISettings, IEventEmitter } from '../types';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Environment related dependencies.
|
|
@@ -44,7 +44,6 @@ export interface ISdkFactoryContext {
|
|
|
44
44
|
eventTracker: IEventTracker,
|
|
45
45
|
telemetryTracker: ITelemetryTracker,
|
|
46
46
|
storage: IStorageSync | IStorageAsync,
|
|
47
|
-
uniqueKeysTracker?: IUniqueKeysTracker,
|
|
48
47
|
signalListener?: ISignalListener
|
|
49
48
|
splitApi?: ISplitApi
|
|
50
49
|
syncManager?: ISyncManager,
|
|
@@ -91,16 +90,11 @@ export interface ISdkFactoryParams {
|
|
|
91
90
|
log: ILogger,
|
|
92
91
|
splits: ISplitsCacheSync | ISplitsCacheAsync,
|
|
93
92
|
sdkReadinessManager: ISdkReadinessManager
|
|
94
|
-
) =>
|
|
93
|
+
) => IManager | IAsyncManager,
|
|
95
94
|
|
|
96
95
|
// Sdk client method factory (ISDK::client method).
|
|
97
96
|
// It Allows to distinguish SDK clients with the client-side API (`ICsSDK`) or server-side API (`ISDK` or `IAsyncSDK`).
|
|
98
|
-
sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ ():
|
|
99
|
-
|
|
100
|
-
// Impression observer factory. If provided, will be used for impressions dedupe
|
|
101
|
-
impressionsObserverFactory: () => IImpressionObserver
|
|
102
|
-
|
|
103
|
-
filterAdapterFactory?: () => IFilterAdapter
|
|
97
|
+
sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): IClientWithKey; (key: SplitKey, trafficType?: string | undefined): IClientWithKey; } | (() => IClientSS) | (() => IAsyncClientSS))
|
|
104
98
|
|
|
105
99
|
// Optional signal listener constructor. Used to handle special app states, like shutdown, app paused or resumed.
|
|
106
100
|
// Pass only if `syncManager` (used by Node listener) and `splitApi` (used by Browser listener) are passed.
|
|
@@ -113,6 +107,9 @@ export interface ISdkFactoryParams {
|
|
|
113
107
|
// @TODO review impressionListener and integrations interfaces. What about handling impressionListener as an integration ?
|
|
114
108
|
integrationsManagerFactory?: (params: IIntegrationFactoryParams) => IIntegrationManager | undefined,
|
|
115
109
|
|
|
110
|
+
// Impression observer factory. If provided, will be used for impressions dedupe
|
|
111
|
+
impressionsObserverFactory?: () => IImpressionObserver
|
|
112
|
+
|
|
116
113
|
// Optional function to assign additional properties to the factory instance
|
|
117
114
|
extraProps?: (params: ISdkFactoryContext) => object
|
|
118
115
|
}
|
package/src/sdkManager/index.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { validateSplit, validateSplitExistance, validateIfNotDestroyed, validate
|
|
|
5
5
|
import { ISplitsCacheAsync, ISplitsCacheSync } from '../storages/types';
|
|
6
6
|
import { ISdkReadinessManager } from '../readiness/types';
|
|
7
7
|
import { ISplit } from '../dtos/types';
|
|
8
|
-
import {
|
|
9
|
-
import { ILogger } from '../
|
|
8
|
+
import { IAsyncManager, IManager, SplitView } from '../types';
|
|
9
|
+
import { ILogger } from '../types';
|
|
10
10
|
|
|
11
11
|
function collectTreatments(splitObject: ISplit) {
|
|
12
12
|
const conditions = splitObject.conditions;
|
|
@@ -18,7 +18,7 @@ function collectTreatments(splitObject: ISplit) {
|
|
|
18
18
|
return allTreatmentsCondition ? allTreatmentsCondition.partitions.map(v => v.treatment) : [];
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function objectToView(json: string | null):
|
|
21
|
+
function objectToView(json: string | null): SplitView | null {
|
|
22
22
|
let splitObject: ISplit | null;
|
|
23
23
|
|
|
24
24
|
try {
|
|
@@ -41,7 +41,7 @@ function objectToView(json: string | null): SplitIO.SplitView | null {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
function objectsToViews(jsons: string[]) {
|
|
44
|
-
let views:
|
|
44
|
+
let views: SplitView[] = [];
|
|
45
45
|
|
|
46
46
|
jsons.forEach(split => {
|
|
47
47
|
const view = objectToView(split);
|
|
@@ -55,7 +55,7 @@ export function sdkManagerFactory<TSplitCache extends ISplitsCacheSync | ISplits
|
|
|
55
55
|
log: ILogger,
|
|
56
56
|
splits: TSplitCache,
|
|
57
57
|
{ readinessManager, sdkStatus }: ISdkReadinessManager
|
|
58
|
-
): TSplitCache extends ISplitsCacheAsync ?
|
|
58
|
+
): TSplitCache extends ISplitsCacheAsync ? IAsyncManager : IManager {
|
|
59
59
|
const SPLIT_FN_LABEL = 'split';
|
|
60
60
|
|
|
61
61
|
return objectAssign(
|
package/src/services/splitApi.ts
CHANGED
|
@@ -25,6 +25,7 @@ export function splitApiFactory(
|
|
|
25
25
|
): ISplitApi {
|
|
26
26
|
|
|
27
27
|
const urls = settings.urls;
|
|
28
|
+
// @ts-ignore
|
|
28
29
|
const filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString;
|
|
29
30
|
const SplitSDKImpressionsMode = settings.sync.impressionsMode;
|
|
30
31
|
const splitHttpClient = splitHttpClientFactory(settings, platform.getFetch, platform.getOptions);
|
|
@@ -106,28 +107,6 @@ export function splitApiFactory(
|
|
|
106
107
|
const url = `${urls.events}/testImpressions/count`;
|
|
107
108
|
return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(IMPRESSIONS_COUNT));
|
|
108
109
|
},
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Post unique keys for client side.
|
|
112
|
-
*
|
|
113
|
-
* @param body unique keys payload
|
|
114
|
-
* @param headers Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
115
|
-
*/
|
|
116
|
-
postUniqueKeysBulkCs(body: string, headers?: Record<string, string>) {
|
|
117
|
-
const url = `${urls.telemetry}/v1/keys/cs`;
|
|
118
|
-
return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(TELEMETRY));
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Post unique keys for server side.
|
|
123
|
-
*
|
|
124
|
-
* @param body unique keys payload
|
|
125
|
-
* @param headers Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers.
|
|
126
|
-
*/
|
|
127
|
-
postUniqueKeysBulkSs(body: string, headers?: Record<string, string>) {
|
|
128
|
-
const url = `${urls.telemetry}/v1/keys/ss`;
|
|
129
|
-
return splitHttpClient(url, { method: 'POST', body, headers }, telemetryTracker.trackHttp(TELEMETRY));
|
|
130
|
-
},
|
|
131
110
|
|
|
132
111
|
postMetricsConfig(body: string) {
|
|
133
112
|
const url = `${urls.telemetry}/v1/metrics/config`;
|
package/src/services/types.ts
CHANGED
|
@@ -43,10 +43,6 @@ export type IFetchMySegments = (userMatchingKey: string, noCache?: boolean) => P
|
|
|
43
43
|
|
|
44
44
|
export type IPostEventsBulk = (body: string, headers?: Record<string, string>) => Promise<IResponse>
|
|
45
45
|
|
|
46
|
-
export type IPostUniqueKeysBulkCs = (body: string, headers?: Record<string, string>) => Promise<IResponse>
|
|
47
|
-
|
|
48
|
-
export type IPostUniqueKeysBulkSs = (body: string, headers?: Record<string, string>) => Promise<IResponse>
|
|
49
|
-
|
|
50
46
|
export type IPostTestImpressionsBulk = (body: string, headers?: Record<string, string>) => Promise<IResponse>
|
|
51
47
|
|
|
52
48
|
export type IPostTestImpressionsCount = (body: string, headers?: Record<string, string>) => Promise<IResponse>
|
|
@@ -63,8 +59,6 @@ export interface ISplitApi {
|
|
|
63
59
|
fetchSegmentChanges: IFetchSegmentChanges
|
|
64
60
|
fetchMySegments: IFetchMySegments
|
|
65
61
|
postEventsBulk: IPostEventsBulk
|
|
66
|
-
postUniqueKeysBulkCs: IPostUniqueKeysBulkCs
|
|
67
|
-
postUniqueKeysBulkSs: IPostUniqueKeysBulkSs
|
|
68
62
|
postTestImpressionsBulk: IPostTestImpressionsBulk
|
|
69
63
|
postTestImpressionsCount: IPostTestImpressionsCount
|
|
70
64
|
postMetricsConfig: IPostMetricsConfig
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PreloadedData } from './types';
|
|
2
2
|
import { DEFAULT_CACHE_EXPIRATION_IN_MILLIS } from '../utils/constants/browser';
|
|
3
3
|
import { DataLoader, ISegmentsCacheSync, ISplitsCacheSync } from './types';
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ import { DataLoader, ISegmentsCacheSync, ISplitsCacheSync } from './types';
|
|
|
9
9
|
* and extended with a `mySegmentsData` property.
|
|
10
10
|
* @returns function to preload the storage
|
|
11
11
|
*/
|
|
12
|
-
export function dataLoaderFactory(preloadedData:
|
|
12
|
+
export function dataLoaderFactory(preloadedData: PreloadedData): DataLoader {
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Storage-agnostic adaptation of `loadDataIntoLocalStorage` function
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ISplit
|
|
1
|
+
import { ISplit } from '../../dtos/types';
|
|
2
2
|
import { AbstractSplitsCacheSync, usesSegments } from '../AbstractSplitsCacheSync';
|
|
3
3
|
import { isFiniteNumber, toNumber, isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { KeyBuilderCS } from '../KeyBuilderCS';
|
|
5
|
-
import { ILogger } from '../../
|
|
5
|
+
import { ILogger, ISplitFiltersValidation } from '../../types';
|
|
6
6
|
import { LOG_PREFIX } from './constants';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ImpressionsCacheInMemory } from '../inMemory/ImpressionsCacheInMemory';
|
|
2
2
|
import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
|
|
3
3
|
import { EventsCacheInMemory } from '../inMemory/EventsCacheInMemory';
|
|
4
|
-
import { IStorageFactoryParams, IStorageSync
|
|
4
|
+
import { IStorageFactoryParams, IStorageSync } from '../types';
|
|
5
|
+
import { StorageSyncFactory } from '../../types';
|
|
5
6
|
import { validatePrefix } from '../KeyBuilder';
|
|
6
7
|
import { KeyBuilderCS } from '../KeyBuilderCS';
|
|
7
8
|
import { isLocalStorageAvailable } from '../../utils/env/isLocalStorageAvailable';
|
|
@@ -12,9 +13,8 @@ import { SplitsCacheInMemory } from '../inMemory/SplitsCacheInMemory';
|
|
|
12
13
|
import { DEFAULT_CACHE_EXPIRATION_IN_MILLIS } from '../../utils/constants/browser';
|
|
13
14
|
import { InMemoryStorageCSFactory } from '../inMemory/InMemoryStorageCS';
|
|
14
15
|
import { LOG_PREFIX } from './constants';
|
|
15
|
-
import { LOCALHOST_MODE,
|
|
16
|
+
import { LOCALHOST_MODE, STORAGE_LOCALSTORAGE } from '../../utils/constants';
|
|
16
17
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from '../inMemory/TelemetryCacheInMemory';
|
|
17
|
-
import { UniqueKeysCacheInMemoryCS } from '../inMemory/uniqueKeysCacheInMemoryCS';
|
|
18
18
|
|
|
19
19
|
export interface InLocalStorageOptions {
|
|
20
20
|
prefix?: string
|
|
@@ -23,7 +23,7 @@ export interface InLocalStorageOptions {
|
|
|
23
23
|
/**
|
|
24
24
|
* InLocal storage factory for standalone client-side SplitFactory
|
|
25
25
|
*/
|
|
26
|
-
export function InLocalStorage(options: InLocalStorageOptions = {}):
|
|
26
|
+
export function InLocalStorage(options: InLocalStorageOptions = {}): StorageSyncFactory {
|
|
27
27
|
|
|
28
28
|
const prefix = validatePrefix(options.prefix);
|
|
29
29
|
|
|
@@ -46,7 +46,6 @@ export function InLocalStorage(options: InLocalStorageOptions = {}): IStorageSyn
|
|
|
46
46
|
impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
|
|
47
47
|
events: new EventsCacheInMemory(params.eventsQueueSize),
|
|
48
48
|
telemetry: params.mode !== LOCALHOST_MODE && shouldRecordTelemetry() ? new TelemetryCacheInMemory() : undefined,
|
|
49
|
-
uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemoryCS() : undefined,
|
|
50
49
|
|
|
51
50
|
destroy() {
|
|
52
51
|
this.splits = new SplitsCacheInMemory();
|
|
@@ -54,7 +53,6 @@ export function InLocalStorage(options: InLocalStorageOptions = {}): IStorageSyn
|
|
|
54
53
|
this.impressions.clear();
|
|
55
54
|
this.impressionCounts && this.impressionCounts.clear();
|
|
56
55
|
this.events.clear();
|
|
57
|
-
this.uniqueKeys?.clear();
|
|
58
56
|
},
|
|
59
57
|
|
|
60
58
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are customer per key).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventData } from '../../types';
|
|
2
2
|
import { IEventsCacheSync } from '../types';
|
|
3
3
|
|
|
4
4
|
const MAX_QUEUE_BYTE_SIZE = 5 * 1024 * 1024; // 5M
|
|
@@ -7,7 +7,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
|
|
|
7
7
|
|
|
8
8
|
private onFullQueue?: () => void;
|
|
9
9
|
private readonly maxQueue: number;
|
|
10
|
-
private queue:
|
|
10
|
+
private queue: EventData[];
|
|
11
11
|
private queueByteSize: number;
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -28,7 +28,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
|
|
|
28
28
|
/**
|
|
29
29
|
* Add a new event object at the end of the queue.
|
|
30
30
|
*/
|
|
31
|
-
track(data:
|
|
31
|
+
track(data: EventData, size = 0) {
|
|
32
32
|
this.queueByteSize += size;
|
|
33
33
|
this.queue.push(data);
|
|
34
34
|
|
|
@@ -48,7 +48,7 @@ export class EventsCacheInMemory implements IEventsCacheSync {
|
|
|
48
48
|
/**
|
|
49
49
|
* Pop the collected data, used as payload for posting.
|
|
50
50
|
*/
|
|
51
|
-
pop(toMerge?:
|
|
51
|
+
pop(toMerge?: EventData[]) {
|
|
52
52
|
const data = this.queue;
|
|
53
53
|
this.clear();
|
|
54
54
|
return toMerge ? toMerge.concat(data) : data;
|
|
@@ -4,9 +4,8 @@ import { ImpressionsCacheInMemory } from './ImpressionsCacheInMemory';
|
|
|
4
4
|
import { EventsCacheInMemory } from './EventsCacheInMemory';
|
|
5
5
|
import { IStorageFactoryParams, IStorageSync } from '../types';
|
|
6
6
|
import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
|
|
7
|
-
import {
|
|
7
|
+
import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
|
|
8
8
|
import { TelemetryCacheInMemory } from './TelemetryCacheInMemory';
|
|
9
|
-
import { UniqueKeysCacheInMemory } from './uniqueKeysCacheInMemory';
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
11
|
* InMemory storage factory for standalone server-side SplitFactory
|
|
@@ -19,10 +18,9 @@ export function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageS
|
|
|
19
18
|
splits: new SplitsCacheInMemory(),
|
|
20
19
|
segments: new SegmentsCacheInMemory(),
|
|
21
20
|
impressions: new ImpressionsCacheInMemory(params.impressionsQueueSize),
|
|
22
|
-
impressionCounts: params.
|
|
21
|
+
impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
|
|
23
22
|
events: new EventsCacheInMemory(params.eventsQueueSize),
|
|
24
23
|
telemetry: params.mode !== LOCALHOST_MODE ? new TelemetryCacheInMemory() : undefined, // Always track telemetry in standalone mode on server-side
|
|
25
|
-
uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemory(params.uniqueKeysCacheSize) : undefined,
|
|
26
24
|
|
|
27
25
|
// When using MEMORY we should clean all the caches to leave them empty
|
|
28
26
|
destroy() {
|
|
@@ -31,7 +29,6 @@ export function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageS
|
|
|
31
29
|
this.impressions.clear();
|
|
32
30
|
this.impressionCounts && this.impressionCounts.clear();
|
|
33
31
|
this.events.clear();
|
|
34
|
-
this.uniqueKeys?.clear();
|
|
35
32
|
}
|
|
36
33
|
};
|
|
37
34
|
}
|
|
@@ -4,9 +4,8 @@ import { ImpressionsCacheInMemory } from './ImpressionsCacheInMemory';
|
|
|
4
4
|
import { EventsCacheInMemory } from './EventsCacheInMemory';
|
|
5
5
|
import { IStorageSync, IStorageFactoryParams } from '../types';
|
|
6
6
|
import { ImpressionCountsCacheInMemory } from './ImpressionCountsCacheInMemory';
|
|
7
|
-
import {
|
|
7
|
+
import { LOCALHOST_MODE, STORAGE_MEMORY } from '../../utils/constants';
|
|
8
8
|
import { shouldRecordTelemetry, TelemetryCacheInMemory } from './TelemetryCacheInMemory';
|
|
9
|
-
import { UniqueKeysCacheInMemoryCS } from './uniqueKeysCacheInMemoryCS';
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
11
|
* InMemory storage factory for standalone client-side SplitFactory
|
|
@@ -19,11 +18,9 @@ export function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorag
|
|
|
19
18
|
splits: new SplitsCacheInMemory(),
|
|
20
19
|
segments: new MySegmentsCacheInMemory(),
|
|
21
20
|
impressions: new ImpressionsCacheInMemory(params.impressionsQueueSize),
|
|
22
|
-
impressionCounts: params.
|
|
21
|
+
impressionCounts: params.optimize ? new ImpressionCountsCacheInMemory() : undefined,
|
|
23
22
|
events: new EventsCacheInMemory(params.eventsQueueSize),
|
|
24
23
|
telemetry: params.mode !== LOCALHOST_MODE && shouldRecordTelemetry() ? new TelemetryCacheInMemory() : undefined,
|
|
25
|
-
uniqueKeys: params.impressionsMode === NONE ? new UniqueKeysCacheInMemoryCS(params.uniqueKeysCacheSize) : undefined,
|
|
26
|
-
|
|
27
24
|
|
|
28
25
|
// When using MEMORY we should clean all the caches to leave them empty
|
|
29
26
|
destroy() {
|
|
@@ -32,7 +29,6 @@ export function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorag
|
|
|
32
29
|
this.impressions.clear();
|
|
33
30
|
this.impressionCounts && this.impressionCounts.clear();
|
|
34
31
|
this.events.clear();
|
|
35
|
-
this.uniqueKeys?.clear();
|
|
36
32
|
},
|
|
37
33
|
|
|
38
34
|
// When using shared instanciation with MEMORY we reuse everything but segments (they are unique per key)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { IEventsCacheAsync } from '../types';
|
|
2
2
|
import { IMetadata } from '../../dtos/types';
|
|
3
3
|
import { Redis } from 'ioredis';
|
|
4
|
-
import {
|
|
5
|
-
import { ILogger } from '../../
|
|
4
|
+
import { EventData } from '../../types';
|
|
5
|
+
import { ILogger } from '../../types';
|
|
6
6
|
import { LOG_PREFIX } from './constants';
|
|
7
7
|
import { StoredEventWithMetadata } from '../../sync/submitters/types';
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ export class EventsCacheInRedis implements IEventsCacheAsync {
|
|
|
24
24
|
* Add a new event object into the queue.
|
|
25
25
|
* Unlike `impressions::track`, result promise is never rejected.
|
|
26
26
|
*/
|
|
27
|
-
track(eventData:
|
|
27
|
+
track(eventData: EventData): Promise<boolean> {
|
|
28
28
|
return this.redis.rpush(
|
|
29
29
|
this.key,
|
|
30
30
|
this._toJSON(eventData)
|
|
@@ -40,7 +40,7 @@ export class EventsCacheInRedis implements IEventsCacheAsync {
|
|
|
40
40
|
/**
|
|
41
41
|
* Generates the JSON as we'll store it on Redis.
|
|
42
42
|
*/
|
|
43
|
-
private _toJSON(eventData:
|
|
43
|
+
private _toJSON(eventData: EventData): string {
|
|
44
44
|
return JSON.stringify({
|
|
45
45
|
m: this.metadata,
|
|
46
46
|
e: eventData
|
|
@@ -3,7 +3,7 @@ import { IMetadata } from '../../dtos/types';
|
|
|
3
3
|
import { ImpressionDTO } from '../../types';
|
|
4
4
|
import { Redis } from 'ioredis';
|
|
5
5
|
import { StoredImpressionWithMetadata } from '../../sync/submitters/types';
|
|
6
|
-
import { ILogger } from '../../
|
|
6
|
+
import { ILogger } from '../../types';
|
|
7
7
|
|
|
8
8
|
const IMPRESSIONS_TTL_REFRESH = 3600; // 1 hr
|
|
9
9
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ioredis from 'ioredis';
|
|
2
|
-
import { ILogger } from '../../
|
|
2
|
+
import { ILogger } from '../../types';
|
|
3
3
|
import { merge, isString } from '../../utils/lang';
|
|
4
4
|
import { _Set, setToArray, ISet } from '../../utils/lang/sets';
|
|
5
5
|
import { thenable } from '../../utils/promise/thenable';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Redis } from 'ioredis';
|
|
2
|
-
import { ILogger } from '../../
|
|
2
|
+
import { ILogger } from '../../types';
|
|
3
3
|
import { isNaNNumber } from '../../utils/lang';
|
|
4
4
|
import { LOG_PREFIX } from '../inLocalStorage/constants';
|
|
5
5
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isFiniteNumber, isNaNNumber } from '../../utils/lang';
|
|
2
2
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
3
3
|
import { Redis } from 'ioredis';
|
|
4
|
-
import { ILogger } from '../../
|
|
4
|
+
import { ILogger } from '../../types';
|
|
5
5
|
import { LOG_PREFIX } from './constants';
|
|
6
6
|
import { ISplit } from '../../dtos/types';
|
|
7
7
|
import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RedisAdapter } from './RedisAdapter';
|
|
2
|
-
import { IStorageAsync,
|
|
2
|
+
import { IStorageAsync, IStorageFactoryParams } from '../types';
|
|
3
|
+
import { StorageAsyncFactory } from '../../types';
|
|
3
4
|
import { validatePrefix } from '../KeyBuilder';
|
|
4
5
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
5
6
|
import { SplitsCacheInRedis } from './SplitsCacheInRedis';
|
|
@@ -18,7 +19,7 @@ export interface InRedisStorageOptions {
|
|
|
18
19
|
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.
|
|
19
20
|
* @see {@link https://www.npmjs.com/package/ioredis}
|
|
20
21
|
*/
|
|
21
|
-
export function InRedisStorage(options: InRedisStorageOptions = {}):
|
|
22
|
+
export function InRedisStorage(options: InRedisStorageOptions = {}): StorageAsyncFactory {
|
|
22
23
|
|
|
23
24
|
const prefix = validatePrefix(options.prefix);
|
|
24
25
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IPluggableStorageWrapper, IEventsCacheAsync } from '../types';
|
|
2
2
|
import { IMetadata } from '../../dtos/types';
|
|
3
|
-
import {
|
|
4
|
-
import { ILogger } from '../../
|
|
3
|
+
import { EventData } from '../../types';
|
|
4
|
+
import { ILogger } from '../../types';
|
|
5
5
|
import { LOG_PREFIX } from './constants';
|
|
6
6
|
import { StoredEventWithMetadata } from '../../sync/submitters/types';
|
|
7
7
|
|
|
@@ -25,7 +25,7 @@ export class EventsCachePluggable implements IEventsCacheAsync {
|
|
|
25
25
|
* @returns A promise that is resolved with a boolean value indicating if the push operation succeeded or failed.
|
|
26
26
|
* Unlike `impressions::track`, The promise will never be rejected.
|
|
27
27
|
*/
|
|
28
|
-
track(eventData:
|
|
28
|
+
track(eventData: EventData): Promise<boolean> {
|
|
29
29
|
return this.wrapper.pushItems(
|
|
30
30
|
this.key,
|
|
31
31
|
[this._toJSON(eventData)]
|
|
@@ -38,7 +38,7 @@ export class EventsCachePluggable implements IEventsCacheAsync {
|
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
private _toJSON(eventData:
|
|
41
|
+
private _toJSON(eventData: EventData): string {
|
|
42
42
|
return JSON.stringify({
|
|
43
43
|
m: this.metadata,
|
|
44
44
|
e: eventData
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IPluggableStorageWrapper, IImpressionsCacheAsync } from '../types';
|
|
2
2
|
import { IMetadata } from '../../dtos/types';
|
|
3
3
|
import { ImpressionDTO } from '../../types';
|
|
4
|
-
import { ILogger } from '../../
|
|
4
|
+
import { ILogger } from '../../types';
|
|
5
5
|
import { StoredImpressionWithMetadata } from '../../sync/submitters/types';
|
|
6
6
|
|
|
7
7
|
export class ImpressionsCachePluggable implements IImpressionsCacheAsync {
|