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,458 @@
1
+ // import { APIDecorator } from '../decorators/apiDecorator';
2
+ import { FeatureModel } from '../models/FeatureModel';
3
+ import { SettingsModel } from '../models/SettingsModel';
4
+
5
+ import { Deferred } from '../utils/PromiseUtil';
6
+ import {
7
+ getFeatureIdFromKey,
8
+ getFeatureNameFromKey,
9
+ getSpecificRulesBasedOnType,
10
+ getAllAbAndPersonaliseRules,
11
+ getFeatureFromKey,
12
+ } from '../utils/FunctionUtil';
13
+ import { checkWhitelistingAndPreSeg, evaluateTrafficAndGetVariation } from '../utils/DecisionUtil';
14
+ import { CampaignModel } from '../models/CampaignModel';
15
+ import { CampaignTypeEnum } from '../enums/campaignTypeEnum';
16
+ import { NetworkUtil } from '../utils/NetworkUtil';
17
+ import { EventEnum } from '../enums/EventEnum';
18
+ import { isObject } from '../utils/DataTypeUtil';
19
+ import { LogManager } from '../modules/logger';
20
+ import HooksManager from '../services/HooksManager';
21
+ import { ApiEnum } from '../enums/ApiEnum';
22
+ import { StorageDecorator } from '../decorators/StorageDecorator';
23
+ import { StorageService } from '../services/StorageService';
24
+ import { VariationModel } from '../models/VariationModel';
25
+ import { VariableModel } from '../models/VariableModel';
26
+ import {
27
+ getCampaignVariation,
28
+ getRolloutVariation,
29
+ findGroupsFeaturePartOf,
30
+ isPartOfGroup,
31
+ } from '../utils/CampaignUtil';
32
+ import { evaluateGroups } from '../utils/MegUtil';
33
+
34
+ interface IGetFlag {
35
+ get(featureKey: string, settings: SettingsModel, context: any, hookManager: HooksManager): Promise<FeatureModel>;
36
+ }
37
+
38
+ export class FlagApi implements IGetFlag {
39
+ async get(
40
+ featureKey: string,
41
+ settings: SettingsModel,
42
+ context: any,
43
+ hookManager: HooksManager,
44
+ ): Promise<FeatureModel> {
45
+ // initialize contextUtil object
46
+ let decision = this.createDecision(settings, featureKey, context);
47
+ let isEnabled = false;
48
+ let rolloutVariationToReturn = null;
49
+ let experimentVariationToReturn = null;
50
+ let rulesInformation = {}; // for storing and integration callback
51
+
52
+ const deferredObject = new Deferred();
53
+ const evaluatedFeatureMap: Map<string, any> = new Map();
54
+ let shouldCheckForAbPersonalise = false;
55
+
56
+ const storageService = new StorageService();
57
+ const storedData: Record<any, any> = await new StorageDecorator().getFeatureFromStorage(
58
+ featureKey,
59
+ context.user,
60
+ storageService,
61
+ );
62
+
63
+ let campArray = [];
64
+
65
+ if (storedData?.experimentVariationId) {
66
+ if (storedData.experimentKey) {
67
+ const variation: VariationModel = getCampaignVariation(
68
+ settings,
69
+ storedData.experimentKey,
70
+ storedData.experimentVariationId,
71
+ );
72
+
73
+ if (variation) {
74
+ LogManager.Instance.info(
75
+ `Variation ${variation.getKey()} found in storage for the user ${context.user.id} for the experiment campaign ${storedData.experimentKey}`,
76
+ );
77
+ deferredObject.resolve({
78
+ isEnabled: () => true,
79
+ getVariables: () => variation?.getVariables(),
80
+ getVariable: (
81
+ key: string,
82
+ defaultValue: string, // loop over all variables object and return the value where key is equal to given key else return given default value
83
+ ) =>
84
+ variation
85
+ ?.getVariables()
86
+ .find((variable) => new VariableModel().modelFromDictionary(variable).getKey() === key)
87
+ ?.getValue() || defaultValue,
88
+ });
89
+
90
+ return deferredObject.promise;
91
+ }
92
+ }
93
+ } else if (storedData?.rolloutKey && storedData.rolloutId) {
94
+ const variation: VariationModel = getRolloutVariation(
95
+ settings,
96
+ storedData.rolloutKey,
97
+ storedData.rolloutVariationId,
98
+ );
99
+ if (variation) {
100
+ LogManager.Instance.info(
101
+ `Variation ${variation.getKey()} found in storage for the user ${context.user.id} for the rollout campaign ${storedData.rolloutKey}`,
102
+ );
103
+ LogManager.Instance.info(`Evaluation experiement campaigns now for the user ${context.user.id}`);
104
+ isEnabled = true;
105
+ rolloutVariationToReturn = variation;
106
+ const featureInfo = {
107
+ rolloutId: storedData.rolloutId,
108
+ rolloutKey: storedData.rolloutKey,
109
+ rolloutVariationId: storedData.rolloutVariationId,
110
+ };
111
+ evaluatedFeatureMap.set(featureKey, featureInfo);
112
+ Object.assign(rulesInformation, featureInfo);
113
+ }
114
+ }
115
+
116
+ let ruleToTrack = [];
117
+
118
+ const feature = getFeatureFromKey(settings, featureKey); // get feature object from feature key
119
+ if (!isObject(feature) || feature === undefined) {
120
+ LogManager.Instance.info(`Feature not found for the key ${featureKey}`);
121
+ deferredObject.resolve({
122
+ isEnabled: () => false,
123
+ getVariables: () => [],
124
+ getVariable: (key: string, defaultValue: string) => defaultValue,
125
+ });
126
+ return deferredObject.promise;
127
+ }
128
+ const rollOutRules = getSpecificRulesBasedOnType(settings, featureKey, CampaignTypeEnum.ROLLOUT); // get all rollout rules
129
+ if (rollOutRules.length > 0 && !isEnabled) {
130
+ // if rollout rules are present and shouldCheckForAB is false, then check for rollout rules only
131
+ for (const rule of rollOutRules) {
132
+ // evaluateRuleResult - true/ false (based pre segment condition)
133
+ const [evaluateRuleResult, temp, tempCampArray] = await evaluateRule(
134
+ settings,
135
+ feature,
136
+ rule,
137
+ context,
138
+ false,
139
+ decision,
140
+ );
141
+ campArray = campArray.concat(tempCampArray);
142
+ if (evaluateRuleResult) {
143
+ ruleToTrack.push(rule);
144
+ evaluatedFeatureMap.set(featureKey, {
145
+ rolloutId: rule.id,
146
+ rolloutKey: rule.key,
147
+ rolloutVariationId: rule.variations[0].id,
148
+ });
149
+ break;
150
+ }
151
+ continue; // if rule does not satisfy, then check for other rule
152
+ }
153
+ } else if (rollOutRules.length === 0) {
154
+ LogManager.Instance.info('No Rollout rules present for the feature, checking rules for AB/Personalize');
155
+ shouldCheckForAbPersonalise = true;
156
+ }
157
+
158
+ if (ruleToTrack.length > 0) {
159
+ const campaign = new CampaignModel().modelFromDictionary(ruleToTrack.pop());
160
+ const [variation, tempCampArray] = this.trafficCheckAndReturnVariation(
161
+ settings,
162
+ feature,
163
+ campaign,
164
+ context,
165
+ rulesInformation,
166
+ decision,
167
+ );
168
+ campArray = campArray.concat(tempCampArray);
169
+ if (isObject(variation) && Object.keys(variation).length > 0) {
170
+ isEnabled = true;
171
+ shouldCheckForAbPersonalise = true;
172
+ rolloutVariationToReturn = variation;
173
+ }
174
+ ruleToTrack = [];
175
+ }
176
+ if (shouldCheckForAbPersonalise) {
177
+ // if rollout rule is passed, get all ab and personalise rules
178
+ const allRules = getAllAbAndPersonaliseRules(settings, featureKey);
179
+ let listOfMegCampaignsGroups = []; // to store megGroups
180
+ let ruleIndex = 0;
181
+ let campaignToSkip = [];
182
+ for (const rule of allRules) {
183
+ // loop over all ab and personalize rules
184
+ ruleIndex++;
185
+ const group = isPartOfGroup(settings, rule.id); // check if rule is part of any group
186
+ if (isObject(group) && Object.keys(group).length > 0) {
187
+ if (listOfMegCampaignsGroups.indexOf(group.groupId) === -1) {
188
+ listOfMegCampaignsGroups.push(group.groupId);
189
+ }
190
+ if (ruleIndex === allRules.length) {
191
+ // if last rule, then evaluate MEG campaigns
192
+ LogManager.Instance.debug(`Evaluating MEG campaigns for the user ${context.user.id}`);
193
+ const [megResult, whitelistedVariationInfoWithCampaign, winnerCampaign] = await evaluateGroups(
194
+ settings,
195
+ featureKey,
196
+ feature,
197
+ listOfMegCampaignsGroups,
198
+ evaluatedFeatureMap,
199
+ context,
200
+ storageService,
201
+ campaignToSkip,
202
+ decision,
203
+ );
204
+ if (megResult) {
205
+ // if MEG campaign passed
206
+ if (winnerCampaign !== null) {
207
+ const winnerCampaignToPush = allRules.find((rule) => rule.id === winnerCampaign.id);
208
+ ruleToTrack.push(winnerCampaignToPush);
209
+ } else {
210
+ isEnabled = true;
211
+ experimentVariationToReturn = whitelistedVariationInfoWithCampaign.variation;
212
+ Object.assign(rulesInformation, {
213
+ experimentId: whitelistedVariationInfoWithCampaign.experimentId,
214
+ experimentKey: whitelistedVariationInfoWithCampaign.experimentKey,
215
+ experimentVariationId: whitelistedVariationInfoWithCampaign.variationId,
216
+ });
217
+ }
218
+ }
219
+ break;
220
+ }
221
+ continue;
222
+ } else if (listOfMegCampaignsGroups.length > 0) {
223
+ // if group is not present and MEG groups are present, then evaluate MEG campaigns
224
+ LogManager.Instance.debug(`Evaluating MEG campaigns for the user ${context.user.id}`);
225
+ const [megResult, whitelistedVariationInfoWithCampaign, winnerCampaign] = await evaluateGroups(
226
+ settings,
227
+ featureKey,
228
+ feature,
229
+ listOfMegCampaignsGroups,
230
+ evaluatedFeatureMap,
231
+ context,
232
+ storageService,
233
+ campaignToSkip,
234
+ decision,
235
+ );
236
+ if (megResult) {
237
+ if (winnerCampaign !== null) {
238
+ const winnerCampaignToPush = allRules.find((rule) => rule.id === winnerCampaign.id);
239
+ ruleToTrack.push(winnerCampaignToPush);
240
+ } else {
241
+ isEnabled = true;
242
+ experimentVariationToReturn = whitelistedVariationInfoWithCampaign.variation;
243
+ Object.assign(rulesInformation, {
244
+ experimentId: whitelistedVariationInfoWithCampaign.experimentId,
245
+ experimentKey: whitelistedVariationInfoWithCampaign.experimentKey,
246
+ experimentVariationId: whitelistedVariationInfoWithCampaign.variationId,
247
+ });
248
+ }
249
+ break;
250
+ }
251
+ campaignToSkip.push(rule.id);
252
+ }
253
+
254
+ // abPersonalizeResult - true/ false (based on whitelisting condition || pre segment condition)
255
+ const [abPersonalizeResult, whitelistedVariation, tempCampArray] = await evaluateRule(
256
+ settings,
257
+ feature,
258
+ rule,
259
+ context,
260
+ false,
261
+ decision,
262
+ );
263
+ campArray = campArray.concat(tempCampArray);
264
+ if (abPersonalizeResult) {
265
+ if (whitelistedVariation === null) {
266
+ // whitelistedVariation will be null if pre segment passed but whitelisting failed
267
+ ruleToTrack.push(rule);
268
+ } else {
269
+ isEnabled = true;
270
+ experimentVariationToReturn = whitelistedVariation.variation;
271
+ Object.assign(rulesInformation, {
272
+ experimentId: rule.id,
273
+ experimentKey: whitelistedVariation.experimentKey,
274
+ experimentVariationId: whitelistedVariation.variationId,
275
+ });
276
+ }
277
+ break;
278
+ }
279
+ campaignToSkip.push(rule.id);
280
+ continue;
281
+ }
282
+ }
283
+ if (ruleToTrack.length > 0) {
284
+ const campaign = new CampaignModel().modelFromDictionary(ruleToTrack.pop());
285
+ const [variation, tempCampArray] = this.trafficCheckAndReturnVariation(
286
+ settings,
287
+ feature,
288
+ campaign,
289
+ context,
290
+ rulesInformation,
291
+ decision,
292
+ );
293
+ campArray = campArray.concat(tempCampArray);
294
+ if (isObject(variation) && Object.keys(variation).length > 0) {
295
+ isEnabled = true;
296
+ experimentVariationToReturn = variation;
297
+ }
298
+ }
299
+ if (isEnabled) {
300
+ // set storage data
301
+ new StorageDecorator().setDataInStorage(
302
+ {
303
+ featureKey,
304
+ user: context.user,
305
+ ...rulesInformation,
306
+ },
307
+ storageService,
308
+ );
309
+ hookManager.set(decision);
310
+ hookManager.execute(hookManager.get());
311
+ }
312
+ if (feature.impactCampaign?.campaignId) {
313
+ LogManager.Instance.info(`Sending data for Impact Campaign for the user ${context.user.id}`);
314
+ campArray = campArray.concat(
315
+ createImpressionForVariationShown(
316
+ settings,
317
+ feature,
318
+ { id: feature.impactCampaign?.campaignId },
319
+ context.user,
320
+ { id: isEnabled ? 2 : 1 },
321
+ true,
322
+ ),
323
+ );
324
+ }
325
+ deferredObject.resolve({
326
+ isEnabled: () => isEnabled,
327
+ getVariables: () => experimentVariationToReturn?.variables ?? rolloutVariationToReturn?.variables ?? [],
328
+ getVariable: (
329
+ key: string,
330
+ defaultValue: string, // loop over all variables object and return the value where key is equal to given key else return given default value
331
+ ) => {
332
+ const variables = experimentVariationToReturn?.variables ?? rolloutVariationToReturn?.variables ?? [];
333
+ const variable = variables.find((variable) => variable.key === key);
334
+ return variable?.value ?? defaultValue;
335
+ },
336
+ campArray: campArray,
337
+ });
338
+
339
+ return deferredObject.promise;
340
+ }
341
+
342
+ private createDecision(settings: SettingsModel, featureKey: string, context: any): any {
343
+ return {
344
+ featureName: getFeatureNameFromKey(settings, featureKey),
345
+ featureId: getFeatureIdFromKey(settings, featureKey),
346
+ featureKey,
347
+ userId: context.user.id,
348
+ api: ApiEnum.GET_FLAG,
349
+ };
350
+ }
351
+
352
+ private trafficCheckAndReturnVariation(
353
+ settings: any,
354
+ feature,
355
+ campaign: any,
356
+ context: any,
357
+ rulesInformation: any,
358
+ decision: any,
359
+ ): [VariationModel, any] {
360
+ const variation = evaluateTrafficAndGetVariation(settings, campaign, context.user.id);
361
+ let campArray = [];
362
+ if (isObject(variation) && Object.keys(variation).length > 0) {
363
+ if (campaign.getType() === CampaignTypeEnum.ROLLOUT) {
364
+ Object.assign(rulesInformation, {
365
+ rolloutId: campaign.getId(),
366
+ rolloutKey: campaign.getKey(),
367
+ rolloutVariationId: variation.getId(),
368
+ });
369
+ } else {
370
+ Object.assign(rulesInformation, {
371
+ experimentId: campaign.getId(),
372
+ experimentKey: campaign.getKey(),
373
+ experimentVariationId: variation.getId(),
374
+ });
375
+ }
376
+ Object.assign(decision, rulesInformation);
377
+ campArray = createImpressionForVariationShown(settings, feature, campaign, context.user, variation);
378
+ return [variation, campArray];
379
+ }
380
+ return [null, campArray];
381
+ }
382
+ }
383
+
384
+ /**
385
+ * Evaluate the rule
386
+ * @param rule rule to evaluate
387
+ * @param user user object
388
+ * @returns
389
+ */
390
+ export const evaluateRule = async (
391
+ settings: any,
392
+ feature: any,
393
+ rule: any,
394
+ context: any,
395
+ isMegWinnerRule: Boolean,
396
+ decision: any,
397
+ ): Promise<[Boolean, any, any]> => {
398
+ // evaluate the dsl
399
+ const campaign: CampaignModel = new CampaignModel();
400
+ let campArray = [];
401
+ campaign.modelFromDictionary(rule);
402
+ // check for whitelisting and pre segmentation
403
+ const [preSegmentationResult, whitelistedObject] = await checkWhitelistingAndPreSeg(
404
+ settings,
405
+ campaign,
406
+ context,
407
+ isMegWinnerRule,
408
+ decision,
409
+ );
410
+
411
+ // if pre segmentation result is true and whitelisted object is present, then send post call
412
+ if (preSegmentationResult && isObject(whitelistedObject) && Object.keys(whitelistedObject).length > 0) {
413
+ Object.assign(decision, {
414
+ experimentId: campaign.getId(),
415
+ experimentKey: campaign.getKey(),
416
+ experimentVariationId: whitelistedObject.variationId,
417
+ });
418
+ campArray = createImpressionForVariationShown(
419
+ settings,
420
+ feature,
421
+ campaign,
422
+ context.user,
423
+ whitelistedObject.variation,
424
+ );
425
+ }
426
+
427
+ return [preSegmentationResult, whitelistedObject, campArray];
428
+ };
429
+
430
+ const createImpressionForVariationShown = (
431
+ settings: any,
432
+ feature: any,
433
+ campaign: any,
434
+ user: any,
435
+ variation: any,
436
+ isImpactCampaign: boolean = false,
437
+ ) => {
438
+ const networkUtil = new NetworkUtil();
439
+ const campArray = [];
440
+ const properties = networkUtil.getEventsBaseProperties(
441
+ settings,
442
+ EventEnum.VWO_VARIATION_SHOWN,
443
+ encodeURIComponent(user.userAgent),
444
+ user.ipAddress,
445
+ );
446
+ const payload = networkUtil.getTrackUserPayloadData(
447
+ settings,
448
+ user.id,
449
+ EventEnum.VWO_VARIATION_SHOWN,
450
+ campaign.id,
451
+ variation.id,
452
+ user.userAgent,
453
+ user.ipAddress,
454
+ );
455
+ campArray.push({ campaignId: campaign.id, variationId: variation.id });
456
+ networkUtil.sendPostApiRequest(properties, payload);
457
+ return campArray;
458
+ };
File without changes
File without changes
@@ -0,0 +1,33 @@
1
+ import { NetworkUtil } from '../utils/NetworkUtil';
2
+ import { EventEnum } from '../enums/EventEnum';
3
+
4
+ interface ISetAttribute {
5
+ setAttribute(settings: any, attributeKey: string, attributeValue: any, context: any): void;
6
+ }
7
+
8
+ export class SetAttributeApi implements ISetAttribute {
9
+ setAttribute(settings: any, attributeKey: string, attributeValue: any, context: any): void {
10
+ createImpressionForAttribute(settings, attributeKey, attributeValue, context.user);
11
+ }
12
+ }
13
+
14
+ const createImpressionForAttribute = async (settings: any, attributeKey: string, attributeValue: any, user: any) => {
15
+ const networkUtil = new NetworkUtil();
16
+ const properties = networkUtil.getEventsBaseProperties(
17
+ settings,
18
+ EventEnum.VWO_SYNC_VISITOR_PROP,
19
+ user.userAgent,
20
+ user.ipAddress,
21
+ );
22
+ const payload = networkUtil.getAttributePayloadData(
23
+ settings,
24
+ user.id,
25
+ EventEnum.VWO_SYNC_VISITOR_PROP,
26
+ attributeKey,
27
+ attributeValue,
28
+ user.userAgent,
29
+ user.ipAddress,
30
+ );
31
+ // console.log(' payload is ', JSON.stringify(payload));
32
+ networkUtil.sendPostApiRequest(properties, payload);
33
+ };
@@ -0,0 +1,52 @@
1
+ import { NetworkUtil } from '../utils/NetworkUtil';
2
+ import { eventExists } from '../utils/FunctionUtil';
3
+ import { EventEnum } from '../enums/EventEnum';
4
+ import { LogManager } from '../modules/logger';
5
+ import HooksManager from '../services/HooksManager';
6
+ import { ApiEnum } from '../enums/ApiEnum';
7
+
8
+ interface ITrack {
9
+ track(
10
+ settings: any,
11
+ eventName: string,
12
+ eventProperties: any,
13
+ context: any,
14
+ hookManager: HooksManager,
15
+ ): Promise<Record<string, boolean>>;
16
+ }
17
+
18
+ export class TrackApi implements ITrack {
19
+ async track(
20
+ settings: any,
21
+ eventName: string,
22
+ eventProperties: any,
23
+ context: any,
24
+ hookManager: HooksManager,
25
+ ): Promise<Record<string, boolean>> {
26
+ if (eventExists(eventName, settings)) {
27
+ // create impression for track
28
+ createImpressionForTrack(settings, eventName, context.user, eventProperties);
29
+ // integeration callback for track
30
+ hookManager.set({ eventName: eventName, api: ApiEnum.TRACK });
31
+ hookManager.execute(hookManager.get());
32
+ return { [eventName]: true };
33
+ }
34
+ LogManager.Instance.error(`Event ${eventName} not found in any of the features`);
35
+ return { [eventName]: false };
36
+ }
37
+ }
38
+
39
+ const createImpressionForTrack = async (settings: any, eventName: string, user: any, eventProperties: any) => {
40
+ const networkUtil = new NetworkUtil();
41
+ const properties = networkUtil.getEventsBaseProperties(settings, eventName, user.userAgent, user.ipAddress);
42
+ const payload = networkUtil.getTrackGoalPayloadData(
43
+ settings,
44
+ user.id,
45
+ eventName,
46
+ eventProperties,
47
+ user.userAgent,
48
+ user.ipAddress,
49
+ );
50
+ // console.log('track payload is ', JSON.stringify(payload));
51
+ networkUtil.sendPostApiRequest(properties, payload);
52
+ };
@@ -0,0 +1,35 @@
1
+ import { SEED_URL, HTTP_PROTOCOL, HTTPS_PROTOCOL } from './url';
2
+
3
+ export const Constants = {
4
+ // SDK_NAME: packageFile.name,
5
+ // SDK_VERSION: packageFile.version,
6
+ PLATFORM: 'server',
7
+
8
+ MAX_TRAFFIC_PERCENT: 100,
9
+ MAX_TRAFFIC_VALUE: 10000,
10
+ STATUS_RUNNING: 'RUNNING',
11
+
12
+ SEED_VALUE: 1,
13
+ MAX_EVENTS_PER_REQUEST: 5000,
14
+ DEFAULT_REQUEST_TIME_INTERVAL: 600, // 10 * 60(secs) = 600 secs i.e. 10 minutes
15
+ DEFAULT_EVENTS_PER_REQUEST: 100,
16
+ SDK_NAME: '@wingify/vwo-sdk',
17
+ SDK_VERSION: '1.0.0',
18
+ AP: 'server',
19
+
20
+ SEED_URL,
21
+ HTTP_PROTOCOL,
22
+ HTTPS_PROTOCOL,
23
+
24
+ SETTINGS: 'settings',
25
+ SETTINGS_EXPIRY: 10000000,
26
+ SETTINGS_TIMEOUT: 50000,
27
+
28
+ HOST_NAME: 'dev.visualwebsiteoptimizer.com', // TODO: change
29
+ SETTINTS_ENDPOINT: '/server-side/v2-settings',
30
+ LOCATION_ENDPOINT: '/getLocation',
31
+
32
+ VWO_FS_ENVIRONMENT: 'vwo_fs_environment',
33
+
34
+ RANDOM_ALGO: 1,
35
+ };
@@ -0,0 +1,7 @@
1
+ export const HTTP = 'http';
2
+ export const HTTPS = 'https';
3
+
4
+ export const SEED_URL = 'https://vwo.com';
5
+ export const HTTP_PROTOCOL = `${HTTP}://`;
6
+ export const HTTPS_PROTOCOL = `${HTTPS}://`;
7
+ export const BASE_URL = 'dev.visualwebsiteoptimizer.com';
@@ -0,0 +1,98 @@
1
+ import { LogManager } from '../modules/logger';
2
+
3
+ import { VariationModel } from '../models/VariationModel';
4
+ import { FeatureModel } from '../models/FeatureModel';
5
+ import { StorageEnum } from '../enums/StorageEnum';
6
+ import { StorageService } from '../services/StorageService';
7
+
8
+ import { Deferred } from '../utils/PromiseUtil';
9
+
10
+ interface IStorageDecorator {
11
+ setDataInStorage(data: Record<any, any>, storageService: StorageService): Promise<VariationModel>;
12
+ getFeatureFromStorage(featureKey: FeatureModel, user: any, storageService: StorageService): Promise<any>;
13
+ }
14
+
15
+ export class StorageDecorator implements IStorageDecorator {
16
+ async getFeatureFromStorage(featureKey: any, user: any, storageService: StorageService): Promise<any> {
17
+ const deferredObject = new Deferred();
18
+ storageService.getDataInStorage(featureKey, user).then((campaignMap: Record<any, any> | StorageEnum) => {
19
+ switch (campaignMap) {
20
+ case StorageEnum.STORAGE_UNDEFINED:
21
+ deferredObject.resolve(null);
22
+ break;
23
+ case StorageEnum.NO_DATA_FOUND:
24
+ deferredObject.resolve(null);
25
+ break;
26
+ case StorageEnum.INCORRECT_DATA:
27
+ deferredObject.resolve(StorageEnum.INCORRECT_DATA);
28
+ break;
29
+ case StorageEnum.CAMPAIGN_PAUSED:
30
+ deferredObject.resolve(null);
31
+ break;
32
+ case StorageEnum.VARIATION_NOT_FOUND:
33
+ deferredObject.resolve(StorageEnum.VARIATION_NOT_FOUND);
34
+ break;
35
+ case StorageEnum.WHITELISTED_VARIATION:
36
+ // handle this case with whitelisting.
37
+ deferredObject.resolve(null);
38
+ break;
39
+ default:
40
+ deferredObject.resolve(campaignMap);
41
+ }
42
+ });
43
+
44
+ return deferredObject.promise;
45
+ }
46
+
47
+ setDataInStorage(data: Record<any, any>, storageService: StorageService): Promise<VariationModel> {
48
+ const deferredObject = new Deferred();
49
+ const {
50
+ featureKey,
51
+ user,
52
+ rolloutId,
53
+ rolloutKey,
54
+ rolloutVariationId,
55
+ experimentId,
56
+ experimentKey,
57
+ experimentVariationId,
58
+ } = data;
59
+
60
+ if (!featureKey) {
61
+ LogManager.Instance.error(`Feature key is not valid. Not able to store data into storage`);
62
+ deferredObject.reject();
63
+ return;
64
+ }
65
+ if (!user.id) {
66
+ LogManager.Instance.error(`User ID is not valid. Not able to store data into storage`);
67
+ deferredObject.reject();
68
+ return;
69
+ }
70
+ if (rolloutKey && !experimentKey && !rolloutVariationId) {
71
+ LogManager.Instance.error(`Variation is not valid for Rollout rule passed. Not able to store data into storage`);
72
+ deferredObject.reject();
73
+ return;
74
+ }
75
+ if (experimentKey && !experimentVariationId) {
76
+ LogManager.Instance.error(
77
+ `Variation is not valid for Experiment rule passed. Not able to store data into storage`,
78
+ );
79
+ deferredObject.reject();
80
+ return;
81
+ }
82
+
83
+ storageService.setDataInStorage({
84
+ featureKey,
85
+ user: user.id,
86
+ rolloutId,
87
+ rolloutKey,
88
+ rolloutVariationId,
89
+ experimentId,
90
+ experimentKey,
91
+ experimentVariationId,
92
+ });
93
+
94
+ deferredObject.resolve();
95
+
96
+ return deferredObject.promise;
97
+ }
98
+ }
@@ -0,0 +1,4 @@
1
+ export enum ApiEnum {
2
+ GET_FLAG = 'getFlag',
3
+ TRACK = 'track',
4
+ }