@prosopo/provider 4.12.0 → 4.13.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 (228) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +43 -39
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +43 -40
  4. package/CHANGELOG.md +97 -0
  5. package/dist/api/admin/apiClearAllCountersEndpoint.d.ts.map +1 -1
  6. package/dist/api/admin/apiClearAllCountersEndpoint.js +1 -1
  7. package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
  8. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
  9. package/dist/api/admin/apiDnsEventEndpoint.js +1 -1
  10. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
  11. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts.map +1 -1
  12. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +1 -1
  13. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
  14. package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts.map +1 -1
  15. package/dist/api/admin/apiGetDecisionMachineEndpoint.js +1 -1
  16. package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
  17. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
  18. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +1 -1
  19. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
  20. package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts.map +1 -1
  21. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +1 -1
  22. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js.map +1 -1
  23. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts.map +1 -1
  24. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +1 -1
  25. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
  26. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts.map +1 -1
  27. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +1 -1
  28. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
  29. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  30. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +1 -2
  31. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
  32. package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts.map +1 -1
  33. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +1 -1
  34. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
  35. package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts.map +1 -1
  36. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +1 -1
  37. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
  38. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  39. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +3 -1
  40. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  41. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts.map +1 -1
  42. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +1 -1
  43. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
  44. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +1 -2
  45. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
  46. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  47. package/dist/api/blacklistRequestInspector.js +7 -3
  48. package/dist/api/blacklistRequestInspector.js.map +1 -1
  49. package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
  50. package/dist/api/captcha/checkSpamEmail.js +19 -4
  51. package/dist/api/captcha/checkSpamEmail.js.map +1 -1
  52. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts +0 -1
  53. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
  54. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +1 -7
  55. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
  56. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
  57. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +8 -7
  58. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
  59. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts +1 -1
  60. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  61. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +68 -28
  62. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  63. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +0 -1
  64. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  65. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +0 -1
  66. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  67. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  68. package/dist/api/captcha/getImageCaptchaChallenge.js +3 -0
  69. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  70. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  71. package/dist/api/captcha/getPoWCaptchaChallenge.js +3 -0
  72. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  73. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  74. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +3 -0
  75. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  76. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +8 -0
  77. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  78. package/dist/api/captcha/submitPoWCaptchaSolution.js +7 -0
  79. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  80. package/dist/api/captcha.d.ts +2 -1
  81. package/dist/api/captcha.d.ts.map +1 -1
  82. package/dist/api/captcha.js +12 -15
  83. package/dist/api/captcha.js.map +1 -1
  84. package/dist/api/domainMiddleware.d.ts.map +1 -1
  85. package/dist/api/domainMiddleware.js +4 -0
  86. package/dist/api/domainMiddleware.js.map +1 -1
  87. package/dist/api/forwardVerify.d.ts +14 -0
  88. package/dist/api/forwardVerify.d.ts.map +1 -0
  89. package/dist/api/forwardVerify.js +54 -0
  90. package/dist/api/forwardVerify.js.map +1 -0
  91. package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
  92. package/dist/api/headerCheckMiddleware.js +7 -4
  93. package/dist/api/headerCheckMiddleware.js.map +1 -1
  94. package/dist/api/ja4.d.ts +5 -0
  95. package/dist/api/ja4.d.ts.map +1 -0
  96. package/dist/api/ja4.js +203 -0
  97. package/dist/api/ja4.js.map +1 -0
  98. package/dist/api/ja4Middleware.d.ts.map +1 -1
  99. package/dist/api/ja4Middleware.js +9 -18
  100. package/dist/api/ja4Middleware.js.map +1 -1
  101. package/dist/api/metrics.d.ts +40 -0
  102. package/dist/api/metrics.d.ts.map +1 -0
  103. package/dist/api/metrics.js +260 -0
  104. package/dist/api/metrics.js.map +1 -0
  105. package/dist/api/public.d.ts.map +1 -1
  106. package/dist/api/public.js +4 -0
  107. package/dist/api/public.js.map +1 -1
  108. package/dist/api/startProviderApi.d.ts.map +1 -1
  109. package/dist/api/startProviderApi.js +3 -1
  110. package/dist/api/startProviderApi.js.map +1 -1
  111. package/dist/api/verify.d.ts.map +1 -1
  112. package/dist/api/verify.js +85 -8
  113. package/dist/api/verify.js.map +1 -1
  114. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +1 -1
  115. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +1 -2
  116. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +1 -1
  117. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +1 -1
  118. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +1 -2
  119. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +1 -2
  120. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +1 -1
  121. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +1 -1
  122. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +1 -3
  123. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +1 -2
  124. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +1 -2
  125. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +3 -2
  126. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +1 -1
  127. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +1 -2
  128. package/dist/cjs/api/blacklistRequestInspector.cjs +7 -3
  129. package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -3
  130. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +1 -7
  131. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +8 -7
  132. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +70 -30
  133. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +0 -1
  134. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -0
  135. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -0
  136. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -0
  137. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +9 -1
  138. package/dist/cjs/api/captcha.cjs +12 -15
  139. package/dist/cjs/api/domainMiddleware.cjs +4 -0
  140. package/dist/cjs/api/forwardVerify.cjs +54 -0
  141. package/dist/cjs/api/headerCheckMiddleware.cjs +7 -4
  142. package/dist/cjs/api/ja4.cjs +203 -0
  143. package/dist/cjs/api/ja4Middleware.cjs +11 -21
  144. package/dist/cjs/api/metrics.cjs +260 -0
  145. package/dist/cjs/api/public.cjs +4 -0
  146. package/dist/cjs/api/startProviderApi.cjs +3 -1
  147. package/dist/cjs/api/verify.cjs +83 -6
  148. package/dist/cjs/index.cjs +1 -0
  149. package/dist/cjs/tasks/captchaManager.cjs +23 -3
  150. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +20 -22
  151. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +17 -23
  152. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +15 -21
  153. package/dist/index.js +2 -1
  154. package/dist/tasks/captchaManager.d.ts.map +1 -1
  155. package/dist/tasks/captchaManager.js +23 -2
  156. package/dist/tasks/captchaManager.js.map +1 -1
  157. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  158. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -22
  159. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  160. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  161. package/dist/tasks/powCaptcha/powTasks.js +17 -23
  162. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  163. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  164. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +15 -21
  165. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  166. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +1 -0
  167. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -1
  168. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +5 -1
  169. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
  170. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
  171. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  172. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +1 -0
  173. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -1
  174. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +1 -0
  175. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -1
  176. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +1 -0
  177. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  178. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +1 -0
  179. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -1
  180. package/dist/tests/unit/api/adminRoutes.unit.test.js +1 -0
  181. package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -1
  182. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +43 -0
  183. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  184. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts +2 -0
  185. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts.map +1 -0
  186. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +62 -0
  187. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -0
  188. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +0 -1
  189. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -1
  190. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +0 -1
  191. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
  192. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.d.ts +2 -0
  193. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.d.ts.map +1 -0
  194. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +130 -0
  195. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -0
  196. package/dist/tests/unit/api/captcha.unit.test.js +31 -1
  197. package/dist/tests/unit/api/captcha.unit.test.js.map +1 -1
  198. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts +2 -0
  199. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts.map +1 -0
  200. package/dist/tests/unit/api/forwardVerify.unit.test.js +151 -0
  201. package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -0
  202. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +68 -0
  203. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  204. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +2 -2
  205. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
  206. package/dist/tests/unit/api/ja4.unit.test.d.ts +2 -0
  207. package/dist/tests/unit/api/ja4.unit.test.d.ts.map +1 -0
  208. package/dist/tests/unit/api/ja4.unit.test.js +233 -0
  209. package/dist/tests/unit/api/ja4.unit.test.js.map +1 -0
  210. package/dist/tests/unit/api/ja4Middleware.unit.test.js +11 -8
  211. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
  212. package/dist/tests/unit/api/public.unit.test.js +72 -0
  213. package/dist/tests/unit/api/public.unit.test.js.map +1 -1
  214. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +1 -1
  215. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  216. package/dist/tests/unit/schedulers/getClientList.unit.test.js +1 -1
  217. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
  218. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +1 -1
  219. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
  220. package/dist/tests/unit/tasks/captchaManager.unit.test.js +87 -2
  221. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  222. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +1 -1
  223. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  224. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
  225. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  226. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +4 -1
  227. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  228. package/package.json +23 -23
@@ -8,7 +8,7 @@ class ApiClearAllCountersEndpoint {
8
8
  this.usageCounters = usageCounters;
9
9
  }
10
10
  async processRequest(args, logger$1) {
11
- logger$1 = logger$1 || logger.getLogger("info", "");
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:counters:clear-all") : logger.getLogger("info", "provider:admin:counters:clear-all");
12
12
  const dappAccount = args.dapp;
13
13
  const scope = dappAccount ?? "all";
14
14
  try {
@@ -4,7 +4,6 @@ const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
6
  const enrichDnsEvent = require("../../tasks/dnsEvent/enrichDnsEvent.cjs");
7
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
8
7
  const dnsEventToFields = (event) => {
9
8
  if (event.kind === "dns") {
10
9
  return { resolverIp: event.src_ip };
@@ -23,7 +22,7 @@ class ApiDnsEventEndpoint {
23
22
  this.ipInfoService = ipInfoService;
24
23
  }
25
24
  async processRequest(args, logger$1) {
26
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiDnsEventEndpoint.cjs", document.baseURI).href);
25
+ logger$1 = logger$1 ? logger$1.with({}, "admin:dns-event:ingest") : logger.getLogger("info", "provider:admin:dns-event:ingest");
27
26
  const { events } = args;
28
27
  let stored = 0;
29
28
  let errors = 0;
@@ -9,7 +9,7 @@ class ApiGetAllDecisionMachinesEndpoint {
9
9
  this.clientTaskManager = clientTaskManager;
10
10
  }
11
11
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", "");
12
+ logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machines:get-all") : logger.getLogger("info", "provider:admin:decision-machines:get-all");
13
13
  try {
14
14
  logger$1.info(() => ({
15
15
  msg: "Getting all decision machines"
@@ -8,7 +8,7 @@ class ApiGetDecisionMachineEndpoint {
8
8
  this.clientTaskManager = clientTaskManager;
9
9
  }
10
10
  async processRequest(args, logger$1) {
11
- logger$1 = logger$1 || logger.getLogger("info", "");
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machine:get") : logger.getLogger("info", "provider:admin:decision-machine:get");
12
12
  try {
13
13
  const { id } = args;
14
14
  logger$1.info(() => ({
@@ -3,14 +3,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
6
  class ApiRegisterSiteKeyEndpoint {
8
7
  constructor(clientTaskManager) {
9
8
  this.clientTaskManager = clientTaskManager;
10
9
  }
11
10
  async processRequest(args, logger$1) {
12
11
  const { siteKey, tier, settings } = args;
13
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRegisterSiteKeyEndpoint.cjs", document.baseURI).href);
12
+ logger$1 = logger$1 ? logger$1.with({}, "admin:site-key:register") : logger.getLogger("info", "provider:admin:site-key:register");
14
13
  const temp = settings || types.ClientSettingsSchema.parse({});
15
14
  logger$1.info(() => ({ data: { siteKey }, msg: "`Registering site key" }));
16
15
  await this.clientTaskManager.registerSiteKey(siteKey, tier, temp);
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
6
  class ApiRegisterSiteKeysEndpoint {
8
7
  constructor(clientTaskManager) {
9
8
  this.clientTaskManager = clientTaskManager;
10
9
  }
11
10
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRegisterSiteKeysEndpoint.cjs", document.baseURI).href);
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:site-keys:register") : logger.getLogger("info", "provider:admin:site-keys:register");
13
12
  logger$1.info(() => ({
14
13
  data: { count: args.length },
15
14
  msg: "Registering site keys"
@@ -9,7 +9,7 @@ class ApiRemoveAllDecisionMachinesEndpoint {
9
9
  this.clientTaskManager = clientTaskManager;
10
10
  }
11
11
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", "");
12
+ logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machines:remove-all") : logger.getLogger("info", "provider:admin:decision-machines:remove-all");
13
13
  try {
14
14
  logger$1.info(() => ({
15
15
  msg: "Removing all decision machines"
@@ -8,7 +8,7 @@ class ApiRemoveDecisionMachineEndpoint {
8
8
  this.clientTaskManager = clientTaskManager;
9
9
  }
10
10
  async processRequest(args, logger$1) {
11
- logger$1 = logger$1 || logger.getLogger("info", "");
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machine:remove") : logger.getLogger("info", "provider:admin:decision-machine:remove");
12
12
  try {
13
13
  const { id } = args;
14
14
  logger$1.info(() => ({
@@ -3,16 +3,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
6
  class ApiRemoveDetectorKeyEndpoint {
8
7
  constructor(clientTaskManager) {
9
8
  this.clientTaskManager = clientTaskManager;
10
9
  }
11
10
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRemoveDetectorKeyEndpoint.cjs", document.baseURI).href);
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:detector-key:remove") : logger.getLogger("info", "provider:admin:detector-key:remove");
13
12
  try {
14
13
  const { detectorKey, expirationInSeconds } = args;
15
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRemoveDetectorKeyEndpoint.cjs", document.baseURI).href);
16
14
  logger$1.info(() => ({ msg: "Removing detector key" }));
17
15
  await this.clientTaskManager.removeDetectorKey(
18
16
  detectorKey,
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
6
  class ApiRemoveSiteKeyEndpoint {
8
7
  constructor(clientTaskManager) {
9
8
  this.clientTaskManager = clientTaskManager;
10
9
  }
11
10
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRemoveSiteKeyEndpoint.cjs", document.baseURI).href);
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:site-key:remove") : logger.getLogger("info", "provider:admin:site-key:remove");
13
12
  try {
14
13
  const { siteKey } = args;
15
14
  logger$1.info(() => ({ data: { siteKey }, msg: "Removing site key" }));
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
6
  class ApiRemoveSiteKeysEndpoint {
8
7
  constructor(clientTaskManager) {
9
8
  this.clientTaskManager = clientTaskManager;
10
9
  }
11
10
  async processRequest(args, logger$1) {
12
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRemoveSiteKeysEndpoint.cjs", document.baseURI).href);
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:site-keys:remove") : logger.getLogger("info", "provider:admin:site-keys:remove");
13
12
  try {
14
13
  logger$1.info(() => ({
15
14
  data: { count: args.length },
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
4
  const logger = require("@prosopo/logger");
5
5
  const types = require("@prosopo/types");
6
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
6
+ const metrics = require("../metrics.cjs");
7
7
  function getMaintenanceMode() {
8
8
  return process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
9
9
  }
@@ -13,13 +13,14 @@ function setMaintenanceMode(enabled) {
13
13
  class ApiToggleMaintenanceModeEndpoint {
14
14
  async processRequest(args, logger$1) {
15
15
  const { enabled } = args;
16
- logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiToggleMaintenanceModeEndpoint.cjs", document.baseURI).href);
16
+ logger$1 = logger$1 ? logger$1.with({}, "admin:maintenance:toggle") : logger.getLogger("info", "provider:admin:maintenance:toggle");
17
17
  const previousMode = getMaintenanceMode();
18
18
  logger$1.info(() => ({
19
19
  data: { enabled, previous: previousMode },
20
20
  msg: "Toggling maintenance mode"
21
21
  }));
22
22
  setMaintenanceMode(enabled);
23
+ metrics.setMaintenanceModeGauge(enabled);
23
24
  const currentMode = getMaintenanceMode();
24
25
  logger$1.info(() => ({
25
26
  data: { enabled: currentMode },
@@ -8,7 +8,7 @@ class ApiUpdateDecisionMachineEndpoint {
8
8
  this.clientTaskManager = clientTaskManager;
9
9
  }
10
10
  async processRequest(args, logger$1) {
11
- logger$1 = logger$1 || logger.getLogger("info", "");
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machine:update") : logger.getLogger("info", "provider:admin:decision-machine:update");
12
12
  try {
13
13
  const {
14
14
  decisionMachineScope,
@@ -8,10 +8,9 @@ class ApiUpdateDetectorKeyEndpoint {
8
8
  this.clientTaskManager = clientTaskManager;
9
9
  }
10
10
  async processRequest(args, logger$1) {
11
- logger$1 = logger$1 || logger.getLogger("info", "");
11
+ logger$1 = logger$1 ? logger$1.with({}, "admin:detector-key:update") : logger.getLogger("info", "provider:admin:detector-key:update");
12
12
  try {
13
13
  const { detectorKey } = args;
14
- logger$1 = logger$1 || logger.getLogger("info", "");
15
14
  logger$1.info(() => ({ msg: "Updating detector key" }));
16
15
  const activeDetectorKeys = await this.clientTaskManager.updateDetectorKey(detectorKey);
17
16
  logger$1.info(() => ({
@@ -4,6 +4,7 @@ const node_crypto = require("node:crypto");
4
4
  const types = require("@prosopo/types");
5
5
  const userAccessPolicy = require("@prosopo/user-access-policy");
6
6
  const compositeIpAddress = require("../compositeIpAddress.cjs");
7
+ const metrics = require("./metrics.cjs");
7
8
  const getRequestUserScope = (requestHeaders, ja4, ip, user, headHash, coords, countryCode, asn) => {
8
9
  const userAgent = requestHeaders["user-agent"] ? requestHeaders["user-agent"].toString() : void 0;
9
10
  return {
@@ -145,7 +146,7 @@ class BlacklistRequestInspector {
145
146
  request.ipInfo
146
147
  );
147
148
  if (shouldAbortRequest) {
148
- res.status(401).json({ error: "Unauthorized" });
149
+ res.status(403).json({ error: "Forbidden" });
149
150
  return;
150
151
  }
151
152
  next();
@@ -163,6 +164,7 @@ class BlacklistRequestInspector {
163
164
  },
164
165
  msg: "Request without IP"
165
166
  }));
167
+ metrics.recordBlockedRequest("no_ip");
166
168
  return true;
167
169
  }
168
170
  await this.environmentReadinessWaiter();
@@ -205,6 +207,7 @@ class BlacklistRequestInspector {
205
207
  const accessPolicy = enforceable[0];
206
208
  const isBlock = userAccessPolicy.AccessPolicyType.Block === accessPolicy.type;
207
209
  if (isBlock) {
210
+ metrics.recordBlockedRequest("access_policy");
208
211
  this.recordBlockDecision(
209
212
  accessPolicy,
210
213
  {
@@ -226,14 +229,15 @@ class BlacklistRequestInspector {
226
229
  err,
227
230
  msg: "Block Middleware Error"
228
231
  }));
232
+ metrics.recordBlockedRequest("error");
229
233
  return true;
230
234
  }
231
235
  }
232
236
  /**
233
237
  * Emit a structured log line and (if a DB is wired) persist a synthetic
234
- * Session record for the request we're about to 401. Fire-and-forget on
238
+ * Session record for the request we're about to block (403). Fire-and-forget on
235
239
  * the Mongo side — the structured log line is the source of truth and
236
- * the 401 response is never delayed by a persistence failure.
240
+ * the 403 response is never delayed by a persistence failure.
237
241
  *
238
242
  * Carries the matched rule's identity (hash + ruleType + description)
239
243
  * so the Traffic page can surface "what's blocking traffic for this
@@ -1,18 +1,32 @@
1
1
  "use strict";
2
2
  const common = require("@prosopo/common");
3
+ const types = require("@prosopo/types");
3
4
  const util = require("@prosopo/util");
4
5
  const zod = require("zod");
5
6
  require("../../tasks/index.cjs");
6
7
  const checkSpamEmail$1 = require("../../tasks/spam/checkSpamEmail.cjs");
7
8
  const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
9
+ const metrics = require("../metrics.cjs");
8
10
  const tasks = require("../../tasks/tasks.cjs");
9
11
  const CheckSpamEmailRequestBody = zod.object({
10
- email: zod.string(),
11
- dapp: zod.string()
12
+ email: types.safeLine(types.INPUT_LIMITS.EMAIL),
13
+ dapp: types.safeLine(types.INPUT_LIMITS.ID)
12
14
  });
13
15
  const checkSpamEmail = (env) => async (req, res, next) => {
16
+ let email;
17
+ let dapp;
18
+ try {
19
+ ({ email, dapp } = CheckSpamEmailRequestBody.parse(req.body));
20
+ } catch (err) {
21
+ return next(
22
+ new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
23
+ context: { code: 400, error: err },
24
+ i18n: req.i18n,
25
+ logger: req.logger
26
+ })
27
+ );
28
+ }
14
29
  try {
15
- const { email, dapp } = CheckSpamEmailRequestBody.parse(req.body);
16
30
  const emailDomain = util.extractDomainFromEmail(email);
17
31
  req.logger.info(() => ({
18
32
  msg: "Check spam email handler entry",
@@ -66,6 +80,7 @@ const checkSpamEmail = (env) => async (req, res, next) => {
66
80
  isSpam
67
81
  }
68
82
  }));
83
+ metrics.recordSpamEmail(isSpam ? "spam" : "ham");
69
84
  return res.json({
70
85
  isSpam,
71
86
  emailDomain
@@ -11,11 +11,10 @@ const handleAccessPolicy = async (input, res) => {
11
11
  scoreComponents: input.scoreComponents
12
12
  };
13
13
  }
14
- const { tasks, clientRecord, userAccessPolicy, logger, requestId } = input;
14
+ const { tasks, clientRecord, userAccessPolicy, logger } = input;
15
15
  logger.info(() => ({
16
16
  msg: "User access policy matched",
17
17
  data: {
18
- requestId,
19
18
  policy: userAccessPolicy,
20
19
  captchaType: userAccessPolicy.captchaType,
21
20
  userScope: input.userScope
@@ -34,7 +33,6 @@ const handleAccessPolicy = async (input, res) => {
34
33
  logger.info(() => ({
35
34
  msg: "Frictionless decision",
36
35
  data: {
37
- requestId,
38
36
  decision: "block",
39
37
  captchaType: types.CaptchaType.image
40
38
  }
@@ -57,7 +55,6 @@ const handleAccessPolicy = async (input, res) => {
57
55
  logger.info(() => ({
58
56
  msg: "Frictionless decision",
59
57
  data: {
60
- requestId,
61
58
  decision: "auto_ban_score",
62
59
  botScore,
63
60
  autoBanThreshold,
@@ -88,7 +85,6 @@ const handleAccessPolicy = async (input, res) => {
88
85
  logger.info(() => ({
89
86
  msg: "Frictionless decision",
90
87
  data: {
91
- requestId,
92
88
  decision: "user_access_policy",
93
89
  captchaType: types.CaptchaType.image
94
90
  }
@@ -111,7 +107,6 @@ const handleAccessPolicy = async (input, res) => {
111
107
  logger.info(() => ({
112
108
  msg: "Frictionless decision",
113
109
  data: {
114
- requestId,
115
110
  decision: "user_access_policy",
116
111
  captchaType: types.CaptchaType.pow
117
112
  }
@@ -128,7 +123,6 @@ const handleAccessPolicy = async (input, res) => {
128
123
  logger.info(() => ({
129
124
  msg: "Frictionless decision",
130
125
  data: {
131
- requestId,
132
126
  decision: "user_access_policy",
133
127
  captchaType: types.CaptchaType.puzzle
134
128
  }
@@ -6,6 +6,7 @@ const util = require("@prosopo/util");
6
6
  const frictionlessTasks = require("../../../tasks/frictionless/frictionlessTasks.cjs");
7
7
  const frictionlessTasksUtils = require("../../../tasks/frictionless/frictionlessTasksUtils.cjs");
8
8
  const hashUserAgent = require("../../../utils/hashUserAgent.cjs");
9
+ const metrics = require("../../metrics.cjs");
9
10
  const contextAwareValidation = require("../contextAwareValidation.cjs");
10
11
  const constants = require("./constants.cjs");
11
12
  const honeypotResponse = require("./honeypotResponse.cjs");
@@ -57,13 +58,13 @@ const runDecisionMachine = async (input, handle) => {
57
58
  req.logger.info(() => ({
58
59
  msg: "Frictionless decision",
59
60
  data: {
60
- requestId: req.requestId,
61
61
  decision: "auto_ban_score",
62
62
  botScore,
63
63
  autoBanThreshold,
64
64
  token: input.token
65
65
  }
66
66
  }));
67
+ metrics.recordFrictionlessDecision("auto_ban_score");
67
68
  await tasks.frictionlessManager.registerBlockedSession({
68
69
  solvedImagesCount: clientRecord.settings.imageMaxRounds,
69
70
  userSitekeyIpHash,
@@ -78,11 +79,11 @@ const runDecisionMachine = async (input, handle) => {
78
79
  req.logger.info(() => ({
79
80
  msg: "Frictionless decision",
80
81
  data: {
81
- requestId: req.requestId,
82
82
  decision: "webview_detected",
83
83
  captchaType: types.CaptchaType.image
84
84
  }
85
85
  }));
86
+ metrics.recordFrictionlessDecision("webview_detected");
86
87
  honeypotResponse.attachHoneypot(res, clientRecord);
87
88
  return res.json(
88
89
  await tasks.frictionlessManager.sendImageCaptcha({
@@ -102,11 +103,11 @@ const runDecisionMachine = async (input, handle) => {
102
103
  req.logger.info(() => ({
103
104
  msg: "Frictionless decision",
104
105
  data: {
105
- requestId: req.requestId,
106
106
  decision: "timestamp_too_old",
107
107
  captchaType: types.CaptchaType.image
108
108
  }
109
109
  }));
110
+ metrics.recordFrictionlessDecision("timestamp_too_old");
110
111
  honeypotResponse.attachHoneypot(res, clientRecord);
111
112
  return res.json(
112
113
  await tasks.frictionlessManager.sendImageCaptcha({
@@ -135,11 +136,11 @@ const runDecisionMachine = async (input, handle) => {
135
136
  req.logger.info(() => ({
136
137
  msg: "Frictionless decision",
137
138
  data: {
138
- requestId: req.requestId,
139
139
  decision: "bot_score_above_threshold",
140
140
  captchaType: types.CaptchaType.image
141
141
  }
142
142
  }));
143
+ metrics.recordFrictionlessDecision("bot_score_above_threshold");
143
144
  honeypotResponse.attachHoneypot(res, clientRecord);
144
145
  return res.json(
145
146
  await tasks.frictionlessManager.sendImageCaptcha({
@@ -158,11 +159,11 @@ const runDecisionMachine = async (input, handle) => {
158
159
  req.logger.info(() => ({
159
160
  msg: "Frictionless decision",
160
161
  data: {
161
- requestId: req.requestId,
162
162
  decision: "default_pow",
163
163
  captchaType: types.CaptchaType.pow
164
164
  }
165
165
  }));
166
+ metrics.recordFrictionlessDecision("default_pow");
166
167
  honeypotResponse.attachHoneypot(res, clientRecord);
167
168
  return res.json(
168
169
  await tasks.frictionlessManager.sendPowCaptcha({
@@ -194,11 +195,11 @@ const runUserAgentMismatchCheck = async (input, handle) => {
194
195
  req.logger.info(() => ({
195
196
  msg: "Frictionless decision",
196
197
  data: {
197
- requestId: req.requestId,
198
198
  decision: "user_agent_mismatch",
199
199
  captchaType: types.CaptchaType.image
200
200
  }
201
201
  }));
202
+ metrics.recordFrictionlessDecision("user_agent_mismatch");
202
203
  honeypotResponse.attachHoneypot(res, input.clientRecord);
203
204
  return res.json(
204
205
  await input.tasks.frictionlessManager.sendImageCaptcha({
@@ -254,13 +255,13 @@ const runContextAwareValidation = async (input, handle) => {
254
255
  req.logger.info(() => ({
255
256
  msg: "Frictionless decision",
256
257
  data: {
257
- requestId: req.requestId,
258
258
  decision: "context_aware_failed",
259
259
  captchaType: types.CaptchaType.image,
260
260
  sim,
261
261
  threshold
262
262
  }
263
263
  }));
264
+ metrics.recordFrictionlessDecision("context_aware_failed");
264
265
  honeypotResponse.attachHoneypot(res, clientRecord);
265
266
  return res.json(
266
267
  await tasks.frictionlessManager.sendImageCaptcha({
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  const common = require("@prosopo/common");
3
3
  const types = require("@prosopo/types");
4
+ const userAccessPolicy = require("@prosopo/user-access-policy");
4
5
  const util = require("@prosopo/util");
5
6
  const compositeIpAddress = require("../../../compositeIpAddress.cjs");
6
7
  require("../../../tasks/index.cjs");
@@ -10,6 +11,7 @@ const normalizeRequestIp = require("../../../utils/normalizeRequestIp.cjs");
10
11
  const apiToggleMaintenanceModeEndpoint = require("../../admin/apiToggleMaintenanceModeEndpoint.cjs");
11
12
  const blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
12
13
  const dnsEventUrl = require("../../dnsEventUrl.cjs");
14
+ const metrics = require("../../metrics.cjs");
13
15
  const testSiteKey = require("../../testSiteKey.cjs");
14
16
  const maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
15
17
  const accessPolicy = require("./accessPolicy.cjs");
@@ -26,7 +28,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
26
28
  req.logger.info(() => ({
27
29
  msg: "Frictionless response finished",
28
30
  data: {
29
- requestId: req.requestId,
30
31
  status: res.statusCode,
31
32
  path: req.path,
32
33
  method: req.method
@@ -39,7 +40,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
39
40
  req.logger.info(() => ({
40
41
  msg: "Frictionless handler entry",
41
42
  data: {
42
- requestId: req.requestId,
43
43
  token,
44
44
  user,
45
45
  dapp,
@@ -104,30 +104,68 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
104
104
  );
105
105
  }
106
106
  if (dedup) {
107
- req.logger.info(() => ({
108
- msg: "Reusing existing session for user-IP-sitekey combination",
109
- data: {
110
- userSitekeyIpHash,
111
- sessionId: dedup.sessionId,
112
- captchaType: dedup.captchaType
113
- }
114
- }));
115
- req.logger.info(() => ({
116
- msg: "Frictionless decision",
117
- data: {
118
- requestId: req.requestId,
119
- decision: "reuse_session",
120
- captchaType: dedup.captchaType,
121
- sessionId: dedup.sessionId
122
- }
123
- }));
124
- honeypotResponse.attachHoneypot(res, clientRecord);
125
- return res.json({
126
- [types.ApiParams.captchaType]: dedup.captchaType,
127
- [types.ApiParams.sessionId]: dedup.sessionId,
128
- [types.ApiParams.status]: "ok",
129
- dns_url: dnsEventUrl.buildDnsEventUrl(dedup.sessionId)
130
- });
107
+ const dedupCountryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
108
+ const dedupAsn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
109
+ const dedupUserScope = blacklistRequestInspector.getRequestUserScope(
110
+ util.flatten(req.headers),
111
+ req.ja4,
112
+ normalizedIp,
113
+ user,
114
+ void 0,
115
+ void 0,
116
+ dedupCountryCode,
117
+ dedupAsn
118
+ );
119
+ const dedupAccessPolicy = (await tasks$1.frictionlessManager.getPrioritisedAccessPolicies(
120
+ userAccessRulesStorage,
121
+ dapp,
122
+ dedupUserScope
123
+ ))[0];
124
+ const dedupConflictsWithPolicy = dedupAccessPolicy !== void 0 && (dedupAccessPolicy.type === userAccessPolicy.AccessPolicyType.Block || dedupAccessPolicy.captchaType !== void 0 && dedupAccessPolicy.captchaType !== dedup.captchaType);
125
+ if (dedupConflictsWithPolicy) {
126
+ req.logger.info(() => ({
127
+ msg: "Evicting reused session: cached captchaType conflicts with access policy",
128
+ data: {
129
+ userSitekeyIpHash,
130
+ sessionId: dedup.sessionId,
131
+ cachedCaptchaType: dedup.captchaType,
132
+ policyType: dedupAccessPolicy.type,
133
+ policyCaptchaType: dedupAccessPolicy.captchaType
134
+ }
135
+ }));
136
+ await tasks$1.db.checkAndRemoveSession(dedup.sessionId);
137
+ await Promise.all([
138
+ tasks$1.writeQueue?.invalidateCachedSession(dedup.sessionId) ?? Promise.resolve(),
139
+ tasks$1.writeQueue?.invalidateCachedSessionByHash(
140
+ userSitekeyIpHash
141
+ ) ?? Promise.resolve()
142
+ ]);
143
+ } else {
144
+ req.logger.info(() => ({
145
+ msg: "Reusing existing session for user-IP-sitekey combination",
146
+ data: {
147
+ userSitekeyIpHash,
148
+ sessionId: dedup.sessionId,
149
+ captchaType: dedup.captchaType
150
+ }
151
+ }));
152
+ req.logger.info(() => ({
153
+ msg: "Frictionless decision",
154
+ data: {
155
+ decision: "reuse_session",
156
+ captchaType: dedup.captchaType,
157
+ sessionId: dedup.sessionId
158
+ }
159
+ }));
160
+ metrics.recordFrictionlessDecision("reuse_session");
161
+ honeypotResponse.attachHoneypot(res, clientRecord);
162
+ return res.json({
163
+ [types.ApiParams.captchaType]: dedup.captchaType,
164
+ [types.ApiParams.sessionId]: dedup.sessionId,
165
+ [types.ApiParams.status]: "ok",
166
+ dns_url: dnsEventUrl.buildDnsEventUrl(dedup.sessionId)
167
+ });
168
+ }
131
169
  }
132
170
  const ipAddress = compositeIpAddress.getCompositeIpAddress(normalizedIp);
133
171
  const flatHeaders = util.flatten(req.headers);
@@ -145,7 +183,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
145
183
  flatHeaders,
146
184
  sessionMode,
147
185
  userSitekeyIpHash,
148
- requestId: req.requestId,
149
186
  logger: req.logger
150
187
  },
151
188
  res
@@ -214,6 +251,10 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
214
251
  })
215
252
  );
216
253
  }
254
+ metrics.recordBotScore(botScore);
255
+ if (triggeredDetectors && triggeredDetectors.length > 0) {
256
+ metrics.recordDetectorTriggered(triggeredDetectors);
257
+ }
217
258
  const botThreshold = clientRecord.settings?.frictionlessThreshold || constants.DEFAULT_FRICTIONLESS_THRESHOLD;
218
259
  let scoreComponents = {
219
260
  baseScore: baseBotScore,
@@ -265,12 +306,12 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
265
306
  ...req.ja4 && { ja4: req.ja4 }
266
307
  }
267
308
  });
268
- const userAccessPolicy = accessPolicies[0];
309
+ const userAccessPolicy$1 = accessPolicies[0];
269
310
  const accessPolicyOutcome = await accessPolicy.handleAccessPolicy(
270
311
  {
271
312
  tasks: tasks$1,
272
313
  clientRecord,
273
- userAccessPolicy,
314
+ userAccessPolicy: userAccessPolicy$1,
274
315
  baseBotScore,
275
316
  botScore,
276
317
  scoreComponents,
@@ -278,7 +319,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
278
319
  dapp,
279
320
  ipInfo: req.ipInfo,
280
321
  flatHeaders,
281
- requestId: req.requestId,
282
322
  logger: req.logger,
283
323
  userScope
284
324
  },
@@ -26,7 +26,6 @@ const runConfiguredCaptchaTypeShortCircuit = async (input, res) => {
26
26
  input.logger.info(() => ({
27
27
  msg: "Frictionless decision",
28
28
  data: {
29
- requestId: input.requestId,
30
29
  decision: "configured_captcha_type",
31
30
  captchaType: configuredType
32
31
  }
@@ -7,6 +7,7 @@ require("../../tasks/index.cjs");
7
7
  const normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
8
8
  const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
9
9
  const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
10
+ const metrics = require("../metrics.cjs");
10
11
  const validateAddress = require("../validateAddress.cjs");
11
12
  const maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
12
13
  const tasks = require("../../tasks/tasks.cjs");
@@ -183,8 +184,10 @@ const getImageCaptchaChallenge = (env, userAccessRulesStorage) => async (req, re
183
184
  sessionId
184
185
  }
185
186
  }));
187
+ metrics.recordCaptchaIssued(types.CaptchaType.image);
186
188
  return res.json(captchaResponse);
187
189
  } catch (err) {
190
+ metrics.recordCaptchaIssueError(types.CaptchaType.image);
188
191
  req.logger.error(() => ({
189
192
  err,
190
193
  data: req.params,