@prosopo/provider 4.15.14 → 4.15.16

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 (232) 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 +63 -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/spam/checkTrafficFilter.unit.test.js +140 -0
  219. package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
  220. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +7 -7
  221. package/dist/util/usageCounters.js +220 -212
  222. package/dist/util.d.ts.map +1 -1
  223. package/dist/util.js +327 -364
  224. package/dist/util.js.map +1 -1
  225. package/dist/utils/devicePlatform.js +15 -9
  226. package/dist/utils/dns.js +64 -77
  227. package/dist/utils/hashUserAgent.js +14 -7
  228. package/dist/utils/hashUserIp.js +14 -6
  229. package/dist/utils/honeypot/encoders.js +74 -80
  230. package/dist/utils/honeypot/phraseBank.js +49 -44
  231. package/dist/utils/normalizeRequestIp.js +34 -26
  232. package/package.json +24 -24
@@ -1,245 +1,227 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const fs = require("node:fs");
4
- const https = require("node:https");
5
- const path = require("node:path");
6
- const node_url = require("node:url");
7
- const apiExpressRouter = require("@prosopo/api-express-router");
8
- const locale = require("@prosopo/locale");
9
- const logger = require("@prosopo/logger");
10
- const types = require("@prosopo/types");
11
- const api = require("@prosopo/user-access-policy/api");
12
- const cors = require("cors");
13
- const express = require("express");
14
- const rateLimit = require("express-rate-limit");
15
- const createApiAdminRoutesProvider = require("./admin/createApiAdminRoutesProvider.cjs");
16
- const blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
17
- const block = require("./block.cjs");
18
- const captcha = require("./captcha.cjs");
19
- const domainMiddleware = require("./domainMiddleware.cjs");
20
- const handshakeTimingMiddleware = require("./handshakeTimingMiddleware.cjs");
21
- const headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
22
- const ignoreMiddleware = require("./ignoreMiddleware.cjs");
23
- const ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
24
- const ja4Middleware = require("./ja4Middleware.cjs");
25
- const metrics = require("./metrics.cjs");
26
- const _public = require("./public.cjs");
27
- const robotsMiddleware = require("./robotsMiddleware.cjs");
28
- const verify = require("./verify.cjs");
29
- var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
30
- const __dirname$1 = path.dirname(node_url.fileURLToPath(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/startProviderApi.cjs", document.baseURI).href));
31
- const certPath = path.resolve(__dirname$1, "../../../../certs");
32
- const keyPath = path.join(certPath, "server.key");
33
- const crtPath = path.join(certPath, "server.crt");
34
- const isTlsAvailable = () => {
35
- return fs.existsSync(keyPath) && fs.existsSync(crtPath);
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_metrics = require("./metrics.cjs");
3
+ const require_blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
4
+ const require_block = require("./block.cjs");
5
+ const require_captcha = require("./captcha.cjs");
6
+ const require_verify = require("./verify.cjs");
7
+ const require_ja4Middleware = require("./ja4Middleware.cjs");
8
+ const require_handshakeTimingMiddleware = require("./handshakeTimingMiddleware.cjs");
9
+ const require_public = require("./public.cjs");
10
+ const require_domainMiddleware = require("./domainMiddleware.cjs");
11
+ const require_createApiAdminRoutesProvider = require("./admin/createApiAdminRoutesProvider.cjs");
12
+ const require_headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
13
+ const require_ignoreMiddleware = require("./ignoreMiddleware.cjs");
14
+ const require_ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
15
+ const require_robotsMiddleware = require("./robotsMiddleware.cjs");
16
+ let _prosopo_logger = require("@prosopo/logger");
17
+ let _prosopo_types = require("@prosopo/types");
18
+ let node_https = require("node:https");
19
+ node_https = require_runtime.__toESM(node_https, 1);
20
+ let node_fs = require("node:fs");
21
+ node_fs = require_runtime.__toESM(node_fs, 1);
22
+ let _prosopo_api_express_router = require("@prosopo/api-express-router");
23
+ let express = require("express");
24
+ express = require_runtime.__toESM(express, 1);
25
+ let node_path = require("node:path");
26
+ node_path = require_runtime.__toESM(node_path, 1);
27
+ let node_url = require("node:url");
28
+ let _prosopo_locale = require("@prosopo/locale");
29
+ let _prosopo_user_access_policy_api = require("@prosopo/user-access-policy/api");
30
+ let cors = require("cors");
31
+ cors = require_runtime.__toESM(cors, 1);
32
+ let express_rate_limit = require("express-rate-limit");
33
+ express_rate_limit = require_runtime.__toESM(express_rate_limit, 1);
34
+ //#region src/api/startProviderApi.ts
35
+ var __dirname$1 = node_path.default.dirname((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
36
+ var certPath = node_path.default.resolve(__dirname$1, "../../../../certs");
37
+ var keyPath = node_path.default.join(certPath, "server.key");
38
+ var crtPath = node_path.default.join(certPath, "server.crt");
39
+ /**
40
+ * Check if TLS certificates are available
41
+ * @returns True if both key and cert files exist
42
+ */
43
+ var isTlsAvailable = () => {
44
+ return node_fs.default.existsSync(keyPath) && node_fs.default.existsSync(crtPath);
36
45
  };
37
- const getClientApiPathsExpectingProsopoHeaders = () => {
38
- const paths = Object.values(types.ClientApiPaths).filter(
39
- (path2) => path2.indexOf("verify") === -1 && path2.indexOf("spam") === -1
40
- );
41
- return paths;
46
+ /**
47
+ * Get client API paths that expect Prosopo headers (like site key) for validation, excluding verify and spam routes
48
+ * @returns Array of ClientApiPaths excluding verify and spam routes
49
+ */
50
+ var getClientApiPathsExpectingProsopoHeaders = () => {
51
+ return Object.values(_prosopo_types.ClientApiPaths).filter((path) => path.indexOf("verify") === -1 && path.indexOf("spam") === -1);
42
52
  };
43
- const getUserFromJWT = (req) => {
44
- try {
45
- const authHeader = req.headers.Authorization || req.headers.authorization;
46
- if (!authHeader || typeof authHeader !== "string") {
47
- return void 0;
48
- }
49
- const jwt = authHeader.replace("Bearer ", "");
50
- if (!jwt) {
51
- return void 0;
52
- }
53
- const parts = jwt.split(".");
54
- if (parts.length !== 3 || !parts[1]) {
55
- return void 0;
56
- }
57
- const payload = JSON.parse(
58
- Buffer.from(parts[1], "base64url").toString("utf-8")
59
- );
60
- return payload.sub;
61
- } catch (e) {
62
- return void 0;
63
- }
53
+ /**
54
+ * Extract authenticated user address from JWT for rate limiting
55
+ * @param req Express request object
56
+ * @returns User address from JWT or undefined
57
+ */
58
+ var getUserFromJWT = (req) => {
59
+ try {
60
+ const authHeader = req.headers.Authorization || req.headers.authorization;
61
+ if (!authHeader || typeof authHeader !== "string") return;
62
+ const jwt = authHeader.replace("Bearer ", "");
63
+ if (!jwt) return;
64
+ const parts = jwt.split(".");
65
+ if (parts.length !== 3 || !parts[1]) return;
66
+ return JSON.parse(Buffer.from(parts[1], "base64url").toString("utf-8")).sub;
67
+ } catch (e) {
68
+ return;
69
+ }
64
70
  };
71
+ /**
72
+ * Start the Prosopo Provider API server
73
+ *
74
+ * This function creates and configures an Express server with all necessary middleware
75
+ * for the Prosopo Provider API, including:
76
+ * - CORS support
77
+ * - Rate limiting (disabled in test/development environments)
78
+ * - Authentication and authorization
79
+ * - Request validation (headers, domains, etc.)
80
+ * - Blocking and security middleware
81
+ * - Admin and client API routes
82
+ * - Access rule management
83
+ *
84
+ * @param env - The ProviderEnvironment containing configuration and database connections
85
+ * @param admin - Whether to enable admin mode (currently unused, kept for compatibility)
86
+ * @param port - Optional port override. If not provided, uses env.config.server.port
87
+ * @returns Promise<Server> - The Node.js HTTP server instance
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const env = new ProviderEnvironment(config);
92
+ * await env.isReady();
93
+ * const server = await startProviderApi(env);
94
+ * ```
95
+ */
65
96
  async function startProviderApi(env, admin = false, port) {
66
- env.logger.info(() => ({ msg: "Starting Prosopo API" }));
67
- const apiApp = express();
68
- const apiPort = port || env.config.server?.port;
69
- const apiEndpointAdapter = apiExpressRouter.createApiExpressDefaultEndpointAdapter(
70
- logger.parseLogLevel(env.config.logLevel)
71
- );
72
- let apiRuleRoutesProvider;
73
- let apiAdminRoutesProvider;
74
- try {
75
- apiRuleRoutesProvider = new api.AccessRuleApiRoutes(
76
- env.getDb().getUserAccessRulesStorage(),
77
- env.logger
78
- );
79
- apiAdminRoutesProvider = createApiAdminRoutesProvider.createApiAdminRoutesProvider(env);
80
- } catch (err) {
81
- env.logger.warn(() => ({
82
- msg: "Skipping admin/access-rule routes; DB unavailable",
83
- err
84
- }));
85
- }
86
- const clientPathsExcludingVerify = getClientApiPathsExpectingProsopoHeaders();
87
- env.logger.debug(() => ({
88
- msg: "Adding headerCheckMiddleware",
89
- paths: clientPathsExcludingVerify
90
- }));
91
- apiApp.set("trust proxy", 1);
92
- apiApp.use(
93
- cors({
94
- exposedHeaders: ["x-prosopo-meta"],
95
- allowedHeaders: [
96
- "Accept",
97
- "Accept-Language",
98
- "Authorization",
99
- "Content-Language",
100
- "Content-Type",
101
- "Prosopo-Site-Key",
102
- "Prosopo-User",
103
- "x-prosopo-meta"
104
- ],
105
- maxAge: 86400
106
- })
107
- );
108
- apiApp.use(express.json({ limit: "1mb" }));
109
- apiApp.use(_public.publicRouter(env));
110
- apiApp.use(metrics.metricsMiddleware());
111
- const isTestOrDevelopmentEnv = process.env.NODE_ENV === "test" || env.config.defaultEnvironment === "development";
112
- if (!isTestOrDevelopmentEnv) {
113
- const configRateLimits = env.config.rateLimits;
114
- const rateLimits = {
115
- ...configRateLimits,
116
- ...api.getExpressApiRuleRateLimits()
117
- };
118
- const adminPaths = Object.values(types.AdminApiPaths);
119
- const rateLimitHandler = (path2) => (req, res, _next, options) => {
120
- env.logger.warn(() => ({
121
- msg: "Rate limit exceeded",
122
- data: {
123
- path: path2,
124
- ip: req.ip,
125
- siteKey: req.headers["prosopo-site-key"]
126
- }
127
- }));
128
- res.status(options.statusCode).send(options.message);
129
- };
130
- for (const [path2, limit] of Object.entries(rateLimits)) {
131
- const enumPath = path2;
132
- if (adminPaths.includes(enumPath)) {
133
- apiApp.use(
134
- enumPath,
135
- rateLimit({
136
- ...limit,
137
- handler: rateLimitHandler(enumPath),
138
- keyGenerator: (req) => {
139
- const user = getUserFromJWT(req);
140
- return user || req.ip || "unknown";
141
- }
142
- })
143
- );
144
- } else if (path2 === types.ClientApiPaths.VerifyImageCaptchaSolutionDapp || path2 === types.ClientApiPaths.VerifyPowCaptchaSolution) {
145
- apiApp.use(
146
- enumPath,
147
- rateLimit({
148
- ...limit,
149
- handler: rateLimitHandler(enumPath),
150
- keyGenerator: (req) => {
151
- const siteKey = req.headers["prosopo-site-key"];
152
- return siteKey || req.ip || "unknown";
153
- }
154
- })
155
- );
156
- } else {
157
- apiApp.use(
158
- enumPath,
159
- rateLimit({ ...limit, handler: rateLimitHandler(enumPath) })
160
- );
161
- }
162
- }
163
- }
164
- const i18Middleware = await locale.i18nMiddleware({});
165
- apiApp.use(robotsMiddleware.robotsMiddleware());
166
- apiApp.use(ignoreMiddleware.ignoreMiddleware());
167
- apiApp.use(apiExpressRouter.requestLoggerMiddleware(env));
168
- apiApp.use(i18Middleware);
169
- apiApp.use(ja4Middleware.ja4Middleware(env));
170
- apiApp.use(handshakeTimingMiddleware.handshakeTimingMiddleware(env));
171
- apiApp.use(ipInfoMiddleware.ipInfoMiddleware(env));
172
- apiApp.use(clientPathsExcludingVerify, headerCheckMiddleware.headerCheckMiddleware(env));
173
- apiApp.use(verify.prosopoVerifyRouter(env));
174
- env.logger.info(() => ({ msg: "Enabling admin auth middleware" }));
175
- apiApp.use(
176
- "/v1/prosopo/provider/admin",
177
- apiExpressRouter.authMiddleware(env.pair, env.authAccount)
178
- );
179
- if (apiRuleRoutesProvider) {
180
- const userAccessRuleRoutes = apiRuleRoutesProvider.getRoutes();
181
- for (const userAccessRuleRoute in userAccessRuleRoutes) {
182
- apiApp.use(
183
- userAccessRuleRoute,
184
- apiExpressRouter.authMiddleware(env.pair, env.authAccount)
185
- );
186
- }
187
- for (const userAccessRuleRoute in userAccessRuleRoutes) {
188
- apiApp.use(userAccessRuleRoute, (req, res, next) => {
189
- if (req.method === "POST") {
190
- res.on("finish", () => {
191
- if (res.statusCode >= 200 && res.statusCode < 300) {
192
- blacklistRequestInspector.getVerdictCache().clear();
193
- }
194
- });
195
- }
196
- next();
197
- });
198
- }
199
- apiApp.use(
200
- apiExpressRouter.apiExpressRouterFactory.createRouter(
201
- apiRuleRoutesProvider,
202
- apiEndpointAdapter
203
- )
204
- );
205
- }
206
- if (apiAdminRoutesProvider) {
207
- apiApp.use(
208
- apiExpressRouter.apiExpressRouterFactory.createRouter(
209
- apiAdminRoutesProvider,
210
- // unlike the default one, it should have errorStatusCode as 400
211
- apiExpressRouter.createApiExpressDefaultEndpointAdapter(
212
- logger.parseLogLevel(env.config.logLevel),
213
- 400
214
- )
215
- )
216
- );
217
- }
218
- apiApp.use(block.blockMiddleware(env));
219
- apiApp.use("/v1/prosopo/provider/client/", domainMiddleware.domainMiddleware(env));
220
- apiApp.use(captcha.prosopoRouter(env));
221
- const useTls = fs.existsSync(keyPath) && fs.existsSync(crtPath);
222
- if (useTls) {
223
- env.logger.info(() => ({ msg: "Starting Provider API with HTTPS" }));
224
- const httpsOptions = {
225
- key: fs.readFileSync(keyPath),
226
- cert: fs.readFileSync(crtPath)
227
- };
228
- const httpsServer = https.createServer(httpsOptions, apiApp);
229
- return httpsServer.listen(apiPort, () => {
230
- env.logger.info(() => ({
231
- data: { apiPort, protocol: "https" },
232
- msg: "Prosopo app listening with HTTPS"
233
- }));
234
- });
235
- }
236
- return apiApp.listen(apiPort, () => {
237
- env.logger.info(() => ({
238
- data: { apiPort },
239
- msg: "Prosopo app listening"
240
- }));
241
- });
97
+ env.logger.info(() => ({ msg: "Starting Prosopo API" }));
98
+ const apiApp = (0, express.default)();
99
+ const apiPort = port || env.config.server?.port;
100
+ const apiEndpointAdapter = (0, _prosopo_api_express_router.createApiExpressDefaultEndpointAdapter)((0, _prosopo_logger.parseLogLevel)(env.config.logLevel));
101
+ let apiRuleRoutesProvider;
102
+ let apiAdminRoutesProvider;
103
+ try {
104
+ apiRuleRoutesProvider = new _prosopo_user_access_policy_api.AccessRuleApiRoutes(env.getDb().getUserAccessRulesStorage(), env.logger);
105
+ apiAdminRoutesProvider = require_createApiAdminRoutesProvider.createApiAdminRoutesProvider(env);
106
+ } catch (err) {
107
+ env.logger.warn(() => ({
108
+ msg: "Skipping admin/access-rule routes; DB unavailable",
109
+ err
110
+ }));
111
+ }
112
+ const clientPathsExcludingVerify = getClientApiPathsExpectingProsopoHeaders();
113
+ env.logger.debug(() => ({
114
+ msg: "Adding headerCheckMiddleware",
115
+ paths: clientPathsExcludingVerify
116
+ }));
117
+ apiApp.set("trust proxy", 1);
118
+ apiApp.use((0, cors.default)({
119
+ exposedHeaders: ["x-prosopo-meta"],
120
+ allowedHeaders: [
121
+ "Accept",
122
+ "Accept-Language",
123
+ "Authorization",
124
+ "Content-Language",
125
+ "Content-Type",
126
+ "Prosopo-Site-Key",
127
+ "Prosopo-User",
128
+ "x-prosopo-meta"
129
+ ],
130
+ maxAge: 86400
131
+ }));
132
+ apiApp.use(express.default.json({ limit: "1mb" }));
133
+ apiApp.use(require_public.publicRouter(env));
134
+ apiApp.use(require_metrics.metricsMiddleware());
135
+ if (!(process.env.NODE_ENV === "test" || env.config.defaultEnvironment === "development")) {
136
+ const rateLimits = {
137
+ ...env.config.rateLimits,
138
+ ...(0, _prosopo_user_access_policy_api.getExpressApiRuleRateLimits)()
139
+ };
140
+ const adminPaths = Object.values(_prosopo_types.AdminApiPaths);
141
+ const rateLimitHandler = (path) => (req, res, _next, options) => {
142
+ env.logger.warn(() => ({
143
+ msg: "Rate limit exceeded",
144
+ data: {
145
+ path,
146
+ ip: req.ip,
147
+ siteKey: req.headers["prosopo-site-key"]
148
+ }
149
+ }));
150
+ res.status(options.statusCode).send(options.message);
151
+ };
152
+ for (const [path, limit] of Object.entries(rateLimits)) {
153
+ const enumPath = path;
154
+ if (adminPaths.includes(enumPath)) apiApp.use(enumPath, (0, express_rate_limit.default)({
155
+ ...limit,
156
+ handler: rateLimitHandler(enumPath),
157
+ keyGenerator: (req) => {
158
+ return getUserFromJWT(req) || req.ip || "unknown";
159
+ }
160
+ }));
161
+ else if (path === _prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp || path === _prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution) apiApp.use(enumPath, (0, express_rate_limit.default)({
162
+ ...limit,
163
+ handler: rateLimitHandler(enumPath),
164
+ keyGenerator: (req) => {
165
+ return req.headers["prosopo-site-key"] || req.ip || "unknown";
166
+ }
167
+ }));
168
+ else apiApp.use(enumPath, (0, express_rate_limit.default)({
169
+ ...limit,
170
+ handler: rateLimitHandler(enumPath)
171
+ }));
172
+ }
173
+ }
174
+ const i18Middleware = await (0, _prosopo_locale.i18nMiddleware)({});
175
+ apiApp.use(require_robotsMiddleware.robotsMiddleware());
176
+ apiApp.use(require_ignoreMiddleware.ignoreMiddleware());
177
+ apiApp.use((0, _prosopo_api_express_router.requestLoggerMiddleware)(env));
178
+ apiApp.use(i18Middleware);
179
+ apiApp.use(require_ja4Middleware.ja4Middleware(env));
180
+ apiApp.use(require_handshakeTimingMiddleware.handshakeTimingMiddleware(env));
181
+ apiApp.use(require_ipInfoMiddleware.ipInfoMiddleware(env));
182
+ apiApp.use(clientPathsExcludingVerify, require_headerCheckMiddleware.headerCheckMiddleware(env));
183
+ apiApp.use(require_verify.prosopoVerifyRouter(env));
184
+ env.logger.info(() => ({ msg: "Enabling admin auth middleware" }));
185
+ apiApp.use("/v1/prosopo/provider/admin", (0, _prosopo_api_express_router.authMiddleware)(env.pair, env.authAccount));
186
+ if (apiRuleRoutesProvider) {
187
+ const userAccessRuleRoutes = apiRuleRoutesProvider.getRoutes();
188
+ for (const userAccessRuleRoute in userAccessRuleRoutes) apiApp.use(userAccessRuleRoute, (0, _prosopo_api_express_router.authMiddleware)(env.pair, env.authAccount));
189
+ for (const userAccessRuleRoute in userAccessRuleRoutes) apiApp.use(userAccessRuleRoute, (req, res, next) => {
190
+ if (req.method === "POST") res.on("finish", () => {
191
+ if (res.statusCode >= 200 && res.statusCode < 300) require_blacklistRequestInspector.getVerdictCache().clear();
192
+ });
193
+ next();
194
+ });
195
+ apiApp.use(_prosopo_api_express_router.apiExpressRouterFactory.createRouter(apiRuleRoutesProvider, apiEndpointAdapter));
196
+ }
197
+ if (apiAdminRoutesProvider) apiApp.use(_prosopo_api_express_router.apiExpressRouterFactory.createRouter(apiAdminRoutesProvider, (0, _prosopo_api_express_router.createApiExpressDefaultEndpointAdapter)((0, _prosopo_logger.parseLogLevel)(env.config.logLevel), 400)));
198
+ apiApp.use(require_block.blockMiddleware(env));
199
+ apiApp.use("/v1/prosopo/provider/client/", require_domainMiddleware.domainMiddleware(env));
200
+ apiApp.use(require_captcha.prosopoRouter(env));
201
+ if (node_fs.default.existsSync(keyPath) && node_fs.default.existsSync(crtPath)) {
202
+ env.logger.info(() => ({ msg: "Starting Provider API with HTTPS" }));
203
+ const httpsOptions = {
204
+ key: node_fs.default.readFileSync(keyPath),
205
+ cert: node_fs.default.readFileSync(crtPath)
206
+ };
207
+ return node_https.default.createServer(httpsOptions, apiApp).listen(apiPort, () => {
208
+ env.logger.info(() => ({
209
+ data: {
210
+ apiPort,
211
+ protocol: "https"
212
+ },
213
+ msg: "Prosopo app listening with HTTPS"
214
+ }));
215
+ });
216
+ }
217
+ return apiApp.listen(apiPort, () => {
218
+ env.logger.info(() => ({
219
+ data: { apiPort },
220
+ msg: "Prosopo app listening"
221
+ }));
222
+ });
242
223
  }
224
+ //#endregion
243
225
  exports.getClientApiPathsExpectingProsopoHeaders = getClientApiPathsExpectingProsopoHeaders;
244
226
  exports.getUserFromJWT = getUserFromJWT;
245
227
  exports.isTlsAvailable = isTlsAvailable;
@@ -1,17 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const types = require("@prosopo/types");
4
- const isReservedTestSiteKey = (siteKey) => types.getTestSiteKeyMode(siteKey) !== null;
5
- const resolveTestSiteKeyVerdict = (siteKey, logger) => {
6
- const mode = types.getTestSiteKeyMode(siteKey);
7
- if (mode === null) {
8
- return null;
9
- }
10
- logger?.warn(() => ({
11
- msg: "Reserved TEST site key - forcing deterministic captcha verdict",
12
- data: { siteKey, mode }
13
- }));
14
- return mode === types.TestSiteKeyMode.Pass;
1
+ let _prosopo_types = require("@prosopo/types");
2
+ //#region src/api/testSiteKey.ts
3
+ var isReservedTestSiteKey = (siteKey) => (0, _prosopo_types.getTestSiteKeyMode)(siteKey) !== null;
4
+ var resolveTestSiteKeyVerdict = (siteKey, logger) => {
5
+ const mode = (0, _prosopo_types.getTestSiteKeyMode)(siteKey);
6
+ if (mode === null) return null;
7
+ logger?.warn(() => ({
8
+ msg: "Reserved TEST site key - forcing deterministic captcha verdict",
9
+ data: {
10
+ siteKey,
11
+ mode
12
+ }
13
+ }));
14
+ return mode === _prosopo_types.TestSiteKeyMode.Pass;
15
15
  };
16
+ //#endregion
16
17
  exports.isReservedTestSiteKey = isReservedTestSiteKey;
17
18
  exports.resolveTestSiteKeyVerdict = resolveTestSiteKeyVerdict;
@@ -1,25 +1,28 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const common = require("@prosopo/common");
4
- const utilCrypto = require("@prosopo/util-crypto");
5
- const validateSiteKey = (siteKey, logger) => {
6
- return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
1
+ let _prosopo_common = require("@prosopo/common");
2
+ let _prosopo_util_crypto = require("@prosopo/util-crypto");
3
+ //#region src/api/validateAddress.ts
4
+ var validateSiteKey = (siteKey, logger) => {
5
+ return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
7
6
  };
8
- const validateAddr = (address, translationKey = "CONTRACT.INVALID_ADDRESS", logger) => {
9
- try {
10
- const valid = utilCrypto.validateAddress(address, false, 42);
11
- if (!valid) {
12
- throw new common.ProsopoApiError(translationKey, {
13
- context: { code: 400, siteKey: address },
14
- logger
15
- });
16
- }
17
- } catch (err) {
18
- throw new common.ProsopoApiError(translationKey, {
19
- context: { code: 400, siteKey: address },
20
- logger
21
- });
22
- }
7
+ var validateAddr = (address, translationKey = "CONTRACT.INVALID_ADDRESS", logger) => {
8
+ try {
9
+ if (!(0, _prosopo_util_crypto.validateAddress)(address, false, 42)) throw new _prosopo_common.ProsopoApiError(translationKey, {
10
+ context: {
11
+ code: 400,
12
+ siteKey: address
13
+ },
14
+ logger
15
+ });
16
+ } catch (err) {
17
+ throw new _prosopo_common.ProsopoApiError(translationKey, {
18
+ context: {
19
+ code: 400,
20
+ siteKey: address
21
+ },
22
+ logger
23
+ });
24
+ }
23
25
  };
26
+ //#endregion
24
27
  exports.validateAddr = validateAddr;
25
28
  exports.validateSiteKey = validateSiteKey;