@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
|
@@ -10,7 +10,7 @@ var constants_3 = require("../../../logger/constants");
|
|
|
10
10
|
* Offline equivalent of `splitChangesUpdaterFactory`
|
|
11
11
|
*/
|
|
12
12
|
function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
13
|
-
var log = settings.log,
|
|
13
|
+
var log = settings.log, definitions = storage.definitions;
|
|
14
14
|
var startingUp = true;
|
|
15
15
|
return function objectUpdater() {
|
|
16
16
|
var splits = [];
|
|
@@ -39,16 +39,16 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
return Promise.all([
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
definitions.clear(),
|
|
43
|
+
definitions.update(splits, [], Date.now())
|
|
44
44
|
]).then(function () {
|
|
45
|
-
readiness.
|
|
45
|
+
readiness.definitions.emit(constants_2.SDK_DEFINITIONS_ARRIVED, { type: constants_2.FLAGS_UPDATE, names: [] });
|
|
46
46
|
if (startingUp) {
|
|
47
47
|
startingUp = false;
|
|
48
48
|
Promise.resolve(storage.validateCache ? storage.validateCache() : { initialCacheLoad: true /* Fallback: assume initial load when validateCache doesn't exist */ }).then(function (cacheMetadata) {
|
|
49
49
|
// Emits SDK_READY_FROM_CACHE
|
|
50
50
|
if (!cacheMetadata.initialCacheLoad) {
|
|
51
|
-
readiness.
|
|
51
|
+
readiness.definitions.emit(constants_2.SDK_DEFINITIONS_CACHE_LOADED, cacheMetadata);
|
|
52
52
|
}
|
|
53
53
|
// Emits SDK_READY
|
|
54
54
|
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED, { type: constants_2.SEGMENTS_UPDATE, names: [] });
|
|
@@ -12,7 +12,7 @@ function greedyFetch(fetchSegmentChanges, since, segmentName, noCache, targetTil
|
|
|
12
12
|
}
|
|
13
13
|
else {
|
|
14
14
|
return Promise.all([json, greedyFetch(fetchSegmentChanges, till, segmentName, noCache, targetTill)]).then(function (flatMe) {
|
|
15
|
-
return
|
|
15
|
+
return tslib_1.__spreadArray([flatMe[0]], flatMe[1], true);
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
});
|
|
@@ -10,16 +10,25 @@ var PROXY_CHECK_INTERVAL_MILLIS_SS = 24 * PROXY_CHECK_INTERVAL_MILLIS_CS; // 24
|
|
|
10
10
|
function sdkEndpointOverridden(settings) {
|
|
11
11
|
return settings.urls.sdk !== settingsValidation_1.base.urls.sdk;
|
|
12
12
|
}
|
|
13
|
+
function isSplitChangesLegacyResponse(data) {
|
|
14
|
+
return data.splits != null;
|
|
15
|
+
}
|
|
16
|
+
function partitionByStatus(items, till, since) {
|
|
17
|
+
var updated = [], removed = [];
|
|
18
|
+
items.forEach(function (item) { return item.status === 'ARCHIVED' ? removed.push(item.name) : updated.push(item); });
|
|
19
|
+
return { updated: updated, removed: removed, till: till, since: since };
|
|
20
|
+
}
|
|
13
21
|
/**
|
|
14
22
|
* Factory of SplitChanges fetcher.
|
|
15
23
|
* SplitChanges fetcher is a wrapper around `splitChanges` API service that parses the response and handle errors.
|
|
16
24
|
*/
|
|
17
25
|
// @TODO breaking: drop support for Split Proxy below v5.10.0 and simplify the implementation
|
|
18
|
-
function splitChangesFetcherFactory(
|
|
26
|
+
function splitChangesFetcherFactory(params) {
|
|
27
|
+
var fetchSplitChanges = params.splitApi.fetchSplitChanges, settings = params.settings, storage = params.storage;
|
|
19
28
|
var log = settings.log;
|
|
20
29
|
var PROXY_CHECK_INTERVAL_MILLIS = (0, key_1.checkIfServerSide)(settings) ? PROXY_CHECK_INTERVAL_MILLIS_SS : PROXY_CHECK_INTERVAL_MILLIS_CS;
|
|
21
30
|
var lastProxyCheckTimestamp;
|
|
22
|
-
|
|
31
|
+
function splitChangesFetcher(since, noCache, till, rbSince,
|
|
23
32
|
// Optional decorator for `fetchSplitChanges` promise, such as timeout or time tracker
|
|
24
33
|
decorator) {
|
|
25
34
|
// Recheck proxy
|
|
@@ -30,7 +39,7 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
|
30
39
|
.catch(function (err) {
|
|
31
40
|
// Handle proxy error with spec 1.3
|
|
32
41
|
if ((!err.statusCode || err.statusCode === 400) && sdkEndpointOverridden(settings) && settings.sync.flagSpecVersion === constants_1.FLAG_SPEC_VERSION) {
|
|
33
|
-
log.error(constants_2.
|
|
42
|
+
log.error(constants_2.LOG_PREFIX_SYNC + 'Proxy error detected. Retrying with spec 1.2. If you are using Split Proxy, please upgrade to latest version');
|
|
34
43
|
lastProxyCheckTimestamp = Date.now();
|
|
35
44
|
settings.sync.flagSpecVersion = '1.2'; // fallback to 1.2 spec
|
|
36
45
|
return fetchSplitChanges(since, noCache, till); // retry request without rbSince
|
|
@@ -43,27 +52,27 @@ function splitChangesFetcherFactory(fetchSplitChanges, settings, storage) {
|
|
|
43
52
|
.then(function (resp) { return resp.json(); })
|
|
44
53
|
.then(function (data) {
|
|
45
54
|
// Using flag spec version 1.2 or below
|
|
46
|
-
if (data
|
|
47
|
-
return {
|
|
48
|
-
ff: {
|
|
49
|
-
d: data.splits,
|
|
50
|
-
s: data.since,
|
|
51
|
-
t: data.till
|
|
52
|
-
}
|
|
53
|
-
};
|
|
55
|
+
if (isSplitChangesLegacyResponse(data)) {
|
|
56
|
+
return { d: partitionByStatus(data.splits || [], data.till, data.since) };
|
|
54
57
|
}
|
|
55
58
|
// Proxy recovery
|
|
56
59
|
if (lastProxyCheckTimestamp) {
|
|
57
|
-
log.info(constants_2.
|
|
60
|
+
log.info(constants_2.LOG_PREFIX_SYNC + 'Proxy error recovered');
|
|
58
61
|
lastProxyCheckTimestamp = undefined;
|
|
59
62
|
return splitChangesFetcher(-1, undefined, undefined, -1)
|
|
60
63
|
.then(function (splitChangesResponse) {
|
|
61
|
-
return Promise.all([storage.
|
|
64
|
+
return Promise.all([storage.definitions.clear(), storage.rbSegments.clear()])
|
|
62
65
|
.then(function () { return splitChangesResponse; });
|
|
63
66
|
});
|
|
64
67
|
}
|
|
65
|
-
|
|
68
|
+
var ff = data.ff, rbs = data.rbs;
|
|
69
|
+
return {
|
|
70
|
+
d: (ff === null || ff === void 0 ? void 0 : ff.d) ? partitionByStatus(ff.d, ff.t, ff.s) : undefined,
|
|
71
|
+
rbs: (rbs === null || rbs === void 0 ? void 0 : rbs.d) ? partitionByStatus(rbs.d, rbs.t, rbs.s) : undefined,
|
|
72
|
+
};
|
|
66
73
|
});
|
|
67
|
-
}
|
|
74
|
+
}
|
|
75
|
+
splitChangesFetcher.type = 'feature flags';
|
|
76
|
+
return splitChangesFetcher;
|
|
68
77
|
}
|
|
69
78
|
exports.splitChangesFetcherFactory = splitChangesFetcherFactory;
|
|
@@ -3,19 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.pollingManagerCSFactory = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
5
|
var mySegmentsSyncTask_1 = require("./syncTasks/mySegmentsSyncTask");
|
|
6
|
-
var
|
|
6
|
+
var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
|
|
7
7
|
var key_1 = require("../../utils/key");
|
|
8
8
|
var constants_1 = require("../../readiness/constants");
|
|
9
9
|
var constants_2 = require("../../logger/constants");
|
|
10
|
-
var
|
|
10
|
+
var AbstractDefinitionsCacheSync_1 = require("../../storages/AbstractDefinitionsCacheSync");
|
|
11
11
|
/**
|
|
12
12
|
* Expose start / stop mechanism for polling data from services.
|
|
13
13
|
* For client-side API with multiple clients.
|
|
14
14
|
*/
|
|
15
|
-
function pollingManagerCSFactory(params) {
|
|
15
|
+
function pollingManagerCSFactory(params, definitionChangesFetcher) {
|
|
16
16
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
17
17
|
var log = settings.log;
|
|
18
|
-
var
|
|
18
|
+
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings, true);
|
|
19
19
|
// Map of matching keys to their corresponding MySegmentsSyncTask.
|
|
20
20
|
var mySegmentsSyncTasks = {};
|
|
21
21
|
var matchingKey = (0, key_1.getMatching)(settings.core.key);
|
|
@@ -32,10 +32,10 @@ function pollingManagerCSFactory(params) {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
// smart pausing
|
|
35
|
-
readiness.
|
|
36
|
-
if (!
|
|
35
|
+
readiness.definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, function () {
|
|
36
|
+
if (!definitionsSyncTask.isRunning())
|
|
37
37
|
return; // noop if not doing polling
|
|
38
|
-
var usingSegments = (0,
|
|
38
|
+
var usingSegments = (0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage);
|
|
39
39
|
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
|
|
40
40
|
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
|
|
41
41
|
if (usingSegments) {
|
|
@@ -50,38 +50,38 @@ function pollingManagerCSFactory(params) {
|
|
|
50
50
|
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(splitApi.fetchMemberships, storage, readiness, settings, matchingKey);
|
|
51
51
|
// smart ready
|
|
52
52
|
function smartReady(metadata) {
|
|
53
|
-
if (!readiness.isReady() && !(0,
|
|
53
|
+
if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
54
54
|
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
|
|
55
55
|
}
|
|
56
|
-
if (!(0,
|
|
56
|
+
if (!(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
57
57
|
setTimeout(smartReady, 0);
|
|
58
58
|
else
|
|
59
|
-
readiness.
|
|
59
|
+
readiness.definitions.once(constants_1.SDK_DEFINITIONS_ARRIVED, smartReady);
|
|
60
60
|
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
|
|
61
61
|
return mySegmentsSyncTask;
|
|
62
62
|
}
|
|
63
63
|
return {
|
|
64
|
-
|
|
64
|
+
definitionsSyncTask: definitionsSyncTask,
|
|
65
65
|
segmentsSyncTask: mySegmentsSyncTask,
|
|
66
66
|
// Start periodic fetching (polling)
|
|
67
67
|
start: function () {
|
|
68
68
|
log.info(constants_2.POLLING_START);
|
|
69
|
-
|
|
70
|
-
if ((0,
|
|
69
|
+
definitionsSyncTask.start();
|
|
70
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
|
|
71
71
|
startMySegmentsSyncTasks();
|
|
72
72
|
},
|
|
73
73
|
// Stop periodic fetching (polling)
|
|
74
74
|
stop: function () {
|
|
75
75
|
log.info(constants_2.POLLING_STOP);
|
|
76
|
-
if (
|
|
77
|
-
|
|
76
|
+
if (definitionsSyncTask.isRunning())
|
|
77
|
+
definitionsSyncTask.stop();
|
|
78
78
|
stopMySegmentsSyncTasks();
|
|
79
79
|
},
|
|
80
80
|
// Used by SyncManager to know if running in polling mode.
|
|
81
|
-
isRunning:
|
|
82
|
-
// fetch
|
|
81
|
+
isRunning: definitionsSyncTask.isRunning,
|
|
82
|
+
// fetch definitions and segments
|
|
83
83
|
syncAll: function () {
|
|
84
|
-
var promises = [
|
|
84
|
+
var promises = [definitionsSyncTask.execute()];
|
|
85
85
|
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
|
|
86
86
|
promises.push(mySegmentsSyncTask.execute());
|
|
87
87
|
});
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
|
-
var
|
|
4
|
+
var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
6
|
var constants_1 = require("../../logger/constants");
|
|
7
7
|
/**
|
|
8
8
|
* Expose start / stop mechanism for pulling data from services.
|
|
9
9
|
*/
|
|
10
|
-
function pollingManagerSSFactory(params) {
|
|
10
|
+
function pollingManagerSSFactory(params, definitionChangesFetcher) {
|
|
11
11
|
var splitApi = params.splitApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
|
|
12
12
|
var log = settings.log;
|
|
13
|
-
var
|
|
13
|
+
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings);
|
|
14
14
|
var segmentsSyncTask = (0, segmentsSyncTask_1.segmentsSyncTaskFactory)(splitApi.fetchSegmentChanges, storage, readiness, settings);
|
|
15
15
|
return {
|
|
16
|
-
|
|
16
|
+
definitionsSyncTask: definitionsSyncTask,
|
|
17
17
|
segmentsSyncTask: segmentsSyncTask,
|
|
18
18
|
// Start periodic fetching (polling)
|
|
19
19
|
start: function () {
|
|
20
20
|
log.info(constants_1.POLLING_START);
|
|
21
|
-
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("
|
|
22
|
-
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING +
|
|
23
|
-
var startingUp =
|
|
21
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "".concat(definitionChangesFetcher.type, " will be refreshed each ").concat(settings.scheduler.featuresRefreshRate, " millis"));
|
|
22
|
+
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + "segments will be refreshed each ".concat(settings.scheduler.segmentsRefreshRate, " millis"));
|
|
23
|
+
var startingUp = definitionsSyncTask.start();
|
|
24
24
|
if (startingUp) {
|
|
25
25
|
startingUp.then(function () {
|
|
26
|
-
if (
|
|
26
|
+
if (definitionsSyncTask.isRunning())
|
|
27
27
|
segmentsSyncTask.start();
|
|
28
28
|
});
|
|
29
29
|
}
|
|
@@ -31,16 +31,16 @@ function pollingManagerSSFactory(params) {
|
|
|
31
31
|
// Stop periodic fetching (polling)
|
|
32
32
|
stop: function () {
|
|
33
33
|
log.info(constants_1.POLLING_STOP);
|
|
34
|
-
if (
|
|
35
|
-
|
|
34
|
+
if (definitionsSyncTask.isRunning())
|
|
35
|
+
definitionsSyncTask.stop();
|
|
36
36
|
if (segmentsSyncTask.isRunning())
|
|
37
37
|
segmentsSyncTask.stop();
|
|
38
38
|
},
|
|
39
39
|
// Used by SyncManager to know if running in polling mode.
|
|
40
|
-
isRunning:
|
|
40
|
+
isRunning: definitionsSyncTask.isRunning,
|
|
41
41
|
syncAll: function () {
|
|
42
|
-
// fetch
|
|
43
|
-
return
|
|
42
|
+
// fetch definitions and segments. There is no need to catch this promise (`DefinitionChangesUpdater` is always resolved with a boolean value)
|
|
43
|
+
return definitionsSyncTask.execute().then(function () {
|
|
44
44
|
return segmentsSyncTask.execute();
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.definitionsSyncTaskFactory = void 0;
|
|
4
|
+
var syncTask_1 = require("../../syncTask");
|
|
5
|
+
var definitionChangesUpdater_1 = require("../updaters/definitionChangesUpdater");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a sync task that periodically executes a `definitionChangesUpdater` task
|
|
8
|
+
*/
|
|
9
|
+
function definitionsSyncTaskFactory(definitionChangesFetcher, storage, readiness, settings, isClientSide) {
|
|
10
|
+
return (0, syncTask_1.syncTaskFactory)(settings.log, (0, definitionChangesUpdater_1.definitionChangesUpdaterFactory)(settings.log, definitionChangesFetcher, storage, settings.sync.__splitFiltersValidation, readiness.definitions, settings.startup.requestTimeoutBeforeReady, settings.startup.retriesOnFailureBeforeReady, isClientSide), settings.scheduler.featuresRefreshRate, 'definitionChangesUpdater');
|
|
11
|
+
}
|
|
12
|
+
exports.definitionsSyncTaskFactory = definitionsSyncTaskFactory;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.definitionChangesUpdaterFactory = exports.computeMutation = exports.parseSegments = void 0;
|
|
4
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
@@ -24,7 +24,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
24
24
|
*/
|
|
25
25
|
function parseSegments(ruleEntity, matcherType) {
|
|
26
26
|
if (matcherType === void 0) { matcherType = constants_3.IN_SEGMENT; }
|
|
27
|
-
var _a = ruleEntity,
|
|
27
|
+
var _a = ruleEntity, conditions = _a.conditions, excluded = _a.excluded;
|
|
28
28
|
var segments = new Set();
|
|
29
29
|
if (excluded && excluded.segments) {
|
|
30
30
|
excluded.segments.forEach(function (_a) {
|
|
@@ -34,122 +34,130 @@ function parseSegments(ruleEntity, matcherType) {
|
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
if (conditions) {
|
|
38
|
+
for (var i = 0; i < conditions.length; i++) {
|
|
39
|
+
var matchers = conditions[i].matcherGroup.matchers;
|
|
40
|
+
matchers.forEach(function (matcher) {
|
|
41
|
+
if (matcher.matcherType === matcherType)
|
|
42
|
+
segments.add(matcher.userDefinedSegmentMatcherData.segmentName);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
43
45
|
}
|
|
44
46
|
return segments;
|
|
45
47
|
}
|
|
46
48
|
exports.parseSegments = parseSegments;
|
|
47
49
|
/**
|
|
48
|
-
* If there are defined filters and one
|
|
50
|
+
* If there are defined filters and one definition doesn't match with them, its status is changed to 'ARCHIVE' to avoid storing it
|
|
49
51
|
* If there is `bySet` filter, `byName` and `byPrefix` filters are ignored
|
|
50
52
|
*
|
|
51
|
-
* @param
|
|
53
|
+
* @param definition - definition to be evaluated
|
|
52
54
|
* @param filters - splitFiltersValidation bySet | byName
|
|
53
55
|
*/
|
|
54
|
-
function matchFilters(
|
|
56
|
+
function matchFilters(definition, filters) {
|
|
55
57
|
var _a = filters.groupedFilters, setsFilter = _a.bySet, namesFilter = _a.byName, prefixFilter = _a.byPrefix;
|
|
56
58
|
if (setsFilter.length > 0)
|
|
57
|
-
return
|
|
59
|
+
return definition.sets && definition.sets.some(function (definitionSet) { return setsFilter.indexOf(definitionSet) > -1; });
|
|
58
60
|
var namesFilterConfigured = namesFilter.length > 0;
|
|
59
61
|
var prefixFilterConfigured = prefixFilter.length > 0;
|
|
60
62
|
if (!namesFilterConfigured && !prefixFilterConfigured)
|
|
61
63
|
return true;
|
|
62
|
-
var matchNames = namesFilterConfigured && namesFilter.indexOf(
|
|
63
|
-
var matchPrefix = prefixFilterConfigured && prefixFilter.some(function (prefix) { return (0, lang_1.startsWith)(
|
|
64
|
+
var matchNames = namesFilterConfigured && namesFilter.indexOf(definition.name) > -1;
|
|
65
|
+
var matchPrefix = prefixFilterConfigured && prefixFilter.some(function (prefix) { return (0, lang_1.startsWith)(definition.name, prefix); });
|
|
64
66
|
return matchNames || matchPrefix;
|
|
65
67
|
}
|
|
66
68
|
/**
|
|
67
|
-
* Given the list of
|
|
68
|
-
* i.e., an object with added
|
|
69
|
+
* Given the list of definitions from /splitChanges or /configs endpoint, it returns the mutations,
|
|
70
|
+
* i.e., an object with added definitions, removed definitions, and used segments.
|
|
69
71
|
* Exported for testing purposes.
|
|
70
72
|
*/
|
|
71
|
-
function computeMutation(
|
|
72
|
-
return
|
|
73
|
-
if (
|
|
73
|
+
function computeMutation(update, segments, filters) {
|
|
74
|
+
return update.updated.reduce(function (accum, ruleEntity) {
|
|
75
|
+
if (!filters || matchFilters(ruleEntity, filters)) {
|
|
74
76
|
accum.added.push(ruleEntity);
|
|
75
77
|
parseSegments(ruleEntity).forEach(function (segmentName) {
|
|
76
78
|
segments.add(segmentName);
|
|
77
79
|
});
|
|
78
80
|
}
|
|
79
81
|
else {
|
|
80
|
-
accum.removed.push(ruleEntity);
|
|
82
|
+
accum.removed.push(ruleEntity.name);
|
|
81
83
|
}
|
|
82
84
|
accum.names.push(ruleEntity.name);
|
|
83
85
|
return accum;
|
|
84
|
-
}, { added: [], removed:
|
|
86
|
+
}, { added: [], removed: update.removed, names: update.removed.slice() });
|
|
85
87
|
}
|
|
86
88
|
exports.computeMutation = computeMutation;
|
|
89
|
+
function convertInstantUpdateToDefinitionChanges(instantUpdate) {
|
|
90
|
+
var payload = instantUpdate.payload, changeNumber = instantUpdate.changeNumber;
|
|
91
|
+
return payload.status === 'ARCHIVED' ?
|
|
92
|
+
{ till: changeNumber, updated: [], removed: [payload.name] } :
|
|
93
|
+
{ till: changeNumber, updated: [payload], removed: [] };
|
|
94
|
+
}
|
|
87
95
|
/**
|
|
88
|
-
*
|
|
89
|
-
* - fetches
|
|
90
|
-
* - updates
|
|
91
|
-
* - uses `
|
|
96
|
+
* Factory of DefinitionChanges updater, a task that:
|
|
97
|
+
* - fetches definition changes using `definitionChangesFetcher`
|
|
98
|
+
* - updates definitions storage
|
|
99
|
+
* - uses `definitionsEventEmitter` to emit events related to definition data updates
|
|
92
100
|
*
|
|
93
101
|
* @param log - Logger instance
|
|
94
|
-
* @param
|
|
95
|
-
* @param
|
|
102
|
+
* @param definitionChangesFetcher - Fetcher of `/splitChanges` or `/configs`
|
|
103
|
+
* @param definitions - Definitions storage, with sync or async methods
|
|
96
104
|
* @param segments - Segments storage, with sync or async methods
|
|
97
|
-
* @param
|
|
105
|
+
* @param definitionsEventEmitter - Optional readiness manager. Not required for synchronizer or producer mode.
|
|
98
106
|
* @param requestTimeoutBeforeReady - How long the updater will wait for the request to timeout. Default 0, i.e., never timeout.
|
|
99
|
-
* @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
|
|
107
|
+
* @param retriesOnFailureBeforeReady - How many retries on `/splitChanges` or `/configs` we the updater do in case of failure or timeout. Default 0, i.e., no retries.
|
|
100
108
|
*/
|
|
101
|
-
function
|
|
109
|
+
function definitionChangesUpdaterFactory(log, definitionChangesFetcher, storage, splitFiltersValidation, definitionsEventEmitter, requestTimeoutBeforeReady, retriesOnFailureBeforeReady, isClientSide) {
|
|
102
110
|
if (requestTimeoutBeforeReady === void 0) { requestTimeoutBeforeReady = 0; }
|
|
103
111
|
if (retriesOnFailureBeforeReady === void 0) { retriesOnFailureBeforeReady = 0; }
|
|
104
|
-
var
|
|
112
|
+
var definitions = storage.definitions, rbSegments = storage.rbSegments, segments = storage.segments;
|
|
105
113
|
var startingUp = true;
|
|
106
|
-
/** timeout decorator for `
|
|
114
|
+
/** timeout decorator for `definitionChangesFetcher` promise */
|
|
107
115
|
function _promiseDecorator(promise) {
|
|
108
116
|
if (startingUp && requestTimeoutBeforeReady)
|
|
109
117
|
promise = (0, timeout_1.timeout)(requestTimeoutBeforeReady, promise);
|
|
110
118
|
return promise;
|
|
111
119
|
}
|
|
112
120
|
/**
|
|
113
|
-
*
|
|
121
|
+
* DefinitionChanges updater returns a promise that resolves with a `false` boolean value if it fails to fetch definitions or synchronize them with the storage.
|
|
114
122
|
* Returned promise will not be rejected.
|
|
115
123
|
*
|
|
116
124
|
* @param noCache - true to revalidate data to fetch
|
|
117
125
|
* @param till - query param to bypass CDN requests
|
|
118
126
|
*/
|
|
119
|
-
return function
|
|
127
|
+
return function definitionChangesUpdater(noCache, till, instantUpdate) {
|
|
120
128
|
/**
|
|
121
|
-
* @param since - current changeNumber at
|
|
129
|
+
* @param since - current changeNumber at definitionsCache
|
|
122
130
|
* @param retry - current number of retry attempts
|
|
123
131
|
*/
|
|
124
|
-
function
|
|
132
|
+
function _definitionChangesUpdater(sinces, retry) {
|
|
125
133
|
if (retry === void 0) { retry = 0; }
|
|
126
134
|
var since = sinces[0], rbSince = sinces[1];
|
|
127
|
-
log.debug(constants_2.
|
|
135
|
+
log.debug(constants_2.SYNC_FETCH, [definitionChangesFetcher.type, since, rbSince]);
|
|
128
136
|
return Promise.resolve(instantUpdate ?
|
|
129
137
|
instantUpdate.type === constants_4.SPLIT_UPDATE ?
|
|
130
|
-
// IFFU edge case: a change to
|
|
138
|
+
// IFFU edge case: a change to definition that adds an IN_RULE_BASED_SEGMENT matcher that is not present yet
|
|
131
139
|
Promise.resolve(rbSegments.contains(parseSegments(instantUpdate.payload, constants_3.IN_RULE_BASED_SEGMENT))).then(function (contains) {
|
|
132
140
|
return contains ?
|
|
133
|
-
{
|
|
134
|
-
|
|
141
|
+
{ d: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
|
|
142
|
+
definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator);
|
|
135
143
|
}) :
|
|
136
|
-
{ rbs:
|
|
137
|
-
|
|
138
|
-
.then(function (
|
|
144
|
+
{ rbs: convertInstantUpdateToDefinitionChanges(instantUpdate) } :
|
|
145
|
+
definitionChangesFetcher(since, noCache, till, rbSince, _promiseDecorator))
|
|
146
|
+
.then(function (definitionChanges) {
|
|
139
147
|
var usedSegments = new Set();
|
|
140
|
-
var
|
|
148
|
+
var updatedDefinitions = [];
|
|
141
149
|
var ffUpdate = false;
|
|
142
|
-
if (
|
|
143
|
-
var _a = computeMutation(
|
|
144
|
-
|
|
145
|
-
log.debug(constants_2.
|
|
146
|
-
ffUpdate =
|
|
150
|
+
if (definitionChanges.d) {
|
|
151
|
+
var _a = computeMutation(definitionChanges.d, usedSegments, splitFiltersValidation), added = _a.added, removed = _a.removed, names = _a.names;
|
|
152
|
+
updatedDefinitions = names;
|
|
153
|
+
log.debug(constants_2.SYNC_UPDATE, [definitionChangesFetcher.type, added.length, removed.length]);
|
|
154
|
+
ffUpdate = definitions.update(added, removed, definitionChanges.d.till);
|
|
147
155
|
}
|
|
148
156
|
var rbsUpdate = false;
|
|
149
|
-
if (
|
|
150
|
-
var _b = computeMutation(
|
|
151
|
-
log.debug(constants_2.
|
|
152
|
-
rbsUpdate = rbSegments.update(added, removed,
|
|
157
|
+
if (definitionChanges.rbs) {
|
|
158
|
+
var _b = computeMutation(definitionChanges.rbs, usedSegments), added = _b.added, removed = _b.removed;
|
|
159
|
+
log.debug(constants_2.SYNC_UPDATE, ['rule-based segments', added.length, removed.length]);
|
|
160
|
+
rbsUpdate = rbSegments.update(added, removed, definitionChanges.rbs.till);
|
|
153
161
|
}
|
|
154
162
|
return Promise.all([ffUpdate, rbsUpdate,
|
|
155
163
|
// @TODO if at least 1 segment fetch fails due to 404 and other segments are updated in the storage, SDK_UPDATE is not emitted
|
|
@@ -159,18 +167,18 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, storage, splitFilt
|
|
|
159
167
|
if (storage.save)
|
|
160
168
|
storage.save();
|
|
161
169
|
startingUp = false;
|
|
162
|
-
if (
|
|
163
|
-
// To emit
|
|
164
|
-
return Promise.resolve(!
|
|
170
|
+
if (definitionsEventEmitter) {
|
|
171
|
+
// To emit SDK_DEFINITIONS_ARRIVED for server-side SDK, we must check that all registered segments have been fetched
|
|
172
|
+
return Promise.resolve(!definitionsEventEmitter.definitionsArrived || ((ffChanged || rbsChanged) && (isClientSide || checkAllSegmentsExist(segments))))
|
|
165
173
|
.catch(function () { return false; } /** noop. just to handle a possible `checkAllSegmentsExist` rejection, before emitting SDK event */)
|
|
166
174
|
.then(function (emitSplitsArrivedEvent) {
|
|
167
175
|
// emit SDK events
|
|
168
176
|
if (emitSplitsArrivedEvent) {
|
|
169
177
|
var metadata = {
|
|
170
|
-
type:
|
|
171
|
-
names:
|
|
178
|
+
type: updatedDefinitions.length > 0 ? definitionChangesFetcher.type === 'configs' ? constants_1.CONFIGS_UPDATE : constants_1.FLAGS_UPDATE : constants_1.SEGMENTS_UPDATE,
|
|
179
|
+
names: updatedDefinitions.length > 0 ? updatedDefinitions : []
|
|
172
180
|
};
|
|
173
|
-
|
|
181
|
+
definitionsEventEmitter.emit(constants_1.SDK_DEFINITIONS_ARRIVED, metadata);
|
|
174
182
|
}
|
|
175
183
|
return true;
|
|
176
184
|
});
|
|
@@ -181,18 +189,18 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, storage, splitFilt
|
|
|
181
189
|
.catch(function (error) {
|
|
182
190
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
183
191
|
retry += 1;
|
|
184
|
-
log.warn(constants_2.
|
|
185
|
-
return
|
|
192
|
+
log.warn(constants_2.SYNC_FETCH_RETRY, [definitionChangesFetcher.type, retry, error]);
|
|
193
|
+
return _definitionChangesUpdater(sinces, retry);
|
|
186
194
|
}
|
|
187
195
|
else {
|
|
188
196
|
startingUp = false;
|
|
189
|
-
log.warn(constants_2.
|
|
197
|
+
log.warn(constants_2.SYNC_FETCH_FAILS, [definitionChangesFetcher.type, error]);
|
|
190
198
|
}
|
|
191
199
|
return false;
|
|
192
200
|
});
|
|
193
201
|
}
|
|
194
202
|
// `getChangeNumber` never rejects or throws error
|
|
195
|
-
return Promise.all([
|
|
203
|
+
return Promise.all([definitions.getChangeNumber(), rbSegments.getChangeNumber()]).then(_definitionChangesUpdater);
|
|
196
204
|
};
|
|
197
205
|
}
|
|
198
|
-
exports.
|
|
206
|
+
exports.definitionChangesUpdaterFactory = definitionChangesUpdaterFactory;
|
|
@@ -5,7 +5,7 @@ var timeout_1 = require("../../../utils/promise/timeout");
|
|
|
5
5
|
var constants_1 = require("../../../readiness/constants");
|
|
6
6
|
var constants_2 = require("../../../logger/constants");
|
|
7
7
|
var constants_3 = require("../../streaming/constants");
|
|
8
|
-
var
|
|
8
|
+
var AbstractDefinitionsCacheSync_1 = require("../../../storages/AbstractDefinitionsCacheSync");
|
|
9
9
|
/**
|
|
10
10
|
* factory of MySegments updater, a task that:
|
|
11
11
|
* - fetches mySegments using `mySegmentsFetcher`
|
|
@@ -37,7 +37,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
37
37
|
if (storage.save)
|
|
38
38
|
storage.save();
|
|
39
39
|
// Notify update if required
|
|
40
|
-
if ((0,
|
|
40
|
+
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage) && (shouldNotifyUpdate || readyOnAlreadyExistentState)) {
|
|
41
41
|
readyOnAlreadyExistentState = false;
|
|
42
42
|
segmentsEventEmitter.emit(constants_1.SDK_SEGMENTS_ARRIVED, { type: constants_1.SEGMENTS_UPDATE, names: [] });
|
|
43
43
|
}
|
|
@@ -56,7 +56,7 @@ function mySegmentsUpdaterFactory(log, mySegmentsFetcher, storage, segmentsEvent
|
|
|
56
56
|
return updaterPromise.catch(function (error) {
|
|
57
57
|
if (startingUp && retriesOnFailureBeforeReady > retry) {
|
|
58
58
|
retry += 1;
|
|
59
|
-
log.warn(constants_2.
|
|
59
|
+
log.warn(constants_2.SYNC_FETCH_RETRY, ['memberships', retry, error]);
|
|
60
60
|
return _mySegmentsUpdater(retry); // no need to forward `segmentList` and `noCache` params
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
@@ -23,7 +23,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
23
23
|
return promise;
|
|
24
24
|
}
|
|
25
25
|
function updateSegment(segmentName, noCache, till, fetchOnlyNew, retries) {
|
|
26
|
-
log.debug(constants_2.
|
|
26
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Processing segment ").concat(segmentName));
|
|
27
27
|
var sincePromise = Promise.resolve(segments.getChangeNumber(segmentName));
|
|
28
28
|
return sincePromise.then(function (since) {
|
|
29
29
|
// if fetchOnlyNew flag, avoid processing already fetched segments
|
|
@@ -31,14 +31,14 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
31
31
|
false :
|
|
32
32
|
segmentChangesFetcher(since || -1, segmentName, noCache, till, _promiseDecorator).then(function (changes) {
|
|
33
33
|
return Promise.all(changes.map(function (x) {
|
|
34
|
-
log.debug(constants_2.
|
|
34
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Processing ").concat(segmentName, " with till = ").concat(x.till, ". Added: ").concat(x.added.length, ". Removed: ").concat(x.removed.length));
|
|
35
35
|
return segments.update(segmentName, x.added, x.removed, x.till);
|
|
36
36
|
})).then(function (updates) {
|
|
37
37
|
return updates.some(function (update) { return update; });
|
|
38
38
|
});
|
|
39
39
|
}).catch(function (error) {
|
|
40
40
|
if (retries) {
|
|
41
|
-
log.warn(constants_2.
|
|
41
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC, "Retrying fetch of segment ").concat(segmentName, " (attempt #").concat(retries, "). Reason: ").concat(error));
|
|
42
42
|
return updateSegment(segmentName, noCache, till, fetchOnlyNew, retries - 1);
|
|
43
43
|
}
|
|
44
44
|
throw error;
|
|
@@ -57,7 +57,7 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
57
57
|
* @param till - till target for the provided segmentName, for CDN bypass.
|
|
58
58
|
*/
|
|
59
59
|
return function segmentChangesUpdater(fetchOnlyNew, segmentName, noCache, till) {
|
|
60
|
-
log.debug(constants_2.
|
|
60
|
+
log.debug("".concat(constants_2.LOG_PREFIX_SYNC, "Started segments update"));
|
|
61
61
|
// If not a segment name provided, read list of available segments names to be updated.
|
|
62
62
|
var segmentsPromise = Promise.resolve(segmentName ? [segmentName] : segments.getRegisteredSegments());
|
|
63
63
|
return segmentsPromise.then(function (segmentNames) {
|
|
@@ -84,10 +84,10 @@ function segmentChangesUpdaterFactory(log, segmentChangesFetcher, segments, read
|
|
|
84
84
|
// @TODO although factory status is destroyed, synchronization is not stopped
|
|
85
85
|
if (readiness)
|
|
86
86
|
readiness.setDestroyed();
|
|
87
|
-
log.error(constants_2.LOG_PREFIX_INSTANTIATION
|
|
87
|
+
log.error("".concat(constants_2.LOG_PREFIX_INSTANTIATION, ": you passed a client-side type authorizationKey, please grab an SDK Key from Harness UI that is of type server-side."));
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
-
log.warn(constants_2.
|
|
90
|
+
log.warn("".concat(constants_2.LOG_PREFIX_SYNC, "Error while doing fetch of segments. ").concat(error));
|
|
91
91
|
}
|
|
92
92
|
return false;
|
|
93
93
|
});
|