@prosopo/provider 4.12.0 → 4.13.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 (218) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +41 -38
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +42 -39
  4. package/CHANGELOG.md +84 -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.d.ts +2 -1
  77. package/dist/api/captcha.d.ts.map +1 -1
  78. package/dist/api/captcha.js +12 -15
  79. package/dist/api/captcha.js.map +1 -1
  80. package/dist/api/domainMiddleware.d.ts.map +1 -1
  81. package/dist/api/domainMiddleware.js +4 -0
  82. package/dist/api/domainMiddleware.js.map +1 -1
  83. package/dist/api/forwardVerify.d.ts +14 -0
  84. package/dist/api/forwardVerify.d.ts.map +1 -0
  85. package/dist/api/forwardVerify.js +54 -0
  86. package/dist/api/forwardVerify.js.map +1 -0
  87. package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
  88. package/dist/api/headerCheckMiddleware.js +7 -4
  89. package/dist/api/headerCheckMiddleware.js.map +1 -1
  90. package/dist/api/ja4.d.ts +5 -0
  91. package/dist/api/ja4.d.ts.map +1 -0
  92. package/dist/api/ja4.js +203 -0
  93. package/dist/api/ja4.js.map +1 -0
  94. package/dist/api/ja4Middleware.d.ts.map +1 -1
  95. package/dist/api/ja4Middleware.js +9 -18
  96. package/dist/api/ja4Middleware.js.map +1 -1
  97. package/dist/api/metrics.d.ts +40 -0
  98. package/dist/api/metrics.d.ts.map +1 -0
  99. package/dist/api/metrics.js +260 -0
  100. package/dist/api/metrics.js.map +1 -0
  101. package/dist/api/public.d.ts.map +1 -1
  102. package/dist/api/public.js +4 -0
  103. package/dist/api/public.js.map +1 -1
  104. package/dist/api/startProviderApi.d.ts.map +1 -1
  105. package/dist/api/startProviderApi.js +3 -1
  106. package/dist/api/startProviderApi.js.map +1 -1
  107. package/dist/api/verify.d.ts.map +1 -1
  108. package/dist/api/verify.js +85 -8
  109. package/dist/api/verify.js.map +1 -1
  110. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +1 -1
  111. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +1 -2
  112. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +1 -1
  113. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +1 -1
  114. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +1 -2
  115. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +1 -2
  116. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +1 -1
  117. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +1 -1
  118. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +1 -3
  119. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +1 -2
  120. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +1 -2
  121. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +3 -2
  122. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +1 -1
  123. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +1 -2
  124. package/dist/cjs/api/blacklistRequestInspector.cjs +7 -3
  125. package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -3
  126. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +1 -7
  127. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +8 -7
  128. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +70 -30
  129. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +0 -1
  130. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -0
  131. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -0
  132. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -0
  133. package/dist/cjs/api/captcha.cjs +12 -15
  134. package/dist/cjs/api/domainMiddleware.cjs +4 -0
  135. package/dist/cjs/api/forwardVerify.cjs +54 -0
  136. package/dist/cjs/api/headerCheckMiddleware.cjs +7 -4
  137. package/dist/cjs/api/ja4.cjs +203 -0
  138. package/dist/cjs/api/ja4Middleware.cjs +11 -21
  139. package/dist/cjs/api/metrics.cjs +260 -0
  140. package/dist/cjs/api/public.cjs +4 -0
  141. package/dist/cjs/api/startProviderApi.cjs +3 -1
  142. package/dist/cjs/api/verify.cjs +83 -6
  143. package/dist/cjs/index.cjs +1 -0
  144. package/dist/cjs/tasks/captchaManager.cjs +1 -2
  145. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +20 -22
  146. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +17 -23
  147. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +15 -21
  148. package/dist/index.js +2 -1
  149. package/dist/tasks/captchaManager.js +1 -1
  150. package/dist/tasks/captchaManager.js.map +1 -1
  151. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  152. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -22
  153. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  154. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  155. package/dist/tasks/powCaptcha/powTasks.js +17 -23
  156. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  157. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  158. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +15 -21
  159. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  160. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +1 -0
  161. package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -1
  162. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +5 -1
  163. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
  164. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
  165. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  166. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +1 -0
  167. package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -1
  168. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +1 -0
  169. package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -1
  170. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +1 -0
  171. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  172. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +1 -0
  173. package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -1
  174. package/dist/tests/unit/api/adminRoutes.unit.test.js +1 -0
  175. package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -1
  176. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +43 -0
  177. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  178. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts +2 -0
  179. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts.map +1 -0
  180. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +62 -0
  181. package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -0
  182. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +0 -1
  183. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -1
  184. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +0 -1
  185. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
  186. package/dist/tests/unit/api/captcha.unit.test.js +31 -1
  187. package/dist/tests/unit/api/captcha.unit.test.js.map +1 -1
  188. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts +2 -0
  189. package/dist/tests/unit/api/forwardVerify.unit.test.d.ts.map +1 -0
  190. package/dist/tests/unit/api/forwardVerify.unit.test.js +151 -0
  191. package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -0
  192. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +68 -0
  193. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  194. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +2 -2
  195. package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
  196. package/dist/tests/unit/api/ja4.unit.test.d.ts +2 -0
  197. package/dist/tests/unit/api/ja4.unit.test.d.ts.map +1 -0
  198. package/dist/tests/unit/api/ja4.unit.test.js +233 -0
  199. package/dist/tests/unit/api/ja4.unit.test.js.map +1 -0
  200. package/dist/tests/unit/api/ja4Middleware.unit.test.js +11 -8
  201. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
  202. package/dist/tests/unit/api/public.unit.test.js +72 -0
  203. package/dist/tests/unit/api/public.unit.test.js.map +1 -1
  204. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +1 -1
  205. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  206. package/dist/tests/unit/schedulers/getClientList.unit.test.js +1 -1
  207. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
  208. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +1 -1
  209. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
  210. package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -1
  211. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  212. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +1 -1
  213. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  214. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
  215. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  216. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +4 -1
  217. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  218. package/package.json +23 -23
@@ -10,6 +10,9 @@ import submitImageCaptchaSolution from "./captcha/submitImageCaptchaSolution.js"
10
10
  import submitPoWCaptchaSolution from "./captcha/submitPoWCaptchaSolution.js";
11
11
  import submitPuzzleCaptchaSolution from "./captcha/submitPuzzleCaptchaSolution.js";
12
12
  import getFrictionlessCaptchaChallenge from "./captcha/getFrictionlessCaptchaChallenge/handler.js";
13
+ const asyncHandler = (handler) => (req, res, next) => {
14
+ Promise.resolve().then(() => handler(req, res, next)).catch(next);
15
+ };
13
16
  function prosopoRouter(env) {
14
17
  const router = express.Router();
15
18
  let userAccessRulesStorage;
@@ -24,43 +27,37 @@ function prosopoRouter(env) {
24
27
  }
25
28
  router.post(
26
29
  ClientApiPaths.GetImageCaptchaChallenge,
27
- (req, res, next) => getImageCaptchaChallenge(env, userAccessRulesStorage)(req, res, next)
30
+ asyncHandler(getImageCaptchaChallenge(env, userAccessRulesStorage))
28
31
  );
29
32
  router.post(
30
33
  ClientApiPaths.SubmitImageCaptchaSolution,
31
- (req, res, next) => submitImageCaptchaSolution(env)(req, res, next)
34
+ asyncHandler(submitImageCaptchaSolution(env))
32
35
  );
33
36
  router.post(
34
37
  ClientApiPaths.GetPowCaptchaChallenge,
35
- (req, res, next) => getPoWCaptchaChallenge(env, userAccessRulesStorage)(req, res, next)
38
+ asyncHandler(getPoWCaptchaChallenge(env, userAccessRulesStorage))
36
39
  );
37
40
  router.post(
38
41
  ClientApiPaths.SubmitPowCaptchaSolution,
39
- (req, res, next) => submitPoWCaptchaSolution(env)(req, res, next)
42
+ asyncHandler(submitPoWCaptchaSolution(env))
40
43
  );
41
44
  router.post(
42
45
  ClientApiPaths.GetFrictionlessCaptchaChallenge,
43
- (req, res, next) => getFrictionlessCaptchaChallenge(env, userAccessRulesStorage)(
44
- req,
45
- res,
46
- next
47
- )
46
+ asyncHandler(getFrictionlessCaptchaChallenge(env, userAccessRulesStorage))
48
47
  );
49
48
  router.post(
50
49
  ClientApiPaths.GetPuzzleCaptchaChallenge,
51
- (req, res, next) => getPuzzleCaptchaChallenge(env, userAccessRulesStorage)(req, res, next)
50
+ asyncHandler(getPuzzleCaptchaChallenge(env, userAccessRulesStorage))
52
51
  );
53
52
  router.post(
54
53
  ClientApiPaths.SubmitPuzzleCaptchaSolution,
55
- (req, res, next) => submitPuzzleCaptchaSolution(env)(req, res, next)
56
- );
57
- router.post(
58
- ClientApiPaths.CheckSpamEmail,
59
- (req, res, next) => checkSpamEmail(env)(req, res, next)
54
+ asyncHandler(submitPuzzleCaptchaSolution(env))
60
55
  );
56
+ router.post(ClientApiPaths.CheckSpamEmail, asyncHandler(checkSpamEmail(env)));
61
57
  router.use(handleErrors);
62
58
  return router;
63
59
  }
64
60
  export {
61
+ asyncHandler,
65
62
  prosopoRouter
66
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/api/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,OAAwB,MAAM,SAAS,CAAC;AAC/C,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,+BAA+B,MAAM,8CAA8C,CAAC;AAC3F,OAAO,wBAAwB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,sBAAsB,MAAM,qCAAqC,CAAC;AACzE,OAAO,yBAAyB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,0BAA0B,MAAM,yCAAyC,CAAC;AACjF,OAAO,wBAAwB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,2BAA2B,MAAM,0CAA0C,CAAC;AAQnF,MAAM,UAAU,aAAa,CAAC,GAAwB;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKhC,IAAI,sBAEH,CAAC;IACF,IAAI,CAAC;QACJ,sBAAsB,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,yBAAyB,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,GAAG,EAAE,yFAAyF;YAC9F,GAAG;SACH,CAAC,CAAC,CAAC;QACJ,sBAAsB,GAAG,SAAkB,CAAC;IAC7C,CAAC;IAKD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACvE,wBAAwB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACrE,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,0BAA0B,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACzE,0BAA0B,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAC/C,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACrE,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACnE,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACvE,wBAAwB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAC7C,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,+BAA+B,EAC9C,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAClB,+BAA+B,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAC3D,GAAG,EACH,GAAG,EACH,IAAI,CACJ,CACF,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,yBAAyB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CACxE,yBAAyB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACtE,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,2BAA2B,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAC1E,2BAA2B,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAChD,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAC7D,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACnC,CAAC;IAKF,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/api/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,OAKN,MAAM,SAAS,CAAC;AACjB,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,+BAA+B,MAAM,8CAA8C,CAAC;AAC3F,OAAO,wBAAwB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,sBAAsB,MAAM,qCAAqC,CAAC;AACzE,OAAO,yBAAyB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,0BAA0B,MAAM,yCAAyC,CAAC;AACjF,OAAO,wBAAwB,MAAM,uCAAuC,CAAC;AAC7E,OAAO,2BAA2B,MAAM,0CAA0C,CAAC;AAanF,MAAM,CAAC,MAAM,YAAY,GACxB,CAAC,OAAqE,EAAE,EAAE,CAC1E,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;IACzD,OAAO,CAAC,OAAO,EAAE;SACf,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;SACnC,KAAK,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAQH,MAAM,UAAU,aAAa,CAAC,GAAwB;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKhC,IAAI,sBAEH,CAAC;IACF,IAAI,CAAC;QACJ,sBAAsB,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,yBAAyB,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,GAAG,EAAE,yFAAyF;YAC9F,GAAG;SACH,CAAC,CAAC,CAAC;QACJ,sBAAsB,GAAG,SAAkB,CAAC;IAC7C,CAAC;IAKD,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,wBAAwB,EACvC,YAAY,CAAC,wBAAwB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CACnE,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,0BAA0B,EACzC,YAAY,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAC7C,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,sBAAsB,EACrC,YAAY,CAAC,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CACjE,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,wBAAwB,EACvC,YAAY,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAC3C,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,+BAA+B,EAC9C,YAAY,CAAC,+BAA+B,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAC1E,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,yBAAyB,EACxC,YAAY,CAAC,yBAAyB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CACpE,CAAC;IAKF,MAAM,CAAC,IAAI,CACV,cAAc,CAAC,2BAA2B,EAC1C,YAAY,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAC9C,CAAC;IAKF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAK9E,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"domainMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/domainMiddleware.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO/D,eAAO,MAAM,gBAAgB,QAAS,mBAAmB,WAOrC,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAgF7D,CAAC"}
1
+ {"version":3,"file":"domainMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/domainMiddleware.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQ/D,eAAO,MAAM,gBAAgB,QAAS,mBAAmB,WAOrC,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAmF7D,CAAC"}
@@ -5,6 +5,7 @@ import { validateAddress } from "@prosopo/util-crypto";
5
5
  import { ZodError } from "zod";
6
6
  import "../tasks/index.js";
7
7
  import { getMaintenanceMode } from "./admin/apiToggleMaintenanceModeEndpoint.js";
8
+ import { recordDomainValidation } from "./metrics.js";
8
9
  import { isReservedTestSiteKey } from "./testSiteKey.js";
9
10
  import { Tasks } from "../tasks/tasks.js";
10
11
  const domainMiddleware = (env) => {
@@ -35,6 +36,7 @@ const domainMiddleware = (env) => {
35
36
  throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
36
37
  }
37
38
  if (isReservedTestSiteKey(siteKey)) {
39
+ recordDomainValidation("test_key");
38
40
  next();
39
41
  return;
40
42
  }
@@ -56,6 +58,7 @@ const domainMiddleware = (env) => {
56
58
  for (const candidate of candidateOrigins) {
57
59
  for (const domain of allowedDomains) {
58
60
  if (tasks.clientTaskManager.domainPatternMatcher(candidate, domain)) {
61
+ recordDomainValidation("allowed");
59
62
  next();
60
63
  return;
61
64
  }
@@ -63,6 +66,7 @@ const domainMiddleware = (env) => {
63
66
  }
64
67
  throw unauthorizedOriginError(req.i18n, origin, req.logger);
65
68
  } catch (err) {
69
+ recordDomainValidation("rejected");
66
70
  if (err instanceof ProsopoApiError || err instanceof ZodError || err instanceof SyntaxError) {
67
71
  handleErrors(err, req, res, next);
68
72
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"domainMiddleware.js","sourceRoot":"","sources":["../../src/api/domainMiddleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domainMiddleware.js","sourceRoot":"","sources":["../../src/api/domainMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Logger } from "@prosopo/logger";
2
+ import type { ClientApiPaths, VerificationResponse } from "@prosopo/types";
3
+ import type { ProviderEnvironment } from "@prosopo/types-env";
4
+ export declare function forwardVerifyIfNotIssuer(args: {
5
+ env: ProviderEnvironment;
6
+ logger: Logger;
7
+ path: ClientApiPaths;
8
+ providerUrl: string | undefined;
9
+ dapp: string;
10
+ user: string;
11
+ body: object;
12
+ alreadyForwarded?: boolean;
13
+ }): Promise<VerificationResponse | null>;
14
+ //# sourceMappingURL=forwardVerify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwardVerify.d.ts","sourceRoot":"","sources":["../../src/api/forwardVerify.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAmC9D,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,mBAAmB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAiEvC"}
@@ -0,0 +1,54 @@
1
+ import { ProviderApi } from "@prosopo/api";
2
+ import { getProviders } from "@prosopo/load-balancer";
3
+ function normalizeProviderUrl(url) {
4
+ try {
5
+ const parsed = new URL(url);
6
+ parsed.hostname = parsed.hostname.replace(/^(ipv4|ipv6)\./, "");
7
+ return parsed.toString().replace(/\/$/, "");
8
+ } catch {
9
+ return url.replace(/\/$/, "");
10
+ }
11
+ }
12
+ async function forwardVerifyIfNotIssuer(args) {
13
+ const { env, logger, path, providerUrl, dapp, user, body, alreadyForwarded } = args;
14
+ if (alreadyForwarded) {
15
+ return null;
16
+ }
17
+ if (!providerUrl) {
18
+ return null;
19
+ }
20
+ let providers;
21
+ try {
22
+ providers = await getProviders(env.defaultEnvironment);
23
+ } catch (error) {
24
+ logger.warn(() => ({
25
+ msg: "Failed to load provider list; verifying locally",
26
+ err: error instanceof Error ? error : new Error(String(error)),
27
+ data: { providerUrl }
28
+ }));
29
+ return null;
30
+ }
31
+ const normalizedProviderUrl = normalizeProviderUrl(providerUrl);
32
+ const issuer = providers.find(
33
+ (provider) => normalizeProviderUrl(provider.url) === normalizedProviderUrl
34
+ );
35
+ if (!issuer) {
36
+ logger.warn(() => ({
37
+ msg: "Token providerUrl is not a known provider; verifying locally",
38
+ data: { providerUrl }
39
+ }));
40
+ return null;
41
+ }
42
+ if (env.pair?.address && issuer.address === env.pair.address) {
43
+ return null;
44
+ }
45
+ logger.info(() => ({
46
+ msg: "Forwarding verify request to issuing provider",
47
+ data: { providerUrl, path, dapp }
48
+ }));
49
+ const providerApi = new ProviderApi(issuer.url, dapp);
50
+ return providerApi.forwardVerify(path, body, user);
51
+ }
52
+ export {
53
+ forwardVerifyIfNotIssuer
54
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwardVerify.js","sourceRoot":"","sources":["../../src/api/forwardVerify.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA4BtD,SAAS,oBAAoB,CAAC,GAAW;IACxC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAS9C;IACA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAC3E,IAAI,CAAC;IAMN,IAAI,gBAAgB,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAID,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACb,CAAC;IAKD,IAAI,SAAmD,CAAC;IACxD,IAAI,CAAC;QACJ,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClB,GAAG,EAAE,iDAAiD;YACtD,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,EAAE,EAAE,WAAW,EAAE;SACrB,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;IAOD,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,qBAAqB,CAC1E,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClB,GAAG,EAAE,8DAA8D;YACnE,IAAI,EAAE,EAAE,WAAW,EAAE;SACrB,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;IAID,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAClB,GAAG,EAAE,+CAA+C;QACpD,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;KACjC,CAAC,CAAC,CAAC;IAIJ,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,WAAW,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"headerCheckMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/headerCheckMiddleware.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG/D,eAAO,MAAM,qBAAqB,QAAS,mBAAmB,WAC1C,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAgC7D,CAAC"}
1
+ {"version":3,"file":"headerCheckMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/headerCheckMiddleware.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG/D,eAAO,MAAM,qBAAqB,QAAS,mBAAmB,WAC1C,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAmC7D,CAAC"}
@@ -17,10 +17,13 @@ const headerCheckMiddleware = (env) => {
17
17
  validateAddr(user, void 0, req.logger);
18
18
  req.user = user;
19
19
  req.siteKey = siteKey;
20
- req.logger = req.logger.with({
21
- user,
22
- siteKey
23
- });
20
+ req.logger = req.logger.with(
21
+ {
22
+ user,
23
+ siteKey
24
+ },
25
+ "header-check"
26
+ );
24
27
  next();
25
28
  } catch (err) {
26
29
  return handleErrors(err, req, res, next);
@@ -1 +1 @@
1
- {"version":3,"file":"headerCheckMiddleware.js","sourceRoot":"","sources":["../../src/api/headerCheckMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAwB,EAAE,EAAE;IACjE,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,CAAC;YACnD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAW,CAAC;YAE1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO;YACR,CAAC;YAED,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAErC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAE1C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAChB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YAGtB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5B,IAAI;gBACJ,OAAO;aACP,CAAC,CAAC;YAEH,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,YAAY,CAAC,GAAY,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAa,EAAE,EAAE,CACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"headerCheckMiddleware.js","sourceRoot":"","sources":["../../src/api/headerCheckMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAwB,EAAE,EAAE;IACjE,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,CAAC;YACnD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAW,CAAC;YAE1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO;YACR,CAAC;YAED,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAErC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAE1C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAChB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YAGtB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAC3B;gBACC,IAAI;gBACJ,OAAO;aACP,EACD,cAAc,CACd,CAAC;YAEF,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,YAAY,CAAC,GAAY,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAa,EAAE,EAAE,CACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class Ja4ParseError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function calculateJa4(data: Buffer): string;
5
+ //# sourceMappingURL=ja4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ja4.d.ts","sourceRoot":"","sources":["../../src/api/ja4.ts"],"names":[],"mappings":"AA8EA,qBAAa,aAAc,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI3B;AAoBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyMjD"}
@@ -0,0 +1,203 @@
1
+ import { createHash } from "node:crypto";
2
+ const RECORD_HEADER_LENGTH = 5;
3
+ const HANDSHAKE_HEADER_LENGTH = 4;
4
+ const HANDSHAKE_RECORD_TYPE = 22;
5
+ const HANDSHAKE_MESSAGE_TYPE = 1;
6
+ const EXT_SERVER_NAME = 0;
7
+ const EXT_SIGNATURE_ALGORITHMS = 13;
8
+ const EXT_ALPN = 16;
9
+ const EXT_SUPPORTED_VERSIONS = 43;
10
+ function isGrease(id) {
11
+ return (id & 3855) === 2570 && id >> 8 === (id & 255);
12
+ }
13
+ function hash12(input) {
14
+ return createHash("sha256").update(input).digest("hex").slice(0, 12);
15
+ }
16
+ function formatIdList(ids) {
17
+ return ids.map((id) => id.toString(16).padStart(4, "0")).join(",");
18
+ }
19
+ function alpnChar(b) {
20
+ if (b >= 48 && b <= 57 || // 0-9
21
+ b >= 65 && b <= 90 || // A-Z
22
+ b >= 97 && b <= 122) {
23
+ return String.fromCharCode(b);
24
+ }
25
+ return b.toString(16).padStart(2, "0");
26
+ }
27
+ function alpnFirstLast(protocol) {
28
+ const first = protocol.length > 0 ? alpnChar(protocol.readUInt8(0)) : "0";
29
+ const last = protocol.length > 1 ? alpnChar(protocol.readUInt8(protocol.length - 1)) : "0";
30
+ return [first, last];
31
+ }
32
+ function tlsVersionStr(version) {
33
+ switch (version) {
34
+ case 769:
35
+ return "10";
36
+ case 770:
37
+ return "11";
38
+ case 771:
39
+ return "12";
40
+ case 772:
41
+ return "13";
42
+ default:
43
+ return "00";
44
+ }
45
+ }
46
+ class Ja4ParseError extends Error {
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = "Ja4ParseError";
50
+ }
51
+ }
52
+ function calculateJa4(data) {
53
+ let offset = 0;
54
+ if (data.length < RECORD_HEADER_LENGTH + HANDSHAKE_HEADER_LENGTH) {
55
+ throw new Ja4ParseError("ClientHello too short");
56
+ }
57
+ const recordType = data.readUInt8(offset);
58
+ offset += 1;
59
+ if (recordType !== HANDSHAKE_RECORD_TYPE) {
60
+ throw new Ja4ParseError(
61
+ `Invalid record type: 0x${recordType.toString(16)}`
62
+ );
63
+ }
64
+ offset += 2;
65
+ const recordLen = data.readUInt16BE(offset);
66
+ offset += 2;
67
+ if (data.length < RECORD_HEADER_LENGTH + recordLen) {
68
+ throw new Ja4ParseError("Record length exceeds buffer");
69
+ }
70
+ data = data.subarray(0, RECORD_HEADER_LENGTH + recordLen);
71
+ if (data.length < RECORD_HEADER_LENGTH + HANDSHAKE_HEADER_LENGTH) {
72
+ throw new Ja4ParseError("Record too short for handshake header");
73
+ }
74
+ const msgType = data.readUInt8(offset);
75
+ offset += 1;
76
+ if (msgType !== HANDSHAKE_MESSAGE_TYPE) {
77
+ throw new Ja4ParseError(
78
+ `Not a ClientHello: handshake type 0x${msgType.toString(16)}`
79
+ );
80
+ }
81
+ const msgLen = data.readUIntBE(offset, 3);
82
+ offset += 3;
83
+ if (data.length - offset < msgLen) {
84
+ throw new Ja4ParseError("Handshake message length exceeds record");
85
+ }
86
+ data = data.subarray(0, offset + msgLen);
87
+ if (data.length - offset < 35) {
88
+ throw new Ja4ParseError("ClientHello body too short");
89
+ }
90
+ let clientVersion = data.readUInt16BE(offset);
91
+ offset += 2;
92
+ offset += 32;
93
+ const sessionIdLen = data.readUInt8(offset);
94
+ offset += 1;
95
+ if (data.length - offset < sessionIdLen) {
96
+ throw new Ja4ParseError("Truncated at session ID");
97
+ }
98
+ offset += sessionIdLen;
99
+ if (data.length - offset < 2) {
100
+ throw new Ja4ParseError("Truncated at cipher suites length");
101
+ }
102
+ const cipherSuitesLen = data.readUInt16BE(offset);
103
+ offset += 2;
104
+ if (data.length - offset < cipherSuitesLen) {
105
+ throw new Ja4ParseError("Truncated at cipher suites");
106
+ }
107
+ if (cipherSuitesLen % 2 !== 0) {
108
+ throw new Ja4ParseError("Cipher suites length is not a multiple of 2");
109
+ }
110
+ const cipherSuites = [];
111
+ for (let i = 0; i < cipherSuitesLen; i += 2) {
112
+ cipherSuites.push(data.readUInt16BE(offset + i));
113
+ }
114
+ offset += cipherSuitesLen;
115
+ if (data.length - offset < 1) {
116
+ throw new Ja4ParseError("Truncated at compression methods");
117
+ }
118
+ const compressionLen = data.readUInt8(offset);
119
+ offset += 1;
120
+ if (data.length - offset < compressionLen) {
121
+ throw new Ja4ParseError("Truncated at compression methods data");
122
+ }
123
+ offset += compressionLen;
124
+ if (data.length - offset < 2) {
125
+ throw new Ja4ParseError("Truncated at extensions length");
126
+ }
127
+ const extensionsLen = data.readUInt16BE(offset);
128
+ offset += 2;
129
+ if (data.length - offset < extensionsLen) {
130
+ throw new Ja4ParseError("Truncated at extensions");
131
+ }
132
+ const extIds = [];
133
+ const sigAlgorithms = [];
134
+ const alpnProtocols = [];
135
+ let extOffset = offset;
136
+ const extEnd = offset + extensionsLen;
137
+ while (extOffset + 4 <= extEnd) {
138
+ const extId = data.readUInt16BE(extOffset);
139
+ extOffset += 2;
140
+ const extLen = data.readUInt16BE(extOffset);
141
+ extOffset += 2;
142
+ if (extOffset + extLen > extEnd) break;
143
+ const extData = data.subarray(extOffset, extOffset + extLen);
144
+ extOffset += extLen;
145
+ extIds.push(extId);
146
+ if (extId === EXT_SUPPORTED_VERSIONS) {
147
+ if (extData.length >= 1) {
148
+ const listLen = extData.readUInt8(0);
149
+ let best = 0;
150
+ for (let i = 1; i + 1 < extData.length && i + 1 <= listLen; i += 2) {
151
+ const v = extData.readUInt16BE(i);
152
+ if (!isGrease(v) && v > best) best = v;
153
+ }
154
+ if (best > 0) clientVersion = best;
155
+ }
156
+ } else if (extId === EXT_SIGNATURE_ALGORITHMS) {
157
+ if (extData.length >= 2) {
158
+ const algLen = extData.readUInt16BE(0);
159
+ for (let i = 2; i + 1 < extData.length && i + 1 < algLen + 2; i += 2) {
160
+ const alg = extData.readUInt16BE(i);
161
+ if (!isGrease(alg)) sigAlgorithms.push(alg);
162
+ }
163
+ }
164
+ } else if (extId === EXT_ALPN) {
165
+ if (extData.length >= 2) {
166
+ const listLen = extData.readUInt16BE(0);
167
+ const listEnd = Math.min(extData.length, 2 + listLen);
168
+ let alpnOff = 2;
169
+ while (alpnOff < listEnd) {
170
+ const protoLen = extData.readUInt8(alpnOff);
171
+ alpnOff += 1;
172
+ if (alpnOff + protoLen > listEnd) break;
173
+ alpnProtocols.push(extData.subarray(alpnOff, alpnOff + protoLen));
174
+ alpnOff += protoLen;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ const versionStr = tlsVersionStr(clientVersion);
180
+ const sni = extIds.includes(EXT_SERVER_NAME) ? "d" : "i";
181
+ const firstAlpn = alpnProtocols[0];
182
+ const [alpnFirst, alpnLast] = firstAlpn ? alpnFirstLast(firstAlpn) : ["0", "0"];
183
+ const nonGreaseCiphers = cipherSuites.filter((c) => !isGrease(c));
184
+ const nonGreaseExts = extIds.filter((e) => !isGrease(e));
185
+ const cipherCount = Math.min(99, nonGreaseCiphers.length).toString().padStart(2, "0");
186
+ const extCount = Math.min(99, nonGreaseExts.length).toString().padStart(2, "0");
187
+ const firstChunk = `t${versionStr}${sni}${cipherCount}${extCount}${alpnFirst}${alpnLast}`;
188
+ const sortedCiphers = [...nonGreaseCiphers].sort((a, b) => a - b);
189
+ const cipherHash = hash12(formatIdList(sortedCiphers));
190
+ const filteredExts = nonGreaseExts.filter(
191
+ (e) => e !== EXT_SERVER_NAME && e !== EXT_ALPN
192
+ );
193
+ const sortedExts = [...filteredExts].sort((a, b) => a - b);
194
+ const extStr = formatIdList(sortedExts);
195
+ const sigAlgStr = formatIdList(sigAlgorithms);
196
+ const extHashInput = sigAlgStr.length > 0 ? `${extStr}_${sigAlgStr}` : extStr;
197
+ const extHash = hash12(extHashInput);
198
+ return `${firstChunk}_${cipherHash}_${extHash}`;
199
+ }
200
+ export {
201
+ Ja4ParseError,
202
+ calculateJa4
203
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ja4.js","sourceRoot":"","sources":["../../src/api/ja4.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ja4Middleware.d.ts","sourceRoot":"","sources":["../../src/api/ja4Middleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM/D,eAAO,MAAM,WAAW,QAAQ,CAAC;AAEjC,eAAO,MAAM,MAAM,YAAmB,mBAAmB,WAAW,MAAM;;EA6EzE,CAAC;AAEF,eAAO,MAAM,aAAa,QAAS,mBAAmB,WAClC,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAc7D,CAAC"}
1
+ {"version":3,"file":"ja4Middleware.d.ts","sourceRoot":"","sources":["../../src/api/ja4Middleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG/D,eAAO,MAAM,WAAW,QAAQ,CAAC;AAEjC,eAAO,MAAM,MAAM,YAAmB,mBAAmB,WAAW,MAAM;;EAyCzE,CAAC;AAEF,eAAO,MAAM,aAAa,QAAS,mBAAmB,WAClC,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAiB7D,CAAC"}
@@ -1,11 +1,10 @@
1
- import { Readable } from "node:stream";
2
1
  import { handleErrors } from "@prosopo/api-express-router";
3
2
  import { getLogger } from "@prosopo/logger";
4
3
  import { randomAsHex } from "@prosopo/util-crypto";
5
- import { readTlsClientHello, calculateJa4FromHelloData } from "read-tls-client-hello";
4
+ import { calculateJa4 } from "./ja4.js";
6
5
  const DEFAULT_JA4 = "ja4";
7
6
  const getJA4 = async (headers, logger) => {
8
- logger = logger || getLogger("info", import.meta.url);
7
+ logger = logger || getLogger("info", "provider:ja4");
9
8
  if (process.env.NODE_ENV === "development") {
10
9
  return {
11
10
  ja4PlusFingerprint: `${DEFAULT_JA4}${randomAsHex().slice(28, 32)}`
@@ -13,7 +12,6 @@ const getJA4 = async (headers, logger) => {
13
12
  }
14
13
  try {
15
14
  const xTlsClientHello = (headers["x-tls-clienthello"] || "").toString();
16
- const xTlsVersion = (headers["x-tls-version"] || "").toString().toLowerCase();
17
15
  const clientHelloBuffer = Buffer.from(xTlsClientHello, "base64");
18
16
  logger.debug(() => ({
19
17
  msg: "ClientHello First Bytes:",
@@ -25,17 +23,7 @@ const getJA4 = async (headers, logger) => {
25
23
  }));
26
24
  return { ja4PlusFingerprint: DEFAULT_JA4 };
27
25
  }
28
- logger.debug(() => ({
29
- msg: "Headers TLS Version:",
30
- data: { xTlsVersion }
31
- }));
32
- const readableStream = new Readable({
33
- read() {
34
- this.push(clientHelloBuffer);
35
- }
36
- });
37
- const clientHello = await readTlsClientHello(readableStream);
38
- const ja4PlusFingerprint = calculateJa4FromHelloData(clientHello);
26
+ const ja4PlusFingerprint = calculateJa4(clientHelloBuffer);
39
27
  return { ja4PlusFingerprint };
40
28
  } catch (e) {
41
29
  logger.error(() => ({
@@ -51,9 +39,12 @@ const ja4Middleware = (env) => {
51
39
  req.logger.debug(() => ({ data: { url: req.url } }));
52
40
  const ja4 = await getJA4(req.headers, req.logger);
53
41
  req.ja4 = ja4.ja4PlusFingerprint || "";
54
- req.logger = req.logger.with({
55
- ja4: req.ja4
56
- });
42
+ req.logger = req.logger.with(
43
+ {
44
+ ja4: req.ja4
45
+ },
46
+ "ja4"
47
+ );
57
48
  next();
58
49
  } catch (err) {
59
50
  return handleErrors(err, req, res, next);
@@ -1 +1 @@
1
- {"version":3,"file":"ja4Middleware.js","sourceRoot":"","sources":["../../src/api/ja4Middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ja4Middleware.js","sourceRoot":"","sources":["../../src/api/ja4Middleware.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAEjC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,OAA4B,EAAE,MAAe,EAAE,EAAE;IAC7E,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAGrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC5C,OAAO;YACN,kBAAkB,EAAE,GAAG,WAAW,GAAG,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;SAClE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QAEJ,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAGxE,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAGjE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACnB,GAAG,EAAE,0BAA0B;YAC/B,IAAI,EAAE,EAAE,GAAG,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;SAC/D,CAAC,CAAC,CAAC;QAGJ,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnB,GAAG,EAAE,qDAAqD;aAC1D,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,kBAAkB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAE3D,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACnB,GAAG,EAAE,oCAAoC;YACzC,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAClD,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAwB,EAAE,EAAE;IACzD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAElD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAC3B;gBACC,GAAG,EAAE,GAAG,CAAC,GAAG;aACZ,EACD,KAAK,CACL,CAAC;YACF,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,YAAY,CAAC,GAAY,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ProviderEnvironment } from "@prosopo/env";
2
+ import { type CaptchaType } from "@prosopo/types";
3
+ import type { RequestHandler } from "express";
4
+ import { Counter, Gauge, Histogram, Registry } from "prom-client";
5
+ export declare const metricsEnabled: () => boolean;
6
+ interface ProviderMetrics {
7
+ registry: Registry;
8
+ httpRequestsTotal: Counter<"route" | "method" | "status">;
9
+ httpRequestDuration: Histogram<"route" | "method" | "status">;
10
+ captchaIssuedTotal: Counter<"type">;
11
+ captchaIssueErrorsTotal: Counter<"type">;
12
+ captchaVerifyTotal: Counter<"type" | "result" | "source">;
13
+ frictionlessRoutedTotal: Counter<"decision">;
14
+ botScore: Histogram<never>;
15
+ detectorTriggeredTotal: Counter<"detector">;
16
+ blockedRequestsTotal: Counter<"reason">;
17
+ domainValidationTotal: Counter<"result">;
18
+ spamEmailTotal: Counter<"result">;
19
+ maintenanceMode: Gauge<never>;
20
+ redisReady: Gauge<"actor">;
21
+ }
22
+ export declare const getMetrics: () => ProviderMetrics;
23
+ export declare const recordCaptchaIssued: (type: CaptchaType) => void;
24
+ export declare const recordCaptchaIssueError: (type: CaptchaType) => void;
25
+ export declare const recordCaptchaVerify: (args: {
26
+ type: CaptchaType;
27
+ verified: boolean;
28
+ source: "real" | "test_key" | "maintenance" | "cached";
29
+ }) => void;
30
+ export declare const recordFrictionlessDecision: (decision: string) => void;
31
+ export declare const recordBotScore: (score: number) => void;
32
+ export declare const recordDetectorTriggered: (detectors: Array<string | number>) => void;
33
+ export declare const recordBlockedRequest: (reason: string) => void;
34
+ export declare const recordDomainValidation: (result: string) => void;
35
+ export declare const recordSpamEmail: (result: string) => void;
36
+ export declare const setMaintenanceModeGauge: (on: boolean) => void;
37
+ export declare const metricsMiddleware: () => RequestHandler;
38
+ export declare const metricsHandler: (env: ProviderEnvironment) => RequestHandler;
39
+ export {};
40
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/api/metrics.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAEN,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAC/E,OAAO,EACN,OAAO,EACP,KAAK,EACL,SAAS,EACT,QAAQ,EAER,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,cAAc,QAAO,OACc,CAAC;AAmCjD,UAAU,eAAe;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAC1D,mBAAmB,EAAE,SAAS,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAC9D,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,kBAAkB,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAC1D,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,sBAAsB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,qBAAqB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC3B;AA+GD,eAAO,MAAM,UAAU,QAAO,eAK7B,CAAC;AAQF,eAAO,MAAM,mBAAmB,SAAU,WAAW,KAAG,IAGvD,CAAC;AAEF,eAAO,MAAM,uBAAuB,SAAU,WAAW,KAAG,IAG3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAU;IACzC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAC;CACvD,KAAG,IAOH,CAAC;AAEF,eAAO,MAAM,0BAA0B,aAAc,MAAM,KAAG,IAG7D,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,IAG9C,CAAC;AAEF,eAAO,MAAM,uBAAuB,cACxB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAC/B,IAMF,CAAC;AAEF,eAAO,MAAM,oBAAoB,WAAY,MAAM,KAAG,IAGrD,CAAC;AAEF,eAAO,MAAM,sBAAsB,WAAY,MAAM,KAAG,IAGvD,CAAC;AAEF,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,IAGhD,CAAC;AAEF,eAAO,MAAM,uBAAuB,OAAQ,OAAO,KAAG,IAGrD,CAAC;AASF,eAAO,MAAM,iBAAiB,QAAO,cAkBpC,CAAC;AASF,eAAO,MAAM,cAAc,QAAS,mBAAmB,KAAG,cA4BzD,CAAC"}