vwo-fme-node-sdk 1.0.0
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/CONTRIBUTING.md +46 -0
- package/LICENSE +202 -0
- package/NOTICE +18 -0
- package/README.md +52 -0
- package/dist/VWO.d.ts +9 -0
- package/dist/VWO.js +100 -0
- package/dist/VWO.js.map +1 -0
- package/dist/VWOBuilder.d.ts +48 -0
- package/dist/VWOBuilder.js +173 -0
- package/dist/VWOBuilder.js.map +1 -0
- package/dist/VWOClient.d.ts +20 -0
- package/dist/VWOClient.js +249 -0
- package/dist/VWOClient.js.map +1 -0
- package/dist/api/GetFlag.d.ts +19 -0
- package/dist/api/GetFlag.js +394 -0
- package/dist/api/GetFlag.js.map +1 -0
- package/dist/api/GetVariable.d.ts +0 -0
- package/dist/api/GetVariable.js +1 -0
- package/dist/api/GetVariable.js.map +1 -0
- package/dist/api/GetVariables.d.ts +0 -0
- package/dist/api/GetVariables.js +1 -0
- package/dist/api/GetVariables.js.map +1 -0
- package/dist/api/SetAttribute.d.ts +7 -0
- package/dist/api/SetAttribute.js +62 -0
- package/dist/api/SetAttribute.js.map +1 -0
- package/dist/api/Track.js +76 -0
- package/dist/api/Track.js.map +1 -0
- package/dist/api/TrackEvent.d.ts +8 -0
- package/dist/api/TrackEvent.js +78 -0
- package/dist/api/TrackEvent.js.map +1 -0
- package/dist/constants/index.d.ts +24 -0
- package/dist/constants/index.js +31 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/url.d.ts +6 -0
- package/dist/constants/url.js +10 -0
- package/dist/constants/url.js.map +1 -0
- package/dist/decision-maker/index.js +75 -0
- package/dist/decision-maker/index.js.map +1 -0
- package/dist/decorators/StorageDecorator.d.ts +12 -0
- package/dist/decorators/StorageDecorator.js +119 -0
- package/dist/decorators/StorageDecorator.js.map +1 -0
- package/dist/enums/ApiEnum.d.ts +4 -0
- package/dist/enums/ApiEnum.js +9 -0
- package/dist/enums/ApiEnum.js.map +1 -0
- package/dist/enums/EventEnum.d.ts +4 -0
- package/dist/enums/EventEnum.js +9 -0
- package/dist/enums/EventEnum.js.map +1 -0
- package/dist/enums/HeadersEnum.d.ts +4 -0
- package/dist/enums/HeadersEnum.js +9 -0
- package/dist/enums/HeadersEnum.js.map +1 -0
- package/dist/enums/HooksEnum.d.ts +7 -0
- package/dist/enums/HooksEnum.js +8 -0
- package/dist/enums/HooksEnum.js.map +1 -0
- package/dist/enums/LogLevelEnum.d.ts +7 -0
- package/dist/enums/LogLevelEnum.js +12 -0
- package/dist/enums/LogLevelEnum.js.map +1 -0
- package/dist/enums/StatusEnum.d.ts +4 -0
- package/dist/enums/StorageEnum.d.ts +8 -0
- package/dist/enums/StorageEnum.js +13 -0
- package/dist/enums/StorageEnum.js.map +1 -0
- package/dist/enums/UrlEnum.d.ts +13 -0
- package/dist/enums/UrlEnum.js +18 -0
- package/dist/enums/UrlEnum.js.map +1 -0
- package/dist/enums/campaignTypeEnum.d.ts +5 -0
- package/dist/enums/campaignTypeEnum.js +10 -0
- package/dist/enums/campaignTypeEnum.js.map +1 -0
- package/dist/enums/logMessages/DbugLogMessageEnum.js +1 -0
- package/dist/enums/logMessages/DbugLogMessageEnum.js.map +1 -0
- package/dist/enums/logMessages/DebugLogMessageEnum.d.ts +3 -0
- package/dist/enums/logMessages/ErorLogMessageEnum.js +1 -0
- package/dist/enums/logMessages/ErorLogMessageEnum.js.map +1 -0
- package/dist/enums/logMessages/ErrorLogMessageEnum.d.ts +3 -0
- package/dist/enums/logMessages/debugLogMessageEnum.js +8 -0
- package/dist/enums/logMessages/debugLogMessageEnum.js.map +1 -0
- package/dist/enums/logMessages/errorLogMessageEnum.js +8 -0
- package/dist/enums/logMessages/errorLogMessageEnum.js.map +1 -0
- package/dist/enums/statusEnum.js +9 -0
- package/dist/enums/statusEnum.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/core/logManager.js +97 -0
- package/dist/logger/core/logManager.js.map +1 -0
- package/dist/logger/core/transportManager.js +60 -0
- package/dist/logger/core/transportManager.js.map +1 -0
- package/dist/logger/enums/logLevelEnum.js +12 -0
- package/dist/logger/enums/logLevelEnum.js.map +1 -0
- package/dist/logger/index.js +8 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logMessageBuilder.js +43 -0
- package/dist/logger/logMessageBuilder.js.map +1 -0
- package/dist/logger/logger.js +10 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/consoleTransport.js +32 -0
- package/dist/logger/transports/consoleTransport.js.map +1 -0
- package/dist/models/CampaignModel.d.ts +32 -0
- package/dist/models/CampaignModel.js +149 -0
- package/dist/models/CampaignModel.js.map +1 -0
- package/dist/models/FeatureModel.d.ts +20 -0
- package/dist/models/FeatureModel.js +72 -0
- package/dist/models/FeatureModel.js.map +1 -0
- package/dist/models/ImpactCampaignModel.d.ts +7 -0
- package/dist/models/ImpactCampaignModel.js +21 -0
- package/dist/models/ImpactCampaignModel.js.map +1 -0
- package/dist/models/MetricModel.d.ts +12 -0
- package/dist/models/MetricModel.js +25 -0
- package/dist/models/MetricModel.js.map +1 -0
- package/dist/models/RuleModel.d.ts +11 -0
- package/dist/models/RuleModel.js +29 -0
- package/dist/models/RuleModel.js.map +1 -0
- package/dist/models/SettingsModel.d.ts +28 -0
- package/dist/models/SettingsModel.js +70 -0
- package/dist/models/SettingsModel.js.map +1 -0
- package/dist/models/VariableModel.d.ts +18 -0
- package/dist/models/VariableModel.js +38 -0
- package/dist/models/VariableModel.js.map +1 -0
- package/dist/models/VariationModel.d.ts +29 -0
- package/dist/models/VariationModel.js +80 -0
- package/dist/models/VariationModel.js.map +1 -0
- package/dist/models/schemas/SettingsSchemaValidation.d.ts +13 -0
- package/dist/models/schemas/SettingsSchemaValidation.js +70 -0
- package/dist/models/schemas/SettingsSchemaValidation.js.map +1 -0
- package/dist/modules/decision-maker/index.d.ts +38 -0
- package/dist/modules/decision-maker/index.js +67 -0
- package/dist/modules/decision-maker/index.js.map +1 -0
- package/dist/modules/logger/core/logManager.d.ts +40 -0
- package/dist/modules/logger/core/logManager.js +97 -0
- package/dist/modules/logger/core/logManager.js.map +1 -0
- package/dist/modules/logger/core/transportManager.d.ts +22 -0
- package/dist/modules/logger/core/transportManager.js +60 -0
- package/dist/modules/logger/core/transportManager.js.map +1 -0
- package/dist/modules/logger/enums/logLevelEnum.d.ts +7 -0
- package/dist/modules/logger/enums/logLevelEnum.js +12 -0
- package/dist/modules/logger/enums/logLevelEnum.js.map +1 -0
- package/dist/modules/logger/index.d.ts +2 -0
- package/dist/modules/logger/index.js +8 -0
- package/dist/modules/logger/index.js.map +1 -0
- package/dist/modules/logger/logMessageBuilder.d.ts +21 -0
- package/dist/modules/logger/logMessageBuilder.js +43 -0
- package/dist/modules/logger/logMessageBuilder.js.map +1 -0
- package/dist/modules/logger/logger.d.ts +7 -0
- package/dist/modules/logger/logger.js +10 -0
- package/dist/modules/logger/logger.js.map +1 -0
- package/dist/modules/logger/transports/consoleTransport.d.ts +12 -0
- package/dist/modules/logger/transports/consoleTransport.js +32 -0
- package/dist/modules/logger/transports/consoleTransport.js.map +1 -0
- package/dist/modules/networking/client/networkClient.d.ts +7 -0
- package/dist/modules/networking/client/networkClient.js +117 -0
- package/dist/modules/networking/client/networkClient.js.map +1 -0
- package/dist/modules/networking/client/networkClientInterface.d.ts +6 -0
- package/dist/modules/networking/client/networkClientInterface.js +3 -0
- package/dist/modules/networking/client/networkClientInterface.js.map +1 -0
- package/dist/modules/networking/handlers/requestHandler.d.ts +5 -0
- package/dist/modules/networking/handlers/requestHandler.js +29 -0
- package/dist/modules/networking/handlers/requestHandler.js.map +1 -0
- package/dist/modules/networking/index.d.ts +6 -0
- package/dist/modules/networking/index.js +14 -0
- package/dist/modules/networking/index.js.map +1 -0
- package/dist/modules/networking/manager/networkManager.d.ts +16 -0
- package/dist/modules/networking/manager/networkManager.js +72 -0
- package/dist/modules/networking/manager/networkManager.js.map +1 -0
- package/dist/modules/networking/models/globalRequestModel.d.ts +22 -0
- package/dist/modules/networking/models/globalRequestModel.js +51 -0
- package/dist/modules/networking/models/globalRequestModel.js.map +1 -0
- package/dist/modules/networking/models/requestModel.d.ts +32 -0
- package/dist/modules/networking/models/requestModel.js +128 -0
- package/dist/modules/networking/models/requestModel.js.map +1 -0
- package/dist/modules/networking/models/responseModel.d.ts +15 -0
- package/dist/modules/networking/models/responseModel.js +34 -0
- package/dist/modules/networking/models/responseModel.js.map +1 -0
- package/dist/modules/segmentor/core/segmentationManger.d.ts +10 -0
- package/dist/modules/segmentor/core/segmentationManger.js +68 -0
- package/dist/modules/segmentor/core/segmentationManger.js.map +1 -0
- package/dist/modules/segmentor/enums/segmentOperandRegexEnum.d.ts +10 -0
- package/dist/modules/segmentor/enums/segmentOperandRegexEnum.js +15 -0
- package/dist/modules/segmentor/enums/segmentOperandRegexEnum.js.map +1 -0
- package/dist/modules/segmentor/enums/segmentOperandValueEnum.d.ts +8 -0
- package/dist/modules/segmentor/enums/segmentOperandValueEnum.js +13 -0
- package/dist/modules/segmentor/enums/segmentOperandValueEnum.js.map +1 -0
- package/dist/modules/segmentor/enums/segmentOperatorValueEnum.d.ts +15 -0
- package/dist/modules/segmentor/enums/segmentOperatorValueEnum.js +20 -0
- package/dist/modules/segmentor/enums/segmentOperatorValueEnum.js.map +1 -0
- package/dist/modules/segmentor/evaluators/segmentEvaluator.d.ts +15 -0
- package/dist/modules/segmentor/evaluators/segmentEvaluator.js +379 -0
- package/dist/modules/segmentor/evaluators/segmentEvaluator.js.map +1 -0
- package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.d.ts +12 -0
- package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.js +248 -0
- package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.js.map +1 -0
- package/dist/modules/segmentor/index.d.ts +3 -0
- package/dist/modules/segmentor/index.js +8 -0
- package/dist/modules/segmentor/index.js.map +1 -0
- package/dist/modules/segmentor/segmentation.d.ts +5 -0
- package/dist/modules/segmentor/segmentation.js +3 -0
- package/dist/modules/segmentor/segmentation.js.map +1 -0
- package/dist/modules/segmentor/utils/SegmentUtil.d.ts +2 -0
- package/dist/modules/segmentor/utils/SegmentUtil.js +26 -0
- package/dist/modules/segmentor/utils/SegmentUtil.js.map +1 -0
- package/dist/modules/storage/connector.d.ts +14 -0
- package/dist/modules/storage/connector.js +10 -0
- package/dist/modules/storage/connector.js.map +1 -0
- package/dist/modules/storage/connectors/index.d.ts +0 -0
- package/dist/modules/storage/connectors/index.js +3 -0
- package/dist/modules/storage/connectors/index.js.map +1 -0
- package/dist/modules/storage/connectors/memoryConnector.d.ts +26 -0
- package/dist/modules/storage/connectors/memoryConnector.js +103 -0
- package/dist/modules/storage/connectors/memoryConnector.js.map +1 -0
- package/dist/modules/storage/connectors/redisConnector.d.ts +0 -0
- package/dist/modules/storage/connectors/redisConnector.js +181 -0
- package/dist/modules/storage/connectors/redisConnector.js.map +1 -0
- package/dist/modules/storage/index.d.ts +1 -0
- package/dist/modules/storage/index.js +6 -0
- package/dist/modules/storage/index.js.map +1 -0
- package/dist/modules/storage/storage.d.ts +10 -0
- package/dist/modules/storage/storage.js +50 -0
- package/dist/modules/storage/storage.js.map +1 -0
- package/dist/networking/client/networkClient.js +117 -0
- package/dist/networking/client/networkClient.js.map +1 -0
- package/dist/networking/client/networkClientInterface.js +3 -0
- package/dist/networking/client/networkClientInterface.js.map +1 -0
- package/dist/networking/handlers/requestHandler.js +29 -0
- package/dist/networking/handlers/requestHandler.js.map +1 -0
- package/dist/networking/index.js +14 -0
- package/dist/networking/index.js.map +1 -0
- package/dist/networking/manager/networkManager.js +72 -0
- package/dist/networking/manager/networkManager.js.map +1 -0
- package/dist/networking/models/globalRequestModel.js +51 -0
- package/dist/networking/models/globalRequestModel.js.map +1 -0
- package/dist/networking/models/requestModel.js +107 -0
- package/dist/networking/models/requestModel.js.map +1 -0
- package/dist/networking/models/responseModel.js +34 -0
- package/dist/networking/models/responseModel.js.map +1 -0
- package/dist/segmentor/core/segmentationManger.js +25 -0
- package/dist/segmentor/core/segmentationManger.js.map +1 -0
- package/dist/segmentor/enums/segmentOperandRegexEnum.js +15 -0
- package/dist/segmentor/enums/segmentOperandRegexEnum.js.map +1 -0
- package/dist/segmentor/enums/segmentOperandValueEnum.js +13 -0
- package/dist/segmentor/enums/segmentOperandValueEnum.js.map +1 -0
- package/dist/segmentor/enums/segmentOperatorValueEnum.js +12 -0
- package/dist/segmentor/enums/segmentOperatorValueEnum.js.map +1 -0
- package/dist/segmentor/evaluators/segmentEvaluator.js +52 -0
- package/dist/segmentor/evaluators/segmentEvaluator.js.map +1 -0
- package/dist/segmentor/evaluators/segmentOperandEvaluator.js +158 -0
- package/dist/segmentor/evaluators/segmentOperandEvaluator.js.map +1 -0
- package/dist/segmentor/index.js +8 -0
- package/dist/segmentor/index.js.map +1 -0
- package/dist/segmentor/segmentation.js +3 -0
- package/dist/segmentor/segmentation.js.map +1 -0
- package/dist/segmentor/utils/SegmentUtil.js +27 -0
- package/dist/segmentor/utils/SegmentUtil.js.map +1 -0
- package/dist/services/CampaignDecisionService.d.ts +44 -0
- package/dist/services/CampaignDecisionService.js +175 -0
- package/dist/services/CampaignDecisionService.js.map +1 -0
- package/dist/services/HooksManager.d.ts +27 -0
- package/dist/services/HooksManager.js +40 -0
- package/dist/services/HooksManager.js.map +1 -0
- package/dist/services/SettingsManager.d.ts +21 -0
- package/dist/services/SettingsManager.js +168 -0
- package/dist/services/SettingsManager.js.map +1 -0
- package/dist/services/StorageService.d.ts +5 -0
- package/dist/services/StorageService.js +94 -0
- package/dist/services/StorageService.js.map +1 -0
- package/dist/services/UrlService.d.ts +13 -0
- package/dist/services/UrlService.js +37 -0
- package/dist/services/UrlService.js.map +1 -0
- package/dist/types/common.d.ts +2 -0
- package/dist/types/common.js +3 -0
- package/dist/types/common.js.map +1 -0
- package/dist/utils/CampaignUtil.d.ts +23 -0
- package/dist/utils/CampaignUtil.js +228 -0
- package/dist/utils/CampaignUtil.js.map +1 -0
- package/dist/utils/DataTypeUtil.d.ts +17 -0
- package/dist/utils/DataTypeUtil.js +86 -0
- package/dist/utils/DataTypeUtil.js.map +1 -0
- package/dist/utils/DecisionUtil.d.ts +4 -0
- package/dist/utils/DecisionUtil.js +197 -0
- package/dist/utils/DecisionUtil.js.map +1 -0
- package/dist/utils/FunctionUtil.d.ts +13 -0
- package/dist/utils/FunctionUtil.js +121 -0
- package/dist/utils/FunctionUtil.js.map +1 -0
- package/dist/utils/LogMessageUtil.d.ts +16 -0
- package/dist/utils/LogMessageUtil.js +53 -0
- package/dist/utils/LogMessageUtil.js.map +1 -0
- package/dist/utils/MegUtil.d.ts +7 -0
- package/dist/utils/MegUtil.js +413 -0
- package/dist/utils/MegUtil.js.map +1 -0
- package/dist/utils/NetworkUtil.d.ts +140 -0
- package/dist/utils/NetworkUtil.js +238 -0
- package/dist/utils/NetworkUtil.js.map +1 -0
- package/dist/utils/PromiseUtil.d.ts +1 -0
- package/dist/utils/PromiseUtil.js +13 -0
- package/dist/utils/PromiseUtil.js.map +1 -0
- package/dist/utils/SettingsUtil.d.ts +2 -0
- package/dist/utils/SettingsUtil.js +17 -0
- package/dist/utils/SettingsUtil.js.map +1 -0
- package/dist/utils/UuidUtil.d.ts +2 -0
- package/dist/utils/UuidUtil.js +30 -0
- package/dist/utils/UuidUtil.js.map +1 -0
- package/dist/utils/WebServiceUtil.d.ts +4 -0
- package/dist/utils/WebServiceUtil.js +93 -0
- package/dist/utils/WebServiceUtil.js.map +1 -0
- package/dist/utils/logMessageBuilder.d.ts +21 -0
- package/dist/utils/logMessageBuilder.js +43 -0
- package/dist/utils/logMessageBuilder.js.map +1 -0
- package/lib/VWO.ts +55 -0
- package/lib/VWOBuilder.ts +237 -0
- package/lib/VWOClient.ts +321 -0
- package/lib/api/GetFlag.ts +458 -0
- package/lib/api/GetVariable.ts +0 -0
- package/lib/api/GetVariables.ts +0 -0
- package/lib/api/SetAttribute.ts +33 -0
- package/lib/api/TrackEvent.ts +52 -0
- package/lib/constants/index.ts +35 -0
- package/lib/constants/url.ts +7 -0
- package/lib/decorators/StorageDecorator.ts +98 -0
- package/lib/enums/ApiEnum.ts +4 -0
- package/lib/enums/EventEnum.ts +4 -0
- package/lib/enums/HeadersEnum.ts +4 -0
- package/lib/enums/HooksEnum.ts +11 -0
- package/lib/enums/LogLevelEnum.ts +7 -0
- package/lib/enums/StatusEnum.ts +4 -0
- package/lib/enums/StorageEnum.ts +8 -0
- package/lib/enums/UrlEnum.ts +13 -0
- package/lib/enums/campaignTypeEnum.ts +5 -0
- package/lib/enums/logMessages/DebugLogMessageEnum.ts +3 -0
- package/lib/enums/logMessages/ErrorLogMessageEnum.ts +3 -0
- package/lib/index.ts +1 -0
- package/lib/models/CampaignModel.ts +176 -0
- package/lib/models/FeatureModel.ts +81 -0
- package/lib/models/ImpactCampaignModel.ts +20 -0
- package/lib/models/MetricModel.ts +31 -0
- package/lib/models/RuleModel.ts +35 -0
- package/lib/models/SettingsModel.ts +95 -0
- package/lib/models/VariableModel.ts +51 -0
- package/lib/models/VariationModel.ts +101 -0
- package/lib/models/schemas/SettingsSchemaValidation.ts +83 -0
- package/lib/modules/decision-maker/index.ts +65 -0
- package/lib/modules/logger/core/logManager.ts +113 -0
- package/lib/modules/logger/core/transportManager.ts +76 -0
- package/lib/modules/logger/enums/logLevelEnum.ts +7 -0
- package/lib/modules/logger/index.ts +2 -0
- package/lib/modules/logger/logMessageBuilder.ts +60 -0
- package/lib/modules/logger/logger.ts +7 -0
- package/lib/modules/logger/transports/consoleTransport.ts +37 -0
- package/lib/modules/networking/client/networkClient.ts +128 -0
- package/lib/modules/networking/client/networkClientInterface.ts +8 -0
- package/lib/modules/networking/handlers/requestHandler.ts +28 -0
- package/lib/modules/networking/index.ts +6 -0
- package/lib/modules/networking/manager/networkManager.ts +77 -0
- package/lib/modules/networking/models/globalRequestModel.ts +69 -0
- package/lib/modules/networking/models/requestModel.ts +164 -0
- package/lib/modules/networking/models/responseModel.ts +40 -0
- package/lib/modules/segmentor/core/segmentationManger.ts +22 -0
- package/lib/modules/segmentor/enums/segmentOperandRegexEnum.ts +10 -0
- package/lib/modules/segmentor/enums/segmentOperandValueEnum.ts +8 -0
- package/lib/modules/segmentor/enums/segmentOperatorValueEnum.ts +15 -0
- package/lib/modules/segmentor/evaluators/segmentEvaluator.ts +239 -0
- package/lib/modules/segmentor/evaluators/segmentOperandEvaluator.ts +199 -0
- package/lib/modules/segmentor/index.ts +3 -0
- package/lib/modules/segmentor/segmentation.ts +6 -0
- package/lib/modules/segmentor/utils/SegmentUtil.ts +23 -0
- package/lib/modules/storage/connector.ts +25 -0
- package/lib/modules/storage/connectors/index.ts +2 -0
- package/lib/modules/storage/connectors/memoryConnector.ts +115 -0
- package/lib/modules/storage/connectors/redisConnector.ts +180 -0
- package/lib/modules/storage/index.ts +1 -0
- package/lib/modules/storage/storage.ts +48 -0
- package/lib/services/CampaignDecisionService.ts +160 -0
- package/lib/services/HooksManager.ts +50 -0
- package/lib/services/SettingsManager.ts +167 -0
- package/lib/services/StorageService.ts +53 -0
- package/lib/services/UrlService.ts +50 -0
- package/lib/types/common.ts +13 -0
- package/lib/utils/CampaignUtil.ts +236 -0
- package/lib/utils/DataTypeUtil.ts +87 -0
- package/lib/utils/DecisionUtil.ts +180 -0
- package/lib/utils/FunctionUtil.ts +105 -0
- package/lib/utils/LogMessageUtil.ts +52 -0
- package/lib/utils/MegUtil.ts +408 -0
- package/lib/utils/NetworkUtil.ts +262 -0
- package/lib/utils/PromiseUtil.ts +10 -0
- package/lib/utils/SettingsUtil.ts +18 -0
- package/lib/utils/UuidUtil.ts +33 -0
- package/lib/utils/WebServiceUtil.ts +60 -0
- package/lib/utils/logMessageBuilder.ts +60 -0
- package/package.json +70 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { CampaignDecisionService } from '../services/CampaignDecisionService';
|
|
2
|
+
import { evaluateRule } from '../api/GetFlag';
|
|
3
|
+
import { CampaignTypeEnum } from '../enums/campaignTypeEnum';
|
|
4
|
+
import { SettingsModel } from '../models/SettingsModel';
|
|
5
|
+
import {
|
|
6
|
+
getBucketingSeed,
|
|
7
|
+
getCampaignIdsFromFeatureKey,
|
|
8
|
+
getCampaignsByGroupId,
|
|
9
|
+
getCampaignVariation,
|
|
10
|
+
getFeatureKeysFromCampaignIds,
|
|
11
|
+
getRuleTypeUsingCampaignIdFromFeature,
|
|
12
|
+
setCampaignAllocation,
|
|
13
|
+
} from './CampaignUtil';
|
|
14
|
+
import { isObject } from './DataTypeUtil';
|
|
15
|
+
import { cloneObject, getFeatureFromKey, getSpecificRulesBasedOnType } from './FunctionUtil';
|
|
16
|
+
import { checkWhitelistingAndPreSeg, evaluateTrafficAndGetVariation } from './DecisionUtil';
|
|
17
|
+
import { StorageDecorator } from '../decorators/StorageDecorator';
|
|
18
|
+
import { StorageService } from '../services/StorageService';
|
|
19
|
+
import { VariationModel } from '../models/VariationModel';
|
|
20
|
+
import { CampaignModel } from '../models/CampaignModel';
|
|
21
|
+
import { Deferred } from './PromiseUtil';
|
|
22
|
+
import { resolve } from 'path';
|
|
23
|
+
import { LogManager } from '../modules/logger';
|
|
24
|
+
import { Constants } from '../constants';
|
|
25
|
+
import { DecisionMaker } from '../modules/decision-maker';
|
|
26
|
+
|
|
27
|
+
export const evaluateGroups = async (
|
|
28
|
+
settings: SettingsModel,
|
|
29
|
+
featureKey: any,
|
|
30
|
+
feature: any,
|
|
31
|
+
listOfMegCampaignsGroups: any[],
|
|
32
|
+
evaluatedFeatureMap: Map<string, any>,
|
|
33
|
+
context: any,
|
|
34
|
+
storageService: StorageService,
|
|
35
|
+
campaignToSkip: any[],
|
|
36
|
+
decision: any,
|
|
37
|
+
): Promise<any> => {
|
|
38
|
+
let featureToSkip = [];
|
|
39
|
+
let eligibleCampaignsForGroup: Map<string, any[]> = new Map();
|
|
40
|
+
|
|
41
|
+
// get all feature keys from the list of meg campaigns
|
|
42
|
+
// evaluate each feature and get all campaigns for the feature
|
|
43
|
+
// add the campaigns if they are present in the groupto campaignMap
|
|
44
|
+
// check the eligible campaigns
|
|
45
|
+
for (let i = 0; i < listOfMegCampaignsGroups.length; i++) {
|
|
46
|
+
let campaignMap: Map<string, any[]> = new Map();
|
|
47
|
+
let groupId = listOfMegCampaignsGroups[i];
|
|
48
|
+
const { featureKeys, groupCampaignIds } = getFeatureKeysFromGroup(settings, groupId);
|
|
49
|
+
for (const featureKey of featureKeys) {
|
|
50
|
+
const feature = getFeatureFromKey(settings, featureKey);
|
|
51
|
+
const featureCampaignIds = getCampaignIdsFromFeatureKey(settings, featureKey);
|
|
52
|
+
if (featureToSkip.includes(featureKey)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const result = await evaluateFeatureRollOutRules(settings, feature, evaluatedFeatureMap, featureToSkip, context);
|
|
56
|
+
if (result) {
|
|
57
|
+
settings.getCampaigns().forEach((campaign) => {
|
|
58
|
+
// groupCampaignIds.includes(campaign.getId()) -> campaig we are adding should be in the group
|
|
59
|
+
// featureCampaignIds.includes(campaign.getId()) -> checks that campaign should be part of the feature that we evaluated
|
|
60
|
+
if (groupCampaignIds.includes(campaign.getId()) && featureCampaignIds.includes(campaign.getId())) {
|
|
61
|
+
if (!campaignMap.has(featureKey)) {
|
|
62
|
+
campaignMap.set(featureKey, []);
|
|
63
|
+
}
|
|
64
|
+
if (campaignMap.get(featureKey).findIndex((item) => item.key === campaign.getKey()) === -1) {
|
|
65
|
+
campaignMap.get(featureKey).push(campaign);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let campaignList = await getEligbleCampaigns(settings, campaignMap, context, storageService);
|
|
72
|
+
eligibleCampaignsForGroup.set(groupId, campaignList);
|
|
73
|
+
}
|
|
74
|
+
return await evaluateEligibleCampaigns(
|
|
75
|
+
settings,
|
|
76
|
+
featureKey,
|
|
77
|
+
feature,
|
|
78
|
+
eligibleCampaignsForGroup,
|
|
79
|
+
context,
|
|
80
|
+
campaignToSkip,
|
|
81
|
+
decision,
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export function getFeatureKeysFromGroup(settings: SettingsModel, groupId: any) {
|
|
86
|
+
let groupCampaignIds = getCampaignsByGroupId(settings, groupId);
|
|
87
|
+
let featureKeys = getFeatureKeysFromCampaignIds(settings, groupCampaignIds);
|
|
88
|
+
return { featureKeys, groupCampaignIds };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const evaluateFeatureRollOutRules = async (
|
|
92
|
+
settings: any,
|
|
93
|
+
feature: any,
|
|
94
|
+
evaluatedFeatureMap: Map<string, any>,
|
|
95
|
+
featureToSkip: any[],
|
|
96
|
+
context: any,
|
|
97
|
+
): Promise<any> => {
|
|
98
|
+
if (evaluatedFeatureMap.has(feature.key) && evaluatedFeatureMap.get(feature.key).hasOwnProperty('rolloutId')) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
const rollOutRules = getSpecificRulesBasedOnType(settings, feature.key, CampaignTypeEnum.ROLLOUT);
|
|
102
|
+
if (rollOutRules.length > 0) {
|
|
103
|
+
let ruleToTestForTraffic = null;
|
|
104
|
+
for (const rule of rollOutRules) {
|
|
105
|
+
const [evaluateRuleResult] = await evaluateRule(settings, feature, rule, context, false, {});
|
|
106
|
+
if (evaluateRuleResult) {
|
|
107
|
+
ruleToTestForTraffic = rule;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (ruleToTestForTraffic !== null) {
|
|
113
|
+
const campaign = new CampaignModel().modelFromDictionary(ruleToTestForTraffic);
|
|
114
|
+
const variation = evaluateTrafficAndGetVariation(settings, campaign, context.user.id);
|
|
115
|
+
if (isObject(variation) && Object.keys(variation).length > 0) {
|
|
116
|
+
evaluatedFeatureMap.set(feature.key, {
|
|
117
|
+
rolloutId: ruleToTestForTraffic.id,
|
|
118
|
+
rolloutKey: ruleToTestForTraffic.key,
|
|
119
|
+
rolloutVariationId: ruleToTestForTraffic.variations[0].id,
|
|
120
|
+
});
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// no rollout rule passed
|
|
125
|
+
featureToSkip.push(feature.key);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
// no rollout rule, evaluate experiments
|
|
129
|
+
LogManager.Instance.debug(`MEG: No rollout rule found for feature ${feature.key}, evaluating experiments...`);
|
|
130
|
+
return true;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const getEligbleCampaigns = async (
|
|
134
|
+
settings: any,
|
|
135
|
+
campaignMap: any,
|
|
136
|
+
context: any,
|
|
137
|
+
storageService: StorageService,
|
|
138
|
+
): Promise<any> => {
|
|
139
|
+
let eligibleCampaigns = [];
|
|
140
|
+
let eligibleCampaignsWithStorage = [];
|
|
141
|
+
let inEligibleCampaigns = [];
|
|
142
|
+
const campaignMapArray = Array.from<[string, CampaignModel[]]>(campaignMap);
|
|
143
|
+
for (const [featureKey, campaigns] of campaignMapArray) {
|
|
144
|
+
for (const campaign of campaigns) {
|
|
145
|
+
const storedData: Record<any, any> = await new StorageDecorator().getFeatureFromStorage(
|
|
146
|
+
featureKey,
|
|
147
|
+
context.user,
|
|
148
|
+
storageService,
|
|
149
|
+
);
|
|
150
|
+
if (storedData?.experimentVariationId) {
|
|
151
|
+
if (storedData.experimentKey && storedData.experimentKey === campaign.getKey()) {
|
|
152
|
+
const variation: VariationModel = getCampaignVariation(
|
|
153
|
+
settings,
|
|
154
|
+
storedData.experimentKey,
|
|
155
|
+
storedData.experimentVariationId,
|
|
156
|
+
);
|
|
157
|
+
if (variation) {
|
|
158
|
+
LogManager.Instance.debug(
|
|
159
|
+
`MEG: Campaign ${storedData.experimentKey} found in storage for user ${context.user.id}`,
|
|
160
|
+
);
|
|
161
|
+
eligibleCampaignsWithStorage.push(campaign);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (
|
|
167
|
+
(await new CampaignDecisionService().getDecision(
|
|
168
|
+
new CampaignModel().modelFromDictionary(campaign),
|
|
169
|
+
settings,
|
|
170
|
+
context,
|
|
171
|
+
)) &&
|
|
172
|
+
new CampaignDecisionService().isUserPartOfCampaign(context.user.id, campaign)
|
|
173
|
+
) {
|
|
174
|
+
LogManager.Instance.debug(`MEG: Campaign ${campaign.getKey()} is eligible for user ${context.user.id}`);
|
|
175
|
+
eligibleCampaigns.push(campaign);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
inEligibleCampaigns.push(campaign);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return Promise.resolve({
|
|
182
|
+
eligibleCampaigns,
|
|
183
|
+
eligibleCampaignsWithStorage,
|
|
184
|
+
inEligibleCampaigns,
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const evaluateEligibleCampaigns = async (
|
|
189
|
+
settings: any,
|
|
190
|
+
featureKey: any,
|
|
191
|
+
feature: any,
|
|
192
|
+
eligibleCampaignsForGroup: Map<string, any[]>,
|
|
193
|
+
context: any,
|
|
194
|
+
campaignToSkip: any[],
|
|
195
|
+
decision: any,
|
|
196
|
+
): Promise<any> => {
|
|
197
|
+
// getCampaignIds from featureKey
|
|
198
|
+
let winnerFromEachGroup = [];
|
|
199
|
+
const campaignIds = getCampaignIdsFromFeatureKey(settings, featureKey);
|
|
200
|
+
eligibleCampaignsForGroup.forEach((campaignList: any, groupId) => {
|
|
201
|
+
let megAlgoNumber =
|
|
202
|
+
typeof settings.groups[groupId].et !== 'undefined' ? settings.groups[groupId].et : Constants.RANDOM_ALGO;
|
|
203
|
+
if (campaignList.eligibleCampaignsWithStorage.length === 1) {
|
|
204
|
+
winnerFromEachGroup.push(campaignList.eligibleCampaignsWithStorage[0]);
|
|
205
|
+
LogManager.Instance.debug(
|
|
206
|
+
`MEG: Campaign ${campaignList.eligibleCampaignsWithStorage[0].getKey()} is the winner for group ${groupId} for user ${context.user.id}`,
|
|
207
|
+
);
|
|
208
|
+
} else if (campaignList.eligibleCampaignsWithStorage.length > 1 && megAlgoNumber === Constants.RANDOM_ALGO) {
|
|
209
|
+
winnerFromEachGroup.push(
|
|
210
|
+
normalizeAndFindWinningCampaign(campaignList.eligibleCampaignsWithStorage, context, campaignIds, groupId),
|
|
211
|
+
);
|
|
212
|
+
} else if (campaignList.eligibleCampaignsWithStorage.length > 1) {
|
|
213
|
+
winnerFromEachGroup.push(
|
|
214
|
+
advancedAlgoFindWinningCampaign(
|
|
215
|
+
settings,
|
|
216
|
+
campaignList.eligibleCampaignsWithStorage,
|
|
217
|
+
context,
|
|
218
|
+
campaignIds,
|
|
219
|
+
groupId,
|
|
220
|
+
),
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (campaignList.eligibleCampaignsWithStorage.length === 0) {
|
|
225
|
+
if (campaignList.eligibleCampaigns.length === 1) {
|
|
226
|
+
winnerFromEachGroup.push(campaignList.eligibleCampaigns[0]);
|
|
227
|
+
LogManager.Instance.debug(
|
|
228
|
+
`MEG: Campaign ${campaignList.eligibleCampaigns[0].getKey()} is the winner for group ${groupId} for user ${context.user.id}`,
|
|
229
|
+
);
|
|
230
|
+
} else if (campaignList.eligibleCampaigns.length > 1 && megAlgoNumber === Constants.RANDOM_ALGO) {
|
|
231
|
+
winnerFromEachGroup.push(
|
|
232
|
+
normalizeAndFindWinningCampaign(campaignList.eligibleCampaigns, context, campaignIds, groupId),
|
|
233
|
+
);
|
|
234
|
+
} else if (campaignList.eligibleCampaigns.length > 1) {
|
|
235
|
+
winnerFromEachGroup.push(
|
|
236
|
+
advancedAlgoFindWinningCampaign(settings, campaignList.eligibleCampaigns, context, campaignIds, groupId),
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
return await campaignToReturn(
|
|
242
|
+
settings,
|
|
243
|
+
feature,
|
|
244
|
+
eligibleCampaignsForGroup,
|
|
245
|
+
winnerFromEachGroup,
|
|
246
|
+
context,
|
|
247
|
+
campaignIds,
|
|
248
|
+
campaignToSkip,
|
|
249
|
+
decision,
|
|
250
|
+
);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const normalizeAndFindWinningCampaign = (
|
|
254
|
+
shortlistedCampaigns: any[],
|
|
255
|
+
context: any,
|
|
256
|
+
calledCampaignIds: any[],
|
|
257
|
+
groupId: any,
|
|
258
|
+
): any => {
|
|
259
|
+
// normalise the weights of all the shortlisted campaigns
|
|
260
|
+
shortlistedCampaigns.forEach((campaign) => {
|
|
261
|
+
campaign.weight = Math.floor(100 / shortlistedCampaigns.length);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// make shortlistedCampaigns as array of VariationModel
|
|
265
|
+
shortlistedCampaigns = shortlistedCampaigns.map((campaign) => new VariationModel().modelFromDictionary(campaign));
|
|
266
|
+
|
|
267
|
+
// re-distribute the traffic for each camapign
|
|
268
|
+
setCampaignAllocation(shortlistedCampaigns);
|
|
269
|
+
let winnerCampaign = new CampaignDecisionService().getVariation(
|
|
270
|
+
shortlistedCampaigns,
|
|
271
|
+
new DecisionMaker().calculateBucketValue(getBucketingSeed(context.user.id, undefined, groupId)),
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
LogManager.Instance.debug(
|
|
275
|
+
`MEG Random: Campaign ${winnerCampaign.getKey()} is the winner for group ${groupId} for user ${context.user.id}`,
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
if (winnerCampaign && calledCampaignIds.includes(winnerCampaign.getId())) {
|
|
279
|
+
return winnerCampaign;
|
|
280
|
+
}
|
|
281
|
+
return null;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const advancedAlgoFindWinningCampaign = (
|
|
285
|
+
settings: any,
|
|
286
|
+
shortlistedCampaigns: any[],
|
|
287
|
+
context: any,
|
|
288
|
+
calledCampaignIds: any[],
|
|
289
|
+
groupId: any,
|
|
290
|
+
) => {
|
|
291
|
+
let winnerCampaign = null;
|
|
292
|
+
let found = false; // flag to check whether winnerCampaign has been found or not and helps to break from the outer loop
|
|
293
|
+
let priorityOrder = typeof settings.groups[groupId].p !== 'undefined' ? settings.groups[groupId].p : {};
|
|
294
|
+
let wt = typeof settings.groups[groupId].wt !== 'undefined' ? settings.groups[groupId].wt : {};
|
|
295
|
+
|
|
296
|
+
for (let i = 0; i < priorityOrder.length; i++) {
|
|
297
|
+
for (let j = 0; j < shortlistedCampaigns.length; j++) {
|
|
298
|
+
if (shortlistedCampaigns[j].id === priorityOrder[i]) {
|
|
299
|
+
winnerCampaign = cloneObject(shortlistedCampaigns[j]);
|
|
300
|
+
found = true;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (found === true) break;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// If winnerCampaign not found through Priority, then go for weighted Random distribution and for that,
|
|
308
|
+
// Store the list of campaigns (participatingCampaigns) out of shortlistedCampaigns and their corresponding weights present in weightage distribution array (wt)
|
|
309
|
+
if (winnerCampaign === null) {
|
|
310
|
+
let participatingCampaignList = [];
|
|
311
|
+
// iterate over shortlisted campaigns and add weights from the weight array
|
|
312
|
+
for (let i = 0; i < shortlistedCampaigns.length; i++) {
|
|
313
|
+
let campaignId = shortlistedCampaigns[i].id;
|
|
314
|
+
if (typeof wt[campaignId] !== 'undefined') {
|
|
315
|
+
let clonedCampaign = cloneObject(shortlistedCampaigns[i]);
|
|
316
|
+
clonedCampaign.weight = wt[campaignId];
|
|
317
|
+
participatingCampaignList.push(clonedCampaign);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/* Finding winner campaign using weighted Distibution :
|
|
321
|
+
1. Re-distribute the traffic by assigning range values for each camapign in particaptingCampaignList
|
|
322
|
+
2. Calculate bucket value for the given userId and groupId
|
|
323
|
+
3. Get the winnerCampaign by checking the Start and End Bucket Allocations of each campaign
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
// make participatingCampaignList as array of VariationModel
|
|
327
|
+
participatingCampaignList = participatingCampaignList.map((campaign) =>
|
|
328
|
+
new VariationModel().modelFromDictionary(campaign),
|
|
329
|
+
);
|
|
330
|
+
setCampaignAllocation(participatingCampaignList);
|
|
331
|
+
winnerCampaign = new CampaignDecisionService().getVariation(
|
|
332
|
+
participatingCampaignList,
|
|
333
|
+
new DecisionMaker().calculateBucketValue(getBucketingSeed(context.user.id, undefined, groupId)),
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
// WinnerCampaign should not be null, in case when winnerCampaign hasn't been found through PriorityOrder and
|
|
337
|
+
// also shortlistedCampaigns and wt array does not have a single campaign id in common
|
|
338
|
+
LogManager.Instance.debug(
|
|
339
|
+
`MEG Advance: Campaign ${winnerCampaign.key} is the winner for group ${groupId} for user ${context.user.id}`,
|
|
340
|
+
);
|
|
341
|
+
if (calledCampaignIds.includes(winnerCampaign.id)) {
|
|
342
|
+
return winnerCampaign;
|
|
343
|
+
}
|
|
344
|
+
return null;
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
const campaignToReturn = async (
|
|
348
|
+
settings: any,
|
|
349
|
+
feature: any,
|
|
350
|
+
eligibleCampaignsForGroup: any,
|
|
351
|
+
winnerCampaigns: any,
|
|
352
|
+
context: any,
|
|
353
|
+
priorityCampaignIds: any,
|
|
354
|
+
campaignToSkip: any[],
|
|
355
|
+
decision: any,
|
|
356
|
+
): Promise<any> => {
|
|
357
|
+
const eligibleCampaignsForGroupArray = Array.from<[string, any[]]>(eligibleCampaignsForGroup);
|
|
358
|
+
for (const [groupId, campaignList] of eligibleCampaignsForGroupArray) {
|
|
359
|
+
let winnerFound = false;
|
|
360
|
+
let campaignToReturn = null;
|
|
361
|
+
for (const campaignId of priorityCampaignIds) {
|
|
362
|
+
const winnerCampaign = winnerCampaigns.find((campaign) => campaign?.id === campaignId);
|
|
363
|
+
if (winnerCampaign) {
|
|
364
|
+
campaignToReturn = winnerCampaign;
|
|
365
|
+
winnerFound = true;
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
if (
|
|
369
|
+
campaignToSkip.includes(campaignId) ||
|
|
370
|
+
getRuleTypeUsingCampaignIdFromFeature(feature, campaignId) === CampaignTypeEnum.ROLLOUT
|
|
371
|
+
) {
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
// check if campaignId is present in eligibleCampaignsWithStorage or eligibleCampaigns or inEligibleCampaigns
|
|
375
|
+
const campaign =
|
|
376
|
+
campaignList['eligibleCampaignsWithStorage'].find((campaign) => campaign.id === campaignId) ||
|
|
377
|
+
campaignList['eligibleCampaigns'].find((campaign) => campaign.id === campaignId) ||
|
|
378
|
+
campaignList['inEligibleCampaigns'].find((campaign) => campaign.id === campaignId);
|
|
379
|
+
if (campaign) {
|
|
380
|
+
continue;
|
|
381
|
+
} else {
|
|
382
|
+
campaignToSkip.push(campaignId);
|
|
383
|
+
return [false, null, null];
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (winnerFound) {
|
|
387
|
+
LogManager.Instance.info(`MEG: Campaign ${campaignToReturn.key} is the winner for user ${context.user.id}`);
|
|
388
|
+
const [megResult, whitelistedVariationInfoWithCampaign] = await evaluateRule(
|
|
389
|
+
settings,
|
|
390
|
+
feature,
|
|
391
|
+
campaignToReturn,
|
|
392
|
+
context,
|
|
393
|
+
true,
|
|
394
|
+
decision,
|
|
395
|
+
);
|
|
396
|
+
if (
|
|
397
|
+
isObject(whitelistedVariationInfoWithCampaign) &&
|
|
398
|
+
Object.keys(whitelistedVariationInfoWithCampaign).length > 0
|
|
399
|
+
) {
|
|
400
|
+
whitelistedVariationInfoWithCampaign.experiementId = campaignToReturn.id;
|
|
401
|
+
whitelistedVariationInfoWithCampaign.experiementKey = campaignToReturn.key;
|
|
402
|
+
return [true, whitelistedVariationInfoWithCampaign, null];
|
|
403
|
+
}
|
|
404
|
+
return [true, whitelistedVariationInfoWithCampaign, campaignToReturn];
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return [false, null, null];
|
|
408
|
+
};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { getUUID } from './UuidUtil';
|
|
2
|
+
import { getRandomNumber, getCurrentUnixTimestamp, getCurrentUnixTimestampInMillis } from './FunctionUtil';
|
|
3
|
+
|
|
4
|
+
import { dynamic } from '../types/common';
|
|
5
|
+
import { Constants } from '../constants';
|
|
6
|
+
import { SettingsModel } from '../models/SettingsModel';
|
|
7
|
+
import UrlService from '../services/UrlService';
|
|
8
|
+
import { UrlEnum } from '../enums/UrlEnum';
|
|
9
|
+
import { LogManager } from '../modules/logger';
|
|
10
|
+
import { EventEnum } from '../enums/EventEnum';
|
|
11
|
+
import { NetworkManager } from '../modules/networking';
|
|
12
|
+
import { RequestModel } from '../modules/networking';
|
|
13
|
+
import { HTTPS_PROTOCOL } from '../constants/url';
|
|
14
|
+
import { ResponseModel } from '../modules/networking';
|
|
15
|
+
import { isObject } from './DataTypeUtil';
|
|
16
|
+
import { HeadersEnum } from '../enums/HeadersEnum';
|
|
17
|
+
|
|
18
|
+
export class NetworkUtil {
|
|
19
|
+
getBasePropertiesForBulk(accountId: string, userId: string): Record<string, dynamic> {
|
|
20
|
+
const path: Record<string, dynamic> = {
|
|
21
|
+
sId: getCurrentUnixTimestamp(),
|
|
22
|
+
u: getUUID(userId, accountId),
|
|
23
|
+
};
|
|
24
|
+
return path;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
getSettingsPath(apikey: string, accountId: any): Record<string, dynamic> {
|
|
28
|
+
const path: Record<string, dynamic> = {
|
|
29
|
+
i: `${apikey}`,
|
|
30
|
+
r: Math.random(),
|
|
31
|
+
a: accountId,
|
|
32
|
+
};
|
|
33
|
+
return path;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
getTrackEventPath(event: string, accountId: string, userId: string): Record<string, dynamic> {
|
|
37
|
+
const path: Record<string, dynamic> = {
|
|
38
|
+
event_type: event,
|
|
39
|
+
account_id: accountId,
|
|
40
|
+
uId: userId,
|
|
41
|
+
u: getUUID(userId, accountId),
|
|
42
|
+
sdk: Constants.SDK_NAME,
|
|
43
|
+
'sdk-v': Constants.SDK_VERSION,
|
|
44
|
+
random: getRandomNumber(),
|
|
45
|
+
ap: Constants.AP,
|
|
46
|
+
sId: getCurrentUnixTimestamp(),
|
|
47
|
+
ed: JSON.stringify({ p: 'server' }),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return path;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
getEventBatchingQueryParams(accountId: string): Record<string, dynamic> {
|
|
54
|
+
const path: Record<string, dynamic> = {
|
|
55
|
+
a: accountId,
|
|
56
|
+
sd: Constants.SDK_NAME,
|
|
57
|
+
sv: Constants.SDK_VERSION,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return path;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Builds generic properties for different tracking calls required by VWO servers.
|
|
65
|
+
* @param {Object} configObj
|
|
66
|
+
* @param {String} eventName
|
|
67
|
+
* @returns properties
|
|
68
|
+
*/
|
|
69
|
+
getEventsBaseProperties(setting: any, eventName, visitorUserAgent = '', ipAddress = ''): any {
|
|
70
|
+
const sdkKey = setting.sdkKey;
|
|
71
|
+
|
|
72
|
+
let properties = Object.assign({
|
|
73
|
+
en: eventName,
|
|
74
|
+
a: setting.accountId,
|
|
75
|
+
env: sdkKey,
|
|
76
|
+
eTime: getCurrentUnixTimestampInMillis(),
|
|
77
|
+
random: getRandomNumber(),
|
|
78
|
+
p: 'FS',
|
|
79
|
+
visitor_ua: visitorUserAgent,
|
|
80
|
+
visitor_ip: ipAddress,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
properties.url = Constants.HTTPS_PROTOCOL + UrlService.getBaseUrl() + UrlEnum.EVENTS;
|
|
84
|
+
return properties;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Builds generic payload required by all the different tracking calls.
|
|
89
|
+
* @param {Object} settings settings file
|
|
90
|
+
* @param {String} userId user id
|
|
91
|
+
* @param {String} eventName event name
|
|
92
|
+
* @returns properties
|
|
93
|
+
*/
|
|
94
|
+
getEventBasePayload(settings: any, userId: any, eventName: string, visitorUserAgent = '', ipAddress = '') {
|
|
95
|
+
const uuid = getUUID(userId, settings.accountId);
|
|
96
|
+
const sdkKey = settings.sdkKey;
|
|
97
|
+
|
|
98
|
+
let props: {
|
|
99
|
+
vwo_sdkName: string;
|
|
100
|
+
vwo_sdkVersion: string;
|
|
101
|
+
vwo_envKey: any;
|
|
102
|
+
id?: any;
|
|
103
|
+
variation?: any;
|
|
104
|
+
isFirst?: any;
|
|
105
|
+
isCustomEvent?: boolean;
|
|
106
|
+
} = {
|
|
107
|
+
vwo_sdkName: Constants.SDK_NAME,
|
|
108
|
+
vwo_sdkVersion: Constants.SDK_VERSION,
|
|
109
|
+
vwo_envKey: sdkKey,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
let properties = {
|
|
113
|
+
d: {
|
|
114
|
+
msgId: `${uuid}-${getCurrentUnixTimestampInMillis()}`,
|
|
115
|
+
visId: uuid,
|
|
116
|
+
sessionId: getCurrentUnixTimestamp(),
|
|
117
|
+
visitor_ua: visitorUserAgent,
|
|
118
|
+
visitor_ip: ipAddress,
|
|
119
|
+
event: {
|
|
120
|
+
props: props,
|
|
121
|
+
name: eventName,
|
|
122
|
+
time: getCurrentUnixTimestampInMillis(),
|
|
123
|
+
},
|
|
124
|
+
visitor: {
|
|
125
|
+
props: {
|
|
126
|
+
vwo_fs_environment: sdkKey,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
return properties;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Builds payload to track the visitor.
|
|
137
|
+
* @param {Object} configObj
|
|
138
|
+
* @param {String} userId
|
|
139
|
+
* @param {String} eventName
|
|
140
|
+
* @param {String} campaignId
|
|
141
|
+
* @param {Number} variationId
|
|
142
|
+
* @returns track-user payload
|
|
143
|
+
*/
|
|
144
|
+
getTrackUserPayloadData(
|
|
145
|
+
settings: any,
|
|
146
|
+
userId: any,
|
|
147
|
+
eventName: string,
|
|
148
|
+
campaignId: any,
|
|
149
|
+
variationId: any,
|
|
150
|
+
visitorUserAgent = '',
|
|
151
|
+
ipAddress = '',
|
|
152
|
+
) {
|
|
153
|
+
const properties = this.getEventBasePayload(settings, userId, eventName, visitorUserAgent, ipAddress);
|
|
154
|
+
|
|
155
|
+
properties.d.event.props.id = campaignId;
|
|
156
|
+
properties.d.event.props.variation = variationId;
|
|
157
|
+
properties.d.event.props.isFirst = 1;
|
|
158
|
+
|
|
159
|
+
LogManager.Instance.debug(
|
|
160
|
+
`IMPRESSION_FOR_EVENT_ARCH_TRACK_USER: Impression built for vwo_variationShown event for Account ID:${settings.accountId}, User ID:${userId}, and Campaign ID:${campaignId}`,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
return properties;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
getTrackGoalPayloadData(
|
|
167
|
+
settings: any,
|
|
168
|
+
userId: any,
|
|
169
|
+
eventName: string,
|
|
170
|
+
eventProperties: any,
|
|
171
|
+
visitorUserAgent = '',
|
|
172
|
+
ipAddress = '',
|
|
173
|
+
) {
|
|
174
|
+
const properties = this.getEventBasePayload(settings, userId, eventName, visitorUserAgent, ipAddress);
|
|
175
|
+
properties.d.event.props.isCustomEvent = true;
|
|
176
|
+
properties.d.event.props.variation = 1; // temporary value
|
|
177
|
+
properties.d.event.props.id = 1; // temporary value
|
|
178
|
+
|
|
179
|
+
if (eventProperties && isObject(eventProperties) && Object.keys(eventProperties).length > 0) {
|
|
180
|
+
for (const prop in eventProperties) {
|
|
181
|
+
properties.d.event.props[prop] = eventProperties[prop];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
LogManager.Instance.debug(
|
|
186
|
+
`IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL: Impression built for ${eventName} event for Account ID:${settings.accountId}, User ID:${userId}`,
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
return properties;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
getAttributePayloadData(
|
|
193
|
+
settings: any,
|
|
194
|
+
userId: any,
|
|
195
|
+
eventName: string,
|
|
196
|
+
attributeKey: any,
|
|
197
|
+
attributeValue: any,
|
|
198
|
+
visitorUserAgent = '',
|
|
199
|
+
ipAddress = '',
|
|
200
|
+
) {
|
|
201
|
+
const properties = this.getEventBasePayload(settings, userId, eventName, visitorUserAgent, ipAddress);
|
|
202
|
+
|
|
203
|
+
properties.d.event.props.isCustomEvent = true;
|
|
204
|
+
properties.d.event.props[Constants.VWO_FS_ENVIRONMENT] = settings.sdkKey;
|
|
205
|
+
properties.d.visitor.props[attributeKey] = attributeValue;
|
|
206
|
+
|
|
207
|
+
LogManager.Instance.debug(
|
|
208
|
+
`IMPRESSION_FOR_EVENT_ARCH_SYNC_VISITOR_PROP: Impression built for ${eventName} event for Account ID:${settings.accountId}, User ID:${userId}`,
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
return properties;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
sendPostApiRequest(properties: any, payload: any) {
|
|
215
|
+
NetworkManager.Instance.attachClient();
|
|
216
|
+
|
|
217
|
+
const headers: Record<string, string> = {};
|
|
218
|
+
|
|
219
|
+
const userAgent = payload.d.visitor_ua;
|
|
220
|
+
const ipAddress = payload.d.visitor_ip;
|
|
221
|
+
|
|
222
|
+
// Set headers
|
|
223
|
+
if (userAgent) headers[HeadersEnum.USER_AGENT] = userAgent;
|
|
224
|
+
if (ipAddress) headers[HeadersEnum.IP] = ipAddress;
|
|
225
|
+
|
|
226
|
+
const request: RequestModel = new RequestModel(
|
|
227
|
+
UrlService.getBaseUrl(),
|
|
228
|
+
'POST',
|
|
229
|
+
UrlEnum.EVENTS,
|
|
230
|
+
properties,
|
|
231
|
+
payload,
|
|
232
|
+
headers,
|
|
233
|
+
null,
|
|
234
|
+
UrlService.getPort(),
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
NetworkManager.Instance.post(request).catch((err: ResponseModel) => {
|
|
238
|
+
console.log('error', err);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async sendGetApiRequest(properties: any, endpoint: any): Promise<any> {
|
|
243
|
+
NetworkManager.Instance.attachClient();
|
|
244
|
+
const request: RequestModel = new RequestModel(
|
|
245
|
+
UrlService.getBaseUrl(),
|
|
246
|
+
'Get',
|
|
247
|
+
endpoint,
|
|
248
|
+
properties,
|
|
249
|
+
null,
|
|
250
|
+
null,
|
|
251
|
+
null,
|
|
252
|
+
UrlService.getPort(),
|
|
253
|
+
);
|
|
254
|
+
try {
|
|
255
|
+
const response: ResponseModel = await NetworkManager.Instance.get(request);
|
|
256
|
+
return response; // Return the response model
|
|
257
|
+
} catch (err) {
|
|
258
|
+
console.error('Error occurred while sending GET request:', err);
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { setVariationAllocation } from '../utils/CampaignUtil';
|
|
2
|
+
import { SettingsModel } from '../models/SettingsModel';
|
|
3
|
+
import { CampaignModel } from '../models/CampaignModel';
|
|
4
|
+
import { dynamic } from '../types/common';
|
|
5
|
+
import { FeatureModel } from '../models/FeatureModel';
|
|
6
|
+
|
|
7
|
+
export function processSettings(settings: SettingsModel): SettingsModel {
|
|
8
|
+
const parsedSettings: SettingsModel = new SettingsModel(settings);
|
|
9
|
+
const features: Array<FeatureModel> = parsedSettings?.getFeatures();
|
|
10
|
+
// features.forEach((feature: FeatureModel) => {
|
|
11
|
+
// feature.getCampaigns().forEach((campaign: CampaignModel) => {
|
|
12
|
+
// campaign.setFeatureDetails(feature.getId(), feature.getKey());
|
|
13
|
+
// setVariationAllocation(campaign.getVariations(), feature.getVariables());
|
|
14
|
+
// });
|
|
15
|
+
// });
|
|
16
|
+
|
|
17
|
+
return parsedSettings;
|
|
18
|
+
}
|