@prosopo/provider 5.19.3 → 5.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +45 -40
  2. package/.turbo/turbo-build$colon$tsc.log +28 -28
  3. package/.turbo/turbo-build.log +48 -40
  4. package/CHANGELOG.md +167 -0
  5. package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
  6. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
  7. package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
  8. package/dist/api/admin/apiGetSessionEndpoint.js.map +1 -1
  9. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
  10. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
  11. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
  12. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
  13. package/dist/api/admin/apiReplaceDetectorPoolEndpoint.js.map +1 -1
  14. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
  15. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  16. package/dist/api/blacklistRequestInspector.js +9 -8
  17. package/dist/api/blacklistRequestInspector.js.map +1 -1
  18. package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
  19. package/dist/api/captcha/checkSpamEmail.js +19 -26
  20. package/dist/api/captcha/checkSpamEmail.js.map +1 -1
  21. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
  22. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +11 -2
  23. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
  24. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
  25. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +6 -1
  26. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +30 -27
  29. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  30. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  31. package/dist/api/captcha/getImageCaptchaChallenge.js +32 -43
  32. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  33. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  34. package/dist/api/captcha/getPoWCaptchaChallenge.js +27 -32
  35. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  36. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +3 -0
  37. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +23 -5
  39. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  40. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -1
  41. package/dist/api/captcha/interactiveCaptchaChallenge.js +27 -32
  42. package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -1
  43. package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -1
  44. package/dist/api/captcha/interactiveCaptchaSolution.js +18 -24
  45. package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -1
  46. package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
  47. package/dist/api/captcha/submitImageCaptchaSolution.js +18 -24
  48. package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
  49. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  50. package/dist/api/captcha/submitPoWCaptchaSolution.js +35 -27
  51. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  52. package/dist/api/domainMiddleware.d.ts.map +1 -1
  53. package/dist/api/domainMiddleware.js +39 -47
  54. package/dist/api/domainMiddleware.js.map +1 -1
  55. package/dist/api/errorCodeForReason.d.ts +3 -0
  56. package/dist/api/errorCodeForReason.d.ts.map +1 -0
  57. package/dist/api/errorCodeForReason.js +22 -0
  58. package/dist/api/errorCodeForReason.js.map +1 -0
  59. package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
  60. package/dist/api/headerCheckMiddleware.js +14 -9
  61. package/dist/api/headerCheckMiddleware.js.map +1 -1
  62. package/dist/api/ipInfoMiddleware.d.ts +1 -1
  63. package/dist/api/ipInfoMiddleware.d.ts.map +1 -1
  64. package/dist/api/ipInfoMiddleware.js +5 -1
  65. package/dist/api/ipInfoMiddleware.js.map +1 -1
  66. package/dist/api/metrics.d.ts.map +1 -1
  67. package/dist/api/metrics.js +9 -1
  68. package/dist/api/metrics.js.map +1 -1
  69. package/dist/api/public.d.ts.map +1 -1
  70. package/dist/api/public.js +6 -2
  71. package/dist/api/public.js.map +1 -1
  72. package/dist/api/rateLimitHandler.d.ts +4 -0
  73. package/dist/api/rateLimitHandler.d.ts.map +1 -0
  74. package/dist/api/rateLimitHandler.js +20 -0
  75. package/dist/api/rateLimitHandler.js.map +1 -0
  76. package/dist/api/startProviderApi.d.ts +1 -0
  77. package/dist/api/startProviderApi.d.ts.map +1 -1
  78. package/dist/api/startProviderApi.js +8 -17
  79. package/dist/api/startProviderApi.js.map +1 -1
  80. package/dist/api/validateAddress.d.ts +3 -4
  81. package/dist/api/validateAddress.d.ts.map +1 -1
  82. package/dist/api/validateAddress.js +13 -19
  83. package/dist/api/validateAddress.js.map +1 -1
  84. package/dist/api/verify.d.ts.map +1 -1
  85. package/dist/api/verify.js +73 -96
  86. package/dist/api/verify.js.map +1 -1
  87. package/dist/cjs/api/blacklistRequestInspector.cjs +9 -8
  88. package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -25
  89. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +11 -2
  90. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +6 -1
  91. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +29 -26
  92. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +31 -42
  93. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +26 -31
  94. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +22 -3
  95. package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +26 -31
  96. package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +17 -23
  97. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +17 -23
  98. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +34 -26
  99. package/dist/cjs/api/domainMiddleware.cjs +38 -46
  100. package/dist/cjs/api/errorCodeForReason.cjs +22 -0
  101. package/dist/cjs/api/headerCheckMiddleware.cjs +13 -8
  102. package/dist/cjs/api/ipInfoMiddleware.cjs +5 -1
  103. package/dist/cjs/api/metrics.cjs +9 -1
  104. package/dist/cjs/api/public.cjs +5 -1
  105. package/dist/cjs/api/rateLimitHandler.cjs +20 -0
  106. package/dist/cjs/api/startProviderApi.cjs +8 -16
  107. package/dist/cjs/api/validateAddress.cjs +12 -18
  108. package/dist/cjs/api/verify.cjs +72 -95
  109. package/dist/cjs/index.cjs +1 -0
  110. package/dist/cjs/tasks/captchaManager.cjs +6 -8
  111. package/dist/cjs/tasks/client/clientTasks.cjs +26 -13
  112. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +28 -8
  113. package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +21 -19
  114. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +1 -1
  115. package/dist/cjs/tasks/frictionless/routingMachine.cjs +13 -4
  116. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +89 -40
  117. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +18 -8
  118. package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +21 -13
  119. package/dist/cjs/tasks/powCaptcha/backgroundWrites.cjs +24 -0
  120. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +44 -19
  121. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +14 -10
  122. package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +17 -8
  123. package/dist/cjs/tasks/signatureCheck.cjs +12 -0
  124. package/dist/cjs/tasks/tasks.cjs +6 -1
  125. package/dist/cjs/util/usageCounters.cjs +26 -3
  126. package/dist/cjs/util.cjs +14 -3
  127. package/dist/cjs/utils/devicePlatform.cjs +9 -5
  128. package/dist/cjs/utils/mobileSignals.cjs +69 -0
  129. package/dist/errorSites.d.ts +98 -0
  130. package/dist/errorSites.d.ts.map +1 -0
  131. package/dist/errorSites.js +2 -0
  132. package/dist/errorSites.js.map +1 -0
  133. package/dist/fingerprint/dist/merkle.js +69 -0
  134. package/dist/fingerprint/dist/proof.js +95 -0
  135. package/dist/fingerprint/dist/summary.js +73 -0
  136. package/dist/index.js +2 -2
  137. package/dist/tasks/captchaManager.d.ts +2 -3
  138. package/dist/tasks/captchaManager.d.ts.map +1 -1
  139. package/dist/tasks/captchaManager.js +6 -7
  140. package/dist/tasks/captchaManager.js.map +1 -1
  141. package/dist/tasks/client/clientTasks.d.ts.map +1 -1
  142. package/dist/tasks/client/clientTasks.js +27 -14
  143. package/dist/tasks/client/clientTasks.js.map +1 -1
  144. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -1
  145. package/dist/tasks/dataset/datasetTasksUtils.js +29 -9
  146. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -1
  147. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts +1 -3
  148. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts.map +1 -1
  149. package/dist/tasks/decisionMachine/decisionMachineRunner.js +21 -19
  150. package/dist/tasks/decisionMachine/decisionMachineRunner.js.map +1 -1
  151. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  152. package/dist/tasks/frictionless/frictionlessTasks.js +1 -1
  153. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  154. package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
  155. package/dist/tasks/frictionless/routingMachine.js +13 -4
  156. package/dist/tasks/frictionless/routingMachine.js.map +1 -1
  157. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  158. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +91 -42
  159. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  160. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +19 -9
  161. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -1
  162. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -1
  163. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +22 -14
  164. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -1
  165. package/dist/tasks/powCaptcha/backgroundWrites.d.ts +7 -0
  166. package/dist/tasks/powCaptcha/backgroundWrites.d.ts.map +1 -0
  167. package/dist/tasks/powCaptcha/backgroundWrites.js +24 -0
  168. package/dist/tasks/powCaptcha/backgroundWrites.js.map +1 -0
  169. package/dist/tasks/powCaptcha/powTasks.d.ts +3 -3
  170. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  171. package/dist/tasks/powCaptcha/powTasks.js +45 -20
  172. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  173. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
  174. package/dist/tasks/powCaptcha/powTasksUtils.js +15 -11
  175. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
  176. package/dist/tasks/puzzle/puzzleRenderer.d.ts +8 -1
  177. package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
  178. package/dist/tasks/puzzle/puzzleRenderer.js +16 -8
  179. package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
  180. package/dist/tasks/signatureCheck.d.ts +2 -0
  181. package/dist/tasks/signatureCheck.d.ts.map +1 -0
  182. package/dist/tasks/signatureCheck.js +12 -0
  183. package/dist/tasks/signatureCheck.js.map +1 -0
  184. package/dist/tasks/tasks.d.ts.map +1 -1
  185. package/dist/tasks/tasks.js +7 -2
  186. package/dist/tasks/tasks.js.map +1 -1
  187. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +3 -1
  188. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  189. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +6 -2
  190. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
  191. package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js +1 -1
  192. package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js.map +1 -1
  193. package/dist/tests/integration/imgCaptcha.integration.test.js +6 -5
  194. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
  195. package/dist/tests/integration/ipValidation.integration.test.js +1 -1
  196. package/dist/tests/integration/ipValidation.integration.test.js.map +1 -1
  197. package/dist/tests/integration/powCaptcha.integration.test.js +2 -2
  198. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
  199. package/dist/tests/integration/routingDecisionMachines.integration.test.js.map +1 -1
  200. package/dist/tests/integration/testUtils.d.ts +2 -2
  201. package/dist/tests/integration/testUtils.d.ts.map +1 -1
  202. package/dist/tests/integration/testUtils.js +1 -1
  203. package/dist/tests/integration/testUtils.js.map +1 -1
  204. package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js +3 -1
  205. package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js.map +1 -1
  206. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +26 -10
  207. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  208. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +4 -4
  209. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -1
  210. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts +2 -0
  211. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts.map +1 -0
  212. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js +210 -0
  213. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js.map +1 -0
  214. package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts +2 -0
  215. package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts.map +1 -0
  216. package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js +153 -0
  217. package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js.map +1 -0
  218. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js +6 -2
  219. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js.map +1 -1
  220. package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts +2 -0
  221. package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts.map +1 -0
  222. package/dist/tests/unit/api/errorCodeForReason.unit.test.js +23 -0
  223. package/dist/tests/unit/api/errorCodeForReason.unit.test.js.map +1 -0
  224. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +6 -1
  225. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  226. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +16 -7
  227. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
  228. package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts +2 -0
  229. package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts.map +1 -0
  230. package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js +46 -0
  231. package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js.map +1 -0
  232. package/dist/tests/unit/api/public.unit.test.js +45 -10
  233. package/dist/tests/unit/api/public.unit.test.js.map +1 -1
  234. package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts +2 -0
  235. package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts.map +1 -0
  236. package/dist/tests/unit/api/rateLimitHandler.unit.test.js +39 -0
  237. package/dist/tests/unit/api/rateLimitHandler.unit.test.js.map +1 -0
  238. package/dist/tests/unit/api/validateAddress.unit.test.js +41 -115
  239. package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -1
  240. package/dist/tests/unit/api/verifyMalformedToken.unit.test.js +3 -3
  241. package/dist/tests/unit/api/verifyMalformedToken.unit.test.js.map +1 -1
  242. package/dist/tests/unit/tasks/captchaManager.unit.test.js +22 -18
  243. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  244. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +25 -0
  245. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  246. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +25 -20
  247. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
  248. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js +31 -0
  249. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js.map +1 -1
  250. package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts +2 -0
  251. package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts.map +1 -0
  252. package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js +80 -0
  253. package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js.map +1 -0
  254. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js +48 -0
  255. package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js.map +1 -1
  256. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +20 -28
  257. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  258. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +2 -2
  259. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
  260. package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts +2 -0
  261. package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts.map +1 -0
  262. package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js +44 -0
  263. package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js.map +1 -0
  264. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +78 -43
  265. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  266. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +7 -6
  267. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  268. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +2 -2
  269. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
  270. package/dist/tests/unit/util/usageCounters.unit.test.js +20 -0
  271. package/dist/tests/unit/util/usageCounters.unit.test.js.map +1 -1
  272. package/dist/tests/unit/util.unit.test.js +7 -7
  273. package/dist/tests/unit/util.unit.test.js.map +1 -1
  274. package/dist/tests/unit/utils/devicePlatform.unit.test.js +9 -8
  275. package/dist/tests/unit/utils/devicePlatform.unit.test.js.map +1 -1
  276. package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts +2 -0
  277. package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts.map +1 -0
  278. package/dist/tests/unit/utils/mobileSignals.unit.test.js +161 -0
  279. package/dist/tests/unit/utils/mobileSignals.unit.test.js.map +1 -0
  280. package/dist/util/usageCounters.d.ts +1 -1
  281. package/dist/util/usageCounters.d.ts.map +1 -1
  282. package/dist/util/usageCounters.js +26 -3
  283. package/dist/util/usageCounters.js.map +1 -1
  284. package/dist/util.d.ts.map +1 -1
  285. package/dist/util.js +15 -4
  286. package/dist/util.js.map +1 -1
  287. package/dist/utils/devicePlatform.d.ts +3 -3
  288. package/dist/utils/devicePlatform.d.ts.map +1 -1
  289. package/dist/utils/devicePlatform.js +9 -5
  290. package/dist/utils/devicePlatform.js.map +1 -1
  291. package/dist/utils/mobileSignals.d.ts +32 -0
  292. package/dist/utils/mobileSignals.d.ts.map +1 -0
  293. package/dist/utils/mobileSignals.js +68 -0
  294. package/dist/utils/mobileSignals.js.map +1 -0
  295. package/package.json +44 -43
@@ -36,13 +36,11 @@ var decodeTokenOr400 = (token, i18n, logger, next) => {
36
36
  try {
37
37
  return (0, _prosopo_types.decodeProcaptchaOutput)(token);
38
38
  } catch (error) {
39
- next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
40
- context: {
41
- code: 400,
42
- error
43
- },
44
- i18n,
45
- logger
39
+ next(new _prosopo_common.ProsopoError({
40
+ code: "INVALID_REQUEST",
41
+ errorSite: "PROV-37",
42
+ message: "Error parsing captcha",
43
+ cause: error
46
44
  }));
47
45
  return null;
48
46
  }
@@ -52,13 +50,12 @@ var dappSignatureError = (signature, message, pair, req) => {
52
50
  (0, _prosopo_api_express_router.verifySignature)(signature, message, pair);
53
51
  return;
54
52
  } catch {
55
- return new _prosopo_common.ProsopoApiError("GENERAL.INVALID_SIGNATURE", {
56
- context: {
57
- code: 400,
58
- siteKey: pair.address
59
- },
60
- i18n: req.i18n,
61
- logger: req.logger
53
+ return new _prosopo_common.ProsopoError({
54
+ code: "UNAUTHORIZED",
55
+ errorSite: "PROV-38",
56
+ message: "Invalid signature",
57
+ status: 400,
58
+ context: { siteKey: pair.address }
62
59
  });
63
60
  }
64
61
  };
@@ -77,14 +74,12 @@ var interactiveVerifyHandler = ({ env, userAccessRulesStorage, path, label, hand
77
74
  try {
78
75
  parsed = _prosopo_types.ServerPuzzleCaptchaVerifyRequestBody.parse(req.body);
79
76
  } catch (err) {
80
- return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
81
- context: {
82
- code: 400,
83
- error: err,
84
- body: require_requestBodySummary.summariseRequestBody(req)
85
- },
86
- i18n: req.i18n,
87
- logger: req.logger
77
+ return next(new _prosopo_common.ProsopoError({
78
+ code: "INVALID_REQUEST",
79
+ errorSite: "PROV-39",
80
+ message: "Error parsing captcha",
81
+ cause: err,
82
+ context: { body: require_requestBodySummary.summariseRequestBody(req) }
88
83
  }));
89
84
  }
90
85
  try {
@@ -115,13 +110,10 @@ var interactiveVerifyHandler = ({ env, userAccessRulesStorage, path, label, hand
115
110
  (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
116
111
  (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
117
112
  const clientRecord = await tasks.db.getClientRecord(dapp);
118
- if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
119
- context: {
120
- code: 400,
121
- siteKey: dapp
122
- },
123
- i18n: req.i18n,
124
- logger: req.logger
113
+ if (!clientRecord) return next(new _prosopo_common.ProsopoError({
114
+ code: "SITE_KEY_NOT_REGISTERED",
115
+ errorSite: "PROV-40",
116
+ context: { siteKey: dapp }
125
117
  }));
126
118
  if (!challenge) {
127
119
  const unverifiedResponse = {
@@ -151,13 +143,11 @@ var interactiveVerifyHandler = ({ env, userAccessRulesStorage, path, label, hand
151
143
  err,
152
144
  data: { body: require_requestBodySummary.summariseRequestBody(req) }
153
145
  }));
154
- return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
155
- context: {
156
- code: 500,
157
- error: err
158
- },
159
- i18n: req.i18n,
160
- logger: req.logger
146
+ return next(new _prosopo_common.ProsopoError({
147
+ code: "UNEXPECTED",
148
+ errorSite: "PROV-41",
149
+ message: "BadRequest",
150
+ cause: err
161
151
  }));
162
152
  }
163
153
  };
@@ -217,14 +207,12 @@ function prosopoVerifyRouter(env) {
217
207
  try {
218
208
  parsed = _prosopo_types.VerifySolutionBody.parse(req.body);
219
209
  } catch (err) {
220
- return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
221
- context: {
222
- code: 400,
223
- error: err,
224
- body: require_requestBodySummary.summariseRequestBody(req)
225
- },
226
- i18n: req.i18n,
227
- logger: req.logger
210
+ return next(new _prosopo_common.ProsopoError({
211
+ code: "INVALID_REQUEST",
212
+ errorSite: "PROV-42",
213
+ message: "Error parsing captcha",
214
+ cause: err,
215
+ context: { body: require_requestBodySummary.summariseRequestBody(req) }
228
216
  }));
229
217
  }
230
218
  const { dappSignature, token, ip, maxVerifiedTime, email, clientSessionId } = parsed;
@@ -255,14 +243,13 @@ function prosopoVerifyRouter(env) {
255
243
  (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
256
244
  (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
257
245
  const clientRecord = await tasks.db.getClientRecord(dapp);
258
- if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
246
+ if (!clientRecord) return next(new _prosopo_common.ProsopoError({
247
+ code: "SITE_KEY_NOT_REGISTERED",
248
+ errorSite: "PROV-43",
259
249
  context: {
260
- code: 400,
261
250
  siteKey: dapp,
262
251
  user
263
- },
264
- i18n: req.i18n,
265
- logger: req.logger
252
+ }
266
253
  }));
267
254
  const keyPair = env.keyring.addFromAddress(dapp);
268
255
  const signatureError = dappSignatureError(dappSignature, timestamp.toString(), keyPair, req);
@@ -285,14 +272,14 @@ function prosopoVerifyRouter(env) {
285
272
  msg: "Error in verifyImageCaptchaSolution",
286
273
  data: { body: require_requestBodySummary.summariseRequestBody(req) }
287
274
  }));
288
- return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
275
+ return next(new _prosopo_common.ProsopoError({
276
+ code: "UNEXPECTED",
277
+ errorSite: "PROV-44",
278
+ message: "BadRequest",
289
279
  context: {
290
- code: 500,
291
280
  siteKey: req.body.dapp,
292
281
  user: req.body.user
293
- },
294
- i18n: req.i18n,
295
- logger: req.logger
282
+ }
296
283
  }));
297
284
  }
298
285
  });
@@ -313,14 +300,12 @@ function prosopoVerifyRouter(env) {
313
300
  try {
314
301
  parsed = _prosopo_types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
315
302
  } catch (err) {
316
- return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
317
- context: {
318
- code: 400,
319
- error: err,
320
- body: require_requestBodySummary.summariseRequestBody(req)
321
- },
322
- i18n: req.i18n,
323
- logger: req.logger
303
+ return next(new _prosopo_common.ProsopoError({
304
+ code: "INVALID_REQUEST",
305
+ errorSite: "PROV-45",
306
+ message: "Error parsing captcha",
307
+ cause: err,
308
+ context: { body: require_requestBodySummary.summariseRequestBody(req) }
324
309
  }));
325
310
  }
326
311
  try {
@@ -351,13 +336,10 @@ function prosopoVerifyRouter(env) {
351
336
  (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
352
337
  (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
353
338
  const clientRecord = await tasks.db.getClientRecord(dapp);
354
- if (!clientRecord) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
355
- context: {
356
- code: 400,
357
- siteKey: dapp
358
- },
359
- i18n: req.i18n,
360
- logger: req.logger
339
+ if (!clientRecord) return next(new _prosopo_common.ProsopoError({
340
+ code: "SITE_KEY_NOT_REGISTERED",
341
+ errorSite: "PROV-46",
342
+ context: { siteKey: dapp }
361
343
  }));
362
344
  if (!challenge) {
363
345
  const unverifiedResponse = {
@@ -377,7 +359,7 @@ function prosopoVerifyRouter(env) {
377
359
  const maintenanceResponse = require_maintenanceModeResponses.buildMaintenanceVerificationResponse(req.i18n.t);
378
360
  return res.json(maintenanceResponse);
379
361
  }
380
- const { verified, score, reason, sessionId } = await tasks.powCaptchaManager.serverVerifyPowCaptchaSolution(dapp, challenge, clientRecord.settings.verifiedTimeout, env, ip, userAccessRulesStorage, email, clientRecord.settings.spamEmailDomainCheckEnabled, clientRecord.settings.spamFilter, clientRecord.settings.trafficFilter, clientRecord.settings.storeMetadata, clientSessionId);
362
+ const { verified, score, reason, sessionId } = await tasks.powCaptchaManager.serverVerifyPowCaptchaSolution(dapp, challenge, clientRecord.settings.verifiedTimeout, env, ip, userAccessRulesStorage, email, clientRecord.settings.spamEmailDomainCheckEnabled, clientRecord.settings.spamFilter, clientRecord.settings.trafficFilter, clientRecord.settings.storeMetadata, clientSessionId, clientRecord.settings.ipValidationRules);
381
363
  const verificationResponse = tasks.powCaptchaManager.getVerificationResponse(verified, clientRecord, req.i18n.t, score, reason, sessionId);
382
364
  return res.json(verificationResponse);
383
365
  } catch (err) {
@@ -386,13 +368,11 @@ function prosopoVerifyRouter(env) {
386
368
  err,
387
369
  data: { body: require_requestBodySummary.summariseRequestBody(req) }
388
370
  }));
389
- return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
390
- context: {
391
- code: 500,
392
- error: err
393
- },
394
- i18n: req.i18n,
395
- logger: req.logger
371
+ return next(new _prosopo_common.ProsopoError({
372
+ code: "UNEXPECTED",
373
+ errorSite: "PROV-47",
374
+ message: "BadRequest",
375
+ cause: err
396
376
  }));
397
377
  }
398
378
  });
@@ -437,14 +417,12 @@ function prosopoVerifyRouter(env) {
437
417
  try {
438
418
  parsed = _prosopo_types.VerifySolutionBody.parse(req.body);
439
419
  } catch (err) {
440
- return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
441
- context: {
442
- code: 400,
443
- error: err,
444
- body: require_requestBodySummary.summariseRequestBody(req)
445
- },
446
- i18n: req.i18n,
447
- logger: req.logger
420
+ return next(new _prosopo_common.ProsopoError({
421
+ code: "INVALID_REQUEST",
422
+ errorSite: "PROV-48",
423
+ message: "Error parsing captcha",
424
+ cause: err,
425
+ context: { body: require_requestBodySummary.summariseRequestBody(req) }
448
426
  }));
449
427
  }
450
428
  const { dappSignature, token, ip, clientSessionId } = parsed;
@@ -471,14 +449,13 @@ function prosopoVerifyRouter(env) {
471
449
  const tasks = new require_tasks.Tasks(env, req.logger);
472
450
  (0, _prosopo_util_crypto.validateAddress)(dapp, false, 42);
473
451
  (0, _prosopo_util_crypto.validateAddress)(user, false, 42);
474
- if (!await tasks.db.getClientRecord(dapp)) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
452
+ if (!await tasks.db.getClientRecord(dapp)) return next(new _prosopo_common.ProsopoError({
453
+ code: "SITE_KEY_NOT_REGISTERED",
454
+ errorSite: "PROV-49",
475
455
  context: {
476
- code: 400,
477
456
  siteKey: dapp,
478
457
  user
479
- },
480
- i18n: req.i18n,
481
- logger: req.logger
458
+ }
482
459
  }));
483
460
  const keyPair = env.keyring.addFromAddress(dapp);
484
461
  const signatureError = dappSignatureError(dappSignature, timestamp.toString(), keyPair, req);
@@ -503,14 +480,14 @@ function prosopoVerifyRouter(env) {
503
480
  msg: "Error in verifyAuthenticatedSession",
504
481
  data: { body: require_requestBodySummary.summariseRequestBody(req) }
505
482
  }));
506
- return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
483
+ return next(new _prosopo_common.ProsopoError({
484
+ code: "UNEXPECTED",
485
+ errorSite: "PROV-50",
486
+ message: "BadRequest",
507
487
  context: {
508
- code: 500,
509
488
  siteKey: req.body.dapp,
510
489
  user: req.body.user
511
- },
512
- i18n: req.i18n,
513
- logger: req.logger
490
+ }
514
491
  }));
515
492
  }
516
493
  });
@@ -45,6 +45,7 @@ exports.getIpAddressFromComposite = require_compositeIpAddress.getIpAddressFromC
45
45
  exports.getJA4 = require_ja4Middleware.getJA4;
46
46
  exports.getPrioritisedAccessRule = require_blacklistRequestInspector.getPrioritisedAccessRule;
47
47
  exports.getRequestUserScope = require_blacklistRequestInspector.getRequestUserScope;
48
+ exports.getServerVerifyPaths = require_startProviderApi.getServerVerifyPaths;
48
49
  exports.getUserFromJWT = require_startProviderApi.getUserFromJWT;
49
50
  exports.getVerdictCache = require_blacklistRequestInspector.getVerdictCache;
50
51
  exports.handshakeTimingMiddleware = require_handshakeTimingMiddleware.handshakeTimingMiddleware;
@@ -552,9 +552,7 @@ var CaptchaManager = class CaptchaManager {
552
552
  *
553
553
  * @returns The blocking policy if user should be blocked, undefined otherwise
554
554
  */
555
- async checkForHardBlock(userAccessRulesStorage, challengeRecord, userAccount, headers, coords, countryCode, asn) {
556
- let headHash;
557
- if (challengeRecord.sessionId) headHash = (await this.db.getSessionRecordBySessionId(challengeRecord.sessionId))?.decryptedHeadHash;
555
+ async checkForHardBlock(userAccessRulesStorage, challengeRecord, userAccount, headers, headHash, coords, countryCode, asn) {
558
556
  const coordsString = coords ? JSON.stringify(coords) : void 0;
559
557
  const ipAddressRecord = require_compositeIpAddress.getIpAddressFromComposite(challengeRecord.ipAddress);
560
558
  const userScope = require_blacklistRequestInspector.getRequestUserScope(headers, challengeRecord.ja4, ipAddressRecord.address, userAccount, headHash, coordsString, countryCode, asn);
@@ -581,8 +579,9 @@ var CaptchaManager = class CaptchaManager {
581
579
  * time (ipInfoMiddleware → storeXxxRecord), so by default we reuse it
582
580
  * instead of hitting the sidecar again.
583
581
  * - If the dapp's server passed up the end user's current IP via the
584
- * verify call, look that up fresh — it's the "now" IP for filtering
585
- * and may differ from the IP that originally requested the captcha.
582
+ * verify call, the caller looks that up fresh and passes the result as
583
+ * `currentIpInfo` — it's the "now" IP for filtering and may differ from
584
+ * the IP that originally requested the captcha.
586
585
  * - When the session carries a `dnsEvent`, its `peerIp` and `resolverIp`
587
586
  * are enriched and passed alongside the primary IP.
588
587
  * - The abuser category defaults to `{action:"block"}` so abusive
@@ -595,7 +594,7 @@ var CaptchaManager = class CaptchaManager {
595
594
  * updates record / session state differently); this helper just returns
596
595
  * the verdict.
597
596
  */
598
- async resolveTrafficFilterCheck(env, recordIpInfo, trafficFilter, currentIp, enrichedDnsEvent) {
597
+ async resolveTrafficFilterCheck(recordIpInfo, trafficFilter, currentIpInfo, enrichedDnsEvent) {
599
598
  const effective = {
600
599
  abuser: { action: _prosopo_types.TrafficFilterAction.Block },
601
600
  ...trafficFilter
@@ -604,8 +603,7 @@ var CaptchaManager = class CaptchaManager {
604
603
  isBlocked: false,
605
604
  matches: []
606
605
  };
607
- const ipInfo = currentIp ? await env.ipInfoService.lookup(currentIp) : recordIpInfo;
608
- return require_checkTrafficFilter.checkTrafficFilter(ipInfo, effective, require_enrichDnsEvent.extraIpInfosFromEnrichedDnsEvent(enrichedDnsEvent), enrichedDnsEvent?.pathValid);
606
+ return require_checkTrafficFilter.checkTrafficFilter(currentIpInfo ?? recordIpInfo, effective, require_enrichDnsEvent.extraIpInfosFromEnrichedDnsEvent(enrichedDnsEvent), enrichedDnsEvent?.pathValid);
609
607
  }
610
608
  /**
611
609
  * Does this client's tier entitle it to the bot score, and is there one?
@@ -126,9 +126,11 @@ var ClientTaskManager = class {
126
126
  if (newClientRecords) await this.providerDB.updateClientRecords(newClientRecords);
127
127
  await this.providerDB.updateScheduledTaskStatus(taskID, _prosopo_types.ScheduledTaskStatus.Completed, { data: { clientRecords: newClientRecords.length } });
128
128
  } catch (e) {
129
- const getClientListError = new _prosopo_common.ProsopoApiError("DATABASE.UNKNOWN", {
130
- context: { error: e },
131
- logger: this.logger
129
+ const getClientListError = new _prosopo_common.ProsopoError({
130
+ code: "DB_QUERY_FAILED",
131
+ errorSite: "PROV-51",
132
+ message: "Unknown database error",
133
+ cause: e
132
134
  });
133
135
  this.logger.error(() => ({
134
136
  err: getClientListError,
@@ -170,12 +172,14 @@ var ClientTaskManager = class {
170
172
  await this.providerDB.removeClientRecords(accounts);
171
173
  }
172
174
  async updateDecisionMachine(scope, runtime, source, dappAccount, language, name, version, captchaType, kind) {
173
- if (scope === _prosopo_types.DecisionMachineScope.Dapp && !dappAccount) throw new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
175
+ if (scope === _prosopo_types.DecisionMachineScope.Dapp && !dappAccount) throw new _prosopo_common.ProsopoError({
176
+ code: "INVALID_REQUEST",
177
+ errorSite: "PROV-52",
178
+ message: "BadRequest",
174
179
  context: {
175
180
  scope,
176
181
  dappAccount
177
- },
178
- logger: this.logger
182
+ }
179
183
  });
180
184
  const now = /* @__PURE__ */ new Date();
181
185
  await this.providerDB.upsertDecisionMachineArtifact({
@@ -218,9 +222,11 @@ var ClientTaskManager = class {
218
222
  }
219
223
  async getDecisionMachine(id) {
220
224
  const artifact = await this.providerDB.getDecisionMachineArtifactById(id);
221
- if (!artifact) throw new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
222
- context: { id },
223
- logger: this.logger
225
+ if (!artifact) throw new _prosopo_common.ProsopoError({
226
+ code: "INVALID_REQUEST",
227
+ errorSite: "PROV-53",
228
+ message: "BadRequest",
229
+ context: { id }
224
230
  });
225
231
  return {
226
232
  _id: artifact._id.toString(),
@@ -239,22 +245,29 @@ var ClientTaskManager = class {
239
245
  }
240
246
  async removeDecisionMachine(id) {
241
247
  const success = await this.providerDB.removeDecisionMachineArtifact(id);
242
- if (!success) throw new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
248
+ if (!success) throw new _prosopo_common.ProsopoError({
249
+ code: "INVALID_REQUEST",
250
+ errorSite: "PROV-54",
251
+ message: "BadRequest",
243
252
  context: {
244
253
  id,
245
254
  message: "Decision machine not found"
246
- },
247
- logger: this.logger
255
+ }
248
256
  });
257
+ require_decisionMachineRunner.invalidateAllDecisionMachineArtifactCaches();
258
+ require_decisionMachineRunner.invalidateDecisionMachineScriptCache();
249
259
  return {
250
260
  success,
251
261
  deletedId: id
252
262
  };
253
263
  }
254
264
  async removeAllDecisionMachines() {
265
+ const deletedCount = await this.providerDB.removeAllDecisionMachineArtifacts();
266
+ require_decisionMachineRunner.invalidateAllDecisionMachineArtifactCaches();
267
+ require_decisionMachineRunner.invalidateDecisionMachineScriptCache();
255
268
  return {
256
269
  success: true,
257
- deletedCount: await this.providerDB.removeAllDecisionMachineArtifacts()
270
+ deletedCount
258
271
  };
259
272
  }
260
273
  /**
@@ -2,16 +2,36 @@ let _prosopo_common = require("@prosopo/common");
2
2
  let _prosopo_datasets = require("@prosopo/datasets");
3
3
  //#region src/tasks/dataset/datasetTasksUtils.ts
4
4
  var providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
5
- if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) throw new _prosopo_common.ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", { context: { failedFuncName: providerValidateDataset.name } });
5
+ if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) throw new _prosopo_common.ProsopoError({
6
+ code: "DATASET_INVALID",
7
+ errorSite: "PROV-55",
8
+ message: "Number of captchas in dataset is less than configured number of captchas",
9
+ context: { failedFuncName: providerValidateDataset.name }
10
+ });
6
11
  const solutions = datasetRaw.captchas.map((captcha) => captcha.solution ? 1 : 0).reduce((partialSum, b) => partialSum + b, 0);
7
- if (solutions < minSolvedCaptchas) throw new _prosopo_common.ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", { context: { failedFuncName: providerValidateDataset.name } });
8
- if (datasetRaw.captchas.length - solutions < minUnsolvedCaptchas) throw new _prosopo_common.ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", { context: { failedFuncName: providerValidateDataset.name } });
12
+ if (solutions < minSolvedCaptchas) throw new _prosopo_common.ProsopoError({
13
+ code: "DATASET_INVALID",
14
+ errorSite: "PROV-56",
15
+ message: "Number of solutions in dataset is less than configured number of solutions",
16
+ context: { failedFuncName: providerValidateDataset.name }
17
+ });
18
+ if (datasetRaw.captchas.length - solutions < minUnsolvedCaptchas) throw new _prosopo_common.ProsopoError({
19
+ code: "DATASET_INVALID",
20
+ errorSite: "PROV-57",
21
+ message: "Number of captchas in dataset is less than configured number of captchas",
22
+ context: { failedFuncName: providerValidateDataset.name }
23
+ });
9
24
  const dataset = await (0, _prosopo_datasets.buildDataset)(datasetRaw);
10
- if (!dataset.datasetId || !dataset.datasetContentId) throw new _prosopo_common.ProsopoEnvError("DATASET.DATASET_ID_UNDEFINED", { context: {
11
- failedFuncName: providerValidateDataset.name,
12
- datasetId: dataset.datasetId,
13
- datasetContentId: dataset.datasetContentId
14
- } });
25
+ if (!dataset.datasetId || !dataset.datasetContentId) throw new _prosopo_common.ProsopoError({
26
+ code: "DATASET_INVALID",
27
+ errorSite: "PROV-58",
28
+ message: "Dataset id undefined",
29
+ context: {
30
+ failedFuncName: providerValidateDataset.name,
31
+ datasetId: dataset.datasetId,
32
+ datasetContentId: dataset.datasetContentId
33
+ }
34
+ });
15
35
  return dataset;
16
36
  };
17
37
  //#endregion
@@ -44,18 +44,20 @@ var ARTIFACT_CACHE_TTL_MS = Number.parseInt(process.env.DECISION_MACHINE_ARTIFAC
44
44
  var DEFAULT_DECISION = { decision: _prosopo_types.DecisionMachineDecision.Allow };
45
45
  var RequiredCountersSchema = zod.z.array(_prosopo_types.CounterSpecSchema);
46
46
  /**
47
- * Bumped by {@link invalidateAllDecisionMachineArtifactCaches}. A runner
48
- * caches the value it last saw and drops its artifact cache whenever the two
49
- * diverge, which flushes every runner — including ones built after the
50
- * invalidation — without holding a reference to any of them.
51
- *
52
- * This replaces a registry of live runners, which assumed runners were built
53
- * once per process. They are built per request, so the registry grew without
54
- * bound and construction eventually began to fail. `WeakRef` did not bound
55
- * it: the set held the wrapper, which outlives its referent.
47
+ * Bumped by {@link invalidateAllDecisionMachineArtifactCaches}. Each cache
48
+ * records the generation it was filled under and is discarded once the two
49
+ * diverge, which flushes every cache without holding a reference to any of
50
+ * them.
56
51
  */
57
52
  var artifactCacheGeneration = 0;
58
53
  /**
54
+ * Runners are built per request, so a cache owned by the runner never served
55
+ * a second lookup and every decision paid two Mongo reads. The cache lives
56
+ * with the database the runner reads from instead: one per process in
57
+ * production, and still isolated between test doubles.
58
+ */
59
+ var artifactCaches = /* @__PURE__ */ new WeakMap();
60
+ /**
59
61
  * Flush every runner's in-memory artifact cache. Companion to
60
62
  * {@link invalidateDecisionMachineScriptCache}. Call both after any
61
63
  * `upsertDecisionMachineArtifact` upload.
@@ -66,19 +68,20 @@ var invalidateAllDecisionMachineArtifactCaches = () => {
66
68
  var DecisionMachineRunner = class DecisionMachineRunner {
67
69
  constructor(db) {
68
70
  this.db = db;
69
- this.artifactCache = /* @__PURE__ */ new Map();
70
- this.seenArtifactCacheGeneration = artifactCacheGeneration;
71
71
  }
72
- /** Drop every entry in this runner's artifact cache. */
72
+ /** Drop every cached artifact read from this runner's database. */
73
73
  invalidateArtifactCache() {
74
74
  this.artifactCache.clear();
75
75
  }
76
- /** Drop the cache if an invalidation happened since it was last consulted. */
77
- dropArtifactCacheIfStale() {
78
- if (this.seenArtifactCacheGeneration !== artifactCacheGeneration) {
79
- this.seenArtifactCacheGeneration = artifactCacheGeneration;
80
- this.artifactCache.clear();
81
- }
76
+ get artifactCache() {
77
+ const cache = artifactCaches.get(this.db);
78
+ if (cache && cache.generation === artifactCacheGeneration) return cache.entries;
79
+ const fresh = {
80
+ generation: artifactCacheGeneration,
81
+ entries: /* @__PURE__ */ new Map()
82
+ };
83
+ artifactCaches.set(this.db, fresh);
84
+ return fresh.entries;
82
85
  }
83
86
  /** Build a cache key for a given scope + kind + dappAccount tuple. */
84
87
  static cacheKey(scope, kind, dappAccount) {
@@ -86,7 +89,6 @@ var DecisionMachineRunner = class DecisionMachineRunner {
86
89
  }
87
90
  /** Return a cached artifact if still fresh, or undefined. */
88
91
  getCachedArtifact(scope, kind, dappAccount) {
89
- this.dropArtifactCacheIfStale();
90
92
  const entry = this.artifactCache.get(DecisionMachineRunner.cacheKey(scope, kind, dappAccount));
91
93
  if (!entry) return null;
92
94
  if (Date.now() - entry.cachedAt > ARTIFACT_CACHE_TTL_MS) {
@@ -282,7 +282,7 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
282
282
  const maxLevel = (0, _prosopo_captcha_severity.resolveMaxEscalationLevel)(this.routingContext?.puzzleMaxDifficulty ?? _prosopo_types.puzzleMaxDifficultyDefault, this.routingContext?.platform.isMobile ?? false);
283
283
  const ceiling = finalReason === _prosopo_types.FrictionlessReason.OLD_TIMESTAMP ? Math.min(maxLevel, _prosopo_captcha_severity.MAX_STALE_PAYLOAD_LEVEL) : maxLevel;
284
284
  const level = finalReason !== void 0 && _prosopo_types.NO_MEASUREMENT_REASONS.has(finalReason) ? 0 : (0, _prosopo_captcha_severity.severityToPuzzleDifficulty)(requestedSolvedImagesCount, this.routingContext?.baseImageRounds ?? this.config.captchas.solved.count, ceiling);
285
- const difficulty = level > 0 ? require_puzzleDifficulty.samplePuzzleDifficulty(level, _prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS.holeDarken) : void 0;
285
+ const difficulty = level > 0 ? require_puzzleDifficulty.samplePuzzleDifficulty(level, _prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS.holeDarken, ceiling) : void 0;
286
286
  const tolerance = routed.puzzleTolerance ?? difficulty?.tolerance;
287
287
  const puzzle = routed.puzzle || difficulty ? {
288
288
  ...difficulty?.puzzle ?? {},
@@ -56,14 +56,15 @@ var applyRouter = async (runner, counters, baseline, ctx, logger, phase = "route
56
56
  };
57
57
  /**
58
58
  * Map machine-declared CounterSpecs onto the values that the provider knows
59
- * how to read (IP and userAccount). Specs whose dimension we cannot resolve
60
- * are silently skipped.
59
+ * how to read. Specs whose dimension we cannot resolve are silently skipped,
60
+ * so a rule naming `deviceBucket` on a request that disclosed no proof of
61
+ * fingerprint simply does not get that key.
61
62
  */
62
63
  var specsToReads = (specs, ctx) => {
63
64
  const out = [];
64
65
  for (const spec of specs) {
65
- const value = spec.dimension === "ip" ? ctx.ip : spec.dimension === "userAccount" ? ctx.userAccount : void 0;
66
- if (value === void 0) continue;
66
+ const value = resolveDimension(spec.dimension, ctx);
67
+ if (value === void 0 || value === "") continue;
67
68
  out.push({
68
69
  spec,
69
70
  value
@@ -71,5 +72,13 @@ var specsToReads = (specs, ctx) => {
71
72
  }
72
73
  return out;
73
74
  };
75
+ var resolveDimension = (dimension, ctx) => {
76
+ switch (dimension) {
77
+ case "ip": return ctx.ip;
78
+ case "userAccount": return ctx.userAccount;
79
+ case "deviceBucket": return ctx.raw.fingerprintSummary?.bucketId;
80
+ case "peerIp": return;
81
+ }
82
+ };
74
83
  //#endregion
75
84
  exports.applyRouter = applyRouter;