@prosopo/provider 4.15.13 → 4.15.15

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 (236) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +106 -106
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +107 -104
  4. package/CHANGELOG.md +78 -0
  5. package/dist/_virtual/_rolldown/runtime.js +3 -0
  6. package/dist/api/admin/apiAdminRoutesProvider.js +27 -46
  7. package/dist/api/admin/apiClearAllCountersEndpoint.js +62 -57
  8. package/dist/api/admin/apiDnsEventEndpoint.js +79 -92
  9. package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +43 -45
  10. package/dist/api/admin/apiGetDecisionMachineEndpoint.js +40 -40
  11. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +23 -22
  12. package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +26 -30
  13. package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +35 -37
  14. package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +40 -40
  15. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  16. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +29 -31
  17. package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +33 -29
  18. package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +32 -31
  19. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +43 -35
  20. package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +43 -63
  21. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +36 -35
  22. package/dist/api/admin/createApiAdminRoutesProvider.js +6 -8
  23. package/dist/api/blacklistRequestInspector.js +285 -377
  24. package/dist/api/block.js +17 -30
  25. package/dist/api/captcha/checkSpamEmail.js +88 -98
  26. package/dist/api/captcha/contextAwareValidation.js +21 -15
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +126 -140
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -12
  29. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +236 -299
  30. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.js +10 -13
  31. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +336 -462
  32. package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.js +17 -14
  33. package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.js +27 -27
  34. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +42 -63
  35. package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +2 -4
  36. package/dist/api/captcha/getImageCaptchaChallenge.js +136 -207
  37. package/dist/api/captcha/getPoWCaptchaChallenge.js +128 -198
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +132 -201
  39. package/dist/api/captcha/maintenanceModeResponses.js +38 -47
  40. package/dist/api/captcha/submitImageCaptchaSolution.js +75 -101
  41. package/dist/api/captcha/submitPoWCaptchaSolution.js +137 -207
  42. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +73 -105
  43. package/dist/api/captcha.js +76 -58
  44. package/dist/api/dnsEventUrl.js +20 -22
  45. package/dist/api/domainMiddleware.js +104 -115
  46. package/dist/api/forwardVerify.js +62 -48
  47. package/dist/api/handshakeTimingMiddleware.js +43 -62
  48. package/dist/api/hardBlockVerdictCache.js +114 -117
  49. package/dist/api/headerCheckMiddleware.js +34 -34
  50. package/dist/api/ignoreMiddleware.js +13 -15
  51. package/dist/api/ipInfoMiddleware.js +17 -19
  52. package/dist/api/ja4.js +149 -188
  53. package/dist/api/ja4Middleware.js +39 -54
  54. package/dist/api/metrics.js +245 -257
  55. package/dist/api/public.js +52 -54
  56. package/dist/api/robotsMiddleware.js +10 -10
  57. package/dist/api/startProviderApi.js +205 -232
  58. package/dist/api/testSiteKey.js +16 -16
  59. package/dist/api/validateAddress.js +23 -21
  60. package/dist/api/verify.js +334 -377
  61. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  62. package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +40 -59
  63. package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +63 -58
  64. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +82 -93
  65. package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +46 -48
  66. package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +41 -41
  67. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +25 -24
  68. package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +28 -32
  69. package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +38 -40
  70. package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +41 -41
  71. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +31 -33
  72. package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +35 -31
  73. package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +34 -33
  74. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +45 -35
  75. package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +45 -65
  76. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +38 -37
  77. package/dist/cjs/api/admin/createApiAdminRoutesProvider.cjs +7 -8
  78. package/dist/cjs/api/blacklistRequestInspector.cjs +288 -376
  79. package/dist/cjs/api/block.cjs +18 -30
  80. package/dist/cjs/api/captcha/checkSpamEmail.cjs +90 -100
  81. package/dist/cjs/api/captcha/contextAwareValidation.cjs +21 -14
  82. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +125 -140
  83. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -10
  84. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +238 -301
  85. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.cjs +9 -12
  86. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +349 -473
  87. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.cjs +18 -14
  88. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.cjs +26 -26
  89. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +42 -63
  90. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge.cjs +2 -3
  91. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +138 -208
  92. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +131 -200
  93. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +135 -203
  94. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +38 -44
  95. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +77 -102
  96. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +140 -209
  97. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +76 -107
  98. package/dist/cjs/api/captcha.cjs +79 -58
  99. package/dist/cjs/api/dnsEventUrl.cjs +20 -21
  100. package/dist/cjs/api/domainMiddleware.cjs +106 -117
  101. package/dist/cjs/api/forwardVerify.cjs +63 -49
  102. package/dist/cjs/api/handshakeTimingMiddleware.cjs +43 -61
  103. package/dist/cjs/api/hardBlockVerdictCache.cjs +114 -114
  104. package/dist/cjs/api/headerCheckMiddleware.cjs +34 -34
  105. package/dist/cjs/api/ignoreMiddleware.cjs +12 -14
  106. package/dist/cjs/api/ipInfoMiddleware.cjs +16 -18
  107. package/dist/cjs/api/ja4.cjs +149 -187
  108. package/dist/cjs/api/ja4Middleware.cjs +40 -53
  109. package/dist/cjs/api/metrics.cjs +229 -228
  110. package/dist/cjs/api/public.cjs +57 -57
  111. package/dist/cjs/api/robotsMiddleware.cjs +9 -9
  112. package/dist/cjs/api/startProviderApi.cjs +219 -237
  113. package/dist/cjs/api/testSiteKey.cjs +15 -14
  114. package/dist/cjs/api/validateAddress.cjs +24 -21
  115. package/dist/cjs/api/verify.cjs +338 -379
  116. package/dist/cjs/compositeIpAddress.cjs +40 -47
  117. package/dist/cjs/index.cjs +65 -71
  118. package/dist/cjs/pairs.cjs +31 -35
  119. package/dist/cjs/rules/lang.cjs +10 -14
  120. package/dist/cjs/schedulers/captchaScheduler.cjs +26 -32
  121. package/dist/cjs/schedulers/getClientList.cjs +35 -33
  122. package/dist/cjs/schedulers/setClientEntropy.cjs +35 -33
  123. package/dist/cjs/schedulers/updateSpamEmailDomains.cjs +39 -43
  124. package/dist/cjs/services/ipComparison.cjs +122 -119
  125. package/dist/cjs/tasks/captchaManager.cjs +407 -486
  126. package/dist/cjs/tasks/client/clientTasks.cjs +347 -470
  127. package/dist/cjs/tasks/dataset/datasetTasks.cjs +25 -29
  128. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +16 -32
  129. package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +220 -307
  130. package/dist/cjs/tasks/detection/decodeBehavior.cjs +408 -317
  131. package/dist/cjs/tasks/detection/decodePayload.cjs +686 -468
  132. package/dist/cjs/tasks/detection/decodeSimd.cjs +462 -304
  133. package/dist/cjs/tasks/detection/getBotScore.cjs +37 -43
  134. package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +88 -71
  135. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +348 -486
  136. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +13 -30
  137. package/dist/cjs/tasks/frictionless/routingMachine.cjs +71 -55
  138. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +555 -806
  139. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +22 -23
  140. package/dist/cjs/tasks/index.cjs +2 -4
  141. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +491 -687
  142. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +17 -29
  143. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +422 -591
  144. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasksUtils.cjs +8 -5
  145. package/dist/cjs/tasks/spam/checkSpamEmail.cjs +133 -141
  146. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +118 -76
  147. package/dist/cjs/tasks/spam/evaluateEmailSpamRules.cjs +75 -84
  148. package/dist/cjs/tasks/spam/updateSpamEmailDomains.cjs +40 -56
  149. package/dist/cjs/tasks/tasks.cjs +107 -158
  150. package/dist/cjs/util/usageCounters.cjs +220 -211
  151. package/dist/cjs/util.cjs +329 -359
  152. package/dist/cjs/utils/devicePlatform.cjs +14 -8
  153. package/dist/cjs/utils/dns.cjs +68 -93
  154. package/dist/cjs/utils/hashUserAgent.cjs +14 -7
  155. package/dist/cjs/utils/hashUserIp.cjs +14 -6
  156. package/dist/cjs/utils/honeypot/encoders.cjs +74 -80
  157. package/dist/cjs/utils/honeypot/phraseBank.cjs +51 -44
  158. package/dist/cjs/utils/normalizeRequestIp.cjs +33 -25
  159. package/dist/compositeIpAddress.js +38 -46
  160. package/dist/index.js +12 -56
  161. package/dist/pairs.js +31 -37
  162. package/dist/rules/lang.js +11 -15
  163. package/dist/schedulers/captchaScheduler.js +25 -31
  164. package/dist/schedulers/getClientList.js +34 -32
  165. package/dist/schedulers/setClientEntropy.js +34 -32
  166. package/dist/schedulers/updateSpamEmailDomains.js +38 -42
  167. package/dist/services/ipComparison.js +122 -119
  168. package/dist/tasks/captchaManager.js +403 -483
  169. package/dist/tasks/client/clientTasks.js +343 -467
  170. package/dist/tasks/dataset/datasetTasks.js +24 -28
  171. package/dist/tasks/dataset/datasetTasksUtils.js +15 -31
  172. package/dist/tasks/decisionMachine/decisionMachineRunner.js +217 -306
  173. package/dist/tasks/detection/getBotScore.js +37 -43
  174. package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -1
  175. package/dist/tasks/dnsEvent/enrichDnsEvent.js +88 -74
  176. package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -1
  177. package/dist/tasks/frictionless/frictionlessTasks.js +342 -479
  178. package/dist/tasks/frictionless/frictionlessTasksUtils.js +14 -32
  179. package/dist/tasks/frictionless/routingMachine.js +72 -56
  180. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +550 -801
  181. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +21 -22
  182. package/dist/tasks/index.js +1 -3
  183. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  184. package/dist/tasks/powCaptcha/powTasks.js +486 -682
  185. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  186. package/dist/tasks/powCaptcha/powTasksUtils.js +15 -28
  187. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  188. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +417 -586
  189. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  190. package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.js +9 -6
  191. package/dist/tasks/spam/checkSpamEmail.js +133 -141
  192. package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -0
  193. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  194. package/dist/tasks/spam/checkTrafficFilter.js +117 -77
  195. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  196. package/dist/tasks/spam/evaluateEmailSpamRules.js +75 -86
  197. package/dist/tasks/spam/updateSpamEmailDomains.js +36 -54
  198. package/dist/tasks/tasks.js +98 -150
  199. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +4 -1
  200. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
  201. package/dist/tests/unit/api/block.unit.test.js +8 -4
  202. package/dist/tests/unit/api/block.unit.test.js.map +1 -1
  203. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +8 -6
  204. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  205. package/dist/tests/unit/api/forwardVerify.unit.test.js +3 -1
  206. package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -1
  207. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +15 -7
  208. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  209. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +24 -18
  210. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  211. package/dist/tests/unit/schedulers/getClientList.unit.test.js +19 -13
  212. package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
  213. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +19 -13
  214. package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
  215. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  216. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +22 -16
  217. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
  218. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +6 -0
  219. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  220. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +60 -1
  221. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
  222. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +140 -0
  223. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
  224. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +7 -7
  225. package/dist/util/usageCounters.js +220 -212
  226. package/dist/util.d.ts.map +1 -1
  227. package/dist/util.js +327 -364
  228. package/dist/util.js.map +1 -1
  229. package/dist/utils/devicePlatform.js +15 -9
  230. package/dist/utils/dns.js +64 -77
  231. package/dist/utils/hashUserAgent.js +14 -7
  232. package/dist/utils/hashUserIp.js +14 -6
  233. package/dist/utils/honeypot/encoders.js +74 -80
  234. package/dist/utils/honeypot/phraseBank.js +49 -44
  235. package/dist/utils/normalizeRequestIp.js +34 -26
  236. package/package.json +24 -24
@@ -1,249 +1,250 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const types = require("@prosopo/types");
4
- const promClient = require("prom-client");
5
- const metricsEnabled = () => process.env.PROSOPO_METRICS_ENABLED !== "false";
6
- const PREFIX = "prosopo_";
7
- const LATENCY_BUCKETS = [
8
- 5e-3,
9
- 0.01,
10
- 0.025,
11
- 0.05,
12
- 0.1,
13
- 0.25,
14
- 0.5,
15
- 1,
16
- 2.5,
17
- 5,
18
- 10
1
+ let _prosopo_types = require("@prosopo/types");
2
+ let prom_client = require("prom-client");
3
+ //#region src/api/metrics.ts
4
+ var metricsEnabled = () => process.env.PROSOPO_METRICS_ENABLED !== "false";
5
+ var PREFIX = "prosopo_";
6
+ var LATENCY_BUCKETS = [
7
+ .005,
8
+ .01,
9
+ .025,
10
+ .05,
11
+ .1,
12
+ .25,
13
+ .5,
14
+ 1,
15
+ 2.5,
16
+ 5,
17
+ 10
19
18
  ];
20
- const SCORE_BUCKETS = [
21
- 0,
22
- 0.1,
23
- 0.2,
24
- 0.3,
25
- 0.4,
26
- 0.5,
27
- 0.6,
28
- 0.7,
29
- 0.8,
30
- 0.9,
31
- 1,
32
- 1.5,
33
- 2,
34
- 3,
35
- 5,
36
- 10
19
+ var SCORE_BUCKETS = [
20
+ 0,
21
+ .1,
22
+ .2,
23
+ .3,
24
+ .4,
25
+ .5,
26
+ .6,
27
+ .7,
28
+ .8,
29
+ .9,
30
+ 1,
31
+ 1.5,
32
+ 2,
33
+ 3,
34
+ 5,
35
+ 10
37
36
  ];
38
- const KNOWN_ROUTES = /* @__PURE__ */ new Set([
39
- ...Object.values(types.ClientApiPaths),
40
- ...Object.values(types.PublicApiPaths),
41
- ...Object.values(types.AdminApiPaths)
37
+ var KNOWN_ROUTES = /* @__PURE__ */ new Set([
38
+ ...Object.values(_prosopo_types.ClientApiPaths),
39
+ ...Object.values(_prosopo_types.PublicApiPaths),
40
+ ...Object.values(_prosopo_types.AdminApiPaths)
42
41
  ]);
43
- const normaliseRoute = (req) => {
44
- const path = req.path;
45
- return KNOWN_ROUTES.has(path) ? path : "other";
42
+ var normaliseRoute = (req) => {
43
+ const path = req.path;
44
+ return KNOWN_ROUTES.has(path) ? path : "other";
46
45
  };
47
- let metrics;
48
- const buildMetrics = () => {
49
- const registry = new promClient.Registry();
50
- promClient.collectDefaultMetrics({ register: registry, prefix: PREFIX });
51
- const httpRequestsTotal = new promClient.Counter({
52
- name: `${PREFIX}http_requests_total`,
53
- help: "Total HTTP requests handled by the provider API",
54
- labelNames: ["route", "method", "status"],
55
- registers: [registry]
56
- });
57
- const httpRequestDuration = new promClient.Histogram({
58
- name: `${PREFIX}http_request_duration_seconds`,
59
- help: "Provider API request duration in seconds",
60
- labelNames: ["route", "method", "status"],
61
- buckets: LATENCY_BUCKETS,
62
- registers: [registry]
63
- });
64
- const captchaIssuedTotal = new promClient.Counter({
65
- name: `${PREFIX}captcha_issued_total`,
66
- help: "Captcha challenges issued, by type",
67
- labelNames: ["type"],
68
- registers: [registry]
69
- });
70
- const captchaIssueErrorsTotal = new promClient.Counter({
71
- name: `${PREFIX}captcha_issue_errors_total`,
72
- help: "Errors while issuing captcha challenges, by type",
73
- labelNames: ["type"],
74
- registers: [registry]
75
- });
76
- const captchaVerifyTotal = new promClient.Counter({
77
- name: `${PREFIX}captcha_verify_total`,
78
- help: "Captcha verification outcomes, by type/result/source",
79
- labelNames: ["type", "result", "source"],
80
- registers: [registry]
81
- });
82
- const frictionlessRoutedTotal = new promClient.Counter({
83
- name: `${PREFIX}frictionless_routed_total`,
84
- help: "Frictionless routing decisions (which captcha the user was sent to)",
85
- labelNames: ["decision"],
86
- registers: [registry]
87
- });
88
- const botScore = new promClient.Histogram({
89
- name: `${PREFIX}bot_score`,
90
- help: "Distribution of frictionless bot scores (0=human .. 1=bot; language-rule penalties can push it above 1)",
91
- buckets: SCORE_BUCKETS,
92
- registers: [registry]
93
- });
94
- const detectorTriggeredTotal = new promClient.Counter({
95
- name: `${PREFIX}detector_triggered_total`,
96
- help: "Count of times each bot detector was triggered",
97
- labelNames: ["detector"],
98
- registers: [registry]
99
- });
100
- const blockedRequestsTotal = new promClient.Counter({
101
- name: `${PREFIX}blocked_requests_total`,
102
- help: "Requests blocked before reaching a captcha handler, by reason",
103
- labelNames: ["reason"],
104
- registers: [registry]
105
- });
106
- const domainValidationTotal = new promClient.Counter({
107
- name: `${PREFIX}domain_validation_total`,
108
- help: "Domain/site-key validation outcomes",
109
- labelNames: ["result"],
110
- registers: [registry]
111
- });
112
- const spamEmailTotal = new promClient.Counter({
113
- name: `${PREFIX}spam_email_total`,
114
- help: "Spam email-domain check outcomes",
115
- labelNames: ["result"],
116
- registers: [registry]
117
- });
118
- const maintenanceMode = new promClient.Gauge({
119
- name: `${PREFIX}maintenance_mode`,
120
- help: "1 when the provider is in maintenance mode, else 0",
121
- registers: [registry]
122
- });
123
- maintenanceMode.set(
124
- process.env.MAINTENANCE_MODE?.toLowerCase() === "true" ? 1 : 0
125
- );
126
- const redisReady = new promClient.Gauge({
127
- name: `${PREFIX}redis_ready`,
128
- help: "1 when the given redis connection is ready, else 0",
129
- labelNames: ["actor"],
130
- registers: [registry]
131
- });
132
- return {
133
- registry,
134
- httpRequestsTotal,
135
- httpRequestDuration,
136
- captchaIssuedTotal,
137
- captchaIssueErrorsTotal,
138
- captchaVerifyTotal,
139
- frictionlessRoutedTotal,
140
- botScore,
141
- detectorTriggeredTotal,
142
- blockedRequestsTotal,
143
- domainValidationTotal,
144
- spamEmailTotal,
145
- maintenanceMode,
146
- redisReady
147
- };
46
+ var metrics;
47
+ var buildMetrics = () => {
48
+ const registry = new prom_client.Registry();
49
+ (0, prom_client.collectDefaultMetrics)({
50
+ register: registry,
51
+ prefix: PREFIX
52
+ });
53
+ const httpRequestsTotal = new prom_client.Counter({
54
+ name: `${PREFIX}http_requests_total`,
55
+ help: "Total HTTP requests handled by the provider API",
56
+ labelNames: [
57
+ "route",
58
+ "method",
59
+ "status"
60
+ ],
61
+ registers: [registry]
62
+ });
63
+ const httpRequestDuration = new prom_client.Histogram({
64
+ name: `${PREFIX}http_request_duration_seconds`,
65
+ help: "Provider API request duration in seconds",
66
+ labelNames: [
67
+ "route",
68
+ "method",
69
+ "status"
70
+ ],
71
+ buckets: LATENCY_BUCKETS,
72
+ registers: [registry]
73
+ });
74
+ const captchaIssuedTotal = new prom_client.Counter({
75
+ name: `${PREFIX}captcha_issued_total`,
76
+ help: "Captcha challenges issued, by type",
77
+ labelNames: ["type"],
78
+ registers: [registry]
79
+ });
80
+ const captchaIssueErrorsTotal = new prom_client.Counter({
81
+ name: `${PREFIX}captcha_issue_errors_total`,
82
+ help: "Errors while issuing captcha challenges, by type",
83
+ labelNames: ["type"],
84
+ registers: [registry]
85
+ });
86
+ const captchaVerifyTotal = new prom_client.Counter({
87
+ name: `${PREFIX}captcha_verify_total`,
88
+ help: "Captcha verification outcomes, by type/result/source",
89
+ labelNames: [
90
+ "type",
91
+ "result",
92
+ "source"
93
+ ],
94
+ registers: [registry]
95
+ });
96
+ const frictionlessRoutedTotal = new prom_client.Counter({
97
+ name: `${PREFIX}frictionless_routed_total`,
98
+ help: "Frictionless routing decisions (which captcha the user was sent to)",
99
+ labelNames: ["decision"],
100
+ registers: [registry]
101
+ });
102
+ const botScore = new prom_client.Histogram({
103
+ name: `${PREFIX}bot_score`,
104
+ help: "Distribution of frictionless bot scores (0=human .. 1=bot; language-rule penalties can push it above 1)",
105
+ buckets: SCORE_BUCKETS,
106
+ registers: [registry]
107
+ });
108
+ const detectorTriggeredTotal = new prom_client.Counter({
109
+ name: `${PREFIX}detector_triggered_total`,
110
+ help: "Count of times each bot detector was triggered",
111
+ labelNames: ["detector"],
112
+ registers: [registry]
113
+ });
114
+ const blockedRequestsTotal = new prom_client.Counter({
115
+ name: `${PREFIX}blocked_requests_total`,
116
+ help: "Requests blocked before reaching a captcha handler, by reason",
117
+ labelNames: ["reason"],
118
+ registers: [registry]
119
+ });
120
+ const domainValidationTotal = new prom_client.Counter({
121
+ name: `${PREFIX}domain_validation_total`,
122
+ help: "Domain/site-key validation outcomes",
123
+ labelNames: ["result"],
124
+ registers: [registry]
125
+ });
126
+ const spamEmailTotal = new prom_client.Counter({
127
+ name: `${PREFIX}spam_email_total`,
128
+ help: "Spam email-domain check outcomes",
129
+ labelNames: ["result"],
130
+ registers: [registry]
131
+ });
132
+ const maintenanceMode = new prom_client.Gauge({
133
+ name: `${PREFIX}maintenance_mode`,
134
+ help: "1 when the provider is in maintenance mode, else 0",
135
+ registers: [registry]
136
+ });
137
+ maintenanceMode.set(process.env.MAINTENANCE_MODE?.toLowerCase() === "true" ? 1 : 0);
138
+ return {
139
+ registry,
140
+ httpRequestsTotal,
141
+ httpRequestDuration,
142
+ captchaIssuedTotal,
143
+ captchaIssueErrorsTotal,
144
+ captchaVerifyTotal,
145
+ frictionlessRoutedTotal,
146
+ botScore,
147
+ detectorTriggeredTotal,
148
+ blockedRequestsTotal,
149
+ domainValidationTotal,
150
+ spamEmailTotal,
151
+ maintenanceMode,
152
+ redisReady: new prom_client.Gauge({
153
+ name: `${PREFIX}redis_ready`,
154
+ help: "1 when the given redis connection is ready, else 0",
155
+ labelNames: ["actor"],
156
+ registers: [registry]
157
+ })
158
+ };
148
159
  };
149
- const getMetrics = () => {
150
- if (!metrics) {
151
- metrics = buildMetrics();
152
- }
153
- return metrics;
160
+ var getMetrics = () => {
161
+ if (!metrics) metrics = buildMetrics();
162
+ return metrics;
154
163
  };
155
- const recordCaptchaIssued = (type) => {
156
- if (!metricsEnabled()) return;
157
- getMetrics().captchaIssuedTotal.inc({ type });
164
+ var recordCaptchaIssued = (type) => {
165
+ if (!metricsEnabled()) return;
166
+ getMetrics().captchaIssuedTotal.inc({ type });
158
167
  };
159
- const recordCaptchaIssueError = (type) => {
160
- if (!metricsEnabled()) return;
161
- getMetrics().captchaIssueErrorsTotal.inc({ type });
168
+ var recordCaptchaIssueError = (type) => {
169
+ if (!metricsEnabled()) return;
170
+ getMetrics().captchaIssueErrorsTotal.inc({ type });
162
171
  };
163
- const recordCaptchaVerify = (args) => {
164
- if (!metricsEnabled()) return;
165
- getMetrics().captchaVerifyTotal.inc({
166
- type: args.type,
167
- result: args.verified ? "verified" : "failed",
168
- source: args.source
169
- });
172
+ var recordCaptchaVerify = (args) => {
173
+ if (!metricsEnabled()) return;
174
+ getMetrics().captchaVerifyTotal.inc({
175
+ type: args.type,
176
+ result: args.verified ? "verified" : "failed",
177
+ source: args.source
178
+ });
170
179
  };
171
- const recordFrictionlessDecision = (decision) => {
172
- if (!metricsEnabled()) return;
173
- getMetrics().frictionlessRoutedTotal.inc({ decision });
180
+ var recordFrictionlessDecision = (decision) => {
181
+ if (!metricsEnabled()) return;
182
+ getMetrics().frictionlessRoutedTotal.inc({ decision });
174
183
  };
175
- const recordBotScore = (score) => {
176
- if (!metricsEnabled()) return;
177
- getMetrics().botScore.observe(score);
184
+ var recordBotScore = (score) => {
185
+ if (!metricsEnabled()) return;
186
+ getMetrics().botScore.observe(score);
178
187
  };
179
- const recordDetectorTriggered = (detectors) => {
180
- if (!metricsEnabled()) return;
181
- const m = getMetrics();
182
- for (const detector of detectors) {
183
- m.detectorTriggeredTotal.inc({ detector: String(detector) });
184
- }
188
+ var recordDetectorTriggered = (detectors) => {
189
+ if (!metricsEnabled()) return;
190
+ const m = getMetrics();
191
+ for (const detector of detectors) m.detectorTriggeredTotal.inc({ detector: String(detector) });
185
192
  };
186
- const recordBlockedRequest = (reason) => {
187
- if (!metricsEnabled()) return;
188
- getMetrics().blockedRequestsTotal.inc({ reason });
193
+ var recordBlockedRequest = (reason) => {
194
+ if (!metricsEnabled()) return;
195
+ getMetrics().blockedRequestsTotal.inc({ reason });
189
196
  };
190
- const recordDomainValidation = (result) => {
191
- if (!metricsEnabled()) return;
192
- getMetrics().domainValidationTotal.inc({ result });
197
+ var recordDomainValidation = (result) => {
198
+ if (!metricsEnabled()) return;
199
+ getMetrics().domainValidationTotal.inc({ result });
193
200
  };
194
- const recordSpamEmail = (result) => {
195
- if (!metricsEnabled()) return;
196
- getMetrics().spamEmailTotal.inc({ result });
201
+ var recordSpamEmail = (result) => {
202
+ if (!metricsEnabled()) return;
203
+ getMetrics().spamEmailTotal.inc({ result });
197
204
  };
198
- const setMaintenanceModeGauge = (on) => {
199
- if (!metricsEnabled()) return;
200
- getMetrics().maintenanceMode.set(on ? 1 : 0);
205
+ var setMaintenanceModeGauge = (on) => {
206
+ if (!metricsEnabled()) return;
207
+ getMetrics().maintenanceMode.set(on ? 1 : 0);
201
208
  };
202
- const metricsMiddleware = () => {
203
- return (req, res, next) => {
204
- if (!metricsEnabled()) return next();
205
- const start = process.hrtime.bigint();
206
- res.on("finish", () => {
207
- const route = normaliseRoute(req);
208
- const labels = {
209
- route,
210
- method: req.method,
211
- status: String(res.statusCode)
212
- };
213
- const durationSeconds = Number(process.hrtime.bigint() - start) / 1e9;
214
- const m = getMetrics();
215
- m.httpRequestsTotal.inc(labels);
216
- m.httpRequestDuration.observe(labels, durationSeconds);
217
- });
218
- next();
219
- };
209
+ var metricsMiddleware = () => {
210
+ return (req, res, next) => {
211
+ if (!metricsEnabled()) return next();
212
+ const start = process.hrtime.bigint();
213
+ res.on("finish", () => {
214
+ const labels = {
215
+ route: normaliseRoute(req),
216
+ method: req.method,
217
+ status: String(res.statusCode)
218
+ };
219
+ const durationSeconds = Number(process.hrtime.bigint() - start) / 1e9;
220
+ const m = getMetrics();
221
+ m.httpRequestsTotal.inc(labels);
222
+ m.httpRequestDuration.observe(labels, durationSeconds);
223
+ });
224
+ next();
225
+ };
220
226
  };
221
- const metricsHandler = (env) => {
222
- return async (req, res) => {
223
- const token = process.env.PROSOPO_METRICS_TOKEN;
224
- if (token && req.headers.authorization !== `Bearer ${token}`) {
225
- res.status(401).send("Unauthorized");
226
- return;
227
- }
228
- const m = getMetrics();
229
- try {
230
- const db = env.getDb();
231
- m.redisReady.set(
232
- { actor: "general" },
233
- db.getRedisConnection().isReady() ? 1 : 0
234
- );
235
- m.redisReady.set(
236
- { actor: "uap" },
237
- db.getRedisAccessRulesConnection().isReady() ? 1 : 0
238
- );
239
- } catch {
240
- m.redisReady.set({ actor: "general" }, 0);
241
- m.redisReady.set({ actor: "uap" }, 0);
242
- }
243
- res.set("Content-Type", m.registry.contentType);
244
- res.end(await m.registry.metrics());
245
- };
227
+ var metricsHandler = (env) => {
228
+ return async (req, res) => {
229
+ const token = process.env.PROSOPO_METRICS_TOKEN;
230
+ if (token && req.headers.authorization !== `Bearer ${token}`) {
231
+ res.status(401).send("Unauthorized");
232
+ return;
233
+ }
234
+ const m = getMetrics();
235
+ try {
236
+ const db = env.getDb();
237
+ m.redisReady.set({ actor: "general" }, db.getRedisConnection().isReady() ? 1 : 0);
238
+ m.redisReady.set({ actor: "uap" }, db.getRedisAccessRulesConnection().isReady() ? 1 : 0);
239
+ } catch {
240
+ m.redisReady.set({ actor: "general" }, 0);
241
+ m.redisReady.set({ actor: "uap" }, 0);
242
+ }
243
+ res.set("Content-Type", m.registry.contentType);
244
+ res.end(await m.registry.metrics());
245
+ };
246
246
  };
247
+ //#endregion
247
248
  exports.getMetrics = getMetrics;
248
249
  exports.metricsEnabled = metricsEnabled;
249
250
  exports.metricsHandler = metricsHandler;
@@ -1,60 +1,60 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const apiExpressRouter = require("@prosopo/api-express-router");
4
- const common = require("@prosopo/common");
5
- const types = require("@prosopo/types");
6
- const util = require("@prosopo/util");
7
- const express = require("express");
8
- const metrics = require("./metrics.cjs");
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_metrics = require("./metrics.cjs");
3
+ let _prosopo_common = require("@prosopo/common");
4
+ let _prosopo_types = require("@prosopo/types");
5
+ let _prosopo_util = require("@prosopo/util");
6
+ let _prosopo_api_express_router = require("@prosopo/api-express-router");
7
+ let express = require("express");
8
+ express = require_runtime.__toESM(express, 1);
9
+ //#region src/api/public.ts
10
+ /**
11
+ * Returns a router connected to the database which can interact with the Proposo protocol
12
+ *
13
+ * @return {Router} - A middleware router that can interact with the Prosopo protocol
14
+ */
9
15
  function publicRouter(env) {
10
- const router = express.Router();
11
- router.get(types.PublicApiPaths.Healthz, (req, res) => {
12
- const host = env.config.host && env.config.host.length > 0 ? env.config.host : req.hostname;
13
- return res.status(200).json({ ok: true, host });
14
- });
15
- if (metrics.metricsEnabled()) {
16
- router.get(types.PublicApiPaths.Metrics, metrics.metricsHandler(env));
17
- }
18
- router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
19
- try {
20
- const db = env.getDb();
21
- const redisConnection = db.getRedisConnection();
22
- const redisAccessRulesConnection = db.getRedisAccessRulesConnection();
23
- const response = {
24
- version: util.version,
25
- message: "Provider online",
26
- redis: [
27
- {
28
- actor: "General",
29
- isReady: redisConnection.isReady(),
30
- awaitingTimeSeconds: Math.ceil(
31
- redisConnection.getAwaitingTimeMs() / 1e3
32
- )
33
- },
34
- {
35
- actor: "UAP",
36
- isReady: redisAccessRulesConnection.isReady(),
37
- awaitingTimeSeconds: Math.ceil(
38
- redisAccessRulesConnection.getAwaitingTimeMs() / 1e3
39
- )
40
- }
41
- ]
42
- };
43
- return res.json(response);
44
- } catch (err) {
45
- env.logger.error(() => ({
46
- err,
47
- data: { reqParams: req.params },
48
- msg: "Error getting provider details"
49
- }));
50
- return next(
51
- new common.ProsopoApiError("API.BAD_REQUEST", {
52
- context: { code: 500 }
53
- })
54
- );
55
- }
56
- });
57
- router.use(apiExpressRouter.handleErrors);
58
- return router;
16
+ const router = express.default.Router();
17
+ router.get(_prosopo_types.PublicApiPaths.Healthz, (req, res) => {
18
+ const host = env.config.host && env.config.host.length > 0 ? env.config.host : req.hostname;
19
+ return res.status(200).json({
20
+ ok: true,
21
+ host
22
+ });
23
+ });
24
+ if (require_metrics.metricsEnabled()) router.get(_prosopo_types.PublicApiPaths.Metrics, require_metrics.metricsHandler(env));
25
+ /**
26
+ * Gets public details of the provider
27
+ */
28
+ router.get(_prosopo_types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
29
+ try {
30
+ const db = env.getDb();
31
+ const redisConnection = db.getRedisConnection();
32
+ const redisAccessRulesConnection = db.getRedisAccessRulesConnection();
33
+ const response = {
34
+ version: _prosopo_util.version,
35
+ message: "Provider online",
36
+ redis: [{
37
+ actor: "General",
38
+ isReady: redisConnection.isReady(),
39
+ awaitingTimeSeconds: Math.ceil(redisConnection.getAwaitingTimeMs() / 1e3)
40
+ }, {
41
+ actor: "UAP",
42
+ isReady: redisAccessRulesConnection.isReady(),
43
+ awaitingTimeSeconds: Math.ceil(redisAccessRulesConnection.getAwaitingTimeMs() / 1e3)
44
+ }]
45
+ };
46
+ return res.json(response);
47
+ } catch (err) {
48
+ env.logger.error(() => ({
49
+ err,
50
+ data: { reqParams: req.params },
51
+ msg: "Error getting provider details"
52
+ }));
53
+ return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", { context: { code: 500 } }));
54
+ }
55
+ });
56
+ router.use(_prosopo_api_express_router.handleErrors);
57
+ return router;
59
58
  }
59
+ //#endregion
60
60
  exports.publicRouter = publicRouter;
@@ -1,12 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
1
+ //#region src/api/robotsMiddleware.ts
3
2
  function robotsMiddleware() {
4
- return (_req, res, next) => {
5
- res.setHeader("Strict-Transport-Security", "max-age=31536000;");
6
- res.setHeader("X-XSS-Protection", "1; mode=block");
7
- res.setHeader("X-Frame-Options", "DENY");
8
- res.setHeader("X-Robots-Tag", "none");
9
- next();
10
- };
3
+ return (_req, res, next) => {
4
+ res.setHeader("Strict-Transport-Security", "max-age=31536000;");
5
+ res.setHeader("X-XSS-Protection", "1; mode=block");
6
+ res.setHeader("X-Frame-Options", "DENY");
7
+ res.setHeader("X-Robots-Tag", "none");
8
+ next();
9
+ };
11
10
  }
11
+ //#endregion
12
12
  exports.robotsMiddleware = robotsMiddleware;