@prosopo/provider 3.12.3 → 3.12.14

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 (351) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +4278 -0
  5. package/coverage/coverage-final.json +42 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +311 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +214 -0
  13. package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +259 -0
  14. package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +283 -0
  15. package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +334 -0
  16. package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +298 -0
  17. package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +163 -0
  18. package/coverage/src/api/admin/index.html +191 -0
  19. package/coverage/src/api/blacklistRequestInspector.ts.html +751 -0
  20. package/coverage/src/api/block.ts.html +187 -0
  21. package/coverage/src/api/captcha.ts.html +2803 -0
  22. package/coverage/src/api/domainMiddleware.ts.html +493 -0
  23. package/coverage/src/api/headerCheckMiddleware.ts.html +256 -0
  24. package/coverage/src/api/ignoreMiddleware.ts.html +181 -0
  25. package/coverage/src/api/index.html +266 -0
  26. package/coverage/src/api/ja4Middleware.ts.html +400 -0
  27. package/coverage/src/api/public.ts.html +343 -0
  28. package/coverage/src/api/robotsMiddleware.ts.html +157 -0
  29. package/coverage/src/api/validateAddress.ts.html +214 -0
  30. package/coverage/src/api/verify.ts.html +871 -0
  31. package/coverage/src/compositeIpAddress.ts.html +340 -0
  32. package/coverage/src/index.html +161 -0
  33. package/coverage/src/index.ts.html +175 -0
  34. package/coverage/src/pairs.ts.html +238 -0
  35. package/coverage/src/rules/index.html +116 -0
  36. package/coverage/src/rules/lang.ts.html +187 -0
  37. package/coverage/src/schedulers/captchaScheduler.ts.html +250 -0
  38. package/coverage/src/schedulers/getClientList.ts.html +271 -0
  39. package/coverage/src/schedulers/index.html +131 -0
  40. package/coverage/src/services/index.html +131 -0
  41. package/coverage/src/services/ipComparison.ts.html +685 -0
  42. package/coverage/src/services/ipInfo.ts.html +490 -0
  43. package/coverage/src/tasks/captchaManager.ts.html +865 -0
  44. package/coverage/src/tasks/client/clientTasks.ts.html +1381 -0
  45. package/coverage/src/tasks/client/index.html +116 -0
  46. package/coverage/src/tasks/dataset/datasetTasks.ts.html +268 -0
  47. package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +271 -0
  48. package/coverage/src/tasks/dataset/index.html +131 -0
  49. package/coverage/src/tasks/detection/decodePayload.js.html +127 -0
  50. package/coverage/src/tasks/detection/getBotScore.ts.html +244 -0
  51. package/coverage/src/tasks/detection/index.html +131 -0
  52. package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +1216 -0
  53. package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +247 -0
  54. package/coverage/src/tasks/frictionless/index.html +131 -0
  55. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +1972 -0
  56. package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +232 -0
  57. package/coverage/src/tasks/imgCaptcha/index.html +131 -0
  58. package/coverage/src/tasks/index.html +146 -0
  59. package/coverage/src/tasks/index.ts.html +127 -0
  60. package/coverage/src/tasks/powCaptcha/index.html +131 -0
  61. package/coverage/src/tasks/powCaptcha/powTasks.ts.html +961 -0
  62. package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +244 -0
  63. package/coverage/src/tasks/tasks.ts.html +388 -0
  64. package/coverage/src/util.ts.html +1627 -0
  65. package/coverage/src/utils/hashUserAgent.ts.html +184 -0
  66. package/coverage/src/utils/index.html +116 -0
  67. package/dist/api/admin/apiAdminRoutesProvider.d.ts +9 -0
  68. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -0
  69. package/dist/api/admin/apiAdminRoutesProvider.js +13 -18
  70. package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -0
  71. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +14 -0
  72. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -0
  73. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -0
  74. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +23 -0
  75. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -0
  76. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -0
  77. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +13 -0
  78. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -0
  79. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +40 -0
  80. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -0
  81. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +14 -0
  82. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -0
  83. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -0
  84. package/dist/api/admin/createApiAdminRoutesProvider.d.ts +4 -0
  85. package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +1 -0
  86. package/dist/api/admin/createApiAdminRoutesProvider.js.map +1 -0
  87. package/dist/api/blacklistRequestInspector.d.ts +19 -0
  88. package/dist/api/blacklistRequestInspector.d.ts.map +1 -0
  89. package/dist/api/blacklistRequestInspector.js +4 -4
  90. package/dist/api/blacklistRequestInspector.js.map +1 -0
  91. package/dist/api/block.d.ts +3 -0
  92. package/dist/api/block.d.ts.map +1 -0
  93. package/dist/api/block.js.map +1 -0
  94. package/dist/api/captcha.d.ts +4 -0
  95. package/dist/api/captcha.d.ts.map +1 -0
  96. package/dist/api/captcha.js +130 -40
  97. package/dist/api/captcha.js.map +1 -0
  98. package/dist/api/domainMiddleware.d.ts +4 -0
  99. package/dist/api/domainMiddleware.d.ts.map +1 -0
  100. package/dist/api/domainMiddleware.js.map +1 -0
  101. package/dist/api/headerCheckMiddleware.d.ts +4 -0
  102. package/dist/api/headerCheckMiddleware.d.ts.map +1 -0
  103. package/dist/api/headerCheckMiddleware.js.map +1 -0
  104. package/dist/api/ignoreMiddleware.d.ts +3 -0
  105. package/dist/api/ignoreMiddleware.d.ts.map +1 -0
  106. package/dist/api/ignoreMiddleware.js.map +1 -0
  107. package/dist/api/ja4Middleware.d.ts +10 -0
  108. package/dist/api/ja4Middleware.d.ts.map +1 -0
  109. package/dist/api/ja4Middleware.js.map +1 -0
  110. package/dist/api/public.d.ts +4 -0
  111. package/dist/api/public.d.ts.map +1 -0
  112. package/dist/api/public.js.map +1 -0
  113. package/dist/api/robotsMiddleware.d.ts +3 -0
  114. package/dist/api/robotsMiddleware.d.ts.map +1 -0
  115. package/dist/api/robotsMiddleware.js.map +1 -0
  116. package/dist/api/validateAddress.d.ts +5 -0
  117. package/dist/api/validateAddress.d.ts.map +1 -0
  118. package/dist/api/validateAddress.js.map +1 -0
  119. package/dist/api/verify.d.ts +4 -0
  120. package/dist/api/verify.d.ts.map +1 -0
  121. package/dist/api/verify.js +23 -1
  122. package/dist/api/verify.js.map +1 -0
  123. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +13 -18
  124. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +2 -1
  125. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +3 -2
  126. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +41 -0
  127. package/dist/cjs/api/blacklistRequestInspector.cjs +3 -3
  128. package/dist/cjs/api/captcha.cjs +130 -40
  129. package/dist/cjs/api/ja4Middleware.cjs +2 -1
  130. package/dist/cjs/api/verify.cjs +23 -1
  131. package/dist/cjs/tasks/captchaManager.cjs +5 -21
  132. package/dist/cjs/tasks/client/clientTasks.cjs +3 -36
  133. package/dist/cjs/tasks/detection/decodePayload.cjs +570 -669
  134. package/dist/cjs/tasks/detection/getBotScore.cjs +15 -2
  135. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +116 -29
  136. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +18 -12
  137. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +6 -6
  138. package/dist/cjs/util.cjs +14 -1
  139. package/dist/compositeIpAddress.d.ts +5 -0
  140. package/dist/compositeIpAddress.d.ts.map +1 -0
  141. package/dist/compositeIpAddress.js.map +1 -0
  142. package/dist/index.d.ts +17 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/pairs.d.ts +3 -0
  146. package/dist/pairs.d.ts.map +1 -0
  147. package/dist/pairs.js.map +1 -0
  148. package/dist/rules/lang.d.ts +3 -0
  149. package/dist/rules/lang.d.ts.map +1 -0
  150. package/dist/rules/lang.js.map +1 -0
  151. package/dist/schedulers/captchaScheduler.d.ts +4 -0
  152. package/dist/schedulers/captchaScheduler.d.ts.map +1 -0
  153. package/dist/schedulers/captchaScheduler.js.map +1 -0
  154. package/dist/schedulers/getClientList.d.ts +4 -0
  155. package/dist/schedulers/getClientList.d.ts.map +1 -0
  156. package/dist/schedulers/getClientList.js.map +1 -0
  157. package/dist/schedulers/setClientEntropy.d.ts +4 -0
  158. package/dist/schedulers/setClientEntropy.d.ts.map +1 -0
  159. package/dist/schedulers/setClientEntropy.js +31 -0
  160. package/dist/schedulers/setClientEntropy.js.map +1 -0
  161. package/dist/services/ipComparison.d.ts +3 -0
  162. package/dist/services/ipComparison.d.ts.map +1 -0
  163. package/dist/services/ipComparison.js.map +1 -0
  164. package/dist/services/ipInfo.d.ts +3 -0
  165. package/dist/services/ipInfo.d.ts.map +1 -0
  166. package/dist/services/ipInfo.js.map +1 -0
  167. package/dist/tasks/captchaManager.d.ts +34 -0
  168. package/dist/tasks/captchaManager.d.ts.map +1 -0
  169. package/dist/tasks/captchaManager.js +3 -20
  170. package/dist/tasks/captchaManager.js.map +1 -0
  171. package/dist/tasks/client/clientTasks.d.ts +21 -0
  172. package/dist/tasks/client/clientTasks.d.ts.map +1 -0
  173. package/dist/tasks/client/clientTasks.js +3 -36
  174. package/dist/tasks/client/clientTasks.js.map +1 -0
  175. package/dist/tasks/dataset/datasetTasks.d.ts +13 -0
  176. package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
  177. package/dist/tasks/dataset/datasetTasks.js.map +1 -0
  178. package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
  179. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
  180. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
  181. package/dist/tasks/detection/decodePayload.d.ts +5 -0
  182. package/dist/tasks/detection/decodePayload.d.ts.map +1 -0
  183. package/dist/tasks/detection/decodePayload.js +570 -669
  184. package/dist/tasks/detection/decodePayload.js.map +1 -0
  185. package/dist/tasks/detection/getBotScore.d.ts +20 -0
  186. package/dist/tasks/detection/getBotScore.d.ts.map +1 -0
  187. package/dist/tasks/detection/getBotScore.js +17 -4
  188. package/dist/tasks/detection/getBotScore.js.map +1 -0
  189. package/dist/tasks/frictionless/frictionlessTasks.d.ts +67 -0
  190. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -0
  191. package/dist/tasks/frictionless/frictionlessTasks.js +116 -29
  192. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -0
  193. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +6 -0
  194. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -0
  195. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -0
  196. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +30 -0
  197. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
  198. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +18 -12
  199. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
  200. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
  201. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
  202. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
  203. package/dist/tasks/index.d.ts +2 -0
  204. package/dist/tasks/index.d.ts.map +1 -0
  205. package/dist/tasks/index.js.map +1 -0
  206. package/dist/tasks/powCaptcha/powTasks.d.ts +17 -0
  207. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
  208. package/dist/tasks/powCaptcha/powTasks.js +6 -6
  209. package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
  210. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +3 -0
  211. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
  212. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
  213. package/dist/tasks/tasks.d.ts +25 -0
  214. package/dist/tasks/tasks.d.ts.map +1 -0
  215. package/dist/tasks/tasks.js.map +1 -0
  216. package/dist/tests/index.d.ts +2 -0
  217. package/dist/tests/index.d.ts.map +1 -0
  218. package/dist/tests/index.js +2 -0
  219. package/dist/tests/index.js.map +1 -0
  220. package/dist/tests/integration/accessRules.integration.test.d.ts +2 -0
  221. package/dist/tests/integration/accessRules.integration.test.d.ts.map +1 -0
  222. package/dist/tests/integration/accessRules.integration.test.js +588 -0
  223. package/dist/tests/integration/accessRules.integration.test.js.map +1 -0
  224. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +2 -0
  225. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +1 -0
  226. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +60 -0
  227. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -0
  228. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +2 -0
  229. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +1 -0
  230. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +368 -0
  231. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -0
  232. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +2 -0
  233. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +1 -0
  234. package/dist/tests/integration/imgCaptcha.integration.test.js +272 -0
  235. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -0
  236. package/dist/tests/integration/ipValidation.integration.test.d.ts +2 -0
  237. package/dist/tests/integration/ipValidation.integration.test.d.ts.map +1 -0
  238. package/dist/tests/integration/ipValidation.integration.test.js +75 -0
  239. package/dist/tests/integration/ipValidation.integration.test.js.map +1 -0
  240. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
  241. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
  242. package/dist/tests/integration/mocks/solvedTestCaptchas.js +1046 -0
  243. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
  244. package/dist/tests/integration/powCaptcha.integration.test.d.ts +2 -0
  245. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +1 -0
  246. package/dist/tests/integration/powCaptcha.integration.test.js +308 -0
  247. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -0
  248. package/dist/tests/integration/registerSitekey.d.ts +3 -0
  249. package/dist/tests/integration/registerSitekey.d.ts.map +1 -0
  250. package/dist/tests/integration/registerSitekey.js +24 -0
  251. package/dist/tests/integration/registerSitekey.js.map +1 -0
  252. package/dist/tests/integration/userAccessPolicy.d.ts +2 -0
  253. package/dist/tests/integration/userAccessPolicy.d.ts.map +1 -0
  254. package/dist/tests/integration/userAccessPolicy.js +2 -0
  255. package/dist/tests/integration/userAccessPolicy.js.map +1 -0
  256. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +2 -0
  257. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +1 -0
  258. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +60 -0
  259. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -0
  260. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
  261. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
  262. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
  263. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
  264. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
  265. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
  266. package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
  267. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
  268. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +2 -0
  269. package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +1 -0
  270. package/dist/tests/unit/compositeIpAddress.unit.test.js +86 -0
  271. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -0
  272. package/dist/tests/unit/pairs.unit.test.d.ts +2 -0
  273. package/dist/tests/unit/pairs.unit.test.d.ts.map +1 -0
  274. package/dist/tests/unit/pairs.unit.test.js +83 -0
  275. package/dist/tests/unit/pairs.unit.test.js.map +1 -0
  276. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +2 -0
  277. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +1 -0
  278. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +75 -0
  279. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -0
  280. package/dist/tests/unit/services/ipComparison.unit.test.d.ts +2 -0
  281. package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +1 -0
  282. package/dist/tests/unit/services/ipComparison.unit.test.js +258 -0
  283. package/dist/tests/unit/services/ipComparison.unit.test.js.map +1 -0
  284. package/dist/tests/unit/services/ipInfo.unit.test.d.ts +2 -0
  285. package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +1 -0
  286. package/dist/tests/unit/services/ipInfo.unit.test.js +210 -0
  287. package/dist/tests/unit/services/ipInfo.unit.test.js.map +1 -0
  288. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +2 -0
  289. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +1 -0
  290. package/dist/tests/unit/tasks/captchaManager.unit.test.js +311 -0
  291. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -0
  292. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +2 -0
  293. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +1 -0
  294. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +289 -0
  295. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -0
  296. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +2 -0
  297. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +1 -0
  298. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +92 -0
  299. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -0
  300. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +2 -0
  301. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +1 -0
  302. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +75 -0
  303. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -0
  304. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +2 -0
  305. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +1 -0
  306. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +143 -0
  307. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +1 -0
  308. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +2 -0
  309. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +1 -0
  310. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +145 -0
  311. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -0
  312. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +2 -0
  313. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +1 -0
  314. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
  315. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -0
  316. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +2 -0
  317. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +1 -0
  318. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +388 -0
  319. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -0
  320. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +2 -0
  321. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +1 -0
  322. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +46 -0
  323. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -0
  324. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +2 -0
  325. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +1 -0
  326. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +216 -0
  327. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -0
  328. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +2 -0
  329. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +1 -0
  330. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +69 -0
  331. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -0
  332. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +2 -0
  333. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +1 -0
  334. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +505 -0
  335. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +1 -0
  336. package/dist/tests/unit/util.ipDistance.unit.test.d.ts +2 -0
  337. package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +1 -0
  338. package/dist/tests/unit/util.ipDistance.unit.test.js +93 -0
  339. package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -0
  340. package/dist/tests/unit/util.unit.test.d.ts +2 -0
  341. package/dist/tests/unit/util.unit.test.d.ts.map +1 -0
  342. package/dist/tests/unit/util.unit.test.js +170 -0
  343. package/dist/tests/unit/util.unit.test.js.map +1 -0
  344. package/dist/util.d.ts +24 -0
  345. package/dist/util.d.ts.map +1 -0
  346. package/dist/util.js +14 -1
  347. package/dist/util.js.map +1 -0
  348. package/dist/utils/hashUserAgent.d.ts +2 -0
  349. package/dist/utils/hashUserAgent.d.ts.map +1 -0
  350. package/dist/utils/hashUserAgent.js.map +1 -0
  351. package/package.json +24 -25
@@ -0,0 +1,505 @@
1
+ import { IPValidationAction } from "@prosopo/types";
2
+ import { describe, expect, it } from "vitest";
3
+ import { evaluateIpValidationRules } from "../../util.js";
4
+ const mockLogger = {
5
+ info: () => { },
6
+ error: () => { },
7
+ warn: () => { },
8
+ debug: () => { },
9
+ setLogLevel: () => { },
10
+ getLogLevel: () => "info",
11
+ getScope: () => "test",
12
+ trace: () => { },
13
+ };
14
+ describe("evaluateIpValidationRules", () => {
15
+ const baseRules = {
16
+ actions: {
17
+ countryChangeAction: IPValidationAction.Flag,
18
+ cityChangeAction: IPValidationAction.Allow,
19
+ distanceExceedAction: IPValidationAction.Flag,
20
+ ispChangeAction: IPValidationAction.Reject,
21
+ abuseScoreExceedAction: IPValidationAction.Reject,
22
+ },
23
+ distanceThresholdKm: 1000,
24
+ abuseScoreThreshold: 0.005,
25
+ requireAllConditions: false,
26
+ forceConsistentIp: false,
27
+ };
28
+ it("returns Allow when no conditions are met", () => {
29
+ const comparison = {
30
+ ipsMatch: true,
31
+ ip1: "ip1",
32
+ ip2: "ip2",
33
+ comparison: {},
34
+ };
35
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
36
+ expect(result.action).toBe(IPValidationAction.Allow);
37
+ expect(result.errorMessage).toBeUndefined();
38
+ });
39
+ it("returns Reject if ISP change triggers Reject", () => {
40
+ const comparison = {
41
+ ipsMatch: false,
42
+ ip1: "ip1",
43
+ ip2: "ip2",
44
+ comparison: {
45
+ ip1Details: {
46
+ country: "A",
47
+ countryCode: "A",
48
+ provider: "X",
49
+ connectionType: "residential",
50
+ isVpnOrProxy: false,
51
+ },
52
+ ip2Details: {
53
+ country: "A",
54
+ countryCode: "A",
55
+ provider: "Y",
56
+ connectionType: "residential",
57
+ isVpnOrProxy: false,
58
+ },
59
+ differentProviders: true,
60
+ differentConnectionTypes: false,
61
+ anyVpnOrProxy: false,
62
+ },
63
+ };
64
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
65
+ expect(result.action).toBe(IPValidationAction.Reject);
66
+ expect(result.errorMessage).toContain("ISP changed");
67
+ });
68
+ it("returns Flag if country change triggers Flag", () => {
69
+ const comparison = {
70
+ ipsMatch: false,
71
+ ip1: "ip1",
72
+ ip2: "ip2",
73
+ comparison: {
74
+ ip1Details: {
75
+ country: "A",
76
+ countryCode: "A",
77
+ provider: "X",
78
+ connectionType: "residential",
79
+ isVpnOrProxy: false,
80
+ },
81
+ ip2Details: {
82
+ country: "B",
83
+ countryCode: "B",
84
+ provider: "X",
85
+ connectionType: "residential",
86
+ isVpnOrProxy: false,
87
+ },
88
+ distanceKm: 2000,
89
+ differentProviders: false,
90
+ differentConnectionTypes: false,
91
+ anyVpnOrProxy: false,
92
+ },
93
+ };
94
+ const rules = {
95
+ ...baseRules,
96
+ actions: {
97
+ ...baseRules.actions,
98
+ countryChangeAction: IPValidationAction.Flag,
99
+ },
100
+ };
101
+ const result = evaluateIpValidationRules(comparison, rules, mockLogger);
102
+ expect(result.action).toBe(IPValidationAction.Flag);
103
+ expect(result.errorMessage).toContain("Country changed");
104
+ });
105
+ it("returns Flag if distance exceeds threshold", () => {
106
+ const comparison = {
107
+ ipsMatch: false,
108
+ ip1: "ip1",
109
+ ip2: "ip2",
110
+ comparison: {
111
+ ip1Details: {
112
+ country: "A",
113
+ countryCode: "A",
114
+ provider: "X",
115
+ connectionType: "residential",
116
+ isVpnOrProxy: false,
117
+ },
118
+ ip2Details: {
119
+ country: "A",
120
+ countryCode: "A",
121
+ provider: "X",
122
+ connectionType: "residential",
123
+ isVpnOrProxy: false,
124
+ },
125
+ distanceKm: 2000,
126
+ differentProviders: false,
127
+ differentConnectionTypes: false,
128
+ anyVpnOrProxy: false,
129
+ },
130
+ };
131
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
132
+ expect(result.action).toBe(IPValidationAction.Flag);
133
+ expect(result.errorMessage).toBeDefined();
134
+ expect(result.errorMessage).toMatch(/IP addresses are 2000\.00km apart/);
135
+ });
136
+ it("returns Allow if city change triggers Allow", () => {
137
+ const comparison = {
138
+ ipsMatch: false,
139
+ ip1: "ip1",
140
+ ip2: "ip2",
141
+ comparison: {
142
+ ip1Details: {
143
+ country: "A",
144
+ countryCode: "A",
145
+ city: "CityA",
146
+ provider: "X",
147
+ connectionType: "residential",
148
+ isVpnOrProxy: false,
149
+ },
150
+ ip2Details: {
151
+ country: "A",
152
+ countryCode: "A",
153
+ city: "CityB",
154
+ provider: "X",
155
+ connectionType: "residential",
156
+ isVpnOrProxy: false,
157
+ },
158
+ differentProviders: false,
159
+ differentConnectionTypes: false,
160
+ anyVpnOrProxy: false,
161
+ },
162
+ };
163
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
164
+ expect(result.action).toBe(IPValidationAction.Allow);
165
+ });
166
+ it("returns Flag if city change triggers Flag", () => {
167
+ const comparison = {
168
+ ipsMatch: false,
169
+ ip1: "ip1",
170
+ ip2: "ip2",
171
+ comparison: {
172
+ ip1Details: {
173
+ country: "A",
174
+ countryCode: "A",
175
+ city: "CityA",
176
+ provider: "X",
177
+ connectionType: "residential",
178
+ isVpnOrProxy: false,
179
+ },
180
+ ip2Details: {
181
+ country: "A",
182
+ countryCode: "A",
183
+ city: "CityB",
184
+ provider: "X",
185
+ connectionType: "residential",
186
+ isVpnOrProxy: false,
187
+ },
188
+ differentProviders: false,
189
+ differentConnectionTypes: false,
190
+ anyVpnOrProxy: false,
191
+ },
192
+ };
193
+ const rules = {
194
+ ...baseRules,
195
+ actions: {
196
+ ...baseRules.actions,
197
+ cityChangeAction: IPValidationAction.Flag,
198
+ },
199
+ };
200
+ const result = evaluateIpValidationRules(comparison, rules, mockLogger);
201
+ expect(result.action).toBe(IPValidationAction.Flag);
202
+ expect(result.errorMessage).toContain("City changed");
203
+ });
204
+ it("returns Reject if city change triggers Reject", () => {
205
+ const comparison = {
206
+ ipsMatch: false,
207
+ ip1: "ip1",
208
+ ip2: "ip2",
209
+ comparison: {
210
+ ip1Details: {
211
+ country: "A",
212
+ countryCode: "A",
213
+ city: "CityA",
214
+ provider: "X",
215
+ connectionType: "residential",
216
+ isVpnOrProxy: false,
217
+ },
218
+ ip2Details: {
219
+ country: "A",
220
+ countryCode: "A",
221
+ city: "CityB",
222
+ provider: "X",
223
+ connectionType: "residential",
224
+ isVpnOrProxy: false,
225
+ },
226
+ differentProviders: false,
227
+ differentConnectionTypes: false,
228
+ anyVpnOrProxy: false,
229
+ },
230
+ };
231
+ const rules = {
232
+ ...baseRules,
233
+ actions: {
234
+ ...baseRules.actions,
235
+ cityChangeAction: IPValidationAction.Reject,
236
+ },
237
+ };
238
+ const result = evaluateIpValidationRules(comparison, rules, mockLogger);
239
+ expect(result.action).toBe(IPValidationAction.Reject);
240
+ expect(result.errorMessage).toContain("City changed from CityA to CityB");
241
+ });
242
+ it("returns no flag if one condition is true but requireAllConditions is true", () => {
243
+ const requireAllRules = {
244
+ actions: {
245
+ countryChangeAction: IPValidationAction.Reject,
246
+ cityChangeAction: IPValidationAction.Allow,
247
+ ispChangeAction: IPValidationAction.Reject,
248
+ distanceExceedAction: IPValidationAction.Allow,
249
+ abuseScoreExceedAction: IPValidationAction.Reject,
250
+ },
251
+ distanceThresholdKm: 1000,
252
+ abuseScoreThreshold: 0.005,
253
+ requireAllConditions: true,
254
+ forceConsistentIp: false,
255
+ };
256
+ const comparison = {
257
+ ipsMatch: false,
258
+ ip1: "ip1",
259
+ ip2: "ip2",
260
+ comparison: {
261
+ ip1Details: {
262
+ country: "A",
263
+ countryCode: "A",
264
+ provider: "X",
265
+ connectionType: "residential",
266
+ isVpnOrProxy: false,
267
+ },
268
+ ip2Details: {
269
+ country: "A",
270
+ countryCode: "A",
271
+ provider: "Y",
272
+ connectionType: "residential",
273
+ isVpnOrProxy: false,
274
+ },
275
+ distanceKm: 500,
276
+ differentProviders: true,
277
+ differentConnectionTypes: false,
278
+ anyVpnOrProxy: false,
279
+ },
280
+ };
281
+ const result = evaluateIpValidationRules(comparison, requireAllRules, mockLogger);
282
+ expect(result.action).toBe(IPValidationAction.Allow);
283
+ });
284
+ it("applies country-specific overrides correctly", () => {
285
+ const comparison = {
286
+ ipsMatch: false,
287
+ ip1: "ip1",
288
+ ip2: "ip2",
289
+ comparison: {
290
+ ip1Details: {
291
+ country: "A",
292
+ countryCode: "A",
293
+ provider: "X",
294
+ connectionType: "residential",
295
+ isVpnOrProxy: false,
296
+ },
297
+ ip2Details: {
298
+ country: "B",
299
+ countryCode: "B",
300
+ provider: "X",
301
+ connectionType: "residential",
302
+ isVpnOrProxy: false,
303
+ },
304
+ differentProviders: false,
305
+ differentConnectionTypes: false,
306
+ anyVpnOrProxy: false,
307
+ },
308
+ };
309
+ const rulesWithOverrides = {
310
+ ...baseRules,
311
+ countryOverrides: {
312
+ B: {
313
+ actions: {
314
+ countryChangeAction: IPValidationAction.Reject,
315
+ },
316
+ },
317
+ },
318
+ };
319
+ const result = evaluateIpValidationRules(comparison, rulesWithOverrides, mockLogger);
320
+ expect(result.action).toBe(IPValidationAction.Reject);
321
+ expect(result.errorMessage).toContain("Country changed from A to B");
322
+ });
323
+ it("applies country override for distance threshold", () => {
324
+ const comparison = {
325
+ ipsMatch: false,
326
+ ip1: "ip1",
327
+ ip2: "ip2",
328
+ comparison: {
329
+ ip1Details: {
330
+ country: "A",
331
+ countryCode: "A",
332
+ provider: "X",
333
+ connectionType: "residential",
334
+ isVpnOrProxy: false,
335
+ },
336
+ ip2Details: {
337
+ country: "B",
338
+ countryCode: "B",
339
+ provider: "X",
340
+ connectionType: "residential",
341
+ isVpnOrProxy: false,
342
+ },
343
+ distanceKm: 800,
344
+ differentProviders: false,
345
+ differentConnectionTypes: false,
346
+ anyVpnOrProxy: false,
347
+ },
348
+ };
349
+ const rulesWithOverrides = {
350
+ ...baseRules,
351
+ countryOverrides: {
352
+ B: {
353
+ actions: {},
354
+ distanceThresholdKm: 500,
355
+ abuseScoreThreshold: 0.01,
356
+ },
357
+ },
358
+ };
359
+ const result = evaluateIpValidationRules(comparison, rulesWithOverrides, mockLogger);
360
+ expect(result.action).toBe(IPValidationAction.Flag);
361
+ expect(result.errorMessage).toContain("IP addresses are 800.00km apart (>500km limit)");
362
+ });
363
+ it("returns Reject if abuse score exceeds threshold", () => {
364
+ const comparison = {
365
+ ipsMatch: false,
366
+ ip1: "ip1",
367
+ ip2: "ip2",
368
+ comparison: {
369
+ ip1Details: {
370
+ country: "A",
371
+ countryCode: "A",
372
+ provider: "X",
373
+ connectionType: "residential",
374
+ isVpnOrProxy: false,
375
+ abuserScore: 0.001,
376
+ },
377
+ ip2Details: {
378
+ country: "A",
379
+ countryCode: "A",
380
+ provider: "X",
381
+ connectionType: "residential",
382
+ isVpnOrProxy: false,
383
+ abuserScore: 0.01,
384
+ },
385
+ differentProviders: false,
386
+ differentConnectionTypes: false,
387
+ anyVpnOrProxy: false,
388
+ },
389
+ };
390
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
391
+ expect(result.action).toBe(IPValidationAction.Reject);
392
+ expect(result.errorMessage).toContain("Abuse score 0.0100 exceeds threshold 0.005");
393
+ });
394
+ it("returns Allow if abuse score does not exceed threshold", () => {
395
+ const comparison = {
396
+ ipsMatch: false,
397
+ ip1: "ip1",
398
+ ip2: "ip2",
399
+ comparison: {
400
+ ip1Details: {
401
+ country: "A",
402
+ countryCode: "A",
403
+ provider: "X",
404
+ connectionType: "residential",
405
+ isVpnOrProxy: false,
406
+ abuserScore: 0.001,
407
+ },
408
+ ip2Details: {
409
+ country: "A",
410
+ countryCode: "A",
411
+ provider: "X",
412
+ connectionType: "residential",
413
+ isVpnOrProxy: false,
414
+ abuserScore: 0.002,
415
+ },
416
+ differentProviders: false,
417
+ differentConnectionTypes: false,
418
+ anyVpnOrProxy: false,
419
+ },
420
+ };
421
+ const result = evaluateIpValidationRules(comparison, baseRules, mockLogger);
422
+ expect(result.action).toBe(IPValidationAction.Allow);
423
+ });
424
+ it("applies country override for abuse score threshold", () => {
425
+ const comparison = {
426
+ ipsMatch: false,
427
+ ip1: "ip1",
428
+ ip2: "ip2",
429
+ comparison: {
430
+ ip1Details: {
431
+ country: "A",
432
+ countryCode: "A",
433
+ provider: "X",
434
+ connectionType: "residential",
435
+ isVpnOrProxy: false,
436
+ abuserScore: 0.001,
437
+ },
438
+ ip2Details: {
439
+ country: "B",
440
+ countryCode: "B",
441
+ provider: "X",
442
+ connectionType: "residential",
443
+ isVpnOrProxy: false,
444
+ abuserScore: 0.007,
445
+ },
446
+ differentProviders: false,
447
+ differentConnectionTypes: false,
448
+ anyVpnOrProxy: false,
449
+ },
450
+ };
451
+ const rulesWithOverrides = {
452
+ ...baseRules,
453
+ countryOverrides: {
454
+ B: {
455
+ actions: {
456
+ abuseScoreExceedAction: IPValidationAction.Flag,
457
+ },
458
+ distanceThresholdKm: 500,
459
+ abuseScoreThreshold: 0.0001,
460
+ },
461
+ },
462
+ };
463
+ const result = evaluateIpValidationRules(comparison, rulesWithOverrides, mockLogger);
464
+ expect(result.action).toBe(IPValidationAction.Flag);
465
+ });
466
+ it("returns Flag if abuse score triggers Flag action", () => {
467
+ const comparison = {
468
+ ipsMatch: false,
469
+ ip1: "ip1",
470
+ ip2: "ip2",
471
+ comparison: {
472
+ ip1Details: {
473
+ country: "A",
474
+ countryCode: "A",
475
+ provider: "X",
476
+ connectionType: "residential",
477
+ isVpnOrProxy: false,
478
+ abuserScore: 0.001,
479
+ },
480
+ ip2Details: {
481
+ country: "A",
482
+ countryCode: "A",
483
+ provider: "X",
484
+ connectionType: "residential",
485
+ isVpnOrProxy: false,
486
+ abuserScore: 0.01,
487
+ },
488
+ differentProviders: false,
489
+ differentConnectionTypes: false,
490
+ anyVpnOrProxy: false,
491
+ },
492
+ };
493
+ const rules = {
494
+ ...baseRules,
495
+ actions: {
496
+ ...baseRules.actions,
497
+ abuseScoreExceedAction: IPValidationAction.Flag,
498
+ },
499
+ };
500
+ const result = evaluateIpValidationRules(comparison, rules, mockLogger);
501
+ expect(result.action).toBe(IPValidationAction.Flag);
502
+ expect(result.errorMessage).toContain("Abuse score 0.0100 exceeds threshold 0.005");
503
+ });
504
+ });
505
+ //# sourceMappingURL=util.evaluateIpValidationRules.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.evaluateIpValidationRules.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/util.evaluateIpValidationRules.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.ipDistance.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.ipDistance.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/util.ipDistance.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { Address4 } from "ip-address";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import * as ipComparisonModule from "../../services/ipComparison.js";
4
+ import { deepValidateIpAddress } from "../../util.js";
5
+ describe("deepValidateIpAddress", () => {
6
+ let mockLogger;
7
+ const compareIPsSpy = vi.spyOn(ipComparisonModule, "compareIPs");
8
+ beforeEach(() => {
9
+ mockLogger = {
10
+ info: vi.fn(),
11
+ debug: vi.fn(),
12
+ error: vi.fn(),
13
+ log: vi.fn(),
14
+ warn: vi.fn(),
15
+ };
16
+ vi.clearAllMocks();
17
+ });
18
+ it("should return valid when IPs match exactly", async () => {
19
+ const ip = "192.168.1.1";
20
+ const challengeIp = new Address4("192.168.1.1");
21
+ const result = await deepValidateIpAddress(ip, challengeIp, mockLogger, "test-api-key", "test-api-url");
22
+ expect(result.isValid).toBe(true);
23
+ expect(compareIPsSpy).not.toHaveBeenCalled();
24
+ });
25
+ it("should reject when distance > 1000km", async () => {
26
+ const ip = "8.8.8.8";
27
+ const challengeIp = new Address4("1.1.1.1");
28
+ compareIPsSpy.mockResolvedValueOnce({
29
+ ipsMatch: false,
30
+ ip1: "1.1.1.1",
31
+ ip2: "8.8.8.8",
32
+ comparison: {
33
+ differentProviders: true,
34
+ differentConnectionTypes: false,
35
+ distanceKm: 2500,
36
+ anyVpnOrProxy: false,
37
+ ip1Details: {
38
+ provider: "Cloudflare",
39
+ connectionType: "datacenter",
40
+ isVpnOrProxy: false,
41
+ country: "US",
42
+ city: "New York",
43
+ },
44
+ ip2Details: {
45
+ provider: "Google",
46
+ connectionType: "datacenter",
47
+ isVpnOrProxy: false,
48
+ country: "AU",
49
+ city: "Sydney",
50
+ },
51
+ },
52
+ });
53
+ const result = await deepValidateIpAddress(ip, challengeIp, mockLogger, "test-api-key", "test-api-url");
54
+ expect(result.isValid).toBe(false);
55
+ expect(result.distanceKm).toBe(2500);
56
+ expect(result.errorMessage).toContain("too far apart");
57
+ });
58
+ it("should allow but flag when distance <= 1000km", async () => {
59
+ const ip = "8.8.8.8";
60
+ const challengeIp = new Address4("1.1.1.1");
61
+ compareIPsSpy.mockResolvedValueOnce({
62
+ ipsMatch: false,
63
+ ip1: "1.1.1.1",
64
+ ip2: "8.8.8.8",
65
+ comparison: {
66
+ differentProviders: true,
67
+ differentConnectionTypes: false,
68
+ distanceKm: 500,
69
+ anyVpnOrProxy: false,
70
+ ip1Details: {
71
+ provider: "Cloudflare",
72
+ connectionType: "datacenter",
73
+ isVpnOrProxy: false,
74
+ country: "US",
75
+ city: "New York",
76
+ },
77
+ ip2Details: {
78
+ provider: "Google",
79
+ connectionType: "datacenter",
80
+ isVpnOrProxy: false,
81
+ country: "US",
82
+ city: "San Francisco",
83
+ },
84
+ },
85
+ });
86
+ const result = await deepValidateIpAddress(ip, challengeIp, mockLogger, "test-api-key", "test-api-url");
87
+ expect(result.isValid).toBe(true);
88
+ expect(result.shouldFlag).toBe(true);
89
+ expect(result.distanceKm).toBe(500);
90
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.any(Function));
91
+ });
92
+ });
93
+ //# sourceMappingURL=util.ipDistance.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.ipDistance.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/util.ipDistance.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/util.unit.test.ts"],"names":[],"mappings":""}