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.
Files changed (385) hide show
  1. package/CONTRIBUTING.md +46 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +18 -0
  4. package/README.md +52 -0
  5. package/dist/VWO.d.ts +9 -0
  6. package/dist/VWO.js +100 -0
  7. package/dist/VWO.js.map +1 -0
  8. package/dist/VWOBuilder.d.ts +48 -0
  9. package/dist/VWOBuilder.js +173 -0
  10. package/dist/VWOBuilder.js.map +1 -0
  11. package/dist/VWOClient.d.ts +20 -0
  12. package/dist/VWOClient.js +249 -0
  13. package/dist/VWOClient.js.map +1 -0
  14. package/dist/api/GetFlag.d.ts +19 -0
  15. package/dist/api/GetFlag.js +394 -0
  16. package/dist/api/GetFlag.js.map +1 -0
  17. package/dist/api/GetVariable.d.ts +0 -0
  18. package/dist/api/GetVariable.js +1 -0
  19. package/dist/api/GetVariable.js.map +1 -0
  20. package/dist/api/GetVariables.d.ts +0 -0
  21. package/dist/api/GetVariables.js +1 -0
  22. package/dist/api/GetVariables.js.map +1 -0
  23. package/dist/api/SetAttribute.d.ts +7 -0
  24. package/dist/api/SetAttribute.js +62 -0
  25. package/dist/api/SetAttribute.js.map +1 -0
  26. package/dist/api/Track.js +76 -0
  27. package/dist/api/Track.js.map +1 -0
  28. package/dist/api/TrackEvent.d.ts +8 -0
  29. package/dist/api/TrackEvent.js +78 -0
  30. package/dist/api/TrackEvent.js.map +1 -0
  31. package/dist/constants/index.d.ts +24 -0
  32. package/dist/constants/index.js +31 -0
  33. package/dist/constants/index.js.map +1 -0
  34. package/dist/constants/url.d.ts +6 -0
  35. package/dist/constants/url.js +10 -0
  36. package/dist/constants/url.js.map +1 -0
  37. package/dist/decision-maker/index.js +75 -0
  38. package/dist/decision-maker/index.js.map +1 -0
  39. package/dist/decorators/StorageDecorator.d.ts +12 -0
  40. package/dist/decorators/StorageDecorator.js +119 -0
  41. package/dist/decorators/StorageDecorator.js.map +1 -0
  42. package/dist/enums/ApiEnum.d.ts +4 -0
  43. package/dist/enums/ApiEnum.js +9 -0
  44. package/dist/enums/ApiEnum.js.map +1 -0
  45. package/dist/enums/EventEnum.d.ts +4 -0
  46. package/dist/enums/EventEnum.js +9 -0
  47. package/dist/enums/EventEnum.js.map +1 -0
  48. package/dist/enums/HeadersEnum.d.ts +4 -0
  49. package/dist/enums/HeadersEnum.js +9 -0
  50. package/dist/enums/HeadersEnum.js.map +1 -0
  51. package/dist/enums/HooksEnum.d.ts +7 -0
  52. package/dist/enums/HooksEnum.js +8 -0
  53. package/dist/enums/HooksEnum.js.map +1 -0
  54. package/dist/enums/LogLevelEnum.d.ts +7 -0
  55. package/dist/enums/LogLevelEnum.js +12 -0
  56. package/dist/enums/LogLevelEnum.js.map +1 -0
  57. package/dist/enums/StatusEnum.d.ts +4 -0
  58. package/dist/enums/StorageEnum.d.ts +8 -0
  59. package/dist/enums/StorageEnum.js +13 -0
  60. package/dist/enums/StorageEnum.js.map +1 -0
  61. package/dist/enums/UrlEnum.d.ts +13 -0
  62. package/dist/enums/UrlEnum.js +18 -0
  63. package/dist/enums/UrlEnum.js.map +1 -0
  64. package/dist/enums/campaignTypeEnum.d.ts +5 -0
  65. package/dist/enums/campaignTypeEnum.js +10 -0
  66. package/dist/enums/campaignTypeEnum.js.map +1 -0
  67. package/dist/enums/logMessages/DbugLogMessageEnum.js +1 -0
  68. package/dist/enums/logMessages/DbugLogMessageEnum.js.map +1 -0
  69. package/dist/enums/logMessages/DebugLogMessageEnum.d.ts +3 -0
  70. package/dist/enums/logMessages/ErorLogMessageEnum.js +1 -0
  71. package/dist/enums/logMessages/ErorLogMessageEnum.js.map +1 -0
  72. package/dist/enums/logMessages/ErrorLogMessageEnum.d.ts +3 -0
  73. package/dist/enums/logMessages/debugLogMessageEnum.js +8 -0
  74. package/dist/enums/logMessages/debugLogMessageEnum.js.map +1 -0
  75. package/dist/enums/logMessages/errorLogMessageEnum.js +8 -0
  76. package/dist/enums/logMessages/errorLogMessageEnum.js.map +1 -0
  77. package/dist/enums/statusEnum.js +9 -0
  78. package/dist/enums/statusEnum.js.map +1 -0
  79. package/dist/index.d.ts +1 -0
  80. package/dist/index.js +7 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/logger/core/logManager.js +97 -0
  83. package/dist/logger/core/logManager.js.map +1 -0
  84. package/dist/logger/core/transportManager.js +60 -0
  85. package/dist/logger/core/transportManager.js.map +1 -0
  86. package/dist/logger/enums/logLevelEnum.js +12 -0
  87. package/dist/logger/enums/logLevelEnum.js.map +1 -0
  88. package/dist/logger/index.js +8 -0
  89. package/dist/logger/index.js.map +1 -0
  90. package/dist/logger/logMessageBuilder.js +43 -0
  91. package/dist/logger/logMessageBuilder.js.map +1 -0
  92. package/dist/logger/logger.js +10 -0
  93. package/dist/logger/logger.js.map +1 -0
  94. package/dist/logger/transports/consoleTransport.js +32 -0
  95. package/dist/logger/transports/consoleTransport.js.map +1 -0
  96. package/dist/models/CampaignModel.d.ts +32 -0
  97. package/dist/models/CampaignModel.js +149 -0
  98. package/dist/models/CampaignModel.js.map +1 -0
  99. package/dist/models/FeatureModel.d.ts +20 -0
  100. package/dist/models/FeatureModel.js +72 -0
  101. package/dist/models/FeatureModel.js.map +1 -0
  102. package/dist/models/ImpactCampaignModel.d.ts +7 -0
  103. package/dist/models/ImpactCampaignModel.js +21 -0
  104. package/dist/models/ImpactCampaignModel.js.map +1 -0
  105. package/dist/models/MetricModel.d.ts +12 -0
  106. package/dist/models/MetricModel.js +25 -0
  107. package/dist/models/MetricModel.js.map +1 -0
  108. package/dist/models/RuleModel.d.ts +11 -0
  109. package/dist/models/RuleModel.js +29 -0
  110. package/dist/models/RuleModel.js.map +1 -0
  111. package/dist/models/SettingsModel.d.ts +28 -0
  112. package/dist/models/SettingsModel.js +70 -0
  113. package/dist/models/SettingsModel.js.map +1 -0
  114. package/dist/models/VariableModel.d.ts +18 -0
  115. package/dist/models/VariableModel.js +38 -0
  116. package/dist/models/VariableModel.js.map +1 -0
  117. package/dist/models/VariationModel.d.ts +29 -0
  118. package/dist/models/VariationModel.js +80 -0
  119. package/dist/models/VariationModel.js.map +1 -0
  120. package/dist/models/schemas/SettingsSchemaValidation.d.ts +13 -0
  121. package/dist/models/schemas/SettingsSchemaValidation.js +70 -0
  122. package/dist/models/schemas/SettingsSchemaValidation.js.map +1 -0
  123. package/dist/modules/decision-maker/index.d.ts +38 -0
  124. package/dist/modules/decision-maker/index.js +67 -0
  125. package/dist/modules/decision-maker/index.js.map +1 -0
  126. package/dist/modules/logger/core/logManager.d.ts +40 -0
  127. package/dist/modules/logger/core/logManager.js +97 -0
  128. package/dist/modules/logger/core/logManager.js.map +1 -0
  129. package/dist/modules/logger/core/transportManager.d.ts +22 -0
  130. package/dist/modules/logger/core/transportManager.js +60 -0
  131. package/dist/modules/logger/core/transportManager.js.map +1 -0
  132. package/dist/modules/logger/enums/logLevelEnum.d.ts +7 -0
  133. package/dist/modules/logger/enums/logLevelEnum.js +12 -0
  134. package/dist/modules/logger/enums/logLevelEnum.js.map +1 -0
  135. package/dist/modules/logger/index.d.ts +2 -0
  136. package/dist/modules/logger/index.js +8 -0
  137. package/dist/modules/logger/index.js.map +1 -0
  138. package/dist/modules/logger/logMessageBuilder.d.ts +21 -0
  139. package/dist/modules/logger/logMessageBuilder.js +43 -0
  140. package/dist/modules/logger/logMessageBuilder.js.map +1 -0
  141. package/dist/modules/logger/logger.d.ts +7 -0
  142. package/dist/modules/logger/logger.js +10 -0
  143. package/dist/modules/logger/logger.js.map +1 -0
  144. package/dist/modules/logger/transports/consoleTransport.d.ts +12 -0
  145. package/dist/modules/logger/transports/consoleTransport.js +32 -0
  146. package/dist/modules/logger/transports/consoleTransport.js.map +1 -0
  147. package/dist/modules/networking/client/networkClient.d.ts +7 -0
  148. package/dist/modules/networking/client/networkClient.js +117 -0
  149. package/dist/modules/networking/client/networkClient.js.map +1 -0
  150. package/dist/modules/networking/client/networkClientInterface.d.ts +6 -0
  151. package/dist/modules/networking/client/networkClientInterface.js +3 -0
  152. package/dist/modules/networking/client/networkClientInterface.js.map +1 -0
  153. package/dist/modules/networking/handlers/requestHandler.d.ts +5 -0
  154. package/dist/modules/networking/handlers/requestHandler.js +29 -0
  155. package/dist/modules/networking/handlers/requestHandler.js.map +1 -0
  156. package/dist/modules/networking/index.d.ts +6 -0
  157. package/dist/modules/networking/index.js +14 -0
  158. package/dist/modules/networking/index.js.map +1 -0
  159. package/dist/modules/networking/manager/networkManager.d.ts +16 -0
  160. package/dist/modules/networking/manager/networkManager.js +72 -0
  161. package/dist/modules/networking/manager/networkManager.js.map +1 -0
  162. package/dist/modules/networking/models/globalRequestModel.d.ts +22 -0
  163. package/dist/modules/networking/models/globalRequestModel.js +51 -0
  164. package/dist/modules/networking/models/globalRequestModel.js.map +1 -0
  165. package/dist/modules/networking/models/requestModel.d.ts +32 -0
  166. package/dist/modules/networking/models/requestModel.js +128 -0
  167. package/dist/modules/networking/models/requestModel.js.map +1 -0
  168. package/dist/modules/networking/models/responseModel.d.ts +15 -0
  169. package/dist/modules/networking/models/responseModel.js +34 -0
  170. package/dist/modules/networking/models/responseModel.js.map +1 -0
  171. package/dist/modules/segmentor/core/segmentationManger.d.ts +10 -0
  172. package/dist/modules/segmentor/core/segmentationManger.js +68 -0
  173. package/dist/modules/segmentor/core/segmentationManger.js.map +1 -0
  174. package/dist/modules/segmentor/enums/segmentOperandRegexEnum.d.ts +10 -0
  175. package/dist/modules/segmentor/enums/segmentOperandRegexEnum.js +15 -0
  176. package/dist/modules/segmentor/enums/segmentOperandRegexEnum.js.map +1 -0
  177. package/dist/modules/segmentor/enums/segmentOperandValueEnum.d.ts +8 -0
  178. package/dist/modules/segmentor/enums/segmentOperandValueEnum.js +13 -0
  179. package/dist/modules/segmentor/enums/segmentOperandValueEnum.js.map +1 -0
  180. package/dist/modules/segmentor/enums/segmentOperatorValueEnum.d.ts +15 -0
  181. package/dist/modules/segmentor/enums/segmentOperatorValueEnum.js +20 -0
  182. package/dist/modules/segmentor/enums/segmentOperatorValueEnum.js.map +1 -0
  183. package/dist/modules/segmentor/evaluators/segmentEvaluator.d.ts +15 -0
  184. package/dist/modules/segmentor/evaluators/segmentEvaluator.js +379 -0
  185. package/dist/modules/segmentor/evaluators/segmentEvaluator.js.map +1 -0
  186. package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.d.ts +12 -0
  187. package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.js +248 -0
  188. package/dist/modules/segmentor/evaluators/segmentOperandEvaluator.js.map +1 -0
  189. package/dist/modules/segmentor/index.d.ts +3 -0
  190. package/dist/modules/segmentor/index.js +8 -0
  191. package/dist/modules/segmentor/index.js.map +1 -0
  192. package/dist/modules/segmentor/segmentation.d.ts +5 -0
  193. package/dist/modules/segmentor/segmentation.js +3 -0
  194. package/dist/modules/segmentor/segmentation.js.map +1 -0
  195. package/dist/modules/segmentor/utils/SegmentUtil.d.ts +2 -0
  196. package/dist/modules/segmentor/utils/SegmentUtil.js +26 -0
  197. package/dist/modules/segmentor/utils/SegmentUtil.js.map +1 -0
  198. package/dist/modules/storage/connector.d.ts +14 -0
  199. package/dist/modules/storage/connector.js +10 -0
  200. package/dist/modules/storage/connector.js.map +1 -0
  201. package/dist/modules/storage/connectors/index.d.ts +0 -0
  202. package/dist/modules/storage/connectors/index.js +3 -0
  203. package/dist/modules/storage/connectors/index.js.map +1 -0
  204. package/dist/modules/storage/connectors/memoryConnector.d.ts +26 -0
  205. package/dist/modules/storage/connectors/memoryConnector.js +103 -0
  206. package/dist/modules/storage/connectors/memoryConnector.js.map +1 -0
  207. package/dist/modules/storage/connectors/redisConnector.d.ts +0 -0
  208. package/dist/modules/storage/connectors/redisConnector.js +181 -0
  209. package/dist/modules/storage/connectors/redisConnector.js.map +1 -0
  210. package/dist/modules/storage/index.d.ts +1 -0
  211. package/dist/modules/storage/index.js +6 -0
  212. package/dist/modules/storage/index.js.map +1 -0
  213. package/dist/modules/storage/storage.d.ts +10 -0
  214. package/dist/modules/storage/storage.js +50 -0
  215. package/dist/modules/storage/storage.js.map +1 -0
  216. package/dist/networking/client/networkClient.js +117 -0
  217. package/dist/networking/client/networkClient.js.map +1 -0
  218. package/dist/networking/client/networkClientInterface.js +3 -0
  219. package/dist/networking/client/networkClientInterface.js.map +1 -0
  220. package/dist/networking/handlers/requestHandler.js +29 -0
  221. package/dist/networking/handlers/requestHandler.js.map +1 -0
  222. package/dist/networking/index.js +14 -0
  223. package/dist/networking/index.js.map +1 -0
  224. package/dist/networking/manager/networkManager.js +72 -0
  225. package/dist/networking/manager/networkManager.js.map +1 -0
  226. package/dist/networking/models/globalRequestModel.js +51 -0
  227. package/dist/networking/models/globalRequestModel.js.map +1 -0
  228. package/dist/networking/models/requestModel.js +107 -0
  229. package/dist/networking/models/requestModel.js.map +1 -0
  230. package/dist/networking/models/responseModel.js +34 -0
  231. package/dist/networking/models/responseModel.js.map +1 -0
  232. package/dist/segmentor/core/segmentationManger.js +25 -0
  233. package/dist/segmentor/core/segmentationManger.js.map +1 -0
  234. package/dist/segmentor/enums/segmentOperandRegexEnum.js +15 -0
  235. package/dist/segmentor/enums/segmentOperandRegexEnum.js.map +1 -0
  236. package/dist/segmentor/enums/segmentOperandValueEnum.js +13 -0
  237. package/dist/segmentor/enums/segmentOperandValueEnum.js.map +1 -0
  238. package/dist/segmentor/enums/segmentOperatorValueEnum.js +12 -0
  239. package/dist/segmentor/enums/segmentOperatorValueEnum.js.map +1 -0
  240. package/dist/segmentor/evaluators/segmentEvaluator.js +52 -0
  241. package/dist/segmentor/evaluators/segmentEvaluator.js.map +1 -0
  242. package/dist/segmentor/evaluators/segmentOperandEvaluator.js +158 -0
  243. package/dist/segmentor/evaluators/segmentOperandEvaluator.js.map +1 -0
  244. package/dist/segmentor/index.js +8 -0
  245. package/dist/segmentor/index.js.map +1 -0
  246. package/dist/segmentor/segmentation.js +3 -0
  247. package/dist/segmentor/segmentation.js.map +1 -0
  248. package/dist/segmentor/utils/SegmentUtil.js +27 -0
  249. package/dist/segmentor/utils/SegmentUtil.js.map +1 -0
  250. package/dist/services/CampaignDecisionService.d.ts +44 -0
  251. package/dist/services/CampaignDecisionService.js +175 -0
  252. package/dist/services/CampaignDecisionService.js.map +1 -0
  253. package/dist/services/HooksManager.d.ts +27 -0
  254. package/dist/services/HooksManager.js +40 -0
  255. package/dist/services/HooksManager.js.map +1 -0
  256. package/dist/services/SettingsManager.d.ts +21 -0
  257. package/dist/services/SettingsManager.js +168 -0
  258. package/dist/services/SettingsManager.js.map +1 -0
  259. package/dist/services/StorageService.d.ts +5 -0
  260. package/dist/services/StorageService.js +94 -0
  261. package/dist/services/StorageService.js.map +1 -0
  262. package/dist/services/UrlService.d.ts +13 -0
  263. package/dist/services/UrlService.js +37 -0
  264. package/dist/services/UrlService.js.map +1 -0
  265. package/dist/types/common.d.ts +2 -0
  266. package/dist/types/common.js +3 -0
  267. package/dist/types/common.js.map +1 -0
  268. package/dist/utils/CampaignUtil.d.ts +23 -0
  269. package/dist/utils/CampaignUtil.js +228 -0
  270. package/dist/utils/CampaignUtil.js.map +1 -0
  271. package/dist/utils/DataTypeUtil.d.ts +17 -0
  272. package/dist/utils/DataTypeUtil.js +86 -0
  273. package/dist/utils/DataTypeUtil.js.map +1 -0
  274. package/dist/utils/DecisionUtil.d.ts +4 -0
  275. package/dist/utils/DecisionUtil.js +197 -0
  276. package/dist/utils/DecisionUtil.js.map +1 -0
  277. package/dist/utils/FunctionUtil.d.ts +13 -0
  278. package/dist/utils/FunctionUtil.js +121 -0
  279. package/dist/utils/FunctionUtil.js.map +1 -0
  280. package/dist/utils/LogMessageUtil.d.ts +16 -0
  281. package/dist/utils/LogMessageUtil.js +53 -0
  282. package/dist/utils/LogMessageUtil.js.map +1 -0
  283. package/dist/utils/MegUtil.d.ts +7 -0
  284. package/dist/utils/MegUtil.js +413 -0
  285. package/dist/utils/MegUtil.js.map +1 -0
  286. package/dist/utils/NetworkUtil.d.ts +140 -0
  287. package/dist/utils/NetworkUtil.js +238 -0
  288. package/dist/utils/NetworkUtil.js.map +1 -0
  289. package/dist/utils/PromiseUtil.d.ts +1 -0
  290. package/dist/utils/PromiseUtil.js +13 -0
  291. package/dist/utils/PromiseUtil.js.map +1 -0
  292. package/dist/utils/SettingsUtil.d.ts +2 -0
  293. package/dist/utils/SettingsUtil.js +17 -0
  294. package/dist/utils/SettingsUtil.js.map +1 -0
  295. package/dist/utils/UuidUtil.d.ts +2 -0
  296. package/dist/utils/UuidUtil.js +30 -0
  297. package/dist/utils/UuidUtil.js.map +1 -0
  298. package/dist/utils/WebServiceUtil.d.ts +4 -0
  299. package/dist/utils/WebServiceUtil.js +93 -0
  300. package/dist/utils/WebServiceUtil.js.map +1 -0
  301. package/dist/utils/logMessageBuilder.d.ts +21 -0
  302. package/dist/utils/logMessageBuilder.js +43 -0
  303. package/dist/utils/logMessageBuilder.js.map +1 -0
  304. package/lib/VWO.ts +55 -0
  305. package/lib/VWOBuilder.ts +237 -0
  306. package/lib/VWOClient.ts +321 -0
  307. package/lib/api/GetFlag.ts +458 -0
  308. package/lib/api/GetVariable.ts +0 -0
  309. package/lib/api/GetVariables.ts +0 -0
  310. package/lib/api/SetAttribute.ts +33 -0
  311. package/lib/api/TrackEvent.ts +52 -0
  312. package/lib/constants/index.ts +35 -0
  313. package/lib/constants/url.ts +7 -0
  314. package/lib/decorators/StorageDecorator.ts +98 -0
  315. package/lib/enums/ApiEnum.ts +4 -0
  316. package/lib/enums/EventEnum.ts +4 -0
  317. package/lib/enums/HeadersEnum.ts +4 -0
  318. package/lib/enums/HooksEnum.ts +11 -0
  319. package/lib/enums/LogLevelEnum.ts +7 -0
  320. package/lib/enums/StatusEnum.ts +4 -0
  321. package/lib/enums/StorageEnum.ts +8 -0
  322. package/lib/enums/UrlEnum.ts +13 -0
  323. package/lib/enums/campaignTypeEnum.ts +5 -0
  324. package/lib/enums/logMessages/DebugLogMessageEnum.ts +3 -0
  325. package/lib/enums/logMessages/ErrorLogMessageEnum.ts +3 -0
  326. package/lib/index.ts +1 -0
  327. package/lib/models/CampaignModel.ts +176 -0
  328. package/lib/models/FeatureModel.ts +81 -0
  329. package/lib/models/ImpactCampaignModel.ts +20 -0
  330. package/lib/models/MetricModel.ts +31 -0
  331. package/lib/models/RuleModel.ts +35 -0
  332. package/lib/models/SettingsModel.ts +95 -0
  333. package/lib/models/VariableModel.ts +51 -0
  334. package/lib/models/VariationModel.ts +101 -0
  335. package/lib/models/schemas/SettingsSchemaValidation.ts +83 -0
  336. package/lib/modules/decision-maker/index.ts +65 -0
  337. package/lib/modules/logger/core/logManager.ts +113 -0
  338. package/lib/modules/logger/core/transportManager.ts +76 -0
  339. package/lib/modules/logger/enums/logLevelEnum.ts +7 -0
  340. package/lib/modules/logger/index.ts +2 -0
  341. package/lib/modules/logger/logMessageBuilder.ts +60 -0
  342. package/lib/modules/logger/logger.ts +7 -0
  343. package/lib/modules/logger/transports/consoleTransport.ts +37 -0
  344. package/lib/modules/networking/client/networkClient.ts +128 -0
  345. package/lib/modules/networking/client/networkClientInterface.ts +8 -0
  346. package/lib/modules/networking/handlers/requestHandler.ts +28 -0
  347. package/lib/modules/networking/index.ts +6 -0
  348. package/lib/modules/networking/manager/networkManager.ts +77 -0
  349. package/lib/modules/networking/models/globalRequestModel.ts +69 -0
  350. package/lib/modules/networking/models/requestModel.ts +164 -0
  351. package/lib/modules/networking/models/responseModel.ts +40 -0
  352. package/lib/modules/segmentor/core/segmentationManger.ts +22 -0
  353. package/lib/modules/segmentor/enums/segmentOperandRegexEnum.ts +10 -0
  354. package/lib/modules/segmentor/enums/segmentOperandValueEnum.ts +8 -0
  355. package/lib/modules/segmentor/enums/segmentOperatorValueEnum.ts +15 -0
  356. package/lib/modules/segmentor/evaluators/segmentEvaluator.ts +239 -0
  357. package/lib/modules/segmentor/evaluators/segmentOperandEvaluator.ts +199 -0
  358. package/lib/modules/segmentor/index.ts +3 -0
  359. package/lib/modules/segmentor/segmentation.ts +6 -0
  360. package/lib/modules/segmentor/utils/SegmentUtil.ts +23 -0
  361. package/lib/modules/storage/connector.ts +25 -0
  362. package/lib/modules/storage/connectors/index.ts +2 -0
  363. package/lib/modules/storage/connectors/memoryConnector.ts +115 -0
  364. package/lib/modules/storage/connectors/redisConnector.ts +180 -0
  365. package/lib/modules/storage/index.ts +1 -0
  366. package/lib/modules/storage/storage.ts +48 -0
  367. package/lib/services/CampaignDecisionService.ts +160 -0
  368. package/lib/services/HooksManager.ts +50 -0
  369. package/lib/services/SettingsManager.ts +167 -0
  370. package/lib/services/StorageService.ts +53 -0
  371. package/lib/services/UrlService.ts +50 -0
  372. package/lib/types/common.ts +13 -0
  373. package/lib/utils/CampaignUtil.ts +236 -0
  374. package/lib/utils/DataTypeUtil.ts +87 -0
  375. package/lib/utils/DecisionUtil.ts +180 -0
  376. package/lib/utils/FunctionUtil.ts +105 -0
  377. package/lib/utils/LogMessageUtil.ts +52 -0
  378. package/lib/utils/MegUtil.ts +408 -0
  379. package/lib/utils/NetworkUtil.ts +262 -0
  380. package/lib/utils/PromiseUtil.ts +10 -0
  381. package/lib/utils/SettingsUtil.ts +18 -0
  382. package/lib/utils/UuidUtil.ts +33 -0
  383. package/lib/utils/WebServiceUtil.ts +60 -0
  384. package/lib/utils/logMessageBuilder.ts +60 -0
  385. 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,10 @@
1
+ import { dynamic } from '../types/common';
2
+
3
+ export function Deferred(): void {
4
+ this.promise = new Promise((resolve: dynamic, reject: dynamic) => {
5
+ this.resolve = resolve;
6
+ this.reject = reject;
7
+ });
8
+
9
+ return this;
10
+ }
@@ -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
+ }