@prosopo/provider 3.15.0 → 4.7.1

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 (623) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +104 -57
  2. package/.turbo/turbo-build$colon$tsc.log +30 -24
  3. package/.turbo/turbo-build.log +104 -58
  4. package/CHANGELOG.md +1311 -0
  5. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -1
  6. package/dist/api/admin/apiAdminRoutesProvider.js +31 -1
  7. package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -1
  8. package/dist/api/admin/apiClearAllCountersEndpoint.d.ts +14 -0
  9. package/dist/api/admin/apiClearAllCountersEndpoint.d.ts.map +1 -0
  10. package/dist/api/admin/apiClearAllCountersEndpoint.js +59 -0
  11. package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -0
  12. package/dist/api/admin/apiDnsEventEndpoint.d.ts +15 -0
  13. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -0
  14. package/dist/api/admin/apiDnsEventEndpoint.js +64 -0
  15. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -0
  16. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts +13 -0
  17. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts.map +1 -0
  18. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +49 -0
  19. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -0
  20. package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts +14 -0
  21. package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts.map +1 -0
  22. package/dist/api/admin/apiGetDecisionMachineEndpoint.js +42 -0
  23. package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -0
  24. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +1 -1
  25. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +1 -1
  26. package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts +14 -0
  27. package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts.map +1 -0
  28. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +33 -0
  29. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js.map +1 -0
  30. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts +13 -0
  31. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts.map +1 -0
  32. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +41 -0
  33. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -0
  34. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts +14 -0
  35. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts.map +1 -0
  36. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +42 -0
  37. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -0
  38. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +2 -2
  39. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  40. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +1 -1
  41. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
  42. package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts +14 -0
  43. package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts.map +1 -0
  44. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +32 -0
  45. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -0
  46. package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts +14 -0
  47. package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts.map +1 -0
  48. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +34 -0
  49. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -0
  50. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +1 -1
  51. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +1 -1
  52. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts +14 -0
  53. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts.map +1 -0
  54. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +60 -0
  55. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -0
  56. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +1 -1
  57. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -1
  58. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +1 -1
  59. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
  60. package/dist/api/blacklistRequestInspector.d.ts +4 -3
  61. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  62. package/dist/api/blacklistRequestInspector.js +18 -5
  63. package/dist/api/blacklistRequestInspector.js.map +1 -1
  64. package/dist/api/block.d.ts +2 -1
  65. package/dist/api/block.d.ts.map +1 -1
  66. package/dist/api/block.js +19 -8
  67. package/dist/api/block.js.map +1 -1
  68. package/dist/api/captcha/checkSpamEmail.d.ts +6 -0
  69. package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -0
  70. package/dist/api/captcha/checkSpamEmail.js +80 -0
  71. package/dist/api/captcha/checkSpamEmail.js.map +1 -0
  72. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts +31 -0
  73. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -0
  74. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +123 -0
  75. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -0
  76. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +3 -0
  77. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -0
  78. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +13 -0
  79. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -0
  80. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts +36 -0
  81. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -0
  82. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +287 -0
  83. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -0
  84. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.d.ts +4 -0
  85. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.d.ts.map +1 -0
  86. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.js +14 -0
  87. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.js.map +1 -0
  88. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts +7 -0
  89. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -0
  90. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +314 -0
  91. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -0
  92. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.d.ts +5 -0
  93. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.d.ts.map +1 -0
  94. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.js +17 -0
  95. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.js.map +1 -0
  96. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.d.ts +14 -0
  97. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.d.ts.map +1 -0
  98. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.js +28 -0
  99. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.js.map +1 -0
  100. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +23 -0
  101. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -0
  102. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +61 -0
  103. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -0
  104. package/dist/api/captcha/getFrictionlessCaptchaChallenge.d.ts +1 -7
  105. package/dist/api/captcha/getFrictionlessCaptchaChallenge.d.ts.map +1 -1
  106. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +2 -364
  107. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js.map +1 -1
  108. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  109. package/dist/api/captcha/getImageCaptchaChallenge.js +36 -9
  110. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  111. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  112. package/dist/api/captcha/getPoWCaptchaChallenge.js +49 -7
  113. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  114. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +7 -0
  115. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -0
  116. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +201 -0
  117. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -0
  118. package/dist/api/captcha/maintenanceModeResponses.d.ts +5 -0
  119. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -0
  120. package/dist/api/captcha/maintenanceModeResponses.js +42 -0
  121. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -0
  122. package/dist/api/captcha/submitImageCaptchaSolution.d.ts +1 -2
  123. package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
  124. package/dist/api/captcha/submitImageCaptchaSolution.js +19 -2
  125. package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
  126. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  127. package/dist/api/captcha/submitPoWCaptchaSolution.js +84 -7
  128. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  129. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +6 -0
  130. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -0
  131. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +108 -0
  132. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -0
  133. package/dist/api/captcha.d.ts.map +1 -1
  134. package/dist/api/captcha.js +28 -3
  135. package/dist/api/captcha.js.map +1 -1
  136. package/dist/api/dnsEventUrl.d.ts +3 -0
  137. package/dist/api/dnsEventUrl.d.ts.map +1 -0
  138. package/dist/api/dnsEventUrl.js +25 -0
  139. package/dist/api/dnsEventUrl.js.map +1 -0
  140. package/dist/api/domainMiddleware.d.ts.map +1 -1
  141. package/dist/api/domainMiddleware.js +36 -5
  142. package/dist/api/domainMiddleware.js.map +1 -1
  143. package/dist/api/ipInfoMiddleware.d.ts +4 -0
  144. package/dist/api/ipInfoMiddleware.d.ts.map +1 -0
  145. package/dist/api/ipInfoMiddleware.js +20 -0
  146. package/dist/api/ipInfoMiddleware.js.map +1 -0
  147. package/dist/api/ja4Middleware.d.ts +1 -1
  148. package/dist/api/ja4Middleware.d.ts.map +1 -1
  149. package/dist/api/ja4Middleware.js +1 -1
  150. package/dist/api/ja4Middleware.js.map +1 -1
  151. package/dist/api/startProviderApi.d.ts +9 -0
  152. package/dist/api/startProviderApi.d.ts.map +1 -0
  153. package/dist/api/startProviderApi.js +217 -0
  154. package/dist/api/startProviderApi.js.map +1 -0
  155. package/dist/api/testSiteKey.d.ts +4 -0
  156. package/dist/api/testSiteKey.d.ts.map +1 -0
  157. package/dist/api/testSiteKey.js +17 -0
  158. package/dist/api/testSiteKey.js.map +1 -0
  159. package/dist/api/validateAddress.d.ts +1 -1
  160. package/dist/api/validateAddress.d.ts.map +1 -1
  161. package/dist/api/validateAddress.js.map +1 -1
  162. package/dist/api/verify.d.ts.map +1 -1
  163. package/dist/api/verify.js +145 -10
  164. package/dist/api/verify.js.map +1 -1
  165. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +31 -1
  166. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +59 -0
  167. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +65 -0
  168. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +49 -0
  169. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +42 -0
  170. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +5 -5
  171. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +34 -0
  172. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +41 -0
  173. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +42 -0
  174. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +6 -6
  175. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +33 -0
  176. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +35 -0
  177. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +5 -5
  178. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +60 -0
  179. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +7 -7
  180. package/dist/cjs/api/blacklistRequestInspector.cjs +18 -5
  181. package/dist/cjs/api/block.cjs +19 -8
  182. package/dist/cjs/api/captcha/checkSpamEmail.cjs +79 -0
  183. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +123 -0
  184. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +13 -0
  185. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +287 -0
  186. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.cjs +14 -0
  187. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +313 -0
  188. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.cjs +17 -0
  189. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.cjs +28 -0
  190. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +61 -0
  191. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge.cjs +2 -364
  192. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +35 -8
  193. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +48 -6
  194. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +200 -0
  195. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +42 -0
  196. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +19 -2
  197. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +82 -5
  198. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +107 -0
  199. package/dist/cjs/api/captcha.cjs +29 -4
  200. package/dist/cjs/api/dnsEventUrl.cjs +25 -0
  201. package/dist/cjs/api/domainMiddleware.cjs +36 -5
  202. package/dist/cjs/api/ipInfoMiddleware.cjs +20 -0
  203. package/dist/cjs/api/ja4Middleware.cjs +7 -7
  204. package/dist/cjs/api/startProviderApi.cjs +240 -0
  205. package/dist/cjs/api/testSiteKey.cjs +17 -0
  206. package/dist/cjs/api/verify.cjs +144 -9
  207. package/dist/cjs/compositeIpAddress.cjs +6 -6
  208. package/dist/cjs/index.cjs +15 -0
  209. package/dist/cjs/rules/lang.cjs +1 -1
  210. package/dist/cjs/schedulers/updateSpamEmailDomains.cjs +46 -0
  211. package/dist/cjs/services/ipComparison.cjs +9 -10
  212. package/dist/cjs/tasks/captchaManager.cjs +338 -66
  213. package/dist/cjs/tasks/client/clientTasks.cjs +115 -4
  214. package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +285 -0
  215. package/dist/cjs/tasks/detection/decodeBehavior.cjs +225 -228
  216. package/dist/cjs/tasks/detection/decodeBehavior.js +1 -1
  217. package/dist/cjs/tasks/detection/decodePayload.cjs +707 -635
  218. package/dist/cjs/tasks/detection/decodePayload.js +1 -1
  219. package/dist/cjs/tasks/detection/decodeSimd.cjs +348 -0
  220. package/dist/cjs/tasks/detection/decodeSimd.js +15 -0
  221. package/dist/cjs/tasks/detection/getBotScore.cjs +4 -2
  222. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +142 -42
  223. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +10 -7
  224. package/dist/cjs/tasks/frictionless/routingMachine.cjs +58 -0
  225. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +371 -57
  226. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +357 -167
  227. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +525 -0
  228. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasksUtils.cjs +7 -0
  229. package/dist/cjs/tasks/spam/checkSpamEmail.cjs +147 -0
  230. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +41 -0
  231. package/dist/cjs/tasks/spam/evaluateEmailSpamRules.cjs +92 -0
  232. package/dist/cjs/tasks/spam/updateSpamEmailDomains.cjs +58 -0
  233. package/dist/cjs/tasks/tasks.cjs +111 -13
  234. package/dist/cjs/util/usageCounters.cjs +201 -0
  235. package/dist/cjs/util.cjs +3 -4
  236. package/dist/cjs/utils/devicePlatform.cjs +10 -0
  237. package/dist/cjs/utils/dns.cjs +102 -0
  238. package/dist/cjs/utils/honeypot/encoders.cjs +86 -0
  239. package/dist/cjs/utils/honeypot/phraseBank.cjs +47 -0
  240. package/dist/cjs/utils/normalizeRequestIp.cjs +27 -0
  241. package/dist/compositeIpAddress.d.ts +1 -1
  242. package/dist/compositeIpAddress.d.ts.map +1 -1
  243. package/dist/compositeIpAddress.js +1 -1
  244. package/dist/compositeIpAddress.js.map +1 -1
  245. package/dist/index.d.ts +4 -0
  246. package/dist/index.d.ts.map +1 -1
  247. package/dist/index.js +12 -0
  248. package/dist/index.js.map +1 -1
  249. package/dist/rules/lang.js +1 -1
  250. package/dist/rules/lang.js.map +1 -1
  251. package/dist/schedulers/updateSpamEmailDomains.d.ts +4 -0
  252. package/dist/schedulers/updateSpamEmailDomains.d.ts.map +1 -0
  253. package/dist/schedulers/updateSpamEmailDomains.js +46 -0
  254. package/dist/schedulers/updateSpamEmailDomains.js.map +1 -0
  255. package/dist/services/ipComparison.d.ts +2 -1
  256. package/dist/services/ipComparison.d.ts.map +1 -1
  257. package/dist/services/ipComparison.js +3 -4
  258. package/dist/services/ipComparison.js.map +1 -1
  259. package/dist/tasks/captchaManager.d.ts +24 -6
  260. package/dist/tasks/captchaManager.d.ts.map +1 -1
  261. package/dist/tasks/captchaManager.js +336 -64
  262. package/dist/tasks/captchaManager.js.map +1 -1
  263. package/dist/tasks/client/clientTasks.d.ts +49 -2
  264. package/dist/tasks/client/clientTasks.d.ts.map +1 -1
  265. package/dist/tasks/client/clientTasks.js +116 -5
  266. package/dist/tasks/client/clientTasks.js.map +1 -1
  267. package/dist/tasks/dataset/datasetTasks.d.ts +1 -1
  268. package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -1
  269. package/dist/tasks/dataset/datasetTasks.js.map +1 -1
  270. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts +20 -0
  271. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts.map +1 -0
  272. package/dist/tasks/decisionMachine/decisionMachineRunner.js +285 -0
  273. package/dist/tasks/decisionMachine/decisionMachineRunner.js.map +1 -0
  274. package/dist/tasks/detection/decodeBehavior.d.ts +2 -2
  275. package/dist/tasks/detection/decodeBehavior.d.ts.map +1 -1
  276. package/dist/tasks/detection/decodeBehavior.js +1 -1
  277. package/dist/tasks/detection/decodeBehavior.js.map +1 -1
  278. package/dist/tasks/detection/decodePayload.d.ts +2 -2
  279. package/dist/tasks/detection/decodePayload.d.ts.map +1 -1
  280. package/dist/tasks/detection/decodePayload.js +1 -1
  281. package/dist/tasks/detection/decodePayload.js.map +1 -1
  282. package/dist/tasks/detection/decodeSimd.d.ts +3 -0
  283. package/dist/tasks/detection/decodeSimd.d.ts.map +1 -0
  284. package/dist/tasks/detection/decodeSimd.js +15 -0
  285. package/dist/tasks/detection/decodeSimd.js.map +1 -0
  286. package/dist/tasks/detection/getBehavioralData.d.ts +1 -1
  287. package/dist/tasks/detection/getBotScore.d.ts +2 -0
  288. package/dist/tasks/detection/getBotScore.d.ts.map +1 -1
  289. package/dist/tasks/detection/getBotScore.js +6 -4
  290. package/dist/tasks/detection/getBotScore.js.map +1 -1
  291. package/dist/tasks/frictionless/frictionlessTasks.d.ts +19 -13
  292. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  293. package/dist/tasks/frictionless/frictionlessTasks.js +140 -42
  294. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  295. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +2 -2
  296. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -1
  297. package/dist/tasks/frictionless/frictionlessTasksUtils.js +10 -7
  298. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -1
  299. package/dist/tasks/frictionless/routingMachine.d.ts +15 -0
  300. package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -0
  301. package/dist/tasks/frictionless/routingMachine.js +58 -0
  302. package/dist/tasks/frictionless/routingMachine.js.map +1 -0
  303. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +14 -10
  304. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  305. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +371 -57
  306. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  307. package/dist/tasks/powCaptcha/powTasks.d.ts +24 -8
  308. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  309. package/dist/tasks/powCaptcha/powTasks.js +358 -168
  310. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  311. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +32 -0
  312. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -0
  313. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +525 -0
  314. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -0
  315. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.d.ts +2 -0
  316. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.d.ts.map +1 -0
  317. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.js +7 -0
  318. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.js.map +1 -0
  319. package/dist/tasks/spam/checkSpamEmail.d.ts +5 -0
  320. package/dist/tasks/spam/checkSpamEmail.d.ts.map +1 -0
  321. package/dist/tasks/spam/checkSpamEmail.js +147 -0
  322. package/dist/tasks/spam/checkSpamEmail.js.map +1 -0
  323. package/dist/tasks/spam/checkTrafficFilter.d.ts +10 -0
  324. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -0
  325. package/dist/tasks/spam/checkTrafficFilter.js +41 -0
  326. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -0
  327. package/dist/tasks/spam/evaluateEmailSpamRules.d.ts +16 -0
  328. package/dist/tasks/spam/evaluateEmailSpamRules.d.ts.map +1 -0
  329. package/dist/tasks/spam/evaluateEmailSpamRules.js +92 -0
  330. package/dist/tasks/spam/evaluateEmailSpamRules.js.map +1 -0
  331. package/dist/tasks/spam/updateSpamEmailDomains.d.ts +4 -0
  332. package/dist/tasks/spam/updateSpamEmailDomains.d.ts.map +1 -0
  333. package/dist/tasks/spam/updateSpamEmailDomains.js +58 -0
  334. package/dist/tasks/spam/updateSpamEmailDomains.js.map +1 -0
  335. package/dist/tasks/tasks.d.ts +12 -1
  336. package/dist/tasks/tasks.d.ts.map +1 -1
  337. package/dist/tasks/tasks.js +102 -4
  338. package/dist/tasks/tasks.js.map +1 -1
  339. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +4 -0
  340. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  341. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.d.ts +2 -0
  342. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.d.ts.map +1 -0
  343. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +107 -0
  344. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -0
  345. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +45 -6
  346. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
  347. package/dist/tests/integration/clientSettingsPersistence.integration.test.d.ts +2 -0
  348. package/dist/tests/integration/clientSettingsPersistence.integration.test.d.ts.map +1 -0
  349. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +165 -0
  350. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -0
  351. package/dist/tests/integration/decisionMachines.integration.test.d.ts +2 -0
  352. package/dist/tests/integration/decisionMachines.integration.test.d.ts.map +1 -0
  353. package/dist/tests/integration/decisionMachines.integration.test.js +511 -0
  354. package/dist/tests/integration/decisionMachines.integration.test.js.map +1 -0
  355. package/dist/tests/integration/imgCaptcha.integration.test.js +418 -44
  356. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
  357. package/dist/tests/integration/ipValidation.integration.test.js +10 -4
  358. package/dist/tests/integration/ipValidation.integration.test.js.map +1 -1
  359. package/dist/tests/integration/mocks/solvedTestCaptchas.js +16 -16
  360. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -1
  361. package/dist/tests/integration/powCaptcha.integration.test.js +218 -23
  362. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
  363. package/dist/tests/integration/registerSitekey.d.ts.map +1 -1
  364. package/dist/tests/integration/registerSitekey.js +2 -0
  365. package/dist/tests/integration/registerSitekey.js.map +1 -1
  366. package/dist/tests/integration/routingDecisionMachines.integration.test.d.ts +2 -0
  367. package/dist/tests/integration/routingDecisionMachines.integration.test.d.ts.map +1 -0
  368. package/dist/tests/integration/routingDecisionMachines.integration.test.js +276 -0
  369. package/dist/tests/integration/routingDecisionMachines.integration.test.js.map +1 -0
  370. package/dist/tests/integration/testUtils.d.ts +4 -0
  371. package/dist/tests/integration/testUtils.d.ts.map +1 -0
  372. package/dist/tests/integration/testUtils.js +15 -0
  373. package/dist/tests/integration/testUtils.js.map +1 -0
  374. package/dist/tests/integration/usageCounters.integration.test.d.ts +2 -0
  375. package/dist/tests/integration/usageCounters.integration.test.d.ts.map +1 -0
  376. package/dist/tests/integration/usageCounters.integration.test.js +103 -0
  377. package/dist/tests/integration/usageCounters.integration.test.js.map +1 -0
  378. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.d.ts +2 -0
  379. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.d.ts.map +1 -0
  380. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +63 -0
  381. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -0
  382. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.d.ts +2 -0
  383. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.d.ts.map +1 -0
  384. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +55 -0
  385. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -0
  386. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.d.ts +2 -0
  387. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.d.ts.map +1 -0
  388. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +67 -0
  389. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -0
  390. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.d.ts +2 -0
  391. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.d.ts.map +1 -0
  392. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +56 -0
  393. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -0
  394. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.d.ts +2 -0
  395. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.d.ts.map +1 -0
  396. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +90 -0
  397. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -0
  398. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.d.ts +2 -0
  399. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.d.ts.map +1 -0
  400. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +59 -0
  401. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -0
  402. package/dist/tests/unit/api/adminRoutes.unit.test.d.ts +2 -0
  403. package/dist/tests/unit/api/adminRoutes.unit.test.d.ts.map +1 -0
  404. package/dist/tests/unit/api/adminRoutes.unit.test.js +131 -0
  405. package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -0
  406. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +79 -2
  407. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  408. package/dist/tests/unit/api/block.unit.test.d.ts +2 -0
  409. package/dist/tests/unit/api/block.unit.test.d.ts.map +1 -0
  410. package/dist/tests/unit/api/block.unit.test.js +60 -0
  411. package/dist/tests/unit/api/block.unit.test.js.map +1 -0
  412. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.d.ts +2 -0
  413. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.d.ts.map +1 -0
  414. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +118 -0
  415. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -0
  416. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.d.ts +2 -0
  417. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.d.ts.map +1 -0
  418. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +37 -0
  419. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -0
  420. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.d.ts +2 -0
  421. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.d.ts.map +1 -0
  422. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js +154 -0
  423. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js.map +1 -0
  424. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.unit.test.d.ts +2 -0
  425. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.unit.test.d.ts.map +1 -0
  426. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.unit.test.js +46 -0
  427. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.unit.test.js.map +1 -0
  428. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.unit.test.d.ts +2 -0
  429. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.unit.test.d.ts.map +1 -0
  430. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.unit.test.js +69 -0
  431. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.unit.test.js.map +1 -0
  432. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.d.ts +2 -0
  433. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.d.ts.map +1 -0
  434. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +98 -0
  435. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -0
  436. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.d.ts +2 -0
  437. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.d.ts.map +1 -0
  438. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js +60 -0
  439. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js.map +1 -0
  440. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.d.ts +2 -0
  441. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.d.ts.map +1 -0
  442. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +134 -0
  443. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -0
  444. package/dist/tests/unit/api/captcha.unit.test.d.ts +2 -0
  445. package/dist/tests/unit/api/captcha.unit.test.d.ts.map +1 -0
  446. package/dist/tests/unit/api/captcha.unit.test.js +39 -0
  447. package/dist/tests/unit/api/captcha.unit.test.js.map +1 -0
  448. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +195 -2
  449. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  450. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.d.ts +2 -0
  451. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.d.ts.map +1 -0
  452. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +126 -0
  453. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -0
  454. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +103 -33
  455. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -1
  456. package/dist/tests/unit/api/ja4Middleware.unit.test.js +130 -49
  457. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
  458. package/dist/tests/unit/api/public.unit.test.d.ts +2 -0
  459. package/dist/tests/unit/api/public.unit.test.d.ts.map +1 -0
  460. package/dist/tests/unit/api/public.unit.test.js +198 -0
  461. package/dist/tests/unit/api/public.unit.test.js.map +1 -0
  462. package/dist/tests/unit/api/robotsMiddleware.unit.test.d.ts +2 -0
  463. package/dist/tests/unit/api/robotsMiddleware.unit.test.d.ts.map +1 -0
  464. package/dist/tests/unit/api/robotsMiddleware.unit.test.js +50 -0
  465. package/dist/tests/unit/api/robotsMiddleware.unit.test.js.map +1 -0
  466. package/dist/tests/unit/api/testSiteKey.unit.test.d.ts +2 -0
  467. package/dist/tests/unit/api/testSiteKey.unit.test.d.ts.map +1 -0
  468. package/dist/tests/unit/api/testSiteKey.unit.test.js +51 -0
  469. package/dist/tests/unit/api/testSiteKey.unit.test.js.map +1 -0
  470. package/dist/tests/unit/api/validateAddress.unit.test.d.ts +2 -0
  471. package/dist/tests/unit/api/validateAddress.unit.test.d.ts.map +1 -0
  472. package/dist/tests/unit/api/validateAddress.unit.test.js +141 -0
  473. package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -0
  474. package/dist/tests/unit/compositeIpAddress.unit.test.js +132 -60
  475. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
  476. package/dist/tests/unit/pairs.unit.test.js +174 -28
  477. package/dist/tests/unit/pairs.unit.test.js.map +1 -1
  478. package/dist/tests/unit/rules/lang.unit.test.d.ts +2 -0
  479. package/dist/tests/unit/rules/lang.unit.test.d.ts.map +1 -0
  480. package/dist/tests/unit/rules/lang.unit.test.js +207 -0
  481. package/dist/tests/unit/rules/lang.unit.test.js.map +1 -0
  482. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +2 -2
  483. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  484. package/dist/tests/unit/schedulers/getClientList.unit.test.d.ts +2 -0
  485. package/dist/tests/unit/schedulers/getClientList.unit.test.d.ts.map +1 -0
  486. package/dist/tests/unit/schedulers/getClientList.unit.test.js +114 -0
  487. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -0
  488. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.d.ts +2 -0
  489. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.d.ts.map +1 -0
  490. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +114 -0
  491. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -0
  492. package/dist/tests/unit/services/ipComparison.unit.test.js +49 -35
  493. package/dist/tests/unit/services/ipComparison.unit.test.js.map +1 -1
  494. package/dist/tests/unit/tasks/captchaManager.unit.test.js +260 -5
  495. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  496. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +16 -5
  497. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  498. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
  499. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  500. package/dist/tests/unit/tasks/decisionMachine/decisionMachineCustomHeaders.unit.test.d.ts +2 -0
  501. package/dist/tests/unit/tasks/decisionMachine/decisionMachineCustomHeaders.unit.test.d.ts.map +1 -0
  502. package/dist/tests/unit/tasks/decisionMachine/decisionMachineCustomHeaders.unit.test.js +213 -0
  503. package/dist/tests/unit/tasks/decisionMachine/decisionMachineCustomHeaders.unit.test.js.map +1 -0
  504. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.d.ts +2 -0
  505. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.d.ts.map +1 -0
  506. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js +304 -0
  507. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js.map +1 -0
  508. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.d.ts +2 -0
  509. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.d.ts.map +1 -0
  510. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js +115 -0
  511. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js.map +1 -0
  512. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +207 -2
  513. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  514. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +83 -48
  515. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -1
  516. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.d.ts +2 -0
  517. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.d.ts.map +1 -0
  518. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js +169 -0
  519. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js.map +1 -0
  520. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +719 -9
  521. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  522. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +9 -3
  523. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
  524. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +1284 -68
  525. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  526. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +152 -52
  527. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  528. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.d.ts +2 -0
  529. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.d.ts.map +1 -0
  530. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +313 -0
  531. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -0
  532. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasksUtils.unit.test.d.ts +2 -0
  533. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasksUtils.unit.test.d.ts.map +1 -0
  534. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasksUtils.unit.test.js +29 -0
  535. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasksUtils.unit.test.js.map +1 -0
  536. package/dist/tests/unit/tasks/spam/checkSpamEmail.unit.test.d.ts +2 -0
  537. package/dist/tests/unit/tasks/spam/checkSpamEmail.unit.test.d.ts.map +1 -0
  538. package/dist/tests/unit/tasks/spam/checkSpamEmail.unit.test.js +434 -0
  539. package/dist/tests/unit/tasks/spam/checkSpamEmail.unit.test.js.map +1 -0
  540. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.d.ts +2 -0
  541. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.d.ts.map +1 -0
  542. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +112 -0
  543. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -0
  544. package/dist/tests/unit/tasks/spam/evaluateEmailSpamRules.unit.test.d.ts +2 -0
  545. package/dist/tests/unit/tasks/spam/evaluateEmailSpamRules.unit.test.d.ts.map +1 -0
  546. package/dist/tests/unit/tasks/spam/evaluateEmailSpamRules.unit.test.js +94 -0
  547. package/dist/tests/unit/tasks/spam/evaluateEmailSpamRules.unit.test.js.map +1 -0
  548. package/dist/tests/unit/tasks/streaming/providerDbStreaming.unit.test.d.ts +2 -0
  549. package/dist/tests/unit/tasks/streaming/providerDbStreaming.unit.test.d.ts.map +1 -0
  550. package/dist/tests/unit/tasks/streaming/providerDbStreaming.unit.test.js +94 -0
  551. package/dist/tests/unit/tasks/streaming/providerDbStreaming.unit.test.js.map +1 -0
  552. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.d.ts +2 -0
  553. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.d.ts.map +1 -0
  554. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js +208 -0
  555. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js.map +1 -0
  556. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +26 -0
  557. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -0
  558. package/dist/tests/unit/testUtils/mockProviderEnv.js +149 -0
  559. package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -0
  560. package/dist/tests/unit/util/redisCache.unit.test.d.ts +2 -0
  561. package/dist/tests/unit/util/redisCache.unit.test.d.ts.map +1 -0
  562. package/dist/tests/unit/util/redisCache.unit.test.js +257 -0
  563. package/dist/tests/unit/util/redisCache.unit.test.js.map +1 -0
  564. package/dist/tests/unit/util/usageCounters.unit.test.d.ts +2 -0
  565. package/dist/tests/unit/util/usageCounters.unit.test.d.ts.map +1 -0
  566. package/dist/tests/unit/util/usageCounters.unit.test.js +242 -0
  567. package/dist/tests/unit/util/usageCounters.unit.test.js.map +1 -0
  568. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +2 -0
  569. package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +1 -1
  570. package/dist/tests/unit/util.ipDistance.unit.test.js +9 -3
  571. package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -1
  572. package/dist/tests/unit/util.unit.test.js +152 -155
  573. package/dist/tests/unit/util.unit.test.js.map +1 -1
  574. package/dist/tests/unit/utils/devicePlatform.unit.test.d.ts +2 -0
  575. package/dist/tests/unit/utils/devicePlatform.unit.test.d.ts.map +1 -0
  576. package/dist/tests/unit/utils/devicePlatform.unit.test.js +58 -0
  577. package/dist/tests/unit/utils/devicePlatform.unit.test.js.map +1 -0
  578. package/dist/tests/unit/utils/hashUserAgent.unit.test.d.ts +2 -0
  579. package/dist/tests/unit/utils/hashUserAgent.unit.test.d.ts.map +1 -0
  580. package/dist/tests/unit/utils/hashUserAgent.unit.test.js +52 -0
  581. package/dist/tests/unit/utils/hashUserAgent.unit.test.js.map +1 -0
  582. package/dist/tests/unit/utils/hashUserIp.unit.test.d.ts +2 -0
  583. package/dist/tests/unit/utils/hashUserIp.unit.test.d.ts.map +1 -0
  584. package/dist/tests/unit/utils/hashUserIp.unit.test.js +81 -0
  585. package/dist/tests/unit/utils/hashUserIp.unit.test.js.map +1 -0
  586. package/dist/util/usageCounters.d.ts +22 -0
  587. package/dist/util/usageCounters.d.ts.map +1 -0
  588. package/dist/util/usageCounters.js +201 -0
  589. package/dist/util/usageCounters.js.map +1 -0
  590. package/dist/util.d.ts +3 -2
  591. package/dist/util.d.ts.map +1 -1
  592. package/dist/util.js +3 -4
  593. package/dist/util.js.map +1 -1
  594. package/dist/utils/devicePlatform.d.ts +5 -0
  595. package/dist/utils/devicePlatform.d.ts.map +1 -0
  596. package/dist/utils/devicePlatform.js +10 -0
  597. package/dist/utils/devicePlatform.js.map +1 -0
  598. package/dist/utils/dns.d.ts +22 -0
  599. package/dist/utils/dns.d.ts.map +1 -0
  600. package/dist/utils/dns.js +84 -0
  601. package/dist/utils/dns.js.map +1 -0
  602. package/dist/utils/honeypot/encoders.d.ts +3 -0
  603. package/dist/utils/honeypot/encoders.d.ts.map +1 -0
  604. package/dist/utils/honeypot/encoders.js +86 -0
  605. package/dist/utils/honeypot/encoders.js.map +1 -0
  606. package/dist/utils/honeypot/phraseBank.d.ts +3 -0
  607. package/dist/utils/honeypot/phraseBank.d.ts.map +1 -0
  608. package/dist/utils/honeypot/phraseBank.js +47 -0
  609. package/dist/utils/honeypot/phraseBank.js.map +1 -0
  610. package/dist/utils/normalizeRequestIp.d.ts +3 -0
  611. package/dist/utils/normalizeRequestIp.d.ts.map +1 -0
  612. package/dist/utils/normalizeRequestIp.js +27 -0
  613. package/dist/utils/normalizeRequestIp.js.map +1 -0
  614. package/package.json +27 -19
  615. package/dist/cjs/services/ipInfo.cjs +0 -87
  616. package/dist/services/ipInfo.d.ts +0 -3
  617. package/dist/services/ipInfo.d.ts.map +0 -1
  618. package/dist/services/ipInfo.js +0 -87
  619. package/dist/services/ipInfo.js.map +0 -1
  620. package/dist/tests/unit/services/ipInfo.unit.test.d.ts +0 -2
  621. package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +0 -1
  622. package/dist/tests/unit/services/ipInfo.unit.test.js +0 -210
  623. package/dist/tests/unit/services/ipInfo.unit.test.js.map +0 -1
@@ -1,57 +1,31 @@
1
1
  import { u8aToHex, stringToHex } from "@polkadot/util";
2
2
  import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
3
- import { POW_SEPARATOR, ApiParams, CaptchaStatus } from "@prosopo/types";
4
- import { AccessPolicyType } from "@prosopo/user-access-policy";
3
+ import { POW_SEPARATOR, ApiParams, ResultReason, CaptchaStatus, CaptchaType, SimdReadingsStage, DecisionMachineDecision } from "@prosopo/types";
5
4
  import { at, extractData, verifyRecency } from "@prosopo/util";
6
- import { getRequestUserScope } from "../../api/blacklistRequestInspector.js";
7
5
  import { getIpAddressFromComposite, getCompositeIpAddress } from "../../compositeIpAddress.js";
8
6
  import { deepValidateIpAddress } from "../../util.js";
7
+ import { buildAllWindowIncrements } from "../../util/usageCounters.js";
9
8
  import { CaptchaManager } from "../captchaManager.js";
9
+ import { DecisionMachineRunner } from "../decisionMachine/decisionMachineRunner.js";
10
10
  import { computeFrictionlessScore } from "../frictionless/frictionlessTasksUtils.js";
11
+ import { applyRouter } from "../frictionless/routingMachine.js";
12
+ import { evaluateEmailSpamRules } from "../spam/evaluateEmailSpamRules.js";
11
13
  import { checkPowSignature, validateSolution } from "./powTasksUtils.js";
12
- const findHardBlockPolicy = (accessPolicies) => {
13
- return accessPolicies.find(
14
- (policy) => policy.type === AccessPolicyType.Block && !policy.captchaType
15
- );
16
- };
17
14
  const DEFAULT_POW_DIFFICULTY = 4;
18
15
  class PowCaptchaManager extends CaptchaManager {
19
- constructor(db, pair, config, logger) {
20
- super(db, pair, config, logger);
16
+ constructor(db, pair, config, logger, writeQueue, usageCounters) {
17
+ super(db, pair, config, logger, writeQueue);
21
18
  this.POW_SEPARATOR = POW_SEPARATOR;
19
+ this.decisionMachineRunner = new DecisionMachineRunner(db);
20
+ this.usageCounters = usageCounters ?? null;
22
21
  }
23
22
  /**
24
- * Checks if a user should be hard blocked based on access policies
25
- * Only checks for Block policies without captchaType
26
- *
27
- * @returns The blocking policy if user should be blocked, undefined otherwise
23
+ * Provide the request-side data needed to run the post-pow routing pass
24
+ * inside `verifyPowCaptchaSolution`. When unset, the routing pass is
25
+ * skipped and verification behaves exactly as before.
28
26
  */
29
- async checkForHardBlock(userAccessRulesStorage, challengeRecord, userAccount, headers, coords) {
30
- let headHash;
31
- if (challengeRecord.sessionId) {
32
- const sessionRecord = await this.db.getSessionRecordBySessionId(
33
- challengeRecord.sessionId
34
- );
35
- headHash = sessionRecord?.decryptedHeadHash;
36
- }
37
- const coordsString = coords ? JSON.stringify(coords) : void 0;
38
- const ipAddressRecord = getIpAddressFromComposite(
39
- challengeRecord.ipAddress
40
- );
41
- const userScope = getRequestUserScope(
42
- headers,
43
- challengeRecord.ja4,
44
- ipAddressRecord.address,
45
- userAccount,
46
- headHash,
47
- coordsString
48
- );
49
- const accessPolicies = await this.getPrioritisedAccessPolicies(
50
- userAccessRulesStorage,
51
- challengeRecord.dappAccount,
52
- userScope
53
- );
54
- return findHardBlockPolicy(accessPolicies);
27
+ setPostPowContext(ctx) {
28
+ this.postPowContext = ctx;
55
29
  }
56
30
  /**
57
31
  * @description Generates a PoW Captcha for a given user and dapp
@@ -78,16 +52,16 @@ class PowCaptchaManager extends CaptchaManager {
78
52
  * @description Verifies a PoW Captcha for a given user and dapp
79
53
  *
80
54
  * @param {string} challenge - the starting string for the PoW challenge
81
- * @param {string} difficulty - how many leading zeroes the solution must have
82
55
  * @param {string} providerChallengeSignature - proof that the Provider provided the challenge
83
56
  * @param {string} nonce - the string that the user has found that satisfies the PoW challenge
84
57
  * @param {number} timeout - the time in milliseconds since the Provider was selected to provide the PoW captcha
85
58
  * @param {string} userTimestampSignature
86
59
  * @param ipAddress
87
60
  * @param headers
61
+ * @param behavioralData
88
62
  * @param salt
89
63
  */
90
- async verifyPowCaptchaSolution(challenge, providerChallengeSignature, nonce, timeout, userTimestampSignature, ipAddress, headers, behavioralData, salt) {
64
+ async verifyPowCaptchaSolution(challenge, providerChallengeSignature, nonce, timeout, userTimestampSignature, ipAddress, headers, behavioralData, salt, simdReadings, clientMetaData) {
91
65
  checkPowSignature(
92
66
  challenge,
93
67
  providerChallengeSignature,
@@ -108,7 +82,7 @@ class PowCaptchaManager extends CaptchaManager {
108
82
  this.logger.debug(() => ({
109
83
  msg: `No record of this challenge: ${challenge}`
110
84
  }));
111
- return false;
85
+ return { verified: false };
112
86
  }
113
87
  const difficulty = challengeRecord.difficulty;
114
88
  let coords;
@@ -127,37 +101,55 @@ class PowCaptchaManager extends CaptchaManager {
127
101
  }
128
102
  }
129
103
  if (!verifyRecency(challenge, timeout)) {
130
- await this.db.updatePowCaptchaRecordResult(
131
- challenge,
132
- {
133
- status: CaptchaStatus.disapproved,
134
- reason: "CAPTCHA.INVALID_TIMESTAMP"
135
- },
136
- false,
137
- //serverchecked
138
- true,
139
- // usersubmitted
140
- userTimestampSignature,
141
- coords
142
- );
143
- return false;
104
+ const timeoutResult = {
105
+ status: CaptchaStatus.disapproved,
106
+ reason: ResultReason.CAPTCHA_INVALID_TIMESTAMP
107
+ };
108
+ const writePromises2 = [
109
+ this.db.updatePowCaptchaRecordResult(
110
+ challenge,
111
+ timeoutResult,
112
+ false,
113
+ //serverchecked
114
+ true,
115
+ // usersubmitted
116
+ userTimestampSignature,
117
+ coords
118
+ )
119
+ ];
120
+ if (challengeRecord.sessionId) {
121
+ writePromises2.push(
122
+ this.updateSessionRecordWithCache(challengeRecord.sessionId, {
123
+ userSubmitted: true,
124
+ result: timeoutResult
125
+ })
126
+ );
127
+ }
128
+ await Promise.all(writePromises2);
129
+ return { verified: false };
144
130
  }
145
131
  const correct = validateSolution(nonce, challenge, difficulty);
146
132
  let result = { status: CaptchaStatus.approved };
147
133
  if (!correct) {
148
134
  result = {
149
135
  status: CaptchaStatus.disapproved,
150
- reason: "CAPTCHA.INVALID_SOLUTION"
136
+ reason: ResultReason.CAPTCHA_INVALID_SOLUTION
151
137
  };
152
138
  }
153
- await this.db.updatePowCaptchaRecordResult(
154
- challenge,
155
- result,
156
- false,
157
- true,
158
- userTimestampSignature,
159
- coords
160
- );
139
+ if (correct && this.usageCounters) {
140
+ const dappAccount = at(challengeSplit, 2);
141
+ this.usageCounters.incrManyAsync(
142
+ dappAccount,
143
+ buildAllWindowIncrements(
144
+ "solved",
145
+ CaptchaType.pow,
146
+ ipAddress.address,
147
+ userAccount
148
+ )
149
+ );
150
+ }
151
+ let behavioralUpdates = {};
152
+ let decryptedBehavioralDataPacked;
161
153
  if (behavioralData) {
162
154
  try {
163
155
  const decryptKeys = [
@@ -190,10 +182,11 @@ class PowCaptchaManager extends CaptchaManager {
190
182
  c3: decryptedData.collector3 || [],
191
183
  d: decryptedData.deviceCapability
192
184
  };
193
- await this.db.updatePowCaptchaRecord(challenge, {
185
+ behavioralUpdates = {
194
186
  behavioralDataPacked: packedData,
195
187
  deviceCapability: decryptedData.deviceCapability
196
- });
188
+ };
189
+ decryptedBehavioralDataPacked = packedData;
197
190
  }
198
191
  } catch (error) {
199
192
  this.logger?.error(() => ({
@@ -202,7 +195,108 @@ class PowCaptchaManager extends CaptchaManager {
202
195
  }));
203
196
  }
204
197
  }
205
- return correct;
198
+ const recordUpdates = { ...behavioralUpdates };
199
+ if (clientMetaData?.hp) {
200
+ recordUpdates.clientMetaData = { hp: clientMetaData.hp };
201
+ }
202
+ if (Object.keys(recordUpdates).length > 0) {
203
+ await this.db.updatePowCaptchaRecord(challenge, recordUpdates);
204
+ }
205
+ const writePromises = [
206
+ this.db.updatePowCaptchaRecordResult(
207
+ challenge,
208
+ result,
209
+ false,
210
+ true,
211
+ userTimestampSignature,
212
+ coords
213
+ )
214
+ ];
215
+ if (challengeRecord.sessionId) {
216
+ const linkedSessionId = challengeRecord.sessionId;
217
+ writePromises.push(
218
+ this.updateSessionRecordWithCache(linkedSessionId, {
219
+ userSubmitted: true,
220
+ result
221
+ })
222
+ );
223
+ if (simdReadings) {
224
+ writePromises.push(
225
+ this.decryptAndAttachSimdReadingsIfAbsent(
226
+ linkedSessionId,
227
+ simdReadings,
228
+ SimdReadingsStage.submit
229
+ )
230
+ );
231
+ }
232
+ }
233
+ await Promise.all(writePromises);
234
+ if (!correct || !this.postPowContext) {
235
+ return { verified: correct };
236
+ }
237
+ const routingOutput = await this.runPostPowRouting({
238
+ challengeRecord,
239
+ challengeSplit,
240
+ behavioralDataPacked: decryptedBehavioralDataPacked
241
+ });
242
+ return { verified: correct, routingOutput };
243
+ }
244
+ /**
245
+ * Resolve the originating session, build a full RoutingContext, and run the
246
+ * post-pow phase of the routing machine. Returns the machine's output, or
247
+ * undefined when prerequisites are missing (no session, no score) — in
248
+ * which case the caller treats the result as "no escalation".
249
+ */
250
+ async runPostPowRouting(args) {
251
+ if (!this.postPowContext) return void 0;
252
+ const { challengeRecord, challengeSplit, behavioralDataPacked } = args;
253
+ if (!challengeRecord.sessionId) {
254
+ this.logger.debug(() => ({
255
+ msg: "Skipping post-pow routing: PoW record has no linked session"
256
+ }));
257
+ return void 0;
258
+ }
259
+ const sessionRecord = await this.db.getSessionRecordBySessionId(
260
+ challengeRecord.sessionId
261
+ );
262
+ if (!sessionRecord) {
263
+ this.logger.debug(() => ({
264
+ msg: "Skipping post-pow routing: session record not found",
265
+ data: { sessionId: challengeRecord.sessionId }
266
+ }));
267
+ return void 0;
268
+ }
269
+ const score = computeFrictionlessScore(sessionRecord.scoreComponents);
270
+ const dappAccount = at(challengeSplit, 2);
271
+ const userAccount = at(challengeSplit, 1);
272
+ const platform = {
273
+ ...this.postPowContext.platform,
274
+ isWebView: sessionRecord.webView
275
+ };
276
+ const ctx = {
277
+ dappAccount,
278
+ userAccount,
279
+ ip: this.postPowContext.ip,
280
+ countryCode: this.postPowContext.countryCode,
281
+ score,
282
+ platform,
283
+ raw: {
284
+ ...this.postPowContext.raw,
285
+ ...behavioralDataPacked && { behavioralDataPacked }
286
+ }
287
+ };
288
+ const baseline = {
289
+ captchaType: CaptchaType.pow,
290
+ powDifficulty: challengeRecord.difficulty
291
+ };
292
+ return applyRouter(
293
+ this.decisionMachineRunner,
294
+ this.usageCounters,
295
+ baseline,
296
+ ctx,
297
+ this.logger,
298
+ "postPow"
299
+ );
206
300
  }
207
301
  /**
208
302
  * @description Verifies a PoW Captcha for a given user and dapp. This is called by the server to verify the user's solution
@@ -214,15 +308,25 @@ class PowCaptchaManager extends CaptchaManager {
214
308
  * @param env - provider environment
215
309
  * @param ip - optional IP address for validation
216
310
  * @param userAccessRulesStorage - storage for querying user access policies
311
+ * @param email
312
+ * @param spamEmailDomainCheckingEnabled
313
+ * @param spamFilter
314
+ * @param trafficFilter
315
+ * @param storeMetadata - when true, persists the dapp-server-provided
316
+ * `email` (and any future metadata fields) on the captcha record so
317
+ * it can be inspected for spam-rate analysis.
217
318
  */
218
- async serverVerifyPowCaptchaSolution(dappAccount, challenge, timeout, env, ip, userAccessRulesStorage) {
219
- const notVerifiedResponse = { verified: false };
319
+ async serverVerifyPowCaptchaSolution(dappAccount, challenge, timeout, env, ip, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, spamFilter, trafficFilter, storeMetadata = false) {
320
+ const notVerified = (reason) => ({
321
+ verified: false,
322
+ reason
323
+ });
220
324
  const challengeRecord = await this.db.getPowCaptchaRecordByChallenge(challenge);
221
325
  if (!challengeRecord) {
222
326
  this.logger.debug(() => ({
223
327
  msg: `No record of this challenge: ${challenge}`
224
328
  }));
225
- return notVerifiedResponse;
329
+ return notVerified("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND");
226
330
  }
227
331
  if (challengeRecord.result.status !== CaptchaStatus.approved) {
228
332
  throw new ProsopoApiError("CAPTCHA.INVALID_SOLUTION", {
@@ -232,7 +336,8 @@ class PowCaptchaManager extends CaptchaManager {
232
336
  }
233
337
  });
234
338
  }
235
- if (challengeRecord.serverChecked) return notVerifiedResponse;
339
+ if (challengeRecord.serverChecked)
340
+ return notVerified("API.USER_ALREADY_VERIFIED");
236
341
  const challengeDappAccount = challengeRecord.dappAccount;
237
342
  if (dappAccount !== challengeDappAccount) {
238
343
  throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", {
@@ -246,24 +351,26 @@ class PowCaptchaManager extends CaptchaManager {
246
351
  await this.db.markDappUserPoWCommitmentsChecked([
247
352
  challengeRecord.challenge
248
353
  ]);
354
+ const powRecordUpdates = {};
355
+ let failResult;
356
+ let failReason;
249
357
  const recent = verifyRecency(challenge, timeout);
250
358
  if (!recent) {
251
- await this.db.updatePowCaptchaRecord(challengeRecord.challenge, {
252
- result: {
253
- status: CaptchaStatus.disapproved,
254
- reason: "API.TIMESTAMP_TOO_OLD"
255
- }
256
- });
257
- return notVerifiedResponse;
359
+ failResult = {
360
+ status: CaptchaStatus.disapproved,
361
+ reason: ResultReason.TIMESTAMP_TOO_OLD
362
+ };
363
+ failReason = "API.TIMESTAMP_TOO_OLD";
258
364
  }
259
- if (userAccessRulesStorage) {
365
+ if (!failResult && userAccessRulesStorage) {
260
366
  try {
261
367
  const blockPolicy = await this.checkForHardBlock(
262
368
  userAccessRulesStorage,
263
369
  challengeRecord,
264
370
  challengeRecord.userAccount,
265
371
  challengeRecord.headers,
266
- challengeRecord.coords
372
+ challengeRecord.coords,
373
+ challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0
267
374
  );
268
375
  if (blockPolicy) {
269
376
  this.logger.info(() => ({
@@ -275,13 +382,11 @@ class PowCaptchaManager extends CaptchaManager {
275
382
  policy: blockPolicy
276
383
  }
277
384
  }));
278
- await this.db.updatePowCaptchaRecord(challengeRecord.challenge, {
279
- result: {
280
- status: CaptchaStatus.disapproved,
281
- reason: "API.ACCESS_POLICY_BLOCK"
282
- }
283
- });
284
- return notVerifiedResponse;
385
+ failResult = {
386
+ status: CaptchaStatus.disapproved,
387
+ reason: ResultReason.ACCESS_POLICY_BLOCK
388
+ };
389
+ failReason = "API.ACCESS_POLICY_BLOCK";
285
390
  }
286
391
  } catch (error) {
287
392
  this.logger.warn(() => ({
@@ -290,40 +395,95 @@ class PowCaptchaManager extends CaptchaManager {
290
395
  }));
291
396
  }
292
397
  }
293
- if (ip) {
398
+ if (!failResult && email && spamEmailDomainCheckingEnabled) {
399
+ try {
400
+ const isSpam = await this.checkSpamEmail(email);
401
+ if (isSpam) {
402
+ const emailDomain = email.split("@")[1] || "unknown";
403
+ this.logger.info(() => ({
404
+ msg: "Spam email domain detected in server PoW verification",
405
+ data: { challenge, dappAccount, emailDomain }
406
+ }));
407
+ failResult = {
408
+ status: CaptchaStatus.disapproved,
409
+ reason: ResultReason.SPAM_EMAIL_DOMAIN
410
+ };
411
+ failReason = "API.SPAM_EMAIL_DOMAIN";
412
+ }
413
+ } catch (error) {
414
+ this.logger.warn(() => ({
415
+ msg: "Failed to check spam email domain in server PoW verification",
416
+ error
417
+ }));
418
+ }
419
+ }
420
+ if (!failResult && spamFilter?.enabled && spamFilter.emailRules?.enabled && email) {
421
+ const result = evaluateEmailSpamRules(email, spamFilter.emailRules);
422
+ if (result.isSpam) {
423
+ this.logger.info(() => ({
424
+ msg: "Spam filter rejected email in PoW verification",
425
+ data: { challenge, dappAccount, reason: result.reason }
426
+ }));
427
+ failResult = {
428
+ status: CaptchaStatus.disapproved,
429
+ reason: ResultReason.SPAM_EMAIL_RULE
430
+ };
431
+ failReason = "API.SPAM_EMAIL_RULE";
432
+ }
433
+ }
434
+ if (!failResult) {
435
+ const check = await this.resolveTrafficFilterCheck(
436
+ env,
437
+ challengeRecord.ipInfo,
438
+ trafficFilter,
439
+ ip
440
+ );
441
+ if (check.isBlocked) {
442
+ this.logger.info(() => ({
443
+ msg: "Traffic filter rejected request in PoW verification",
444
+ data: { challenge, dappAccount, ip, reason: check.reason }
445
+ }));
446
+ failResult = {
447
+ status: CaptchaStatus.disapproved,
448
+ reason: check.reason
449
+ };
450
+ failReason = check.reason;
451
+ }
452
+ }
453
+ if (storeMetadata && email) {
454
+ powRecordUpdates.metadata = { email };
455
+ }
456
+ if (!failResult && ip) {
294
457
  const challengeIpAddress = getIpAddressFromComposite(
295
458
  challengeRecord.ipAddress
296
459
  );
297
460
  const clientRecord = await this.db.getClientRecord(dappAccount);
298
461
  const ipValidationRules = clientRecord?.settings?.ipValidationRules;
299
- await this.db.updatePowCaptchaRecord(challengeRecord.challenge, {
300
- providedIp: getCompositeIpAddress(ip)
301
- });
302
- const ipValidation = await deepValidateIpAddress(
303
- ip,
304
- challengeIpAddress,
305
- this.logger,
306
- env.config.ipApi.apiKey,
307
- env.config.ipApi.baseUrl,
308
- ipValidationRules
309
- );
310
- if (!ipValidation.isValid) {
311
- this.logger.error(() => ({
312
- msg: "IP validation failed for PoW captcha",
313
- data: {
314
- ip,
315
- challengeIp: challengeIpAddress.address,
316
- error: ipValidation.errorMessage,
317
- distanceKm: ipValidation.distanceKm
318
- }
319
- }));
320
- await this.db.updatePowCaptchaRecord(challengeRecord.challenge, {
321
- result: {
462
+ powRecordUpdates.providedIp = getCompositeIpAddress(ip);
463
+ if (ipValidationRules?.enabled === true) {
464
+ const ipValidation = await deepValidateIpAddress(
465
+ ip,
466
+ challengeIpAddress,
467
+ this.logger,
468
+ env.ipInfoService,
469
+ ipValidationRules
470
+ );
471
+ if (!ipValidation.isValid) {
472
+ this.logger.error(() => ({
473
+ msg: "IP validation failed for PoW captcha",
474
+ data: {
475
+ ip,
476
+ challengeIp: challengeIpAddress.address,
477
+ error: ipValidation.errorMessage,
478
+ distanceKm: ipValidation.distanceKm
479
+ }
480
+ }));
481
+ failResult = {
322
482
  status: CaptchaStatus.disapproved,
323
- reason: "API.FAILED_IP_VALIDATION"
324
- }
325
- });
326
- return notVerifiedResponse;
483
+ reason: ResultReason.FAILED_IP_VALIDATION
484
+ };
485
+ failReason = "API.FAILED_IP_VALIDATION";
486
+ }
327
487
  }
328
488
  }
329
489
  let score;
@@ -341,62 +501,92 @@ class PowCaptchaManager extends CaptchaManager {
341
501
  }));
342
502
  }
343
503
  }
344
- return { verified: true, ...score ? { score } : {} };
345
- }
346
- /**
347
- * Decrypts behavioral data
348
- * @param encryptedData - The encrypted behavioral data
349
- * @param decryptKeys - Array of possible decryption keys to try
350
- * @returns Decrypted behavioral data in unpacked format, or null if decryption fails
351
- */
352
- async decryptBehavioralData(encryptedData, decryptKeys) {
353
- const decryptBehavioralData = (await import("../detection/decodeBehavior.js")).default;
354
- const validKeys = decryptKeys.filter((k) => k);
355
- if (validKeys.length === 0) {
356
- this.logger?.error(() => ({
357
- msg: "No decryption keys provided for behavioral data"
358
- }));
359
- return null;
360
- }
361
- for (const [keyIndex, key] of validKeys.entries()) {
504
+ if (!failResult) {
362
505
  try {
363
- this.logger?.debug(() => ({
364
- msg: "Attempting to decrypt behavioral data",
365
- data: {
366
- keyIndex: keyIndex + 1,
367
- totalKeys: validKeys.length
368
- }
369
- }));
370
- const result = await decryptBehavioralData(encryptedData, key);
371
- this.logger?.info(() => ({
372
- msg: "Behavioral data decrypted successfully",
373
- data: {
374
- keyIndex: keyIndex + 1,
375
- c1Length: result.collector1?.length || 0,
376
- c2Length: result.collector2?.length || 0,
377
- c3Length: result.collector3?.length || 0,
378
- deviceCapability: result.deviceCapability
379
- }
380
- }));
381
- return result;
506
+ const decisionInput = {
507
+ userAccount: challengeRecord.userAccount,
508
+ dappAccount: challengeRecord.dappAccount,
509
+ captchaResult: "passed",
510
+ headers: challengeRecord.headers,
511
+ captchaType: CaptchaType.pow,
512
+ behavioralDataPacked: challengeRecord.behavioralDataPacked,
513
+ deviceCapability: challengeRecord.deviceCapability,
514
+ countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0
515
+ };
516
+ const decision = await this.decisionMachineRunner.decide(
517
+ decisionInput,
518
+ this.logger
519
+ );
520
+ if (decision.decision === DecisionMachineDecision.Deny) {
521
+ this.logger.info(() => ({
522
+ msg: "Decision machine denied PoW captcha in server verification",
523
+ data: {
524
+ challenge,
525
+ userAccount: challengeRecord.userAccount,
526
+ dappAccount,
527
+ reason: decision.reason,
528
+ score: decision.score,
529
+ tags: decision.tags
530
+ }
531
+ }));
532
+ const dmReason = decision.reason || ResultReason.CAPTCHA_DECISION_MACHINE_DENIED;
533
+ failResult = {
534
+ status: CaptchaStatus.disapproved,
535
+ reason: dmReason
536
+ };
537
+ failReason = dmReason;
538
+ } else {
539
+ this.logger.debug(() => ({
540
+ msg: "Decision machine allowed PoW captcha",
541
+ data: {
542
+ challenge,
543
+ reason: decision.reason,
544
+ score: decision.score,
545
+ tags: decision.tags
546
+ }
547
+ }));
548
+ }
382
549
  } catch (error) {
383
- this.logger?.debug(() => ({
384
- msg: "Failed to decrypt with key, trying next",
385
- data: {
386
- keyIndex: keyIndex + 1,
387
- totalKeys: validKeys.length,
388
- err: error
389
- }
550
+ this.logger?.error(() => ({
551
+ msg: "Failed to run decision machine in server PoW verification",
552
+ err: error
390
553
  }));
391
554
  }
392
555
  }
393
- this.logger?.error(() => ({
394
- msg: "Failed to decrypt behavioral data with all available keys",
395
- data: {
396
- totalKeysAttempted: validKeys.length
397
- }
398
- }));
399
- return null;
556
+ const finalResult = failResult || {
557
+ status: CaptchaStatus.approved
558
+ };
559
+ if (failResult) {
560
+ powRecordUpdates.result = failResult;
561
+ }
562
+ const writePromises = [];
563
+ if (Object.keys(powRecordUpdates).length > 0) {
564
+ writePromises.push(
565
+ this.db.updatePowCaptchaRecord(
566
+ challengeRecord.challenge,
567
+ powRecordUpdates
568
+ )
569
+ );
570
+ }
571
+ if (challengeRecord.sessionId) {
572
+ writePromises.push(
573
+ this.updateSessionRecordWithCache(
574
+ challengeRecord.sessionId,
575
+ {
576
+ serverChecked: true,
577
+ result: finalResult
578
+ },
579
+ true
580
+ )
581
+ );
582
+ }
583
+ if (writePromises.length > 0) {
584
+ await Promise.all(writePromises);
585
+ }
586
+ if (failReason) {
587
+ return notVerified(failReason);
588
+ }
589
+ return { verified: true, ...score ? { score } : {} };
400
590
  }
401
591
  }
402
592
  export {