@splitsoftware/splitio-commons 2.12.0 → 3.0.0-rc.1
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/CHANGES.txt +19 -1
- package/cjs/evaluator/condition/engineUtils.js +2 -2
- package/cjs/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.js +70 -0
- package/cjs/evaluator/fallbackConfigsCalculator/index.js +25 -0
- package/cjs/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/cjs/evaluator/fallbackTreatmentsCalculator/index.js +21 -32
- package/cjs/evaluator/index.js +73 -48
- package/cjs/evaluator/matchers/whitelist.js +1 -1
- package/cjs/integrations/pluggable.js +1 -1
- package/cjs/listeners/browser.js +4 -3
- package/cjs/listeners/node.js +4 -4
- package/cjs/logger/constants.js +15 -21
- package/cjs/logger/index.js +1 -1
- package/cjs/logger/messages/debug.js +6 -7
- package/cjs/logger/messages/error.js +4 -4
- package/cjs/logger/messages/info.js +2 -4
- package/cjs/logger/messages/warn.js +9 -10
- package/cjs/platform/browser.js +15 -0
- package/cjs/platform/getEventSource/browser.js +8 -0
- package/cjs/platform/getEventSource/eventsource.js +480 -0
- package/cjs/platform/getEventSource/node.js +26 -0
- package/cjs/platform/getFetch/browser.js +9 -0
- package/cjs/platform/getFetch/node.js +27 -0
- package/cjs/platform/getOptions/node.js +25 -0
- package/cjs/platform/node.js +17 -0
- package/cjs/readiness/constants.js +5 -4
- package/cjs/readiness/readinessManager.js +22 -22
- package/cjs/readiness/sdkReadinessManager.js +0 -16
- package/cjs/sdkClient/client.js +9 -35
- package/cjs/sdkClient/clientAttributesDecoration.js +3 -3
- package/cjs/sdkClient/clientInputValidation.js +38 -81
- package/cjs/sdkClient/identity.js +1 -1
- package/cjs/sdkClient/sdkClient.js +4 -49
- package/cjs/sdkClient/sdkLifecycle.js +71 -0
- package/cjs/sdkClient/trackMethod.js +56 -0
- package/cjs/sdkFactory/index.js +13 -50
- package/cjs/sdkManager/index.js +5 -5
- package/cjs/services/authProvider.js +67 -0
- package/cjs/services/secureSplitHttpClient.js +39 -0
- package/cjs/services/splitApi.js +24 -14
- package/cjs/services/splitHttpClient.js +1 -1
- package/cjs/storages/AbstractDefinitionsCacheAsync.js +51 -0
- package/cjs/storages/AbstractDefinitionsCacheSync.js +76 -0
- package/cjs/storages/KeyBuilder.js +16 -16
- package/cjs/storages/KeyBuilderCS.js +17 -17
- package/cjs/storages/KeyBuilderSS.js +16 -16
- package/cjs/storages/getRolloutPlan.js +4 -4
- package/cjs/storages/inLocalStorage/DefinitionsCacheInLocal.js +194 -0
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -1
- package/cjs/storages/inLocalStorage/RBSegmentsCacheInLocal.js +10 -10
- package/cjs/storages/inLocalStorage/index.js +6 -6
- package/cjs/storages/inLocalStorage/validateCache.js +3 -3
- package/cjs/storages/inMemory/DefinitionsCacheInMemory.js +121 -0
- package/cjs/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/InMemoryStorage.js +4 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/cjs/storages/inMemory/MySegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/RBSegmentsCacheInMemory.js +5 -5
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/cjs/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/cjs/storages/inRedis/DefinitionsCacheInRedis.js +243 -0
- package/cjs/storages/inRedis/EventsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/ImpressionCountsCacheInRedis.js +5 -5
- package/cjs/storages/inRedis/ImpressionsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/RedisAdapter.js +8 -8
- package/cjs/storages/inRedis/TelemetryCacheInRedis.js +7 -7
- package/cjs/storages/inRedis/UniqueKeysCacheInRedis.js +3 -3
- package/cjs/storages/inRedis/index.js +2 -2
- package/cjs/storages/pluggable/DefinitionsCachePluggable.js +212 -0
- package/cjs/storages/pluggable/EventsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/ImpressionCountsCachePluggable.js +6 -6
- package/cjs/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/TelemetryCachePluggable.js +7 -7
- package/cjs/storages/pluggable/UniqueKeysCachePluggable.js +2 -2
- package/cjs/storages/pluggable/index.js +5 -5
- package/cjs/storages/pluggable/wrapperAdapter.js +1 -1
- package/cjs/storages/setRolloutPlan.js +6 -6
- package/cjs/storages/utils.js +6 -6
- package/cjs/sync/offline/splitsParser/parseCondition.js +1 -1
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +5 -5
- package/cjs/sync/polling/fetchers/segmentChangesFetcher.js +1 -1
- package/cjs/sync/polling/fetchers/splitChangesFetcher.js +24 -15
- package/cjs/sync/polling/pollingManagerCS.js +18 -18
- package/cjs/sync/polling/pollingManagerSS.js +13 -13
- package/cjs/sync/polling/syncTasks/definitionsSyncTask.js +12 -0
- package/cjs/sync/polling/updaters/{splitChangesUpdater.js → definitionChangesUpdater.js} +72 -64
- package/cjs/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/cjs/sync/polling/updaters/segmentChangesUpdater.js +6 -6
- package/cjs/sync/streaming/SSEClient/index.js +2 -2
- package/cjs/sync/streaming/SSEHandler/NotificationKeeper.js +1 -1
- package/cjs/sync/streaming/SSEHandler/index.js +1 -1
- package/cjs/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +18 -18
- package/cjs/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +2 -2
- package/cjs/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -2
- package/cjs/sync/streaming/constants.js +3 -3
- package/cjs/sync/streaming/parseUtils.js +12 -12
- package/cjs/sync/streaming/pushManager.js +14 -14
- package/cjs/sync/submitters/impressionsSubmitter.js +6 -6
- package/cjs/sync/submitters/submitter.js +1 -1
- package/cjs/sync/submitters/telemetrySubmitter.js +1 -2
- package/cjs/sync/syncManagerOnline.js +9 -6
- package/cjs/trackers/eventTracker.js +10 -12
- package/cjs/trackers/impressionObserver/buildKey.js +1 -1
- package/cjs/trackers/impressionsTracker.js +37 -20
- package/cjs/trackers/uniqueKeysTracker.js +1 -1
- package/cjs/utils/Backoff.js +20 -0
- package/cjs/utils/EventEmitter.js +391 -0
- package/cjs/utils/filter/bloomFilter.js +37 -0
- package/cjs/utils/inputValidation/apiKey.js +1 -1
- package/cjs/utils/inputValidation/attribute.js +2 -2
- package/cjs/utils/inputValidation/{split.js → definition.js} +10 -10
- package/cjs/utils/inputValidation/{splitExistence.js → definitionExistence.js} +6 -6
- package/cjs/utils/inputValidation/definitions.js +25 -0
- package/cjs/utils/inputValidation/eventProperties.js +1 -1
- package/cjs/utils/inputValidation/index.js +7 -7
- package/cjs/utils/inputValidation/isOperational.js +4 -4
- package/cjs/utils/inputValidation/target.js +22 -0
- package/cjs/utils/labels/index.js +3 -3
- package/cjs/utils/lang/index.js +1 -1
- package/cjs/utils/lang/sets.js +4 -4
- package/cjs/utils/promise/timeout.js +1 -1
- package/cjs/utils/settingsValidation/splitFilters.js +4 -4
- package/cjs/utils/settingsValidation/url.js +6 -6
- package/esm/evaluator/condition/engineUtils.js +2 -2
- package/esm/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.js +64 -0
- package/esm/evaluator/fallbackConfigsCalculator/index.js +21 -0
- package/esm/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.js +5 -8
- package/esm/evaluator/fallbackTreatmentsCalculator/index.js +21 -33
- package/esm/evaluator/index.js +72 -48
- package/esm/evaluator/matchers/whitelist.js +1 -1
- package/esm/integrations/pluggable.js +1 -1
- package/esm/listeners/browser.js +4 -3
- package/esm/listeners/node.js +4 -4
- package/esm/logger/constants.js +12 -18
- package/esm/logger/index.js +1 -1
- package/esm/logger/messages/debug.js +5 -6
- package/esm/logger/messages/error.js +3 -3
- package/esm/logger/messages/info.js +1 -3
- package/esm/logger/messages/warn.js +8 -9
- package/esm/platform/browser.js +12 -0
- package/esm/platform/getEventSource/browser.js +4 -0
- package/esm/platform/getEventSource/eventsource.js +480 -0
- package/esm/platform/getEventSource/node.js +20 -0
- package/esm/platform/getFetch/browser.js +5 -0
- package/esm/platform/getFetch/node.js +22 -0
- package/esm/platform/getOptions/node.js +20 -0
- package/esm/platform/node.js +14 -0
- package/esm/readiness/constants.js +4 -3
- package/esm/readiness/readinessManager.js +23 -23
- package/esm/readiness/sdkReadinessManager.js +1 -17
- package/esm/sdkClient/client.js +10 -37
- package/esm/sdkClient/clientAttributesDecoration.js +3 -3
- package/esm/sdkClient/clientInputValidation.js +40 -83
- package/esm/sdkClient/identity.js +1 -1
- package/esm/sdkClient/sdkClient.js +4 -49
- package/esm/sdkClient/sdkLifecycle.js +67 -0
- package/esm/sdkClient/trackMethod.js +52 -0
- package/esm/sdkFactory/index.js +14 -51
- package/esm/sdkManager/index.js +6 -6
- package/esm/services/authProvider.js +63 -0
- package/esm/services/secureSplitHttpClient.js +35 -0
- package/esm/services/splitApi.js +24 -14
- package/esm/services/splitHttpClient.js +1 -1
- package/esm/storages/AbstractDefinitionsCacheAsync.js +48 -0
- package/esm/storages/AbstractDefinitionsCacheSync.js +71 -0
- package/esm/storages/KeyBuilder.js +16 -16
- package/esm/storages/KeyBuilderCS.js +16 -16
- package/esm/storages/KeyBuilderSS.js +15 -15
- package/esm/storages/getRolloutPlan.js +4 -4
- package/esm/storages/inLocalStorage/DefinitionsCacheInLocal.js +191 -0
- package/esm/storages/inLocalStorage/RBSegmentsCacheInLocal.js +7 -7
- package/esm/storages/inLocalStorage/index.js +6 -6
- package/esm/storages/inLocalStorage/validateCache.js +3 -3
- package/esm/storages/inMemory/DefinitionsCacheInMemory.js +118 -0
- package/esm/storages/inMemory/ImpressionCountsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/InMemoryStorage.js +4 -4
- package/esm/storages/inMemory/InMemoryStorageCS.js +5 -5
- package/esm/storages/inMemory/RBSegmentsCacheInMemory.js +2 -2
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +1 -1
- package/esm/storages/inMemory/TelemetryCacheInMemory.js +5 -5
- package/esm/storages/inRedis/DefinitionsCacheInRedis.js +240 -0
- package/esm/storages/inRedis/EventsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/ImpressionCountsCacheInRedis.js +4 -4
- package/esm/storages/inRedis/RBSegmentsCacheInRedis.js +1 -1
- package/esm/storages/inRedis/RedisAdapter.js +7 -7
- package/esm/storages/inRedis/TelemetryCacheInRedis.js +7 -7
- package/esm/storages/inRedis/UniqueKeysCacheInRedis.js +1 -1
- package/esm/storages/inRedis/index.js +2 -2
- package/esm/storages/pluggable/DefinitionsCachePluggable.js +209 -0
- package/esm/storages/pluggable/EventsCachePluggable.js +1 -1
- package/esm/storages/pluggable/ImpressionCountsCachePluggable.js +5 -5
- package/esm/storages/pluggable/RBSegmentsCachePluggable.js +1 -1
- package/esm/storages/pluggable/TelemetryCachePluggable.js +7 -7
- package/esm/storages/pluggable/UniqueKeysCachePluggable.js +1 -1
- package/esm/storages/pluggable/index.js +4 -4
- package/esm/storages/pluggable/wrapperAdapter.js +1 -1
- package/esm/storages/setRolloutPlan.js +6 -6
- package/esm/storages/utils.js +6 -6
- package/esm/sync/offline/splitsParser/parseCondition.js +1 -1
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +6 -6
- package/esm/sync/polling/fetchers/splitChangesFetcher.js +25 -16
- package/esm/sync/polling/pollingManagerCS.js +15 -15
- package/esm/sync/polling/pollingManagerSS.js +13 -13
- package/esm/sync/polling/syncTasks/definitionsSyncTask.js +8 -0
- package/esm/sync/polling/updaters/definitionChangesUpdater.js +200 -0
- package/esm/sync/polling/updaters/mySegmentsUpdater.js +3 -3
- package/esm/sync/polling/updaters/segmentChangesUpdater.js +7 -7
- package/esm/sync/streaming/SSEClient/index.js +2 -2
- package/esm/sync/streaming/SSEHandler/NotificationKeeper.js +2 -2
- package/esm/sync/streaming/SSEHandler/index.js +2 -2
- package/esm/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.js → DefinitionsUpdateWorker.js} +17 -17
- package/esm/sync/streaming/UpdateWorkers/MySegmentsUpdateWorker.js +2 -2
- package/esm/sync/streaming/UpdateWorkers/SegmentsUpdateWorker.js +2 -2
- package/esm/sync/streaming/constants.js +2 -2
- package/esm/sync/streaming/parseUtils.js +10 -10
- package/esm/sync/streaming/pushManager.js +16 -16
- package/esm/sync/submitters/impressionsSubmitter.js +6 -6
- package/esm/sync/submitters/submitter.js +1 -1
- package/esm/sync/submitters/telemetrySubmitter.js +1 -2
- package/esm/sync/syncManagerOnline.js +8 -5
- package/esm/trackers/eventTracker.js +10 -12
- package/esm/trackers/impressionObserver/buildKey.js +1 -1
- package/esm/trackers/impressionsTracker.js +38 -21
- package/esm/trackers/uniqueKeysTracker.js +1 -1
- package/esm/utils/Backoff.js +20 -0
- package/esm/utils/EventEmitter.js +387 -0
- package/esm/utils/filter/bloomFilter.js +33 -0
- package/esm/utils/inputValidation/apiKey.js +1 -1
- package/esm/utils/inputValidation/attribute.js +2 -2
- package/esm/utils/inputValidation/{split.js → definition.js} +8 -8
- package/esm/utils/inputValidation/definitionExistence.js +15 -0
- package/esm/utils/inputValidation/definitions.js +21 -0
- package/esm/utils/inputValidation/index.js +3 -3
- package/esm/utils/inputValidation/isOperational.js +4 -4
- package/esm/utils/inputValidation/target.js +18 -0
- package/esm/utils/labels/index.js +2 -2
- package/esm/utils/lang/sets.js +4 -4
- package/esm/utils/promise/timeout.js +1 -1
- package/esm/utils/settingsValidation/splitFilters.js +4 -4
- package/esm/utils/settingsValidation/url.js +6 -6
- package/package.json +15 -6
- package/src/dtos/types.ts +65 -70
- package/src/evaluator/Engine.ts +4 -4
- package/src/evaluator/combiners/and.ts +3 -3
- package/src/evaluator/combiners/ifelseif.ts +2 -2
- package/src/evaluator/condition/engineUtils.ts +2 -2
- package/src/evaluator/condition/index.ts +3 -3
- package/src/evaluator/fallbackConfigsCalculator/fallbackSanitizer/index.ts +76 -0
- package/src/evaluator/fallbackConfigsCalculator/index.ts +24 -0
- package/src/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.ts +5 -7
- package/src/evaluator/fallbackTreatmentsCalculator/index.ts +27 -41
- package/src/evaluator/index.ts +86 -51
- package/src/evaluator/matchers/dependency.ts +2 -2
- package/src/evaluator/matchers/matcherTypes.ts +2 -2
- package/src/evaluator/matchers/prerequisites.ts +4 -4
- package/src/evaluator/matchers/rbsegment.ts +2 -2
- package/src/evaluator/matchers/whitelist.ts +2 -2
- package/src/evaluator/matchersTransform/index.ts +2 -2
- package/src/evaluator/matchersTransform/whitelist.ts +2 -2
- package/src/evaluator/parser/index.ts +4 -4
- package/src/evaluator/treatments/index.ts +2 -2
- package/src/evaluator/types.ts +6 -6
- package/src/evaluator/value/index.ts +1 -1
- package/src/integrations/pluggable.ts +1 -1
- package/src/listeners/browser.ts +11 -8
- package/src/listeners/node.ts +2 -5
- package/src/logger/constants.ts +12 -18
- package/src/logger/messages/debug.ts +5 -6
- package/src/logger/messages/error.ts +3 -3
- package/src/logger/messages/info.ts +1 -3
- package/src/logger/messages/warn.ts +8 -9
- package/src/platform/browser.ts +14 -0
- package/src/platform/getEventSource/browser.ts +4 -0
- package/src/platform/getEventSource/eventsource.js +519 -0
- package/src/platform/getEventSource/node.ts +23 -0
- package/src/platform/getFetch/browser.ts +5 -0
- package/src/platform/getFetch/node.ts +27 -0
- package/src/platform/getOptions/node.ts +24 -0
- package/src/platform/node.ts +16 -0
- package/src/readiness/constants.ts +4 -3
- package/src/readiness/readinessManager.ts +22 -22
- package/src/readiness/sdkReadinessManager.ts +1 -16
- package/src/readiness/types.ts +10 -16
- package/src/sdkClient/client.ts +11 -41
- package/src/sdkClient/clientInputValidation.ts +44 -84
- package/src/sdkClient/sdkClient.ts +5 -54
- package/src/sdkClient/sdkLifecycle.ts +79 -0
- package/src/sdkClient/trackMethod.ts +59 -0
- package/src/sdkFactory/index.ts +15 -59
- package/src/sdkFactory/types.ts +19 -16
- package/src/sdkManager/index.ts +15 -15
- package/src/services/authProvider.ts +86 -0
- package/src/services/secureSplitHttpClient.ts +44 -0
- package/src/services/splitApi.ts +14 -2
- package/src/services/types.ts +7 -2
- package/src/storages/AbstractDefinitionsCacheAsync.ts +63 -0
- package/src/storages/AbstractDefinitionsCacheSync.ts +95 -0
- package/src/storages/KeyBuilder.ts +6 -6
- package/src/storages/KeyBuilderCS.ts +6 -6
- package/src/storages/KeyBuilderSS.ts +2 -2
- package/src/storages/getRolloutPlan.ts +3 -3
- package/src/storages/inLocalStorage/DefinitionsCacheInLocal.ts +234 -0
- package/src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts +8 -8
- package/src/storages/inLocalStorage/index.ts +6 -6
- package/src/storages/inLocalStorage/validateCache.ts +4 -4
- package/src/storages/inMemory/DefinitionsCacheInMemory.ts +130 -0
- package/src/storages/inMemory/InMemoryStorage.ts +4 -4
- package/src/storages/inMemory/InMemoryStorageCS.ts +5 -5
- package/src/storages/inMemory/RBSegmentsCacheInMemory.ts +3 -3
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +1 -1
- package/src/storages/inMemory/TelemetryCacheInMemory.ts +5 -5
- package/src/storages/inRedis/{SplitsCacheInRedis.ts → DefinitionsCacheInRedis.ts} +69 -69
- package/src/storages/inRedis/RBSegmentsCacheInRedis.ts +2 -2
- package/src/storages/inRedis/index.ts +2 -2
- package/src/storages/pluggable/DefinitionsCachePluggable.ts +230 -0
- package/src/storages/pluggable/RBSegmentsCachePluggable.ts +2 -2
- package/src/storages/pluggable/index.ts +2 -2
- package/src/storages/setRolloutPlan.ts +7 -7
- package/src/storages/types.ts +34 -29
- package/src/sync/offline/splitsParser/parseCondition.ts +2 -2
- package/src/sync/offline/splitsParser/splitsParserFromSettings.ts +3 -3
- package/src/sync/offline/splitsParser/types.ts +6 -3
- package/src/sync/offline/syncManagerOffline.ts +2 -2
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +14 -14
- package/src/sync/polling/fetchers/splitChangesFetcher.ts +58 -23
- package/src/sync/polling/fetchers/types.ts +5 -3
- package/src/sync/polling/pollingManagerCS.ts +16 -14
- package/src/sync/polling/pollingManagerSS.ts +15 -13
- package/src/sync/polling/syncTasks/{splitsSyncTask.ts → definitionsSyncTask.ts} +11 -12
- package/src/sync/polling/types.ts +3 -3
- package/src/sync/polling/updaters/definitionChangesUpdater.ts +239 -0
- package/src/sync/polling/updaters/mySegmentsUpdater.ts +3 -3
- package/src/sync/polling/updaters/segmentChangesUpdater.ts +7 -7
- package/src/sync/streaming/AuthClient/index.ts +2 -2
- package/src/sync/streaming/AuthClient/types.ts +14 -11
- package/src/sync/streaming/SSEClient/index.ts +2 -2
- package/src/sync/streaming/SSEClient/types.ts +2 -2
- package/src/sync/streaming/SSEHandler/NotificationKeeper.ts +2 -2
- package/src/sync/streaming/SSEHandler/index.ts +2 -2
- package/src/sync/streaming/UpdateWorkers/{SplitsUpdateWorker.ts → DefinitionsUpdateWorker.ts} +21 -21
- package/src/sync/streaming/constants.ts +2 -2
- package/src/sync/streaming/parseUtils.ts +12 -12
- package/src/sync/streaming/pushManager.ts +18 -18
- package/src/sync/streaming/types.ts +2 -2
- package/src/sync/submitters/impressionsSubmitter.ts +9 -9
- package/src/sync/submitters/telemetrySubmitter.ts +1 -2
- package/src/sync/submitters/types.ts +3 -0
- package/src/sync/syncManagerOnline.ts +9 -5
- package/src/trackers/eventTracker.ts +7 -10
- package/src/trackers/impressionsTracker.ts +42 -26
- package/src/trackers/types.ts +3 -1
- package/src/utils/Backoff.ts +21 -0
- package/src/utils/EventEmitter.js +444 -0
- package/src/utils/filter/bloomFilter.ts +38 -0
- package/src/utils/inputValidation/definition.ts +27 -0
- package/src/utils/inputValidation/definitionExistence.ts +19 -0
- package/src/utils/inputValidation/definitions.ts +21 -0
- package/src/utils/inputValidation/index.ts +3 -3
- package/src/utils/inputValidation/isOperational.ts +4 -4
- package/src/utils/inputValidation/target.ts +21 -0
- package/src/utils/inputValidation/trafficTypeExistence.ts +2 -2
- package/src/utils/jwt/types.ts +1 -1
- package/src/utils/labels/index.ts +2 -2
- package/src/utils/lang/sets.ts +4 -2
- package/src/utils/settingsValidation/splitFilters.ts +3 -3
- package/src/utils/settingsValidation/url.ts +1 -1
- package/types/splitio.d.ts +222 -11
- package/cjs/storages/AbstractSplitsCacheAsync.js +0 -51
- package/cjs/storages/AbstractSplitsCacheSync.js +0 -76
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +0 -194
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +0 -121
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +0 -243
- package/cjs/storages/pluggable/SplitsCachePluggable.js +0 -212
- package/cjs/sync/polling/syncTasks/splitsSyncTask.js +0 -13
- package/cjs/utils/inputValidation/splits.js +0 -25
- package/esm/storages/AbstractSplitsCacheAsync.js +0 -48
- package/esm/storages/AbstractSplitsCacheSync.js +0 -71
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +0 -191
- package/esm/storages/inMemory/SplitsCacheInMemory.js +0 -118
- package/esm/storages/inRedis/SplitsCacheInRedis.js +0 -240
- package/esm/storages/pluggable/SplitsCachePluggable.js +0 -209
- package/esm/sync/polling/syncTasks/splitsSyncTask.js +0 -9
- package/esm/sync/polling/updaters/splitChangesUpdater.js +0 -192
- package/esm/utils/inputValidation/splitExistence.js +0 -15
- package/esm/utils/inputValidation/splits.js +0 -21
- package/src/storages/AbstractSplitsCacheAsync.ts +0 -63
- package/src/storages/AbstractSplitsCacheSync.ts +0 -95
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +0 -234
- package/src/storages/inMemory/SplitsCacheInMemory.ts +0 -130
- package/src/storages/pluggable/SplitsCachePluggable.ts +0 -230
- package/src/sync/polling/updaters/splitChangesUpdater.ts +0 -230
- package/src/utils/inputValidation/split.ts +0 -27
- package/src/utils/inputValidation/splitExistence.ts +0 -19
- package/src/utils/inputValidation/splits.ts +0 -21
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SplitsCacheInLocal = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
|
-
var lang_1 = require("../../utils/lang");
|
|
7
|
-
var constants_1 = require("./constants");
|
|
8
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
9
|
-
var SplitsCacheInLocal = /** @class */ (function (_super) {
|
|
10
|
-
(0, tslib_1.__extends)(SplitsCacheInLocal, _super);
|
|
11
|
-
function SplitsCacheInLocal(settings, keys, storage) {
|
|
12
|
-
var _this = _super.call(this) || this;
|
|
13
|
-
_this.keys = keys;
|
|
14
|
-
_this.log = settings.log;
|
|
15
|
-
_this.flagSetsFilter = settings.sync.__splitFiltersValidation.groupedFilters.bySet;
|
|
16
|
-
_this.storage = storage;
|
|
17
|
-
return _this;
|
|
18
|
-
}
|
|
19
|
-
SplitsCacheInLocal.prototype._decrementCount = function (key) {
|
|
20
|
-
var count = (0, lang_1.toNumber)(this.storage.getItem(key)) - 1;
|
|
21
|
-
if (count > 0)
|
|
22
|
-
this.storage.setItem(key, count + '');
|
|
23
|
-
else
|
|
24
|
-
this.storage.removeItem(key);
|
|
25
|
-
};
|
|
26
|
-
SplitsCacheInLocal.prototype._decrementCounts = function (split) {
|
|
27
|
-
try {
|
|
28
|
-
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
29
|
-
this._decrementCount(ttKey);
|
|
30
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
|
|
31
|
-
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
32
|
-
this._decrementCount(segmentsCountKey);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
this.log.error(constants_1.LOG_PREFIX + e);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
SplitsCacheInLocal.prototype._incrementCounts = function (split) {
|
|
40
|
-
try {
|
|
41
|
-
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
42
|
-
this.storage.setItem(ttKey, ((0, lang_1.toNumber)(this.storage.getItem(ttKey)) + 1) + '');
|
|
43
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split)) {
|
|
44
|
-
var segmentsCountKey = this.keys.buildSplitsWithSegmentCountKey();
|
|
45
|
-
this.storage.setItem(segmentsCountKey, ((0, lang_1.toNumber)(this.storage.getItem(segmentsCountKey)) + 1) + '');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch (e) {
|
|
49
|
-
this.log.error(constants_1.LOG_PREFIX + e);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Removes all splits cache related data from localStorage (splits, counters, changeNumber and lastUpdated).
|
|
54
|
-
* We cannot simply call `localStorage.clear()` since that implies removing user items from the storage.
|
|
55
|
-
*/
|
|
56
|
-
SplitsCacheInLocal.prototype.clear = function () {
|
|
57
|
-
var _this = this;
|
|
58
|
-
// collect item keys
|
|
59
|
-
var len = this.storage.length;
|
|
60
|
-
var accum = [];
|
|
61
|
-
for (var cur = 0; cur < len; cur++) {
|
|
62
|
-
var key = this.storage.key(cur);
|
|
63
|
-
if (key != null && this.keys.isSplitsCacheKey(key))
|
|
64
|
-
accum.push(key);
|
|
65
|
-
}
|
|
66
|
-
// remove items
|
|
67
|
-
accum.forEach(function (key) {
|
|
68
|
-
_this.storage.removeItem(key);
|
|
69
|
-
});
|
|
70
|
-
this.hasSync = false;
|
|
71
|
-
};
|
|
72
|
-
SplitsCacheInLocal.prototype.addSplit = function (split) {
|
|
73
|
-
var name = split.name;
|
|
74
|
-
var splitKey = this.keys.buildSplitKey(name);
|
|
75
|
-
var splitFromStorage = this.storage.getItem(splitKey);
|
|
76
|
-
var previousSplit = splitFromStorage ? JSON.parse(splitFromStorage) : null;
|
|
77
|
-
if (previousSplit) {
|
|
78
|
-
this._decrementCounts(previousSplit);
|
|
79
|
-
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
80
|
-
}
|
|
81
|
-
this.storage.setItem(splitKey, JSON.stringify(split));
|
|
82
|
-
this._incrementCounts(split);
|
|
83
|
-
this.addToFlagSets(split);
|
|
84
|
-
return true;
|
|
85
|
-
};
|
|
86
|
-
SplitsCacheInLocal.prototype.removeSplit = function (name) {
|
|
87
|
-
var split = this.getSplit(name);
|
|
88
|
-
if (!split)
|
|
89
|
-
return false;
|
|
90
|
-
this.storage.removeItem(this.keys.buildSplitKey(name));
|
|
91
|
-
this._decrementCounts(split);
|
|
92
|
-
this.removeFromFlagSets(split.name, split.sets);
|
|
93
|
-
return true;
|
|
94
|
-
};
|
|
95
|
-
SplitsCacheInLocal.prototype.getSplit = function (name) {
|
|
96
|
-
var item = this.storage.getItem(this.keys.buildSplitKey(name));
|
|
97
|
-
return item && JSON.parse(item);
|
|
98
|
-
};
|
|
99
|
-
SplitsCacheInLocal.prototype.setChangeNumber = function (changeNumber) {
|
|
100
|
-
try {
|
|
101
|
-
this.storage.setItem(this.keys.buildSplitsTillKey(), changeNumber + '');
|
|
102
|
-
// update "last updated" timestamp with current time
|
|
103
|
-
this.storage.setItem(this.keys.buildLastUpdatedKey(), Date.now() + '');
|
|
104
|
-
this.hasSync = true;
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
catch (e) {
|
|
108
|
-
this.log.error(constants_1.LOG_PREFIX + e);
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
SplitsCacheInLocal.prototype.getChangeNumber = function () {
|
|
113
|
-
var n = -1;
|
|
114
|
-
var value = this.storage.getItem(this.keys.buildSplitsTillKey());
|
|
115
|
-
if (value !== null) {
|
|
116
|
-
value = parseInt(value, 10);
|
|
117
|
-
return (0, lang_1.isNaNNumber)(value) ? n : value;
|
|
118
|
-
}
|
|
119
|
-
return n;
|
|
120
|
-
};
|
|
121
|
-
SplitsCacheInLocal.prototype.getSplitNames = function () {
|
|
122
|
-
var len = this.storage.length;
|
|
123
|
-
var accum = [];
|
|
124
|
-
var cur = 0;
|
|
125
|
-
while (cur < len) {
|
|
126
|
-
var key = this.storage.key(cur);
|
|
127
|
-
if (key != null && this.keys.isSplitKey(key))
|
|
128
|
-
accum.push(this.keys.extractKey(key));
|
|
129
|
-
cur++;
|
|
130
|
-
}
|
|
131
|
-
return accum;
|
|
132
|
-
};
|
|
133
|
-
SplitsCacheInLocal.prototype.trafficTypeExists = function (trafficType) {
|
|
134
|
-
var ttCount = (0, lang_1.toNumber)(this.storage.getItem(this.keys.buildTrafficTypeKey(trafficType)));
|
|
135
|
-
return (0, lang_1.isFiniteNumber)(ttCount) && ttCount > 0;
|
|
136
|
-
};
|
|
137
|
-
SplitsCacheInLocal.prototype.usesSegments = function () {
|
|
138
|
-
// If cache hasn't been synchronized with the cloud, assume we need them.
|
|
139
|
-
if (!this.hasSync)
|
|
140
|
-
return true;
|
|
141
|
-
var storedCount = this.storage.getItem(this.keys.buildSplitsWithSegmentCountKey());
|
|
142
|
-
var splitsWithSegmentsCount = storedCount === null ? 0 : (0, lang_1.toNumber)(storedCount);
|
|
143
|
-
return (0, lang_1.isFiniteNumber)(splitsWithSegmentsCount) ?
|
|
144
|
-
splitsWithSegmentsCount > 0 :
|
|
145
|
-
true;
|
|
146
|
-
};
|
|
147
|
-
SplitsCacheInLocal.prototype.getNamesByFlagSets = function (flagSets) {
|
|
148
|
-
var _this = this;
|
|
149
|
-
return flagSets.map(function (flagSet) {
|
|
150
|
-
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
151
|
-
var flagSetFromStorage = _this.storage.getItem(flagSetKey);
|
|
152
|
-
return new Set(flagSetFromStorage ? JSON.parse(flagSetFromStorage) : []);
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
SplitsCacheInLocal.prototype.addToFlagSets = function (featureFlag) {
|
|
156
|
-
var _this = this;
|
|
157
|
-
if (!featureFlag.sets)
|
|
158
|
-
return;
|
|
159
|
-
featureFlag.sets.forEach(function (featureFlagSet) {
|
|
160
|
-
if (_this.flagSetsFilter.length > 0 && !_this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === featureFlagSet; }))
|
|
161
|
-
return;
|
|
162
|
-
var flagSetKey = _this.keys.buildFlagSetKey(featureFlagSet);
|
|
163
|
-
var flagSetFromStorage = _this.storage.getItem(flagSetKey);
|
|
164
|
-
var flagSetCache = new Set(flagSetFromStorage ? JSON.parse(flagSetFromStorage) : []);
|
|
165
|
-
if (flagSetCache.has(featureFlag.name))
|
|
166
|
-
return;
|
|
167
|
-
flagSetCache.add(featureFlag.name);
|
|
168
|
-
_this.storage.setItem(flagSetKey, JSON.stringify((0, sets_1.setToArray)(flagSetCache)));
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
SplitsCacheInLocal.prototype.removeFromFlagSets = function (featureFlagName, flagSets) {
|
|
172
|
-
var _this = this;
|
|
173
|
-
if (!flagSets)
|
|
174
|
-
return;
|
|
175
|
-
flagSets.forEach(function (flagSet) {
|
|
176
|
-
_this.removeNames(flagSet, featureFlagName);
|
|
177
|
-
});
|
|
178
|
-
};
|
|
179
|
-
SplitsCacheInLocal.prototype.removeNames = function (flagSetName, featureFlagName) {
|
|
180
|
-
var flagSetKey = this.keys.buildFlagSetKey(flagSetName);
|
|
181
|
-
var flagSetFromStorage = this.storage.getItem(flagSetKey);
|
|
182
|
-
if (!flagSetFromStorage)
|
|
183
|
-
return;
|
|
184
|
-
var flagSetCache = new Set(JSON.parse(flagSetFromStorage));
|
|
185
|
-
flagSetCache.delete(featureFlagName);
|
|
186
|
-
if (flagSetCache.size === 0) {
|
|
187
|
-
this.storage.removeItem(flagSetKey);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
this.storage.setItem(flagSetKey, JSON.stringify((0, sets_1.setToArray)(flagSetCache)));
|
|
191
|
-
};
|
|
192
|
-
return SplitsCacheInLocal;
|
|
193
|
-
}(AbstractSplitsCacheSync_1.AbstractSplitsCacheSync));
|
|
194
|
-
exports.SplitsCacheInLocal = SplitsCacheInLocal;
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SplitsCacheInMemory = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var AbstractSplitsCacheSync_1 = require("../AbstractSplitsCacheSync");
|
|
6
|
-
var lang_1 = require("../../utils/lang");
|
|
7
|
-
/**
|
|
8
|
-
* Default ISplitsCacheSync implementation that stores split definitions in memory.
|
|
9
|
-
*/
|
|
10
|
-
var SplitsCacheInMemory = /** @class */ (function (_super) {
|
|
11
|
-
(0, tslib_1.__extends)(SplitsCacheInMemory, _super);
|
|
12
|
-
function SplitsCacheInMemory(splitFiltersValidation) {
|
|
13
|
-
var _this = _super.call(this) || this;
|
|
14
|
-
_this.splitsCache = {};
|
|
15
|
-
_this.ttCache = {};
|
|
16
|
-
_this.changeNumber = -1;
|
|
17
|
-
_this.segmentsCount = 0;
|
|
18
|
-
_this.flagSetsCache = {};
|
|
19
|
-
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
20
|
-
return _this;
|
|
21
|
-
}
|
|
22
|
-
SplitsCacheInMemory.prototype.clear = function () {
|
|
23
|
-
this.splitsCache = {};
|
|
24
|
-
this.ttCache = {};
|
|
25
|
-
this.changeNumber = -1;
|
|
26
|
-
this.segmentsCount = 0;
|
|
27
|
-
this.flagSetsCache = {};
|
|
28
|
-
};
|
|
29
|
-
SplitsCacheInMemory.prototype.addSplit = function (split) {
|
|
30
|
-
var name = split.name;
|
|
31
|
-
var previousSplit = this.getSplit(name);
|
|
32
|
-
if (previousSplit) { // We had this Split already
|
|
33
|
-
var previousTtName = previousSplit.trafficTypeName;
|
|
34
|
-
this.ttCache[previousTtName]--;
|
|
35
|
-
if (!this.ttCache[previousTtName])
|
|
36
|
-
delete this.ttCache[previousTtName];
|
|
37
|
-
this.removeFromFlagSets(previousSplit.name, previousSplit.sets);
|
|
38
|
-
// Subtract from segments count for the previous version of this Split
|
|
39
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(previousSplit))
|
|
40
|
-
this.segmentsCount--;
|
|
41
|
-
}
|
|
42
|
-
// Store the Split.
|
|
43
|
-
this.splitsCache[name] = split;
|
|
44
|
-
// Update TT cache
|
|
45
|
-
var ttName = split.trafficTypeName;
|
|
46
|
-
this.ttCache[ttName] = (this.ttCache[ttName] || 0) + 1;
|
|
47
|
-
this.addToFlagSets(split);
|
|
48
|
-
// Add to segments count for the new version of the Split
|
|
49
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
50
|
-
this.segmentsCount++;
|
|
51
|
-
return true;
|
|
52
|
-
};
|
|
53
|
-
SplitsCacheInMemory.prototype.removeSplit = function (name) {
|
|
54
|
-
var split = this.getSplit(name);
|
|
55
|
-
if (!split)
|
|
56
|
-
return false;
|
|
57
|
-
// Delete the Split
|
|
58
|
-
delete this.splitsCache[name];
|
|
59
|
-
var ttName = split.trafficTypeName;
|
|
60
|
-
this.ttCache[ttName]--; // Update tt cache
|
|
61
|
-
if (!this.ttCache[ttName])
|
|
62
|
-
delete this.ttCache[ttName];
|
|
63
|
-
this.removeFromFlagSets(split.name, split.sets);
|
|
64
|
-
// Update the segments count.
|
|
65
|
-
if ((0, AbstractSplitsCacheSync_1.usesSegments)(split))
|
|
66
|
-
this.segmentsCount--;
|
|
67
|
-
return true;
|
|
68
|
-
};
|
|
69
|
-
SplitsCacheInMemory.prototype.getSplit = function (name) {
|
|
70
|
-
return this.splitsCache[name] || null;
|
|
71
|
-
};
|
|
72
|
-
SplitsCacheInMemory.prototype.setChangeNumber = function (changeNumber) {
|
|
73
|
-
this.changeNumber = changeNumber;
|
|
74
|
-
return true;
|
|
75
|
-
};
|
|
76
|
-
SplitsCacheInMemory.prototype.getChangeNumber = function () {
|
|
77
|
-
return this.changeNumber;
|
|
78
|
-
};
|
|
79
|
-
SplitsCacheInMemory.prototype.getSplitNames = function () {
|
|
80
|
-
return Object.keys(this.splitsCache);
|
|
81
|
-
};
|
|
82
|
-
SplitsCacheInMemory.prototype.trafficTypeExists = function (trafficType) {
|
|
83
|
-
return (0, lang_1.isFiniteNumber)(this.ttCache[trafficType]) && this.ttCache[trafficType] > 0;
|
|
84
|
-
};
|
|
85
|
-
SplitsCacheInMemory.prototype.usesSegments = function () {
|
|
86
|
-
return this.getChangeNumber() === -1 || this.segmentsCount > 0;
|
|
87
|
-
};
|
|
88
|
-
SplitsCacheInMemory.prototype.getNamesByFlagSets = function (flagSets) {
|
|
89
|
-
var _this = this;
|
|
90
|
-
return flagSets.map(function (flagSet) { return _this.flagSetsCache[flagSet] || new Set(); });
|
|
91
|
-
};
|
|
92
|
-
SplitsCacheInMemory.prototype.addToFlagSets = function (featureFlag) {
|
|
93
|
-
var _this = this;
|
|
94
|
-
if (!featureFlag.sets)
|
|
95
|
-
return;
|
|
96
|
-
featureFlag.sets.forEach(function (featureFlagSet) {
|
|
97
|
-
if (_this.flagSetsFilter.length > 0 && !_this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === featureFlagSet; }))
|
|
98
|
-
return;
|
|
99
|
-
if (!_this.flagSetsCache[featureFlagSet])
|
|
100
|
-
_this.flagSetsCache[featureFlagSet] = new Set([]);
|
|
101
|
-
_this.flagSetsCache[featureFlagSet].add(featureFlag.name);
|
|
102
|
-
});
|
|
103
|
-
};
|
|
104
|
-
SplitsCacheInMemory.prototype.removeFromFlagSets = function (featureFlagName, flagSets) {
|
|
105
|
-
var _this = this;
|
|
106
|
-
if (!flagSets)
|
|
107
|
-
return;
|
|
108
|
-
flagSets.forEach(function (flagSet) {
|
|
109
|
-
_this.removeNames(flagSet, featureFlagName);
|
|
110
|
-
});
|
|
111
|
-
};
|
|
112
|
-
SplitsCacheInMemory.prototype.removeNames = function (flagSetName, featureFlagName) {
|
|
113
|
-
if (!this.flagSetsCache[flagSetName])
|
|
114
|
-
return;
|
|
115
|
-
this.flagSetsCache[flagSetName].delete(featureFlagName);
|
|
116
|
-
if (this.flagSetsCache[flagSetName].size === 0)
|
|
117
|
-
delete this.flagSetsCache[flagSetName];
|
|
118
|
-
};
|
|
119
|
-
return SplitsCacheInMemory;
|
|
120
|
-
}(AbstractSplitsCacheSync_1.AbstractSplitsCacheSync));
|
|
121
|
-
exports.SplitsCacheInMemory = SplitsCacheInMemory;
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SplitsCacheInRedis = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var lang_1 = require("../../utils/lang");
|
|
6
|
-
var constants_1 = require("./constants");
|
|
7
|
-
var AbstractSplitsCacheAsync_1 = require("../AbstractSplitsCacheAsync");
|
|
8
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
9
|
-
/**
|
|
10
|
-
* Discard errors for an answer of multiple operations.
|
|
11
|
-
*/
|
|
12
|
-
function processPipelineAnswer(results) {
|
|
13
|
-
return results ? results.reduce(function (accum, errValuePair) {
|
|
14
|
-
if (errValuePair[0] === null)
|
|
15
|
-
accum.push(errValuePair[1]);
|
|
16
|
-
return accum;
|
|
17
|
-
}, []) : [];
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* ISplitsCacheAsync implementation that stores split definitions in Redis.
|
|
21
|
-
* Supported by Node.js
|
|
22
|
-
*/
|
|
23
|
-
var SplitsCacheInRedis = /** @class */ (function (_super) {
|
|
24
|
-
(0, tslib_1.__extends)(SplitsCacheInRedis, _super);
|
|
25
|
-
function SplitsCacheInRedis(log, keys, redis, splitFiltersValidation) {
|
|
26
|
-
var _this = _super.call(this) || this;
|
|
27
|
-
_this.log = log;
|
|
28
|
-
_this.redis = redis;
|
|
29
|
-
_this.keys = keys;
|
|
30
|
-
_this.flagSetsFilter = splitFiltersValidation ? splitFiltersValidation.groupedFilters.bySet : [];
|
|
31
|
-
// There is no need to listen for redis 'error' event, because in that case ioredis calls will be rejected and handled by redis storage adapters.
|
|
32
|
-
// But it is done just to avoid getting the ioredis message `Unhandled error event`.
|
|
33
|
-
_this.redis.on('error', function (e) {
|
|
34
|
-
_this.redisError = e;
|
|
35
|
-
});
|
|
36
|
-
_this.redis.on('connect', function () {
|
|
37
|
-
_this.redisError = undefined;
|
|
38
|
-
});
|
|
39
|
-
return _this;
|
|
40
|
-
}
|
|
41
|
-
SplitsCacheInRedis.prototype._decrementCounts = function (split) {
|
|
42
|
-
var _this = this;
|
|
43
|
-
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
44
|
-
return this.redis.decr(ttKey).then(function (count) {
|
|
45
|
-
if (count === 0)
|
|
46
|
-
return _this.redis.del(ttKey);
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
|
-
SplitsCacheInRedis.prototype._incrementCounts = function (split) {
|
|
50
|
-
var ttKey = this.keys.buildTrafficTypeKey(split.trafficTypeName);
|
|
51
|
-
return this.redis.incr(ttKey);
|
|
52
|
-
};
|
|
53
|
-
SplitsCacheInRedis.prototype._updateFlagSets = function (featureFlagName, flagSetsOfRemovedFlag, flagSetsOfAddedFlag) {
|
|
54
|
-
var _this = this;
|
|
55
|
-
var removeFromFlagSets = (0, sets_1.returnDifference)(flagSetsOfRemovedFlag, flagSetsOfAddedFlag);
|
|
56
|
-
var addToFlagSets = (0, sets_1.returnDifference)(flagSetsOfAddedFlag, flagSetsOfRemovedFlag);
|
|
57
|
-
if (this.flagSetsFilter.length > 0) {
|
|
58
|
-
addToFlagSets = addToFlagSets.filter(function (flagSet) {
|
|
59
|
-
return _this.flagSetsFilter.some(function (filterFlagSet) { return filterFlagSet === flagSet; });
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
var items = [featureFlagName];
|
|
63
|
-
return Promise.all((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], removeFromFlagSets.map(function (flagSetName) { return _this.redis.srem(_this.keys.buildFlagSetKey(flagSetName), items); }), true), addToFlagSets.map(function (flagSetName) { return _this.redis.sadd(_this.keys.buildFlagSetKey(flagSetName), items); }), true));
|
|
64
|
-
};
|
|
65
|
-
/**
|
|
66
|
-
* Add a given split.
|
|
67
|
-
* The returned promise is resolved when the operation success
|
|
68
|
-
* or rejected if it fails (e.g., redis operation fails)
|
|
69
|
-
*/
|
|
70
|
-
SplitsCacheInRedis.prototype.addSplit = function (split) {
|
|
71
|
-
var _this = this;
|
|
72
|
-
var name = split.name;
|
|
73
|
-
var splitKey = this.keys.buildSplitKey(name);
|
|
74
|
-
return this.redis.get(splitKey).then(function (splitFromStorage) {
|
|
75
|
-
// handling parsing error
|
|
76
|
-
var parsedPreviousSplit, stringifiedNewSplit;
|
|
77
|
-
try {
|
|
78
|
-
parsedPreviousSplit = splitFromStorage ? JSON.parse(splitFromStorage) : undefined;
|
|
79
|
-
stringifiedNewSplit = JSON.stringify(split);
|
|
80
|
-
}
|
|
81
|
-
catch (e) {
|
|
82
|
-
throw new Error('Error parsing feature flag definition: ' + e);
|
|
83
|
-
}
|
|
84
|
-
return _this.redis.set(splitKey, stringifiedNewSplit).then(function () {
|
|
85
|
-
// avoid unnecessary increment/decrement operations
|
|
86
|
-
if (parsedPreviousSplit && parsedPreviousSplit.trafficTypeName === split.trafficTypeName)
|
|
87
|
-
return;
|
|
88
|
-
// update traffic type counts
|
|
89
|
-
return _this._incrementCounts(split).then(function () {
|
|
90
|
-
if (parsedPreviousSplit)
|
|
91
|
-
return _this._decrementCounts(parsedPreviousSplit);
|
|
92
|
-
});
|
|
93
|
-
}).then(function () { return _this._updateFlagSets(name, parsedPreviousSplit && parsedPreviousSplit.sets, split.sets); });
|
|
94
|
-
}).then(function () { return true; });
|
|
95
|
-
};
|
|
96
|
-
/**
|
|
97
|
-
* Remove a given split.
|
|
98
|
-
* The returned promise is resolved when the operation success, with true or false indicating if the split existed (and was removed) or not.
|
|
99
|
-
* or rejected if it fails (e.g., redis operation fails).
|
|
100
|
-
*/
|
|
101
|
-
SplitsCacheInRedis.prototype.removeSplit = function (name) {
|
|
102
|
-
var _this = this;
|
|
103
|
-
return this.getSplit(name).then(function (split) {
|
|
104
|
-
if (split) {
|
|
105
|
-
return _this._decrementCounts(split).then(function () { return _this._updateFlagSets(name, split.sets); });
|
|
106
|
-
}
|
|
107
|
-
}).then(function () {
|
|
108
|
-
return _this.redis.del(_this.keys.buildSplitKey(name)).then(function (status) { return status === 1; });
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Get split definition or null if it's not defined.
|
|
113
|
-
* Returned promise is rejected if redis operation fails.
|
|
114
|
-
*/
|
|
115
|
-
SplitsCacheInRedis.prototype.getSplit = function (name) {
|
|
116
|
-
if (this.redisError) {
|
|
117
|
-
this.log.error(constants_1.LOG_PREFIX + this.redisError);
|
|
118
|
-
return Promise.reject(this.redisError);
|
|
119
|
-
}
|
|
120
|
-
return this.redis.get(this.keys.buildSplitKey(name))
|
|
121
|
-
.then(function (maybeSplit) { return maybeSplit && JSON.parse(maybeSplit); });
|
|
122
|
-
};
|
|
123
|
-
/**
|
|
124
|
-
* Set till number.
|
|
125
|
-
* The returned promise is resolved when the operation success,
|
|
126
|
-
* or rejected if it fails.
|
|
127
|
-
*/
|
|
128
|
-
SplitsCacheInRedis.prototype.setChangeNumber = function (changeNumber) {
|
|
129
|
-
return this.redis.set(this.keys.buildSplitsTillKey(), changeNumber + '').then(function (status) { return status === 'OK'; });
|
|
130
|
-
};
|
|
131
|
-
/**
|
|
132
|
-
* Get till number or -1 if it's not defined.
|
|
133
|
-
* The returned promise is resolved with the changeNumber or -1 if it doesn't exist or a redis operation fails.
|
|
134
|
-
* The promise will never be rejected.
|
|
135
|
-
*/
|
|
136
|
-
SplitsCacheInRedis.prototype.getChangeNumber = function () {
|
|
137
|
-
var _this = this;
|
|
138
|
-
return this.redis.get(this.keys.buildSplitsTillKey()).then(function (value) {
|
|
139
|
-
var i = parseInt(value, 10);
|
|
140
|
-
return (0, lang_1.isNaNNumber)(i) ? -1 : i;
|
|
141
|
-
}).catch(function (e) {
|
|
142
|
-
_this.log.error(constants_1.LOG_PREFIX + 'Could not retrieve changeNumber from storage. Error: ' + e);
|
|
143
|
-
return -1;
|
|
144
|
-
});
|
|
145
|
-
};
|
|
146
|
-
/**
|
|
147
|
-
* Get list of all split definitions.
|
|
148
|
-
* The returned promise is resolved with the list of split definitions,
|
|
149
|
-
* or rejected if redis operation fails.
|
|
150
|
-
*/
|
|
151
|
-
// @TODO we need to benchmark which is the maximun number of commands we could pipeline without kill redis performance.
|
|
152
|
-
SplitsCacheInRedis.prototype.getAll = function () {
|
|
153
|
-
var _this = this;
|
|
154
|
-
return this.redis.keys(this.keys.searchPatternForSplitKeys())
|
|
155
|
-
.then(function (listOfKeys) { return _this.redis.pipeline(listOfKeys.map(function (k) { return ['get', k]; })).exec(); })
|
|
156
|
-
.then(processPipelineAnswer)
|
|
157
|
-
.then(function (splitDefinitions) { return splitDefinitions.map(function (splitDefinition) {
|
|
158
|
-
return JSON.parse(splitDefinition);
|
|
159
|
-
}); });
|
|
160
|
-
};
|
|
161
|
-
/**
|
|
162
|
-
* Get list of split names.
|
|
163
|
-
* The returned promise is resolved with the list of split names,
|
|
164
|
-
* or rejected if redis operation fails.
|
|
165
|
-
*/
|
|
166
|
-
SplitsCacheInRedis.prototype.getSplitNames = function () {
|
|
167
|
-
var _this = this;
|
|
168
|
-
return this.redis.keys(this.keys.searchPatternForSplitKeys()).then(function (listOfKeys) { return listOfKeys.map(_this.keys.extractKey); });
|
|
169
|
-
};
|
|
170
|
-
/**
|
|
171
|
-
* Get list of feature flag names related to a given list of flag set names.
|
|
172
|
-
* The returned promise is resolved with the list of feature flag names per flag set,
|
|
173
|
-
* or rejected if the pipelined redis operation fails (e.g., timeout).
|
|
174
|
-
*/
|
|
175
|
-
SplitsCacheInRedis.prototype.getNamesByFlagSets = function (flagSets) {
|
|
176
|
-
var _this = this;
|
|
177
|
-
return this.redis.pipeline(flagSets.map(function (flagSet) { return ['smembers', _this.keys.buildFlagSetKey(flagSet)]; })).exec()
|
|
178
|
-
.then(function (results) { return results ? results.map(function (_a, index) {
|
|
179
|
-
var e = _a[0], value = _a[1];
|
|
180
|
-
if (e === null)
|
|
181
|
-
return value;
|
|
182
|
-
_this.log.error(constants_1.LOG_PREFIX + ("Could not read result from get members of flag set " + flagSets[index] + " due to an error: " + e));
|
|
183
|
-
}) : []; })
|
|
184
|
-
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
185
|
-
};
|
|
186
|
-
/**
|
|
187
|
-
* Check traffic type existence.
|
|
188
|
-
* The returned promise is resolved with a boolean indicating whether the TT exist or not.
|
|
189
|
-
* In case of redis operation failure, the promise resolves with a true value, assuming that the TT might exist.
|
|
190
|
-
* It will never be rejected.
|
|
191
|
-
*/
|
|
192
|
-
SplitsCacheInRedis.prototype.trafficTypeExists = function (trafficType) {
|
|
193
|
-
var _this = this;
|
|
194
|
-
// If there is a number there should be > 0, otherwise the TT is considered as not existent.
|
|
195
|
-
return this.redis.get(this.keys.buildTrafficTypeKey(trafficType))
|
|
196
|
-
.then(function (ttCount) {
|
|
197
|
-
if (ttCount === null)
|
|
198
|
-
return false; // if entry doesn't exist, means that TT doesn't exist
|
|
199
|
-
ttCount = parseInt(ttCount, 10);
|
|
200
|
-
if (!(0, lang_1.isFiniteNumber)(ttCount) || ttCount < 0) {
|
|
201
|
-
_this.log.info(constants_1.LOG_PREFIX + ("Could not validate traffic type existence of " + trafficType + " due to data corruption of some sorts."));
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
return ttCount > 0;
|
|
205
|
-
})
|
|
206
|
-
.catch(function (e) {
|
|
207
|
-
_this.log.error(constants_1.LOG_PREFIX + ("Could not validate traffic type existence of " + trafficType + " due to an error: " + e + "."));
|
|
208
|
-
// If there is an error, bypass the validation so the event can get tracked.
|
|
209
|
-
return true;
|
|
210
|
-
});
|
|
211
|
-
};
|
|
212
|
-
// @TODO remove or implement. It is not being used.
|
|
213
|
-
SplitsCacheInRedis.prototype.clear = function () {
|
|
214
|
-
return Promise.resolve();
|
|
215
|
-
};
|
|
216
|
-
/**
|
|
217
|
-
* Fetches multiple splits definitions.
|
|
218
|
-
* Returned promise is rejected if redis operation fails.
|
|
219
|
-
*/
|
|
220
|
-
SplitsCacheInRedis.prototype.getSplits = function (names) {
|
|
221
|
-
var _a;
|
|
222
|
-
var _this = this;
|
|
223
|
-
if (this.redisError) {
|
|
224
|
-
this.log.error(constants_1.LOG_PREFIX + this.redisError);
|
|
225
|
-
return Promise.reject(this.redisError);
|
|
226
|
-
}
|
|
227
|
-
var keys = names.map(function (name) { return _this.keys.buildSplitKey(name); });
|
|
228
|
-
return (_a = this.redis).mget.apply(_a, keys).then(function (splitDefinitions) {
|
|
229
|
-
var splits = {};
|
|
230
|
-
names.forEach(function (name, idx) {
|
|
231
|
-
var split = splitDefinitions[idx];
|
|
232
|
-
splits[name] = split && JSON.parse(split);
|
|
233
|
-
});
|
|
234
|
-
return Promise.resolve(splits);
|
|
235
|
-
})
|
|
236
|
-
.catch(function (e) {
|
|
237
|
-
_this.log.error(constants_1.LOG_PREFIX + ("Could not grab feature flags due to an error: " + e + "."));
|
|
238
|
-
return Promise.reject(e);
|
|
239
|
-
});
|
|
240
|
-
};
|
|
241
|
-
return SplitsCacheInRedis;
|
|
242
|
-
}(AbstractSplitsCacheAsync_1.AbstractSplitsCacheAsync));
|
|
243
|
-
exports.SplitsCacheInRedis = SplitsCacheInRedis;
|