@splitsoftware/splitio-commons 1.6.2-rc.4 → 1.6.2-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/consent/sdkUserConsent.js +2 -2
- package/cjs/listeners/browser.js +2 -1
- package/cjs/logger/constants.js +2 -1
- package/cjs/sdkClient/clientAttributesDecoration.js +1 -1
- package/cjs/sdkFactory/index.js +23 -6
- package/cjs/services/splitApi.js +20 -1
- package/cjs/storages/KeyBuilderSS.js +6 -0
- package/cjs/storages/inLocalStorage/index.js +4 -0
- package/cjs/storages/inMemory/AttributesCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +12 -1
- package/cjs/storages/inMemory/InMemoryStorage.js +5 -1
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -1
- package/cjs/storages/inMemory/uniqueKeysCacheInMemory.js +73 -0
- package/cjs/storages/inMemory/uniqueKeysCacheInMemoryCS.js +78 -0
- package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +46 -0
- package/cjs/storages/inRedis/constants.js +4 -1
- package/cjs/storages/inRedis/index.js +15 -1
- package/cjs/storages/inRedis/uniqueKeysCacheInRedis.js +55 -0
- package/cjs/sync/submitters/submitterManager.js +3 -0
- package/cjs/sync/submitters/telemetrySubmitter.js +1 -0
- package/cjs/sync/submitters/uniqueKeysSubmitter.js +26 -0
- package/cjs/trackers/impressionsTracker.js +22 -41
- package/cjs/trackers/strategy/strategyDebug.js +25 -0
- package/cjs/trackers/strategy/strategyNone.js +29 -0
- package/cjs/trackers/strategy/strategyOptimized.js +34 -0
- package/cjs/trackers/uniqueKeysTracker.js +31 -0
- package/cjs/types.js +2 -0
- package/cjs/utils/constants/index.js +4 -2
- package/cjs/utils/key/index.js +1 -1
- package/cjs/utils/settingsValidation/impressionsMode.js +2 -2
- package/cjs/utils/settingsValidation/index.js +3 -1
- package/esm/consent/sdkUserConsent.js +2 -2
- package/esm/listeners/browser.js +3 -2
- package/esm/logger/constants.js +1 -0
- package/esm/sdkClient/clientAttributesDecoration.js +1 -1
- package/esm/sdkFactory/index.js +23 -6
- package/esm/services/splitApi.js +20 -1
- package/esm/storages/KeyBuilderSS.js +6 -0
- package/esm/storages/inLocalStorage/index.js +5 -1
- package/esm/storages/inMemory/AttributesCacheInMemory.js +1 -1
- package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +12 -1
- package/esm/storages/inMemory/InMemoryStorage.js +6 -2
- package/esm/storages/inMemory/InMemoryStorageCS.js +6 -2
- package/esm/storages/inMemory/uniqueKeysCacheInMemory.js +70 -0
- package/esm/storages/inMemory/uniqueKeysCacheInMemoryCS.js +75 -0
- package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +43 -0
- package/esm/storages/inRedis/constants.js +3 -0
- package/esm/storages/inRedis/index.js +16 -2
- package/esm/storages/inRedis/uniqueKeysCacheInRedis.js +52 -0
- package/esm/sync/submitters/submitterManager.js +3 -0
- package/esm/sync/submitters/telemetrySubmitter.js +2 -1
- package/esm/sync/submitters/uniqueKeysSubmitter.js +22 -0
- package/esm/trackers/impressionsTracker.js +22 -41
- package/esm/trackers/strategy/strategyDebug.js +21 -0
- package/esm/trackers/strategy/strategyNone.js +25 -0
- package/esm/trackers/strategy/strategyOptimized.js +30 -0
- package/esm/trackers/uniqueKeysTracker.js +27 -0
- package/esm/types.js +1 -0
- package/esm/utils/constants/index.js +2 -0
- package/esm/utils/key/index.js +1 -1
- package/esm/utils/settingsValidation/impressionsMode.js +3 -3
- package/esm/utils/settingsValidation/index.js +3 -1
- package/package.json +5 -4
- package/src/consent/sdkUserConsent.ts +5 -6
- package/src/dtos/types.ts +8 -0
- 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 +3 -2
- package/src/logger/constants.ts +1 -0
- package/src/logger/index.ts +3 -3
- package/src/logger/sdkLogger.ts +2 -1
- package/src/logger/types.ts +16 -0
- package/src/readiness/sdkReadinessManager.ts +1 -1
- package/src/readiness/types.ts +9 -2
- package/src/sdkClient/client.ts +13 -13
- package/src/sdkClient/clientAttributesDecoration.ts +13 -13
- package/src/sdkClient/clientCS.ts +4 -3
- 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 +28 -8
- package/src/sdkFactory/types.ts +11 -8
- package/src/sdkManager/index.ts +5 -5
- package/src/services/splitApi.ts +22 -1
- package/src/services/types.ts +6 -0
- package/src/storages/KeyBuilderSS.ts +8 -0
- 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 +6 -4
- package/src/storages/inMemory/AttributesCacheInMemory.ts +12 -13
- package/src/storages/inMemory/EventsCacheInMemory.ts +4 -4
- package/src/storages/inMemory/ImpressionCountsCacheInMemory.ts +16 -1
- package/src/storages/inMemory/InMemoryStorage.ts +5 -2
- package/src/storages/inMemory/InMemoryStorageCS.ts +6 -2
- package/src/storages/inMemory/uniqueKeysCacheInMemory.ts +82 -0
- package/src/storages/inMemory/uniqueKeysCacheInMemoryCS.ts +88 -0
- package/src/storages/inRedis/EventsCacheInRedis.ts +4 -4
- package/src/storages/inRedis/ImpressionCountsCacheInRedis.ts +48 -0
- 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/constants.ts +3 -0
- package/src/storages/inRedis/index.ts +14 -6
- package/src/storages/inRedis/uniqueKeysCacheInRedis.ts +61 -0
- 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 +45 -50
- 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 +2 -0
- package/src/sync/submitters/telemetrySubmitter.ts +4 -3
- package/src/sync/submitters/types.ts +22 -3
- package/src/sync/submitters/uniqueKeysSubmitter.ts +35 -0
- package/src/sync/syncTask.ts +1 -1
- package/src/trackers/eventTracker.ts +3 -3
- package/src/trackers/impressionsTracker.ts +30 -51
- package/src/trackers/strategy/strategyDebug.ts +28 -0
- package/src/trackers/strategy/strategyNone.ts +34 -0
- package/src/trackers/strategy/strategyOptimized.ts +42 -0
- package/src/trackers/types.ts +30 -4
- package/src/trackers/uniqueKeysTracker.ts +37 -0
- package/src/types.ts +1265 -0
- package/src/utils/constants/index.ts +3 -1
- 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 +2 -1
- package/src/utils/settingsValidation/impressionsMode.ts +6 -6
- package/src/utils/settingsValidation/index.ts +4 -1
- 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 +2 -1
- package/src/utils/settingsValidation/localhost/builtin.ts +2 -1
- package/src/utils/settingsValidation/localhost/pluggable.ts +2 -1
- package/src/utils/settingsValidation/logger/builtinLogger.ts +2 -1
- package/src/utils/settingsValidation/logger/pluggableLogger.ts +2 -1
- package/src/utils/settingsValidation/splitFilters.ts +9 -7
- package/src/utils/settingsValidation/storage/storageCS.ts +2 -1
- package/types/consent/index.d.ts +2 -0
- package/types/consent/sdkUserConsent.d.ts +13 -0
- package/types/dtos/types.d.ts +172 -0
- package/types/evaluator/Engine.d.ts +15 -0
- package/types/evaluator/combiners/and.d.ts +4 -0
- package/types/evaluator/combiners/ifelseif.d.ts +3 -0
- package/types/evaluator/condition/engineUtils.d.ts +11 -0
- package/types/evaluator/condition/index.d.ts +6 -0
- package/types/evaluator/convertions/index.d.ts +2 -0
- package/types/evaluator/index.d.ts +7 -0
- package/types/evaluator/matchers/all.d.ts +2 -0
- package/types/evaluator/matchers/between.d.ts +3 -0
- package/types/evaluator/matchers/boolean.d.ts +2 -0
- package/types/evaluator/matchers/cont_all.d.ts +2 -0
- package/types/evaluator/matchers/cont_any.d.ts +2 -0
- package/types/evaluator/matchers/cont_str.d.ts +2 -0
- package/types/evaluator/matchers/dependency.d.ts +5 -0
- package/types/evaluator/matchers/eq.d.ts +2 -0
- package/types/evaluator/matchers/eq_set.d.ts +2 -0
- package/types/evaluator/matchers/ew.d.ts +2 -0
- package/types/evaluator/matchers/gte.d.ts +2 -0
- package/types/evaluator/matchers/index.d.ts +7 -0
- package/types/evaluator/matchers/lte.d.ts +2 -0
- package/types/evaluator/matchers/matcherTypes.d.ts +10 -0
- package/types/evaluator/matchers/part_of.d.ts +2 -0
- package/types/evaluator/matchers/segment.d.ts +6 -0
- package/types/evaluator/matchers/string.d.ts +2 -0
- package/types/evaluator/matchers/sw.d.ts +2 -0
- package/types/evaluator/matchers/whitelist.d.ts +3 -0
- package/types/evaluator/matchersTransform/index.d.ts +6 -0
- package/types/evaluator/matchersTransform/segment.d.ts +5 -0
- package/types/evaluator/matchersTransform/set.d.ts +5 -0
- package/types/evaluator/matchersTransform/unaryNumeric.d.ts +5 -0
- package/types/evaluator/matchersTransform/whitelist.d.ts +5 -0
- package/types/evaluator/parser/index.d.ts +5 -0
- package/types/evaluator/treatments/index.d.ts +8 -0
- package/types/evaluator/types.d.ts +28 -0
- package/types/evaluator/value/index.d.ts +7 -0
- package/types/evaluator/value/sanitize.d.ts +7 -0
- package/types/index.d.ts +5 -0
- package/types/integrations/browser.d.ts +12 -0
- package/types/integrations/ga/GaToSplit.d.ts +40 -0
- package/types/integrations/ga/GoogleAnalyticsToSplit.d.ts +3 -0
- package/types/integrations/ga/SplitToGa.d.ts +34 -0
- package/types/integrations/ga/SplitToGoogleAnalytics.d.ts +3 -0
- package/types/integrations/ga/types.d.ts +148 -0
- package/types/integrations/pluggable.d.ts +11 -0
- package/types/integrations/types.d.ts +17 -0
- package/types/listeners/browser.d.ts +40 -0
- package/types/listeners/node.d.ts +22 -0
- package/types/listeners/types.d.ts +4 -0
- package/types/logger/browser/DebugLogger.d.ts +2 -0
- package/types/logger/browser/ErrorLogger.d.ts +2 -0
- package/types/logger/browser/InfoLogger.d.ts +2 -0
- package/types/logger/browser/WarnLogger.d.ts +2 -0
- package/types/logger/constants.d.ts +142 -0
- package/types/logger/index.d.ts +22 -0
- package/types/logger/messages/debug.d.ts +1 -0
- package/types/logger/messages/error.d.ts +1 -0
- package/types/logger/messages/info.d.ts +1 -0
- package/types/logger/messages/warn.d.ts +1 -0
- package/types/logger/sdkLogger.d.ts +8 -0
- package/types/logger/types.d.ts +17 -0
- package/types/readiness/constants.d.ts +7 -0
- package/types/readiness/readinessManager.d.ts +6 -0
- package/types/readiness/sdkReadinessManager.d.ts +11 -0
- package/types/readiness/types.d.ts +60 -0
- package/types/sdkClient/client.d.ts +6 -0
- package/types/sdkClient/clientAttributesDecoration.d.ts +51 -0
- package/types/sdkClient/clientCS.d.ts +10 -0
- package/types/sdkClient/clientInputValidation.d.ts +7 -0
- package/types/sdkClient/sdkClient.d.ts +6 -0
- package/types/sdkClient/sdkClientMethod.d.ts +6 -0
- package/types/sdkClient/sdkClientMethodCS.d.ts +7 -0
- package/types/sdkClient/sdkClientMethodCSWithTT.d.ts +8 -0
- package/types/sdkClient/types.d.ts +18 -0
- package/types/sdkFactory/index.d.ts +6 -0
- package/types/sdkFactory/types.d.ts +82 -0
- package/types/sdkManager/index.d.ts +5 -0
- package/types/services/splitApi.d.ts +11 -0
- package/types/services/splitHttpClient.d.ts +10 -0
- package/types/services/types.d.ts +54 -0
- package/types/storages/AbstractSegmentsCacheSync.d.ts +55 -0
- package/types/storages/AbstractSplitsCacheAsync.d.ts +36 -0
- package/types/storages/AbstractSplitsCacheSync.d.ts +42 -0
- package/types/storages/KeyBuilder.d.ts +14 -0
- package/types/storages/KeyBuilderCS.d.ts +16 -0
- package/types/storages/KeyBuilderSS.d.ts +17 -0
- package/types/storages/dataLoader.d.ts +10 -0
- package/types/storages/findLatencyIndex.d.ts +7 -0
- package/types/storages/inLocalStorage/MySegmentsCacheInLocal.d.ts +25 -0
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +51 -0
- package/types/storages/inLocalStorage/constants.d.ts +2 -0
- package/types/storages/inLocalStorage/index.d.ts +8 -0
- package/types/storages/inMemory/AttributesCacheInMemory.d.ts +43 -0
- package/types/storages/inMemory/CountsCacheInMemory.d.ts +20 -0
- package/types/storages/inMemory/EventsCacheInMemory.d.ts +35 -0
- package/types/storages/inMemory/ImpressionCountsCacheInMemory.d.ts +28 -0
- package/types/storages/inMemory/ImpressionsCacheInMemory.d.ts +30 -0
- package/types/storages/inMemory/InMemoryStorage.d.ts +10 -0
- package/types/storages/inMemory/InMemoryStorageCS.d.ts +10 -0
- package/types/storages/inMemory/LatenciesCacheInMemory.d.ts +20 -0
- package/types/storages/inMemory/MySegmentsCacheInMemory.d.ts +22 -0
- package/types/storages/inMemory/SegmentsCacheInMemory.d.ts +19 -0
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +20 -0
- package/types/storages/inMemory/TelemetryCacheInMemory.d.ts +53 -0
- package/types/storages/inMemory/uniqueKeysCacheInMemory.d.ts +35 -0
- package/types/storages/inMemory/uniqueKeysCacheInMemoryCS.d.ts +37 -0
- package/types/storages/inRedis/CountsCacheInRedis.d.ts +9 -0
- package/types/storages/inRedis/EventsCacheInRedis.d.ts +32 -0
- package/types/storages/inRedis/ImpressionCountsCacheInRedis.d.ts +13 -0
- package/types/storages/inRedis/ImpressionsCacheInRedis.d.ts +18 -0
- package/types/storages/inRedis/LatenciesCacheInRedis.d.ts +9 -0
- package/types/storages/inRedis/RedisAdapter.d.ts +24 -0
- package/types/storages/inRedis/SegmentsCacheInRedis.d.ts +18 -0
- package/types/storages/inRedis/SplitsCacheInRedis.d.ts +91 -0
- package/types/storages/inRedis/TelemetryCacheInRedis.d.ts +20 -0
- package/types/storages/inRedis/constants.d.ts +4 -0
- package/types/storages/inRedis/index.d.ts +10 -0
- package/types/storages/inRedis/uniqueKeysCacheInRedis.d.ts +14 -0
- package/types/storages/metadataBuilder.d.ts +3 -0
- package/types/storages/pluggable/EventsCachePluggable.d.ts +38 -0
- package/types/storages/pluggable/ImpressionsCachePluggable.d.ts +35 -0
- package/types/storages/pluggable/SegmentsCachePluggable.d.ts +54 -0
- package/types/storages/pluggable/SplitsCachePluggable.d.ts +89 -0
- package/types/storages/pluggable/TelemetryCachePluggable.d.ts +18 -0
- package/types/storages/pluggable/constants.d.ts +1 -0
- package/types/storages/pluggable/inMemoryWrapper.d.ts +13 -0
- package/types/storages/pluggable/index.d.ts +9 -0
- package/types/storages/pluggable/wrapperAdapter.d.ts +12 -0
- package/types/storages/types.d.ts +414 -0
- package/types/sync/offline/LocalhostFromFile.d.ts +2 -0
- package/types/sync/offline/LocalhostFromObject.d.ts +2 -0
- package/types/sync/offline/splitsParser/parseCondition.d.ts +7 -0
- package/types/sync/offline/splitsParser/splitsParserFromFile.d.ts +2 -0
- package/types/sync/offline/splitsParser/splitsParserFromSettings.d.ts +3 -0
- package/types/sync/offline/splitsParser/types.d.ts +3 -0
- package/types/sync/offline/syncManagerOffline.d.ts +10 -0
- package/types/sync/offline/syncTasks/fromObjectSyncTask.d.ts +17 -0
- package/types/sync/polling/fetchers/mySegmentsFetcher.d.ts +7 -0
- package/types/sync/polling/fetchers/segmentChangesFetcher.d.ts +7 -0
- package/types/sync/polling/fetchers/splitChangesFetcher.d.ts +7 -0
- package/types/sync/polling/fetchers/types.d.ts +5 -0
- package/types/sync/polling/pollingManagerCS.d.ts +7 -0
- package/types/sync/polling/pollingManagerSS.d.ts +6 -0
- package/types/sync/polling/syncTasks/mySegmentsSyncTask.d.ts +9 -0
- package/types/sync/polling/syncTasks/segmentsSyncTask.d.ts +9 -0
- package/types/sync/polling/syncTasks/splitsSyncTask.d.ts +9 -0
- package/types/sync/polling/types.d.ts +26 -0
- package/types/sync/polling/updaters/mySegmentsUpdater.d.ts +13 -0
- package/types/sync/polling/updaters/segmentChangesUpdater.d.ts +18 -0
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +39 -0
- package/types/sync/streaming/AuthClient/index.d.ts +12 -0
- package/types/sync/streaming/AuthClient/types.d.ts +17 -0
- package/types/sync/streaming/SSEClient/index.d.ts +34 -0
- package/types/sync/streaming/SSEClient/types.d.ts +11 -0
- package/types/sync/streaming/SSEHandler/NotificationKeeper.d.ts +14 -0
- package/types/sync/streaming/SSEHandler/NotificationParser.d.ts +20 -0
- package/types/sync/streaming/SSEHandler/index.d.ts +11 -0
- package/types/sync/streaming/SSEHandler/types.d.ts +67 -0
- package/types/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.d.ts +6 -0
- package/types/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.d.ts +8 -0
- package/types/sync/streaming/UpdateWorkers/SplitsUpdateWorker.d.ts +12 -0
- package/types/sync/streaming/UpdateWorkers/constants.d.ts +3 -0
- package/types/sync/streaming/UpdateWorkers/types.d.ts +4 -0
- package/types/sync/streaming/constants.d.ts +34 -0
- package/types/sync/streaming/mySegmentsV2utils.d.ts +27 -0
- package/types/sync/streaming/pushManager.d.ts +9 -0
- package/types/sync/streaming/types.d.ts +35 -0
- package/types/sync/submitters/eventsSubmitter.d.ts +5 -0
- package/types/sync/submitters/eventsSyncTask.d.ts +8 -0
- package/types/sync/submitters/impressionCountsSubmitter.d.ts +10 -0
- package/types/sync/submitters/impressionCountsSubmitterInRedis.d.ts +5 -0
- package/types/sync/submitters/impressionCountsSyncTask.d.ts +13 -0
- package/types/sync/submitters/impressionsSubmitter.d.ts +11 -0
- package/types/sync/submitters/impressionsSyncTask.d.ts +14 -0
- package/types/sync/submitters/metricsSyncTask.d.ts +12 -0
- package/types/sync/submitters/submitter.d.ts +12 -0
- package/types/sync/submitters/submitterManager.d.ts +3 -0
- package/types/sync/submitters/submitterSyncTask.d.ts +10 -0
- package/types/sync/submitters/telemetrySubmitter.d.ts +25 -0
- package/types/sync/submitters/types.d.ts +194 -0
- package/types/sync/submitters/uniqueKeysSubmitter.d.ts +5 -0
- package/types/sync/submitters/uniqueKeysSubmitterInRedis.d.ts +5 -0
- package/types/sync/syncManagerOnline.d.ts +13 -0
- package/types/sync/syncTask.d.ts +13 -0
- package/types/sync/syncTaskComposite.d.ts +5 -0
- package/types/sync/types.d.ts +43 -0
- package/types/trackers/eventTracker.d.ts +10 -0
- package/types/trackers/filter/bloomFilter.d.ts +10 -0
- package/types/trackers/filter/dictionaryFilter.d.ts +8 -0
- package/types/trackers/filter/types.d.ts +5 -0
- package/types/trackers/impressionObserver/ImpressionObserver.d.ts +8 -0
- package/types/trackers/impressionObserver/buildKey.d.ts +2 -0
- package/types/trackers/impressionObserver/impressionObserverCS.d.ts +4 -0
- package/types/trackers/impressionObserver/impressionObserverSS.d.ts +4 -0
- package/types/trackers/impressionObserver/types.d.ts +4 -0
- package/types/trackers/impressionObserver/utils.d.ts +13 -0
- package/types/trackers/impressionsTracker.d.ts +13 -0
- package/types/trackers/strategy/strategyDebug.d.ts +9 -0
- package/types/trackers/strategy/strategyNone.d.ts +10 -0
- package/types/trackers/strategy/strategyOptimized.d.ts +11 -0
- package/types/trackers/telemetryTracker.d.ts +3 -0
- package/types/trackers/types.d.ts +57 -0
- package/types/trackers/uniqueKeysTracker.d.ts +13 -0
- package/types/types.d.ts +1263 -0
- package/types/utils/Backoff.d.ts +25 -0
- package/types/utils/LRUCache/LinkedList.d.ts +34 -0
- package/types/utils/LRUCache/index.d.ts +16 -0
- package/types/utils/MinEventEmitter.d.ts +12 -0
- package/types/utils/MinEvents.d.ts +4 -0
- package/types/utils/base64/index.d.ts +30 -0
- package/types/utils/constants/browser.d.ts +3 -0
- package/types/utils/constants/index.d.ts +64 -0
- package/types/utils/decompress/index.d.ts +16 -0
- package/types/utils/env/isLocalStorageAvailable.d.ts +1 -0
- package/types/utils/env/isNode.d.ts +5 -0
- package/types/utils/inputValidation/apiKey.d.ts +7 -0
- package/types/utils/inputValidation/attribute.d.ts +2 -0
- package/types/utils/inputValidation/attributes.d.ts +4 -0
- package/types/utils/inputValidation/event.d.ts +2 -0
- package/types/utils/inputValidation/eventProperties.d.ts +6 -0
- package/types/utils/inputValidation/eventValue.d.ts +2 -0
- package/types/utils/inputValidation/index.d.ts +13 -0
- package/types/utils/inputValidation/isOperational.d.ts +4 -0
- package/types/utils/inputValidation/key.d.ts +3 -0
- package/types/utils/inputValidation/preloadedData.d.ts +3 -0
- package/types/utils/inputValidation/split.d.ts +2 -0
- package/types/utils/inputValidation/splitExistance.d.ts +7 -0
- package/types/utils/inputValidation/splits.d.ts +2 -0
- package/types/utils/inputValidation/trafficType.d.ts +2 -0
- package/types/utils/inputValidation/trafficTypeExistance.d.ts +9 -0
- package/types/utils/jwt/index.d.ts +5 -0
- package/types/utils/jwt/types.d.ts +5 -0
- package/types/utils/key/index.d.ts +8 -0
- package/types/utils/labels/index.d.ts +7 -0
- package/types/utils/lang/binarySearch.d.ts +9 -0
- package/types/utils/lang/getFnName.d.ts +4 -0
- package/types/utils/lang/getGlobal.d.ts +4 -0
- package/types/utils/lang/index.d.ts +105 -0
- package/types/utils/lang/maps.d.ts +55 -0
- package/types/utils/lang/objectAssign.d.ts +3 -0
- package/types/utils/lang/sets.d.ts +60 -0
- package/types/utils/murmur3/common.d.ts +12 -0
- package/types/utils/murmur3/legacy.d.ts +2 -0
- package/types/utils/murmur3/murmur3.d.ts +2 -0
- package/types/utils/murmur3/murmur3_128.d.ts +6 -0
- package/types/utils/murmur3/murmur3_128_x86.d.ts +7 -0
- package/types/utils/murmur3/murmur3_64.d.ts +10 -0
- package/types/utils/murmur3/utfx.d.ts +27 -0
- package/types/utils/promise/thenable.d.ts +1 -0
- package/types/utils/promise/timeout.d.ts +1 -0
- package/types/utils/promise/wrapper.d.ts +21 -0
- package/types/utils/settingsValidation/consent.d.ts +6 -0
- package/types/utils/settingsValidation/impressionsMode.d.ts +3 -0
- package/types/utils/settingsValidation/index.d.ts +52 -0
- package/types/utils/settingsValidation/integrations/common.d.ts +14 -0
- package/types/utils/settingsValidation/integrations/configurable.d.ts +13 -0
- package/types/utils/settingsValidation/integrations/pluggable.d.ts +13 -0
- package/types/utils/settingsValidation/localhost/builtin.d.ts +16 -0
- package/types/utils/settingsValidation/localhost/pluggable.d.ts +16 -0
- package/types/utils/settingsValidation/logger/builtinLogger.d.ts +10 -0
- package/types/utils/settingsValidation/logger/commons.d.ts +9 -0
- package/types/utils/settingsValidation/logger/pluggableLogger.d.ts +11 -0
- package/types/utils/settingsValidation/mode.d.ts +1 -0
- package/types/utils/settingsValidation/runtime.d.ts +2 -0
- package/types/utils/settingsValidation/splitFilters.d.ts +16 -0
- package/types/utils/settingsValidation/storage/storageCS.d.ts +21 -0
- package/types/utils/settingsValidation/types.d.ts +32 -0
- package/types/utils/settingsValidation/url.d.ts +10 -0
- package/types/utils/time/index.d.ts +4 -0
- package/types/utils/timeTracker/index.d.ts +70 -0
- package/types/utils/timeTracker/now/browser.d.ts +1 -0
- package/types/utils/timeTracker/now/node.d.ts +1 -0
- package/types/utils/timeTracker/timer.d.ts +1 -0
- package/src/logger/.DS_Store +0 -0
- package/src/types.d.ts +0 -1581
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { IUniqueKeysCacheBase } from '../types';
|
|
2
|
+
import { ISet, setToArray, _Set } from '../../utils/lang/sets';
|
|
3
|
+
import { UniqueKeysPayloadCs } from '../../sync/submitters/types';
|
|
4
|
+
import { DEFAULT_CACHE_SIZE } from '../inRedis/constants';
|
|
5
|
+
|
|
6
|
+
export class UniqueKeysCacheInMemoryCS implements IUniqueKeysCacheBase {
|
|
7
|
+
|
|
8
|
+
private onFullQueue?: () => void;
|
|
9
|
+
private readonly maxStorage: number;
|
|
10
|
+
private uniqueTrackerSize = 0;
|
|
11
|
+
private uniqueKeysTracker: { [keys: string]: ISet<string> };
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param impressionsQueueSize number of queued impressions to call onFullQueueCb.
|
|
16
|
+
* Default value is 0, that means no maximum value, in case we want to avoid this being triggered.
|
|
17
|
+
*/
|
|
18
|
+
constructor(uniqueKeysQueueSize: number = DEFAULT_CACHE_SIZE) {
|
|
19
|
+
this.maxStorage = uniqueKeysQueueSize;
|
|
20
|
+
this.uniqueKeysTracker = {};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
setOnFullQueueCb(cb: () => void) {
|
|
24
|
+
this.onFullQueue = cb;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Store unique keys in sequential order
|
|
29
|
+
* key: string = key.
|
|
30
|
+
* value: HashSet<string> = set of split names.
|
|
31
|
+
*/
|
|
32
|
+
track(key: string, featureName: string) {
|
|
33
|
+
|
|
34
|
+
if (!this.uniqueKeysTracker[key]) this.uniqueKeysTracker[key] = new _Set();
|
|
35
|
+
const tracker = this.uniqueKeysTracker[key];
|
|
36
|
+
if (!tracker.has(featureName)) {
|
|
37
|
+
tracker.add(featureName);
|
|
38
|
+
this.uniqueTrackerSize++;
|
|
39
|
+
}
|
|
40
|
+
if (this.uniqueTrackerSize >= this.maxStorage && this.onFullQueue) {
|
|
41
|
+
this.uniqueTrackerSize = 0;
|
|
42
|
+
this.onFullQueue();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Clear the data stored on the cache.
|
|
48
|
+
*/
|
|
49
|
+
clear() {
|
|
50
|
+
this.uniqueKeysTracker = {};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Pop the collected data, used as payload for posting.
|
|
55
|
+
*/
|
|
56
|
+
pop() {
|
|
57
|
+
const data = this.uniqueKeysTracker;
|
|
58
|
+
this.uniqueKeysTracker = {};
|
|
59
|
+
return this.fromUniqueKeysCollector(data);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if the cache is empty.
|
|
64
|
+
*/
|
|
65
|
+
isEmpty() {
|
|
66
|
+
return Object.keys(this.uniqueKeysTracker).length === 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Converts `uniqueKeys` data from cache into request payload.
|
|
71
|
+
*/
|
|
72
|
+
private fromUniqueKeysCollector(uniqueKeys: { [featureName: string]: ISet<string> }): UniqueKeysPayloadCs {
|
|
73
|
+
const payload = [];
|
|
74
|
+
const featureKeys = Object.keys(uniqueKeys);
|
|
75
|
+
for (let k = 0; k < featureKeys.length; k++) {
|
|
76
|
+
const featureKey = featureKeys[k];
|
|
77
|
+
const featureNames = setToArray(uniqueKeys[featureKey]);
|
|
78
|
+
const uniqueKeysPayload = {
|
|
79
|
+
k: featureKey,
|
|
80
|
+
fs: featureNames
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
payload.push(uniqueKeysPayload);
|
|
84
|
+
}
|
|
85
|
+
return { keys: payload };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
}
|
|
@@ -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 '../../types';
|
|
4
|
+
import { SplitIO } from '../../types';
|
|
5
|
+
import { ILogger } from '../../logger/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: EventData): Promise<boolean> {
|
|
27
|
+
track(eventData: SplitIO.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: EventData): string {
|
|
43
|
+
private _toJSON(eventData: SplitIO.EventData): string {
|
|
44
44
|
return JSON.stringify({
|
|
45
45
|
m: this.metadata,
|
|
46
46
|
e: eventData
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Redis } from 'ioredis';
|
|
2
|
+
import { ILogger } from '../../logger/types';
|
|
3
|
+
import { ImpressionCountsCacheInMemory } from '../inMemory/ImpressionCountsCacheInMemory';
|
|
4
|
+
import { LOG_PREFIX, REFRESH_RATE, TTL_REFRESH } from './constants';
|
|
5
|
+
|
|
6
|
+
export class ImpressionCountsCacheInRedis extends ImpressionCountsCacheInMemory {
|
|
7
|
+
|
|
8
|
+
private readonly log: ILogger;
|
|
9
|
+
private readonly key: string;
|
|
10
|
+
private readonly redis: Redis;
|
|
11
|
+
private handle: any;
|
|
12
|
+
|
|
13
|
+
constructor(log: ILogger, key: string, redis: Redis, impressionCountsCacheSize?: number) {
|
|
14
|
+
super(impressionCountsCacheSize);
|
|
15
|
+
this.log = log;
|
|
16
|
+
this.key = key;
|
|
17
|
+
this.redis = redis;
|
|
18
|
+
this.onFullQueue = () => { this.postImpressionCountsInRedis(); };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
postImpressionCountsInRedis(){
|
|
22
|
+
const counts = this.pop();
|
|
23
|
+
const keys = Object.keys(counts);
|
|
24
|
+
const pipeline = this.redis.pipeline();
|
|
25
|
+
keys.forEach(key => {
|
|
26
|
+
pipeline.hincrby(this.key, key, counts[key]);
|
|
27
|
+
});
|
|
28
|
+
return pipeline.exec()
|
|
29
|
+
.then(data => {
|
|
30
|
+
// If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
|
|
31
|
+
if (data.length && data.length === keys.length) {
|
|
32
|
+
return this.redis.expire(this.key, TTL_REFRESH);
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
.catch(err => {
|
|
36
|
+
this.log.error(`${LOG_PREFIX}Error in impression counts pipeline: ${err}.`);
|
|
37
|
+
return false;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
start(refreshRate: number = REFRESH_RATE) {
|
|
42
|
+
this.handle = setInterval(this.postImpressionCountsInRedis.bind(this), refreshRate);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
stop() {
|
|
46
|
+
clearInterval(this.handle);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -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 '../../types';
|
|
6
|
+
import { ILogger } from '../../logger/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 '../../types';
|
|
2
|
+
import { ILogger } from '../../logger/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 '../../types';
|
|
2
|
+
import { ILogger } from '../../logger/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 '../../types';
|
|
4
|
+
import { ILogger } from '../../logger/types';
|
|
5
5
|
import { LOG_PREFIX } from './constants';
|
|
6
6
|
import { ISplit } from '../../dtos/types';
|
|
7
7
|
import { AbstractSplitsCacheAsync } from '../AbstractSplitsCacheAsync';
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { RedisAdapter } from './RedisAdapter';
|
|
2
|
-
import { IStorageAsync, IStorageFactoryParams } from '../types';
|
|
3
|
-
import { StorageAsyncFactory } from '../../types';
|
|
2
|
+
import { IStorageAsync, IStorageAsyncFactory, IStorageFactoryParams } from '../types';
|
|
4
3
|
import { validatePrefix } from '../KeyBuilder';
|
|
5
4
|
import { KeyBuilderSS } from '../KeyBuilderSS';
|
|
6
5
|
import { SplitsCacheInRedis } from './SplitsCacheInRedis';
|
|
7
6
|
import { SegmentsCacheInRedis } from './SegmentsCacheInRedis';
|
|
8
7
|
import { ImpressionsCacheInRedis } from './ImpressionsCacheInRedis';
|
|
9
8
|
import { EventsCacheInRedis } from './EventsCacheInRedis';
|
|
10
|
-
import { STORAGE_REDIS } from '../../utils/constants';
|
|
9
|
+
import { DEBUG, NONE, STORAGE_REDIS } from '../../utils/constants';
|
|
11
10
|
import { TelemetryCacheInRedis } from './TelemetryCacheInRedis';
|
|
11
|
+
import { UniqueKeysCacheInRedis } from './uniqueKeysCacheInRedis';
|
|
12
|
+
import { ImpressionCountsCacheInRedis } from './ImpressionCountsCacheInRedis';
|
|
12
13
|
|
|
13
14
|
export interface InRedisStorageOptions {
|
|
14
15
|
prefix?: string
|
|
@@ -19,19 +20,22 @@ export interface InRedisStorageOptions {
|
|
|
19
20
|
* InRedis storage factory for consumer server-side SplitFactory, that uses `Ioredis` Redis client for Node.
|
|
20
21
|
* @see {@link https://www.npmjs.com/package/ioredis}
|
|
21
22
|
*/
|
|
22
|
-
export function InRedisStorage(options: InRedisStorageOptions = {}):
|
|
23
|
+
export function InRedisStorage(options: InRedisStorageOptions = {}): IStorageAsyncFactory {
|
|
23
24
|
|
|
24
25
|
const prefix = validatePrefix(options.prefix);
|
|
25
26
|
|
|
26
|
-
function InRedisStorageFactory({ log, metadata, onReadyCb }: IStorageFactoryParams): IStorageAsync {
|
|
27
|
-
|
|
27
|
+
function InRedisStorageFactory({ log, metadata, onReadyCb, impressionsMode }: IStorageFactoryParams): IStorageAsync {
|
|
28
28
|
const keys = new KeyBuilderSS(prefix, metadata);
|
|
29
29
|
const redisClient = new RedisAdapter(log, options.options || {});
|
|
30
30
|
const telemetry = new TelemetryCacheInRedis(log, keys, redisClient);
|
|
31
|
+
const impressionCountsCache = impressionsMode !== DEBUG ? new ImpressionCountsCacheInRedis(log, keys.buildImpressionsCountKey(), redisClient) : undefined;
|
|
32
|
+
const uniqueKeysCache = impressionsMode === NONE ? new UniqueKeysCacheInRedis(log, keys.buildUniqueKeysKey(), redisClient) : undefined;
|
|
31
33
|
|
|
32
34
|
// subscription to Redis connect event in order to emit SDK_READY event on consumer mode
|
|
33
35
|
redisClient.on('connect', () => {
|
|
34
36
|
onReadyCb();
|
|
37
|
+
if (impressionCountsCache) impressionCountsCache.start();
|
|
38
|
+
if (uniqueKeysCache) uniqueKeysCache.start();
|
|
35
39
|
|
|
36
40
|
// Synchronize config
|
|
37
41
|
telemetry.recordConfig();
|
|
@@ -41,13 +45,17 @@ export function InRedisStorage(options: InRedisStorageOptions = {}): StorageAsyn
|
|
|
41
45
|
splits: new SplitsCacheInRedis(log, keys, redisClient),
|
|
42
46
|
segments: new SegmentsCacheInRedis(log, keys, redisClient),
|
|
43
47
|
impressions: new ImpressionsCacheInRedis(log, keys.buildImpressionsKey(), redisClient, metadata),
|
|
48
|
+
impressionCounts: impressionCountsCache,
|
|
44
49
|
events: new EventsCacheInRedis(log, keys.buildEventsKey(), redisClient, metadata),
|
|
45
50
|
telemetry,
|
|
51
|
+
uniqueKeys: uniqueKeysCache,
|
|
46
52
|
|
|
47
53
|
// When using REDIS we should:
|
|
48
54
|
// 1- Disconnect from the storage
|
|
49
55
|
destroy() {
|
|
50
56
|
redisClient.disconnect();
|
|
57
|
+
if (impressionCountsCache) impressionCountsCache.stop();
|
|
58
|
+
if (uniqueKeysCache) uniqueKeysCache.stop();
|
|
51
59
|
// @TODO check that caches works as expected when redisClient is disconnected
|
|
52
60
|
}
|
|
53
61
|
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { IUniqueKeysCacheBase } from '../types';
|
|
2
|
+
import { Redis } from 'ioredis';
|
|
3
|
+
import { UniqueKeysCacheInMemory } from '../inMemory/uniqueKeysCacheInMemory';
|
|
4
|
+
import { setToArray } from '../../utils/lang/sets';
|
|
5
|
+
import { DEFAULT_CACHE_SIZE, REFRESH_RATE, TTL_REFRESH } from './constants';
|
|
6
|
+
import { LOG_PREFIX } from './constants';
|
|
7
|
+
import { ILogger } from '../../logger/types';
|
|
8
|
+
|
|
9
|
+
export class UniqueKeysCacheInRedis extends UniqueKeysCacheInMemory implements IUniqueKeysCacheBase {
|
|
10
|
+
|
|
11
|
+
private readonly log: ILogger;
|
|
12
|
+
private readonly key: string;
|
|
13
|
+
private readonly redis: Redis;
|
|
14
|
+
private handle: any;
|
|
15
|
+
|
|
16
|
+
constructor(log: ILogger, key: string, redis: Redis, uniqueKeysQueueSize: number = DEFAULT_CACHE_SIZE) {
|
|
17
|
+
super(uniqueKeysQueueSize);
|
|
18
|
+
this.log = log;
|
|
19
|
+
this.key = key;
|
|
20
|
+
this.redis = redis;
|
|
21
|
+
this.onFullQueue = () => {this.postUniqueKeysInRedis();};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
postUniqueKeysInRedis() {
|
|
25
|
+
const pipeline = this.redis.pipeline();
|
|
26
|
+
|
|
27
|
+
const featureNames = Object.keys(this.uniqueKeysTracker);
|
|
28
|
+
for (let i = 0; i < featureNames.length; i++) {
|
|
29
|
+
const featureName = featureNames[i];
|
|
30
|
+
const featureKeys = setToArray(this.uniqueKeysTracker[featureName]);
|
|
31
|
+
const uniqueKeysPayload = {
|
|
32
|
+
f: featureName,
|
|
33
|
+
ks: featureKeys
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
pipeline.rpush(this.key, JSON.stringify(uniqueKeysPayload));
|
|
37
|
+
}
|
|
38
|
+
this.clear();
|
|
39
|
+
return pipeline.exec()
|
|
40
|
+
.then(data => {
|
|
41
|
+
// If this is the creation of the key on Redis, set the expiration for it in 3600 seconds.
|
|
42
|
+
if (data.length && data.length === featureNames.length) {
|
|
43
|
+
return this.redis.expire(this.key, TTL_REFRESH);
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
.catch(err => {
|
|
47
|
+
this.log.error(`${LOG_PREFIX}Error in uniqueKeys pipeline: ${err}.`);
|
|
48
|
+
return false;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
start(refreshRate: number = REFRESH_RATE) {
|
|
54
|
+
this.handle = setInterval(this.postUniqueKeysInRedis.bind(this), refreshRate);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
stop() {
|
|
58
|
+
clearInterval(this.handle);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IPluggableStorageWrapper, IEventsCacheAsync } from '../types';
|
|
2
2
|
import { IMetadata } from '../../dtos/types';
|
|
3
|
-
import {
|
|
4
|
-
import { ILogger } from '../../types';
|
|
3
|
+
import { SplitIO } from '../../types';
|
|
4
|
+
import { ILogger } from '../../logger/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: EventData): Promise<boolean> {
|
|
28
|
+
track(eventData: SplitIO.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: EventData): string {
|
|
41
|
+
private _toJSON(eventData: SplitIO.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 '../../types';
|
|
4
|
+
import { ILogger } from '../../logger/types';
|
|
5
5
|
import { StoredImpressionWithMetadata } from '../../sync/submitters/types';
|
|
6
6
|
|
|
7
7
|
export class ImpressionsCachePluggable implements IImpressionsCacheAsync {
|
|
@@ -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 '../../types';
|
|
6
|
+
import { ILogger } from '../../logger/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 '../../types';
|
|
4
|
+
import { ILogger } from '../../logger/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, IStorageFactoryParams } from '../types';
|
|
2
|
-
|
|
1
|
+
import { IPluggableStorageWrapper, IStorageAsync, IStorageAsyncFactory, IStorageFactoryParams } from '../types';
|
|
2
|
+
|
|
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): IStorageAsyncFactory {
|
|
62
62
|
|
|
63
63
|
validatePluggableStorageOptions(options);
|
|
64
64
|
|
package/src/storages/types.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { MaybeThenable, IMetadata } from '../dtos/types';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { MaybeThenable, IMetadata, ISplitFiltersValidation } from '../dtos/types';
|
|
2
|
+
import { ILogger } from '../logger/types';
|
|
3
|
+
import { EventDataType, HttpErrors, HttpLatencies, ImpressionDataType, LastSync, Method, MethodExceptions, MethodLatencies, OperationType, StoredEventWithMetadata, StoredImpressionWithMetadata, StreamingEvent, UniqueKeysPayloadCs, UniqueKeysPayloadSs } from '../sync/submitters/types';
|
|
4
|
+
import { SplitIO, ImpressionDTO, SDKMode } from '../types';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Interface of a pluggable storage wrapper.
|
|
@@ -288,7 +289,7 @@ export interface IImpressionsCacheBase {
|
|
|
288
289
|
|
|
289
290
|
export interface IEventsCacheBase {
|
|
290
291
|
// Consumer API method, used by events tracker, in standalone and consumer modes, to push events into the storage.
|
|
291
|
-
track(data: EventData, size?: number): MaybeThenable<boolean>
|
|
292
|
+
track(data: SplitIO.EventData, size?: number): MaybeThenable<boolean>
|
|
292
293
|
}
|
|
293
294
|
|
|
294
295
|
/** Impressions and events cache for standalone mode (sync) */
|
|
@@ -311,8 +312,8 @@ export interface IImpressionsCacheSync extends IImpressionsCacheBase, IRecorderC
|
|
|
311
312
|
setOnFullQueueCb(cb: () => void): void
|
|
312
313
|
}
|
|
313
314
|
|
|
314
|
-
export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<EventData[]> {
|
|
315
|
-
track(data: EventData, size?: number): boolean
|
|
315
|
+
export interface IEventsCacheSync extends IEventsCacheBase, IRecorderCacheProducerSync<SplitIO.EventData[]> {
|
|
316
|
+
track(data: SplitIO.EventData, size?: number): boolean
|
|
316
317
|
/* Registers callback for full queue */
|
|
317
318
|
setOnFullQueueCb(cb: () => void): void
|
|
318
319
|
}
|
|
@@ -338,7 +339,7 @@ export interface IImpressionsCacheAsync extends IImpressionsCacheBase, IRecorder
|
|
|
338
339
|
export interface IEventsCacheAsync extends IEventsCacheBase, IRecorderCacheProducerAsync<StoredEventWithMetadata[]> {
|
|
339
340
|
// Consumer API method, used by events tracker (in standalone and consumer modes) to push data into.
|
|
340
341
|
// The result promise cannot reject.
|
|
341
|
-
track(data: EventData, size?: number): Promise<boolean>
|
|
342
|
+
track(data: SplitIO.EventData, size?: number): Promise<boolean>
|
|
342
343
|
}
|
|
343
344
|
|
|
344
345
|
/**
|
|
@@ -346,14 +347,25 @@ export interface IEventsCacheAsync extends IEventsCacheBase, IRecorderCacheProdu
|
|
|
346
347
|
* Only in memory. Named `ImpressionsCounter` in spec.
|
|
347
348
|
*/
|
|
348
349
|
export interface IImpressionCountsCacheSync extends IRecorderCacheProducerSync<Record<string, number>> {
|
|
349
|
-
|
|
350
|
+
// Used by impressions tracker
|
|
350
351
|
track(featureName: string, timeFrame: number, amount: number): void
|
|
351
352
|
|
|
352
353
|
// Used by impressions count submitter in standalone and producer mode
|
|
353
354
|
isEmpty(): boolean // check if cache is empty. Return true if the cache was just created or cleared.
|
|
354
|
-
pop(toMerge?: Record<string, number>): Record<string, number> // pop cache data
|
|
355
|
+
pop(toMerge?: Record<string, number> ): Record<string, number> // pop cache data
|
|
355
356
|
}
|
|
356
357
|
|
|
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
|
+
}
|
|
357
369
|
|
|
358
370
|
/**
|
|
359
371
|
* Telemetry storage interface for standalone and partial consumer modes.
|
|
@@ -443,15 +455,18 @@ export interface IStorageBase<
|
|
|
443
455
|
TSplitsCache extends ISplitsCacheBase,
|
|
444
456
|
TSegmentsCache extends ISegmentsCacheBase,
|
|
445
457
|
TImpressionsCache extends IImpressionsCacheBase,
|
|
458
|
+
TImpressionsCountCache extends IImpressionCountsCacheSync,
|
|
446
459
|
TEventsCache extends IEventsCacheBase,
|
|
447
|
-
TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync
|
|
460
|
+
TTelemetryCache extends ITelemetryCacheSync | ITelemetryCacheAsync,
|
|
461
|
+
TUniqueKeysCache extends IUniqueKeysCacheBase
|
|
448
462
|
> {
|
|
449
463
|
splits: TSplitsCache,
|
|
450
464
|
segments: TSegmentsCache,
|
|
451
465
|
impressions: TImpressionsCache,
|
|
452
|
-
impressionCounts?:
|
|
466
|
+
impressionCounts?: TImpressionsCountCache,
|
|
453
467
|
events: TEventsCache,
|
|
454
|
-
telemetry?: TTelemetryCache
|
|
468
|
+
telemetry?: TTelemetryCache,
|
|
469
|
+
uniqueKeys?: TUniqueKeysCache,
|
|
455
470
|
destroy(): void | Promise<void>,
|
|
456
471
|
shared?: (matchingKey: string, onReadyCb: (error?: any) => void) => this
|
|
457
472
|
}
|
|
@@ -460,16 +475,20 @@ export interface IStorageSync extends IStorageBase<
|
|
|
460
475
|
ISplitsCacheSync,
|
|
461
476
|
ISegmentsCacheSync,
|
|
462
477
|
IImpressionsCacheSync,
|
|
478
|
+
IImpressionCountsCacheSync,
|
|
463
479
|
IEventsCacheSync,
|
|
464
|
-
ITelemetryCacheSync
|
|
480
|
+
ITelemetryCacheSync,
|
|
481
|
+
IUniqueKeysCacheBase
|
|
465
482
|
> { }
|
|
466
483
|
|
|
467
484
|
export interface IStorageAsync extends IStorageBase<
|
|
468
485
|
ISplitsCacheAsync,
|
|
469
486
|
ISegmentsCacheAsync,
|
|
470
487
|
IImpressionsCacheAsync | IImpressionsCacheSync,
|
|
488
|
+
IImpressionCountsCacheSync,
|
|
471
489
|
IEventsCacheAsync | IEventsCacheSync,
|
|
472
|
-
ITelemetryCacheAsync
|
|
490
|
+
ITelemetryCacheAsync,
|
|
491
|
+
IUniqueKeysCacheBase
|
|
473
492
|
> { }
|
|
474
493
|
|
|
475
494
|
/** StorageFactory */
|
|
@@ -479,10 +498,11 @@ export type DataLoader = (storage: IStorageSync, matchingKey: string) => void
|
|
|
479
498
|
export interface IStorageFactoryParams {
|
|
480
499
|
log: ILogger,
|
|
481
500
|
impressionsQueueSize?: number,
|
|
501
|
+
uniqueKeysCacheSize?: number;
|
|
482
502
|
eventsQueueSize?: number,
|
|
483
503
|
optimize?: boolean /* whether create the `impressionCounts` cache (OPTIMIZED impression mode) or not (DEBUG impression mode) */,
|
|
484
504
|
mode: SDKMode,
|
|
485
|
-
|
|
505
|
+
impressionsMode?: string,
|
|
486
506
|
// ATM, only used by InLocalStorage
|
|
487
507
|
matchingKey?: string, /* undefined on server-side SDKs */
|
|
488
508
|
splitFiltersValidation?: ISplitFiltersValidation,
|
|
@@ -494,39 +514,14 @@ export interface IStorageFactoryParams {
|
|
|
494
514
|
metadata: IMetadata,
|
|
495
515
|
}
|
|
496
516
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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
|
-
},
|
|
517
|
+
export type StorageType = 'MEMORY' | 'LOCALSTORAGE' | 'REDIS' | 'PLUGGABLE';
|
|
518
|
+
|
|
519
|
+
export type IStorageSyncFactory = {
|
|
520
|
+
readonly type: StorageType,
|
|
521
|
+
(params: IStorageFactoryParams): IStorageSync
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export type IStorageAsyncFactory = {
|
|
525
|
+
type: StorageType,
|
|
526
|
+
(params: IStorageFactoryParams): IStorageAsync
|
|
532
527
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { splitsParserFromSettingsFactory } from './splitsParser/splitsParserFromSettings';
|
|
2
2
|
import { syncManagerOfflineFactory } from './syncManagerOffline';
|
|
3
|
-
import {
|
|
3
|
+
import { SplitIO } 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
|
|
7
|
+
const localhostFromObject = syncManagerOfflineFactory(splitsParserFromSettingsFactory) as SplitIO.LocalhostFactory;
|
|
8
8
|
localhostFromObject.type = 'LocalhostFromObject';
|
|
9
9
|
|
|
10
|
-
export function LocalhostFromObject() {
|
|
11
|
-
return localhostFromObject
|
|
10
|
+
export function LocalhostFromObject(): SplitIO.LocalhostFactory {
|
|
11
|
+
return localhostFromObject;
|
|
12
12
|
}
|