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,77 @@
1
+ import { Deferred } from '../../../utils/PromiseUtil';
2
+ import { GlobalRequestModel } from '../models/globalRequestModel';
3
+ import { NetworkClient } from '../client/networkClient';
4
+ import { RequestModel } from '../models/requestModel';
5
+ import { RequestHandler } from '../handlers/requestHandler';
6
+ import { ResponseModel } from '../models/responseModel';
7
+ import { NetworkClientInterface } from '../client/networkClientInterface';
8
+
9
+ export class NetworkManager {
10
+ private config: GlobalRequestModel;
11
+ private client: NetworkClientInterface;
12
+ private static instance: NetworkManager;
13
+
14
+ attachClient(client?: NetworkClientInterface): void {
15
+ this.client = client || new NetworkClient();
16
+ this.config = new GlobalRequestModel(null, null, null, null);
17
+ }
18
+
19
+ static get Instance(): NetworkManager {
20
+ this.instance = this.instance || new NetworkManager();
21
+
22
+ return this.instance;
23
+ }
24
+
25
+ setConfig(config: GlobalRequestModel): void {
26
+ this.config = config;
27
+ }
28
+
29
+ getConfig(): GlobalRequestModel {
30
+ return this.config;
31
+ }
32
+
33
+ createRequest(request: RequestModel): RequestModel {
34
+ const options: RequestModel = new RequestHandler().createRequest(request, this.config);
35
+ return options;
36
+ }
37
+
38
+ get(request: RequestModel): Promise<ResponseModel> {
39
+ const deferred = new Deferred();
40
+
41
+ const networkOptions: RequestModel = this.createRequest(request);
42
+ if (networkOptions === null) {
43
+ deferred.reject(new Error('no url found'));
44
+ } else {
45
+ this.client
46
+ .GET(networkOptions)
47
+ .then((response: ResponseModel) => {
48
+ deferred.resolve(response);
49
+ })
50
+ .catch((errorResponse: ResponseModel) => {
51
+ deferred.reject(errorResponse);
52
+ });
53
+ }
54
+
55
+ return deferred.promise;
56
+ }
57
+
58
+ post(request: RequestModel): Promise<ResponseModel> {
59
+ const deferred = new Deferred();
60
+ const networkOptions: RequestModel = this.createRequest(request);
61
+
62
+ if (networkOptions === null) {
63
+ deferred.reject(new Error('no url found'));
64
+ } else {
65
+ this.client
66
+ .POST(networkOptions)
67
+ .then((response: ResponseModel) => {
68
+ deferred.resolve(response);
69
+ })
70
+ .catch((error: ResponseModel) => {
71
+ deferred.reject(error);
72
+ });
73
+ }
74
+
75
+ return deferred.promise;
76
+ }
77
+ }
@@ -0,0 +1,69 @@
1
+ import { dynamic } from '../../../types/common';
2
+
3
+ export class GlobalRequestModel {
4
+ private url: string;
5
+ private timeout = 3000;
6
+ private query: Record<string, dynamic>;
7
+ private body: Record<string, dynamic>;
8
+ private headers: Record<string, string>;
9
+ private isDevelopmentMode: boolean;
10
+
11
+ constructor(
12
+ url: string,
13
+ query: Record<string, dynamic>,
14
+ body: Record<string, dynamic>,
15
+ headers: Record<string, any>
16
+ ) {
17
+ this.url = url;
18
+ this.query = query;
19
+ this.body = body;
20
+ this.headers = headers;
21
+ }
22
+ setQuery(query: Record<string, dynamic>): void {
23
+ this.query = query;
24
+ }
25
+
26
+ getQuery(): Record<string, dynamic> {
27
+ return this.query;
28
+ }
29
+
30
+ setBody(body: Record<string, dynamic>): void {
31
+ this.body = body;
32
+ }
33
+
34
+ getBody(): Record<string, dynamic> {
35
+ return this.body;
36
+ }
37
+
38
+ setBaseUrl(url: string): void {
39
+ this.url = url;
40
+ }
41
+
42
+ getBaseUrl(): string {
43
+ return this.url;
44
+ }
45
+
46
+ setTimeout(timeout: number): void {
47
+ this.timeout = timeout;
48
+ }
49
+
50
+ getTimeout(): number {
51
+ return this.timeout;
52
+ }
53
+
54
+ setHeaders(headers: Record<string, string>): void {
55
+ this.headers = headers;
56
+ }
57
+
58
+ getHeaders(): Record<string, string> {
59
+ return this.headers;
60
+ }
61
+
62
+ setDevelopmentMode(isDevelopmentMode: boolean): void {
63
+ this.isDevelopmentMode = isDevelopmentMode;
64
+ }
65
+
66
+ getDevelopmentMode(): boolean {
67
+ return this.isDevelopmentMode;
68
+ }
69
+ }
@@ -0,0 +1,164 @@
1
+ import { dynamic } from '../../../types/common';
2
+
3
+ const HTTP = 'http';
4
+
5
+ export class RequestModel {
6
+ private url: string;
7
+ private method: string;
8
+ private scheme: string;
9
+ private port: number;
10
+ private path: string;
11
+ private query: Record<string, dynamic>;
12
+ private timeout: number;
13
+ private body: Record<string, dynamic>;
14
+ private headers: Record<string, string>;
15
+
16
+ constructor(
17
+ url: string,
18
+ method: string = 'GET',
19
+ path: string,
20
+ query: Record<string, dynamic>,
21
+ body: Record<string, dynamic>,
22
+ headers: Record<string, string>,
23
+ scheme: string = HTTP,
24
+ port: number = 80
25
+ ) {
26
+ this.url = url;
27
+ this.path = path;
28
+ this.query = query;
29
+ this.body = body;
30
+ this.headers = headers;
31
+ this.scheme = scheme;
32
+ this.port = port;
33
+ this.method = method;
34
+ }
35
+
36
+ getMethod(): string {
37
+ return this.method;
38
+ }
39
+
40
+ setMethod(method: string): void {
41
+ this.method = method;
42
+ }
43
+
44
+ getBody(): Record<string, dynamic> {
45
+ return this.body;
46
+ }
47
+
48
+ setBody(body: Record<string, dynamic>): void {
49
+ this.body = body;
50
+ }
51
+
52
+ setQuery(query: Record<string, dynamic>): void {
53
+ this.query = query;
54
+ }
55
+
56
+ getQuery(): Record<string, dynamic> {
57
+ return this.query;
58
+ }
59
+
60
+ setHeaders(headers: Record<string, string>): this {
61
+ this.headers = headers;
62
+ return this;
63
+ }
64
+
65
+ getHeaders(): Record<string, string> {
66
+ return this.headers;
67
+ }
68
+
69
+ setTimeout(timeout: number): this {
70
+ this.timeout = timeout;
71
+ return this;
72
+ }
73
+
74
+ getTimeout(): number {
75
+ return this.timeout;
76
+ }
77
+
78
+ getUrl(): string {
79
+ return this.url;
80
+ }
81
+
82
+ setUrl(host: string): this {
83
+ this.url = host;
84
+ return this;
85
+ }
86
+
87
+ getScheme(): string {
88
+ return this.scheme;
89
+ }
90
+
91
+ setScheme(scheme: string): this {
92
+ this.scheme = scheme;
93
+ return this;
94
+ }
95
+
96
+ getPort(): number {
97
+ return this.port;
98
+ }
99
+
100
+ setPort(port: number): this {
101
+ this.port = port;
102
+ return this;
103
+ }
104
+
105
+ getPath(): string {
106
+ return this.path;
107
+ }
108
+
109
+ setPath(path: string): this {
110
+ this.path = path;
111
+ return this;
112
+ }
113
+
114
+ getOptions(): Record<string, any> {
115
+ let queryParams = '';
116
+ for (const key in this.query) {
117
+ const queryString = `${key}=${this.query[key]}&`;
118
+ queryParams += queryString;
119
+ }
120
+ const options: Record<string, any> = {
121
+ hostname: this.url,
122
+ agent: false
123
+ };
124
+
125
+ if (this.scheme) {
126
+ options.scheme = this.scheme;
127
+ }
128
+ if (this.port) {
129
+ options.port = this.port;
130
+ }
131
+ if (this.headers) {
132
+ options.headers = this.headers;
133
+ }
134
+
135
+ if (this.method) {
136
+ options.method = this.method;
137
+ }
138
+
139
+ if (this.body) {
140
+ const postBody = JSON.stringify(this.body);
141
+ options.headers = {
142
+ 'Content-Type': 'application/json',
143
+ 'Content-Length': Buffer.byteLength(postBody),
144
+ };
145
+ options.body = this.body;
146
+ }
147
+
148
+ if (this.path) {
149
+ if (queryParams !== '') {
150
+ options.path = this.path + '?' + queryParams || '';
151
+ } else {
152
+ options.path = this.path;
153
+ }
154
+ }
155
+ if (this.timeout) {
156
+ options.timeout = this.timeout;
157
+ }
158
+ if (options.path.charAt(options.path.length - 1) === '&') {
159
+ options.path = options.path.substring(0, options.path.length - 1);
160
+ }
161
+
162
+ return options;
163
+ }
164
+ }
@@ -0,0 +1,40 @@
1
+ import { dynamic } from '../../../types/common';
2
+
3
+ export class ResponseModel {
4
+ private statusCode: number;
5
+ private error: dynamic;
6
+ private headers: Record<string, string>;
7
+ private data: dynamic;
8
+
9
+ setStatusCode(statusCode: number): void {
10
+ this.statusCode = statusCode;
11
+ }
12
+
13
+ setHeaders(headers: Record<string, string>): void {
14
+ this.headers = headers;
15
+ }
16
+
17
+ setData(data: dynamic): void {
18
+ this.data = data;
19
+ }
20
+
21
+ setError(error: dynamic): void {
22
+ this.error = error;
23
+ }
24
+
25
+ getHeaders(): Record<string, string> {
26
+ return this.headers;
27
+ }
28
+
29
+ getData(): dynamic {
30
+ return this.data;
31
+ }
32
+
33
+ getStatusCode(): number {
34
+ return this.statusCode;
35
+ }
36
+
37
+ getError(): dynamic {
38
+ return this.error;
39
+ }
40
+ }
@@ -0,0 +1,22 @@
1
+ import { SegmentEvaluator } from '../evaluators/segmentEvaluator';
2
+ import { dynamic } from '../../../types/common';
3
+ import { SettingsModel } from '../../../models/SettingsModel';
4
+
5
+ export class SegmentationManager {
6
+ private static instance: SegmentationManager;
7
+ evaluator: SegmentEvaluator;
8
+
9
+ static get Instance(): SegmentationManager {
10
+ this.instance = this.instance || new SegmentationManager();
11
+
12
+ return this.instance;
13
+ }
14
+
15
+ attachEvaluator(evaluator?: SegmentEvaluator): void {
16
+ this.evaluator = evaluator || new SegmentEvaluator();
17
+ }
18
+
19
+ async validateSegmentation(dsl: Record<string, dynamic>, properties: Record<any, dynamic>, settings: SettingsModel, context?:any): Promise<boolean> {
20
+ return await this.evaluator.isSegmentationValid(dsl, properties, settings, context);
21
+ }
22
+ }
@@ -0,0 +1,10 @@
1
+ export enum SegmentOperandRegexEnum {
2
+ LOWER = '^lower',
3
+ LOWER_MATCH = '^lower\\((.*)\\)',
4
+ WILDCARD = '^wildcard',
5
+ WILDCARD_MATCH = '^wildcard\\((.*)\\)',
6
+ REGEX = '^regex',
7
+ REGEX_MATCH = '^regex\\((.*)\\)',
8
+ STARTING_STAR = '^\\*',
9
+ ENDING_STAR = '\\*$'
10
+ }
@@ -0,0 +1,8 @@
1
+ export enum SegmentOperandValueEnum {
2
+ LOWER_VALUE = 1,
3
+ STARTING_ENDING_STAR_VALUE = 2,
4
+ STARTING_STAR_VALUE = 3,
5
+ ENDING_STAR_VALUE = 4,
6
+ REGEX_VALUE = 5,
7
+ EQUAL_VALUE = 6
8
+ }
@@ -0,0 +1,15 @@
1
+ export enum SegmentOperatorValueEnum {
2
+ AND = 'and',
3
+ NOT = 'not',
4
+ OR = 'or',
5
+ CUSTOM_VARIABLE = 'custom_variable',
6
+ USER = 'user',
7
+ COUNTRY = 'country',
8
+ REGION = 'region',
9
+ CITY = 'city',
10
+ OPERATING_SYSTEM = 'os',
11
+ DEVICE_TYPE = 'device_type',
12
+ BROWSER_AGENT = 'browser_string',
13
+ UA = 'ua',
14
+ FEATURE_ID = 'featureId'
15
+ }
@@ -0,0 +1,239 @@
1
+ import { object } from 'superstruct';
2
+ import { getKeyValue } from '../utils/SegmentUtil';
3
+ import { SegmentOperandEvaluator } from './segmentOperandEvaluator';
4
+ import { SegmentOperatorValueEnum } from '../enums/segmentOperatorValueEnum';
5
+ import { Segmentation } from '../segmentation';
6
+ import { dynamic } from '../../../types/common';
7
+ import { getFromWebService, getQueryParamForLocationPreSegment, getQueryParamForUaParser } from '../../../utils/WebServiceUtil';
8
+ import { UrlEnum } from '../../../enums/UrlEnum';
9
+ import { StorageDecorator } from '../../../decorators/StorageDecorator';
10
+ import { StorageService } from '../../../services/StorageService';
11
+ import { getCampaignVariation, getRolloutVariation } from '../../../utils/CampaignUtil';
12
+ import { VariationModel } from '../../../models/VariationModel';
13
+ import { VariableModel } from '../../../models/VariableModel';
14
+ import { LogManager } from '../../../modules/logger';
15
+ import { Deferred } from '../../../utils/PromiseUtil';
16
+ import { SettingsModel } from '../../../models/SettingsModel';
17
+ import { isObject } from '../../../utils/DataTypeUtil';
18
+
19
+ export class SegmentEvaluator implements Segmentation {
20
+ async isSegmentationValid(dsl: Record<string, dynamic>, properties: Record<string, dynamic>, settings: SettingsModel, context?: any): Promise<boolean> {
21
+ const { key, value } = getKeyValue(dsl);
22
+ const operator = key;
23
+ const subDsl = value;
24
+
25
+ if (operator === SegmentOperatorValueEnum.NOT) {
26
+ const result = await this.isSegmentationValid(subDsl, properties, settings, context);
27
+ return !result;
28
+ } else if (operator === SegmentOperatorValueEnum.AND) {
29
+ return await this.every(subDsl, properties, settings, context);
30
+ } else if (operator === SegmentOperatorValueEnum.OR) {
31
+ return await this.some(subDsl, properties, settings, context);
32
+ } else if (operator === SegmentOperatorValueEnum.CUSTOM_VARIABLE) {
33
+ return await new SegmentOperandEvaluator().evaluateCustomVariableDSL(subDsl, properties);
34
+ } else if (operator === SegmentOperatorValueEnum.USER) {
35
+ return new SegmentOperandEvaluator().evaluateUserDSL(subDsl, properties);
36
+ } else if (operator === SegmentOperatorValueEnum.UA) {
37
+ return new SegmentOperandEvaluator().evaluateUserAgentDSL(subDsl, context);
38
+ }
39
+ return false;
40
+ }
41
+
42
+ async some(dslNodes: Array<Record<string, dynamic>>, customVariables: Record<string, dynamic>, settings: SettingsModel, context: any): Promise<boolean> {
43
+ let uaParserMap: Record<string, string[]> = {};
44
+ let keyCount: number = 0; // Initialize count of keys encountered
45
+ let isUaParser = false;
46
+ for (const dsl of dslNodes) {
47
+ for (const key in dsl) {
48
+ if (key === SegmentOperatorValueEnum.OPERATING_SYSTEM || key === SegmentOperatorValueEnum.BROWSER_AGENT || key === SegmentOperatorValueEnum.DEVICE_TYPE) {
49
+ isUaParser = true;
50
+ const value = dsl[key];
51
+
52
+ if (!uaParserMap[key]) {
53
+ uaParserMap[key] = [];
54
+ }
55
+
56
+ // Ensure value is treated as an array of strings
57
+ const valuesArray = Array.isArray(value) ? value : [value];
58
+
59
+ // Push each value from valueArray to uaParserMap[key]
60
+ valuesArray.forEach((val: dynamic) => {
61
+ if (typeof val === "string") {
62
+ uaParserMap[key].push(val);
63
+ }
64
+ });
65
+
66
+ keyCount++; // Increment count of keys encountered
67
+ }
68
+
69
+ if (key === SegmentOperatorValueEnum.FEATURE_ID) {
70
+ const featureIdObject = dsl[key] as Record<string, string>; // Type assertion to specify the shape of the object
71
+ const featureIdKey: string = Object.keys(featureIdObject)[0]; // Extract the key '4'
72
+ const featureIdValue: string = featureIdObject[featureIdKey]; // Extract the value 'on'
73
+
74
+
75
+ if (featureIdValue === 'on') {
76
+
77
+ const features = settings.getFeatures(); // Access features using the getter method
78
+ const feature = features.find(feature => feature.getId() === parseInt(featureIdKey)); // Find feature by featureIdKey
79
+
80
+ if (feature) {
81
+ const featureKey = feature.getKey(); // Get the key of the found feature
82
+ const result = await this.checkInUserStorage(settings, featureKey, context);
83
+ return result;
84
+ } else {
85
+ console.error("Feature not found with featureIdKey:", featureIdKey);
86
+ return null; // Handle the case when feature is not found
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ // Check if the count of keys encountered is equal to dslNodes.length
93
+ if (isUaParser && keyCount === dslNodes.length) {
94
+ try {
95
+ const uaParserResult = await this.checkUserAgentParser(uaParserMap, context.userAgent);
96
+ return uaParserResult;
97
+ }
98
+ catch (err) {
99
+ console.log(err);
100
+ }
101
+ }
102
+
103
+ if (await this.isSegmentationValid(dsl, customVariables, settings, context)) {
104
+ return true;
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+
110
+ async every(dslNodes: Array<Record<string, dynamic>>, customVariables: Record<string, dynamic>, settings: SettingsModel, context: any): Promise<boolean> {
111
+ let locationMap: Record<string, dynamic> = {};
112
+ for (const dsl of dslNodes) {
113
+ if (dsl.hasOwnProperty(SegmentOperatorValueEnum.COUNTRY) || dsl.hasOwnProperty(SegmentOperatorValueEnum.REGION) || dsl.hasOwnProperty(SegmentOperatorValueEnum.CITY)) {
114
+ this.addLocationValuesToMap(dsl, locationMap);
115
+ // check if location map size is equal to dslNodes size
116
+ if (Object.keys(locationMap).length === dslNodes.length) {
117
+ if (!context.ipAddress || context.ipAddress === undefined){
118
+ LogManager.Instance.info('To evaluate location pre Segment, please pass ipAddress in context.user object');
119
+ return false;
120
+ }
121
+ const segmentResult = await this.checkLocationPreSegmentation(locationMap, context.ipAddress || '0.0.0.0');
122
+ return segmentResult;
123
+ }
124
+ continue;
125
+ }
126
+ const res = await this.isSegmentationValid(dsl, customVariables, settings, context);
127
+ if (!res) {
128
+ return false;
129
+ }
130
+ }
131
+ return true;
132
+ }
133
+
134
+ addLocationValuesToMap(dsl: Record<string, dynamic>, locationMap: Record<string, dynamic>): void {
135
+ if (dsl.hasOwnProperty(SegmentOperatorValueEnum.COUNTRY)) {
136
+ locationMap[SegmentOperatorValueEnum.COUNTRY] = dsl[SegmentOperatorValueEnum.COUNTRY];
137
+ }
138
+ if (dsl.hasOwnProperty(SegmentOperatorValueEnum.REGION)) {
139
+ locationMap[SegmentOperatorValueEnum.REGION] = dsl[SegmentOperatorValueEnum.REGION];
140
+ }
141
+ if (dsl.hasOwnProperty(SegmentOperatorValueEnum.CITY)) {
142
+ locationMap[SegmentOperatorValueEnum.CITY] = dsl[SegmentOperatorValueEnum.CITY];
143
+ }
144
+ }
145
+
146
+ async checkLocationPreSegmentation(locationMap: Record<string, dynamic>, ipAddress: string): Promise<boolean> {
147
+ const queryParams = getQueryParamForLocationPreSegment(ipAddress);
148
+ const userLocation = await getFromWebService(queryParams, UrlEnum.LOCATION_CHECK);
149
+ if (!userLocation || userLocation === undefined || userLocation === 'false' || userLocation.status === 0) {
150
+ return false;
151
+ }
152
+ return this.valuesMatch(locationMap, userLocation.location);
153
+ }
154
+
155
+ async checkUserAgentParser(uaParserMap: Record<string, string[]>, userAgent: string): Promise<boolean> {
156
+ const queryParams = getQueryParamForUaParser(userAgent);
157
+ if (!userAgent || userAgent === undefined){
158
+ LogManager.Instance.info('To evaluate user agent related segments, please pass userAgent in context object');
159
+ return false;
160
+ }
161
+ const uaParser = await getFromWebService(queryParams, UrlEnum.UAPARSER);
162
+ if (!uaParser || uaParser === undefined || uaParser === 'false' || uaParser.status === 0) {
163
+ return false;
164
+ }
165
+
166
+ return this.checkValuePresent(uaParserMap, uaParser);
167
+ }
168
+
169
+ async checkInUserStorage( settings: SettingsModel, featureKey: string, user: any): Promise<any> {
170
+ const storageService = new StorageService();
171
+ const storedData: Record<any, any> = await new StorageDecorator().getFeatureFromStorage(featureKey, user, storageService);
172
+
173
+ //check only in userStorage
174
+ if(isObject(storedData) && Object.keys(storedData).length > 0) {
175
+ return true;
176
+ }
177
+ else {
178
+ return false;
179
+ }
180
+ }
181
+
182
+ async checkValuePresent(expectedMap: Record<string, string[]>, actualMap: Record<string, string>): Promise<boolean> {
183
+ for (const key in actualMap) {
184
+ if (Object.prototype.hasOwnProperty.call(expectedMap, key)) {
185
+ const expectedValues = expectedMap[key];
186
+ const actualValue = actualMap[key];
187
+
188
+ if (key === SegmentOperatorValueEnum.DEVICE_TYPE) {
189
+ const wildcardPatterns = expectedValues.filter(val => val.startsWith('wildcard(') && val.endsWith(')'));
190
+ if (wildcardPatterns.length > 0) {
191
+ // If any wildcard pattern matches, return true
192
+ if (wildcardPatterns.some(pattern => {
193
+ const wildcardPattern = pattern.slice(9, -1); // Extract pattern from wildcard string
194
+ const regex = new RegExp(wildcardPattern.replace(/\*/g, '.*')); // Convert wildcard pattern to regex
195
+ return regex.test(actualValue);
196
+ })) {
197
+ continue; // Value matches, continue to next key
198
+ } else {
199
+ return false; // No wildcard pattern matched, return false
200
+ }
201
+ }
202
+ } else {
203
+ if (expectedValues.includes(actualValue)) {
204
+ continue; // Value found, continue to next key
205
+ } else {
206
+ return false; // Value not found, return false
207
+ }
208
+ }
209
+ }
210
+ }
211
+ return true; // All keys checked and values found, return true
212
+ }
213
+
214
+
215
+ async valuesMatch(expectedLocationMap, userLocation) {
216
+ for (let [key, value] of Object.entries(expectedLocationMap)) {
217
+ if (userLocation.hasOwnProperty(key)) {
218
+ let normalizedValue1 = this.normalizeValue(value);
219
+ let normalizedValue2 = this.normalizeValue(userLocation[key]);
220
+ if (normalizedValue1 !== normalizedValue2) {
221
+ return false;
222
+ }
223
+ } else {
224
+ return false;
225
+ }
226
+ }
227
+ // If all values match, return true
228
+ return true;
229
+ }
230
+
231
+ normalizeValue(value) {
232
+ if (value === null || value === undefined) {
233
+ return null;
234
+ }
235
+ return value.toString().replace(/^"|"$/g, "").trim();
236
+ }
237
+
238
+
239
+ }