@prosopo/provider 3.2.0 → 3.2.2

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 (233) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/api/admin/apiAdminRoutesProvider.js +26 -21
  3. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +21 -20
  4. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +27 -27
  5. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +33 -33
  6. package/dist/api/admin/createApiAdminRoutesProvider.js +8 -5
  7. package/dist/api/blacklistRequestInspector.js +115 -98
  8. package/dist/api/block.js +13 -8
  9. package/dist/api/captcha.js +519 -356
  10. package/dist/api/domainMiddleware.js +75 -68
  11. package/dist/api/headerCheckMiddleware.js +26 -25
  12. package/dist/api/ignoreMiddleware.js +12 -10
  13. package/dist/api/ja4Middleware.js +74 -82
  14. package/dist/api/public.js +26 -23
  15. package/dist/api/robotsMiddleware.js +11 -9
  16. package/dist/api/validateAddress.js +20 -18
  17. package/dist/api/verify.js +133 -95
  18. package/dist/cjs/api/captcha.cjs +45 -36
  19. package/dist/cjs/tasks/captchaManager.cjs +24 -10
  20. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +12 -12
  21. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +1 -1
  22. package/dist/index.js +38 -15
  23. package/dist/rules/lang.js +14 -14
  24. package/dist/schedulers/captchaScheduler.js +28 -23
  25. package/dist/schedulers/getClientList.js +29 -24
  26. package/dist/tasks/captchaManager.js +109 -85
  27. package/dist/tasks/client/clientTasks.js +265 -204
  28. package/dist/tasks/dataset/datasetTasks.js +27 -16
  29. package/dist/tasks/dataset/datasetTasksUtils.js +31 -31
  30. package/dist/tasks/detection/decodePayload.js +378 -208
  31. package/dist/tasks/detection/getBotScore.js +12 -10
  32. package/dist/tasks/frictionless/frictionlessTasks.js +120 -119
  33. package/dist/tasks/frictionless/frictionlessTasksUtils.js +10 -5
  34. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +360 -271
  35. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +23 -16
  36. package/dist/tasks/index.js +4 -2
  37. package/dist/tasks/powCaptcha/powTasks.js +157 -97
  38. package/dist/tasks/powCaptcha/powTasksUtils.js +24 -20
  39. package/dist/tasks/tasks.js +53 -29
  40. package/dist/util.js +98 -88
  41. package/package.json +31 -27
  42. package/vite.cjs.config.ts +4 -1
  43. package/vite.esm.config.ts +20 -0
  44. package/vite.test.config.ts +15 -3
  45. package/dist/api/admin/apiAdminRoutesProvider.d.ts +0 -9
  46. package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +0 -1
  47. package/dist/api/admin/apiAdminRoutesProvider.js.map +0 -1
  48. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +0 -14
  49. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +0 -1
  50. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +0 -1
  51. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +0 -14
  52. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +0 -1
  53. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +0 -1
  54. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +0 -14
  55. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +0 -1
  56. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +0 -1
  57. package/dist/api/admin/createApiAdminRoutesProvider.d.ts +0 -4
  58. package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +0 -1
  59. package/dist/api/admin/createApiAdminRoutesProvider.js.map +0 -1
  60. package/dist/api/blacklistRequestInspector.d.ts +0 -39
  61. package/dist/api/blacklistRequestInspector.d.ts.map +0 -1
  62. package/dist/api/blacklistRequestInspector.js.map +0 -1
  63. package/dist/api/block.d.ts +0 -3
  64. package/dist/api/block.d.ts.map +0 -1
  65. package/dist/api/block.js.map +0 -1
  66. package/dist/api/captcha.d.ts +0 -4
  67. package/dist/api/captcha.d.ts.map +0 -1
  68. package/dist/api/captcha.js.map +0 -1
  69. package/dist/api/domainMiddleware.d.ts +0 -4
  70. package/dist/api/domainMiddleware.d.ts.map +0 -1
  71. package/dist/api/domainMiddleware.js.map +0 -1
  72. package/dist/api/headerCheckMiddleware.d.ts +0 -4
  73. package/dist/api/headerCheckMiddleware.d.ts.map +0 -1
  74. package/dist/api/headerCheckMiddleware.js.map +0 -1
  75. package/dist/api/ignoreMiddleware.d.ts +0 -3
  76. package/dist/api/ignoreMiddleware.d.ts.map +0 -1
  77. package/dist/api/ignoreMiddleware.js.map +0 -1
  78. package/dist/api/ja4Middleware.d.ts +0 -10
  79. package/dist/api/ja4Middleware.d.ts.map +0 -1
  80. package/dist/api/ja4Middleware.js.map +0 -1
  81. package/dist/api/public.d.ts +0 -3
  82. package/dist/api/public.d.ts.map +0 -1
  83. package/dist/api/public.js.map +0 -1
  84. package/dist/api/robotsMiddleware.d.ts +0 -3
  85. package/dist/api/robotsMiddleware.d.ts.map +0 -1
  86. package/dist/api/robotsMiddleware.js.map +0 -1
  87. package/dist/api/validateAddress.d.ts +0 -5
  88. package/dist/api/validateAddress.d.ts.map +0 -1
  89. package/dist/api/validateAddress.js.map +0 -1
  90. package/dist/api/verify.d.ts +0 -4
  91. package/dist/api/verify.d.ts.map +0 -1
  92. package/dist/api/verify.js.map +0 -1
  93. package/dist/index.d.ts +0 -15
  94. package/dist/index.d.ts.map +0 -1
  95. package/dist/index.js.map +0 -1
  96. package/dist/rules/lang.d.ts +0 -3
  97. package/dist/rules/lang.d.ts.map +0 -1
  98. package/dist/rules/lang.js.map +0 -1
  99. package/dist/schedulers/captchaScheduler.d.ts +0 -4
  100. package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
  101. package/dist/schedulers/captchaScheduler.js.map +0 -1
  102. package/dist/schedulers/getClientList.d.ts +0 -4
  103. package/dist/schedulers/getClientList.d.ts.map +0 -1
  104. package/dist/schedulers/getClientList.js.map +0 -1
  105. package/dist/tasks/captchaManager.d.ts +0 -48
  106. package/dist/tasks/captchaManager.d.ts.map +0 -1
  107. package/dist/tasks/captchaManager.js.map +0 -1
  108. package/dist/tasks/client/clientTasks.d.ts +0 -21
  109. package/dist/tasks/client/clientTasks.d.ts.map +0 -1
  110. package/dist/tasks/client/clientTasks.js.map +0 -1
  111. package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
  112. package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
  113. package/dist/tasks/dataset/datasetTasks.js.map +0 -1
  114. package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
  115. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
  116. package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
  117. package/dist/tasks/detection/decodePayload.d.ts +0 -5
  118. package/dist/tasks/detection/decodePayload.d.ts.map +0 -1
  119. package/dist/tasks/detection/decodePayload.js.map +0 -1
  120. package/dist/tasks/detection/getBotScore.d.ts +0 -5
  121. package/dist/tasks/detection/getBotScore.d.ts.map +0 -1
  122. package/dist/tasks/detection/getBotScore.js.map +0 -1
  123. package/dist/tasks/frictionless/frictionlessTasks.d.ts +0 -23
  124. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +0 -1
  125. package/dist/tasks/frictionless/frictionlessTasks.js.map +0 -1
  126. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +0 -5
  127. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +0 -1
  128. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +0 -1
  129. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -29
  130. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
  131. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
  132. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
  133. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
  134. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
  135. package/dist/tasks/index.d.ts +0 -2
  136. package/dist/tasks/index.d.ts.map +0 -1
  137. package/dist/tasks/index.js.map +0 -1
  138. package/dist/tasks/powCaptcha/powTasks.d.ts +0 -16
  139. package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
  140. package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
  141. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
  142. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
  143. package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
  144. package/dist/tasks/tasks.d.ts +0 -25
  145. package/dist/tasks/tasks.d.ts.map +0 -1
  146. package/dist/tasks/tasks.js.map +0 -1
  147. package/dist/tests/index.d.ts +0 -2
  148. package/dist/tests/index.d.ts.map +0 -1
  149. package/dist/tests/index.js +0 -2
  150. package/dist/tests/index.js.map +0 -1
  151. package/dist/tests/integration/accessRules.integration.test.d.ts +0 -2
  152. package/dist/tests/integration/accessRules.integration.test.d.ts.map +0 -1
  153. package/dist/tests/integration/accessRules.integration.test.js +0 -164
  154. package/dist/tests/integration/accessRules.integration.test.js.map +0 -1
  155. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
  156. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
  157. package/dist/tests/integration/imgCaptcha.integration.test.js +0 -261
  158. package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
  159. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
  160. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
  161. package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
  162. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
  163. package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
  164. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
  165. package/dist/tests/integration/powCaptcha.integration.test.js +0 -306
  166. package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
  167. package/dist/tests/integration/registerSitekey.d.ts +0 -3
  168. package/dist/tests/integration/registerSitekey.d.ts.map +0 -1
  169. package/dist/tests/integration/registerSitekey.js +0 -39
  170. package/dist/tests/integration/registerSitekey.js.map +0 -1
  171. package/dist/tests/integration/userAccessPolicy.d.ts +0 -16
  172. package/dist/tests/integration/userAccessPolicy.d.ts.map +0 -1
  173. package/dist/tests/integration/userAccessPolicy.js +0 -55
  174. package/dist/tests/integration/userAccessPolicy.js.map +0 -1
  175. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +0 -2
  176. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +0 -1
  177. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +0 -43
  178. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +0 -1
  179. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +0 -2
  180. package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +0 -1
  181. package/dist/tests/unit/api/ja4Middleware.unit.test.js +0 -71
  182. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +0 -1
  183. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
  184. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
  185. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -75
  186. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
  187. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +0 -2
  188. package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +0 -1
  189. package/dist/tests/unit/tasks/captchaManager.unit.test.js +0 -236
  190. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +0 -1
  191. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
  192. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
  193. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -277
  194. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
  195. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
  196. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
  197. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -93
  198. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
  199. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
  200. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
  201. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
  202. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
  203. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +0 -2
  204. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +0 -1
  205. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +0 -68
  206. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +0 -1
  207. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +0 -2
  208. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +0 -1
  209. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +0 -37
  210. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +0 -1
  211. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
  212. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
  213. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -402
  214. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
  215. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
  216. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
  217. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
  218. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
  219. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
  220. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
  221. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -228
  222. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
  223. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
  224. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
  225. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -68
  226. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
  227. package/dist/tests/unit/util.unit.test.d.ts +0 -2
  228. package/dist/tests/unit/util.unit.test.d.ts.map +0 -1
  229. package/dist/tests/unit/util.unit.test.js +0 -148
  230. package/dist/tests/unit/util.unit.test.js.map +0 -1
  231. package/dist/util.d.ts +0 -13
  232. package/dist/util.d.ts.map +0 -1
  233. package/dist/util.js.map +0 -1
@@ -1,228 +1,289 @@
1
1
  import { createPrivateKey } from "node:crypto";
2
2
  import { ProsopoApiError } from "@prosopo/common";
3
3
  import { CaptchaDatabase, ClientDatabase } from "@prosopo/database";
4
- import { ScheduledTaskNames, ScheduledTaskStatus, } from "@prosopo/types";
4
+ import { ScheduledTaskNames, ScheduledTaskStatus } from "@prosopo/types";
5
5
  import { parseUrl } from "@prosopo/util";
6
6
  import { validateSiteKey } from "../../api/validateAddress.js";
7
7
  const isValidPrivateKey = (privateKeyString) => {
8
- const privateKey = Buffer.from(privateKeyString, "base64").toString("ascii");
9
- try {
10
- createPrivateKey({
11
- key: privateKey,
12
- format: "pem",
13
- type: "pkcs8",
14
- });
15
- return true;
8
+ const privateKey = Buffer.from(privateKeyString, "base64").toString("ascii");
9
+ try {
10
+ createPrivateKey({
11
+ key: privateKey,
12
+ format: "pem",
13
+ type: "pkcs8"
14
+ });
15
+ return true;
16
+ } catch (error) {
17
+ return false;
18
+ }
19
+ };
20
+ class ClientTaskManager {
21
+ constructor(config, logger, db) {
22
+ this.config = config;
23
+ this.logger = logger;
24
+ this.providerDB = db;
25
+ }
26
+ /**
27
+ * @description Get the captcha database connection or create a new one
28
+ * @returns CaptchaDatabase
29
+ */
30
+ getCaptchaDB(mongoCaptchaUri) {
31
+ if (this.captchaDB) {
32
+ return this.captchaDB;
16
33
  }
17
- catch (error) {
18
- return false;
34
+ if (!this.captchaDB) {
35
+ this.captchaDB = new CaptchaDatabase(
36
+ mongoCaptchaUri,
37
+ void 0,
38
+ void 0,
39
+ this.logger
40
+ );
19
41
  }
20
- };
21
- export class ClientTaskManager {
22
- constructor(config, logger, db) {
23
- this.config = config;
24
- this.logger = logger;
25
- this.providerDB = db;
42
+ return this.captchaDB;
43
+ }
44
+ /**
45
+ * @description Store commitments externally in the database (Sends image captcha data to the big Mongo Cloud DB)
46
+ * @returns Promise<void>
47
+ */
48
+ async storeCommitmentsExternal() {
49
+ if (!this.config.mongoCaptchaUri) {
50
+ this.logger.info(() => ({ msg: "Mongo env not set" }));
51
+ return;
26
52
  }
27
- getCaptchaDB(mongoCaptchaUri) {
28
- if (this.captchaDB) {
29
- return this.captchaDB;
53
+ const lastTask = await this.providerDB.getLastScheduledTaskStatus(
54
+ ScheduledTaskNames.StoreCommitmentsExternal,
55
+ ScheduledTaskStatus.Completed
56
+ );
57
+ const taskID = await this.providerDB.createScheduledTaskStatus(
58
+ ScheduledTaskNames.StoreCommitmentsExternal,
59
+ ScheduledTaskStatus.Running
60
+ );
61
+ try {
62
+ const BATCH_SIZE = 1e3;
63
+ const captchaDB = this.getCaptchaDB(this.config.mongoCaptchaUri);
64
+ let processedCommitments = 0;
65
+ await this.processBatchesWithCursor(
66
+ async (skip) => await this.providerDB.getUnstoredDappUserCommitments(
67
+ BATCH_SIZE,
68
+ skip
69
+ ),
70
+ async (batch) => {
71
+ const filteredBatch = lastTask?.updated ? batch.filter((commitment) => this.isRecordUpdated(commitment)) : batch;
72
+ if (filteredBatch.length > 0) {
73
+ await captchaDB.saveCaptchas([], filteredBatch, []);
74
+ await this.providerDB.markDappUserCommitmentsStored(
75
+ filteredBatch.map((commitment) => commitment.id)
76
+ );
77
+ }
78
+ processedCommitments += filteredBatch.length;
30
79
  }
31
- if (!this.captchaDB) {
32
- this.captchaDB = new CaptchaDatabase(mongoCaptchaUri, undefined, undefined, this.logger);
80
+ );
81
+ let processedPowRecords = 0;
82
+ await this.processBatchesWithCursor(
83
+ async (skip) => await this.providerDB.getUnstoredDappUserPoWCommitments(
84
+ BATCH_SIZE,
85
+ skip
86
+ ),
87
+ async (batch) => {
88
+ const filteredBatch = lastTask?.updated ? batch.filter((record) => this.isRecordUpdated(record)) : batch;
89
+ if (filteredBatch.length > 0) {
90
+ await captchaDB.saveCaptchas([], [], filteredBatch);
91
+ await this.providerDB.markDappUserPoWCommitmentsStored(
92
+ filteredBatch.map((record) => record.challenge)
93
+ );
94
+ }
95
+ processedPowRecords += filteredBatch.length;
33
96
  }
34
- return this.captchaDB;
35
- }
36
- async storeCommitmentsExternal() {
37
- if (!this.config.mongoCaptchaUri) {
38
- this.logger.info(() => ({ msg: "Mongo env not set" }));
39
- return;
40
- }
41
- const lastTask = await this.providerDB.getLastScheduledTaskStatus(ScheduledTaskNames.StoreCommitmentsExternal, ScheduledTaskStatus.Completed);
42
- const taskID = await this.providerDB.createScheduledTaskStatus(ScheduledTaskNames.StoreCommitmentsExternal, ScheduledTaskStatus.Running);
43
- try {
44
- const BATCH_SIZE = 1000;
45
- const captchaDB = this.getCaptchaDB(this.config.mongoCaptchaUri);
46
- let processedCommitments = 0;
47
- await this.processBatchesWithCursor(async (skip) => await this.providerDB.getUnstoredDappUserCommitments(BATCH_SIZE, skip), async (batch) => {
48
- const filteredBatch = lastTask?.updated
49
- ? batch.filter((commitment) => this.isRecordUpdated(commitment))
50
- : batch;
51
- if (filteredBatch.length > 0) {
52
- await captchaDB.saveCaptchas([], filteredBatch, []);
53
- await this.providerDB.markDappUserCommitmentsStored(filteredBatch.map((commitment) => commitment.id));
54
- }
55
- processedCommitments += filteredBatch.length;
56
- });
57
- let processedPowRecords = 0;
58
- await this.processBatchesWithCursor(async (skip) => await this.providerDB.getUnstoredDappUserPoWCommitments(BATCH_SIZE, skip), async (batch) => {
59
- const filteredBatch = lastTask?.updated
60
- ? batch.filter((record) => this.isRecordUpdated(record))
61
- : batch;
62
- if (filteredBatch.length > 0) {
63
- await captchaDB.saveCaptchas([], [], filteredBatch);
64
- await this.providerDB.markDappUserPoWCommitmentsStored(filteredBatch.map((record) => record.challenge));
65
- }
66
- processedPowRecords += filteredBatch.length;
67
- });
68
- let processedSessionRecords = 0;
69
- await this.processBatchesWithCursor(async (skip) => await this.providerDB.getUnstoredSessionRecords(BATCH_SIZE, skip), async (batch) => {
70
- const filteredBatch = lastTask?.updated
71
- ? batch.filter((record) => this.isRecordUpdated(record))
72
- : batch;
73
- const frictionlessTokenRecords = await this.providerDB.getFrictionlessTokenRecordsByTokenIds(filteredBatch.map((record) => record.tokenId));
74
- this.logger.info(() => ({
75
- msg: `Frictionless token records: ${frictionlessTokenRecords.length}`,
76
- }));
77
- const filteredBatchWithScores = filteredBatch.map((record) => {
78
- const tokenRecord = frictionlessTokenRecords.find((tokenRecord) => tokenRecord._id?.toString() === record.tokenId.toString());
79
- if (!tokenRecord) {
80
- this.logger.error(() => ({
81
- msg: "No token record found",
82
- data: { tokenId: record.tokenId },
83
- }));
84
- return {
85
- ...record,
86
- score: 0,
87
- scoreComponents: {
88
- baseScore: 0,
89
- },
90
- threshold: 0,
91
- };
92
- }
93
- return {
94
- ...record,
95
- score: tokenRecord?.score || 0,
96
- scoreComponents: tokenRecord?.scoreComponents,
97
- threshold: tokenRecord?.threshold || 0,
98
- };
99
- });
100
- if (filteredBatch.length > 0) {
101
- await captchaDB.saveCaptchas(filteredBatchWithScores, [], []);
102
- await this.providerDB.markSessionRecordsStored(filteredBatch.map((record) => record.sessionId));
103
- }
104
- processedSessionRecords += filteredBatch.length;
105
- });
106
- await this.providerDB.updateScheduledTaskStatus(taskID, ScheduledTaskStatus.Completed, {
107
- data: {
108
- processedSessionRecords,
109
- processedCommitments,
110
- processedPowRecords,
97
+ );
98
+ let processedSessionRecords = 0;
99
+ await this.processBatchesWithCursor(
100
+ async (skip) => await this.providerDB.getUnstoredSessionRecords(BATCH_SIZE, skip),
101
+ async (batch) => {
102
+ const filteredBatch = lastTask?.updated ? batch.filter((record) => this.isRecordUpdated(record)) : batch;
103
+ const frictionlessTokenRecords = await this.providerDB.getFrictionlessTokenRecordsByTokenIds(
104
+ filteredBatch.map((record) => record.tokenId)
105
+ );
106
+ this.logger.info(() => ({
107
+ msg: `Frictionless token records: ${frictionlessTokenRecords.length}`
108
+ }));
109
+ const filteredBatchWithScores = filteredBatch.map((record) => {
110
+ const tokenRecord = frictionlessTokenRecords.find(
111
+ (tokenRecord2) => tokenRecord2._id?.toString() === record.tokenId.toString()
112
+ );
113
+ if (!tokenRecord) {
114
+ this.logger.error(() => ({
115
+ msg: "No token record found",
116
+ data: { tokenId: record.tokenId }
117
+ }));
118
+ return {
119
+ ...record,
120
+ score: 0,
121
+ scoreComponents: {
122
+ baseScore: 0
111
123
  },
112
- });
113
- this.captchaDB?.close();
114
- }
115
- catch (e) {
116
- this.logger.error(() => ({
117
- err: e,
118
- msg: "Error processing client tasks",
119
- }));
120
- this.captchaDB?.close();
121
- await this.providerDB.updateScheduledTaskStatus(taskID, ScheduledTaskStatus.Failed, { error: String(e) });
122
- }
123
- }
124
- async getClientList() {
125
- if (!this.config.mongoClientUri) {
126
- this.logger.info(() => ({ msg: "Mongo env not set" }));
127
- return;
128
- }
129
- const lastTask = await this.providerDB.getLastScheduledTaskStatus(ScheduledTaskNames.GetClientList, ScheduledTaskStatus.Completed);
130
- const taskID = await this.providerDB.createScheduledTaskStatus(ScheduledTaskNames.GetClientList, ScheduledTaskStatus.Running);
131
- try {
132
- const clientDB = new ClientDatabase(this.config.mongoClientUri, undefined, undefined, this.logger);
133
- const tenMinuteWindow = 10 * 60 * 1000;
134
- const updatedAtTimestamp = lastTask?.updated
135
- ? lastTask.updated - tenMinuteWindow || 0
136
- : 0;
137
- this.logger.info(() => ({
138
- msg: `Getting updated client records since ${new Date(updatedAtTimestamp).toDateString()}`,
139
- }));
140
- const newClientRecords = await clientDB.getUpdatedClients(updatedAtTimestamp);
141
- if (newClientRecords) {
142
- await this.providerDB.updateClientRecords(newClientRecords);
124
+ threshold: 0
125
+ };
143
126
  }
144
- await this.providerDB.updateScheduledTaskStatus(taskID, ScheduledTaskStatus.Completed, {
145
- data: {
146
- clientRecords: newClientRecords.length,
147
- },
148
- });
127
+ return {
128
+ ...record,
129
+ score: tokenRecord?.score || 0,
130
+ scoreComponents: tokenRecord?.scoreComponents,
131
+ threshold: tokenRecord?.threshold || 0
132
+ };
133
+ });
134
+ if (filteredBatch.length > 0) {
135
+ await captchaDB.saveCaptchas(filteredBatchWithScores, [], []);
136
+ await this.providerDB.markSessionRecordsStored(
137
+ filteredBatch.map((record) => record.sessionId)
138
+ );
139
+ }
140
+ processedSessionRecords += filteredBatch.length;
149
141
  }
150
- catch (e) {
151
- const getClientListError = new ProsopoApiError("DATABASE.UNKNOWN", {
152
- context: { error: e },
153
- logger: this.logger,
154
- });
155
- this.logger.error(() => ({
156
- err: getClientListError,
157
- msg: "Error getting client list",
158
- }));
159
- await this.providerDB.updateScheduledTaskStatus(taskID, ScheduledTaskStatus.Failed, { error: String(e) });
142
+ );
143
+ await this.providerDB.updateScheduledTaskStatus(
144
+ taskID,
145
+ ScheduledTaskStatus.Completed,
146
+ {
147
+ data: {
148
+ processedSessionRecords,
149
+ processedCommitments,
150
+ processedPowRecords
151
+ }
160
152
  }
153
+ );
154
+ this.captchaDB?.close();
155
+ } catch (e) {
156
+ this.logger.error(() => ({
157
+ err: e,
158
+ msg: "Error processing client tasks"
159
+ }));
160
+ this.captchaDB?.close();
161
+ await this.providerDB.updateScheduledTaskStatus(
162
+ taskID,
163
+ ScheduledTaskStatus.Failed,
164
+ { error: String(e) }
165
+ );
161
166
  }
162
- async registerSiteKey(siteKey, tier, settings) {
163
- validateSiteKey(siteKey);
164
- await this.providerDB.updateClientRecords([
165
- {
166
- account: siteKey,
167
- tier: tier,
168
- settings: settings,
169
- },
170
- ]);
167
+ }
168
+ /**
169
+ * @description Get a list of client accounts and their settings from the client database
170
+ * @returns Promise<void>
171
+ */
172
+ async getClientList() {
173
+ if (!this.config.mongoClientUri) {
174
+ this.logger.info(() => ({ msg: "Mongo env not set" }));
175
+ return;
171
176
  }
172
- async updateDetectorKey(detectorKey) {
173
- if (!isValidPrivateKey(detectorKey)) {
174
- throw new ProsopoApiError("INVALID_DETECTOR_KEY", {
175
- context: { detectorKey },
176
- logger: this.logger,
177
- });
177
+ const lastTask = await this.providerDB.getLastScheduledTaskStatus(
178
+ ScheduledTaskNames.GetClientList,
179
+ ScheduledTaskStatus.Completed
180
+ );
181
+ const taskID = await this.providerDB.createScheduledTaskStatus(
182
+ ScheduledTaskNames.GetClientList,
183
+ ScheduledTaskStatus.Running
184
+ );
185
+ try {
186
+ const clientDB = new ClientDatabase(
187
+ this.config.mongoClientUri,
188
+ void 0,
189
+ // expected to come from URI
190
+ void 0,
191
+ // expected to come from URI
192
+ this.logger
193
+ );
194
+ const tenMinuteWindow = 10 * 60 * 1e3;
195
+ const updatedAtTimestamp = lastTask?.updated ? lastTask.updated - tenMinuteWindow || 0 : 0;
196
+ this.logger.info(() => ({
197
+ msg: `Getting updated client records since ${new Date(updatedAtTimestamp).toDateString()}`
198
+ }));
199
+ const newClientRecords = await clientDB.getUpdatedClients(updatedAtTimestamp);
200
+ if (newClientRecords) {
201
+ await this.providerDB.updateClientRecords(newClientRecords);
202
+ }
203
+ await this.providerDB.updateScheduledTaskStatus(
204
+ taskID,
205
+ ScheduledTaskStatus.Completed,
206
+ {
207
+ data: {
208
+ clientRecords: newClientRecords.length
209
+ }
178
210
  }
179
- await this.providerDB.storeDetectorKey(detectorKey);
180
- const activeDetectorKeys = await this.providerDB.getDetectorKeys();
181
- return activeDetectorKeys;
211
+ );
212
+ } catch (e) {
213
+ const getClientListError = new ProsopoApiError("DATABASE.UNKNOWN", {
214
+ context: { error: e },
215
+ logger: this.logger
216
+ });
217
+ this.logger.error(() => ({
218
+ err: getClientListError,
219
+ msg: "Error getting client list"
220
+ }));
221
+ await this.providerDB.updateScheduledTaskStatus(
222
+ taskID,
223
+ ScheduledTaskStatus.Failed,
224
+ { error: String(e) }
225
+ );
182
226
  }
183
- async removeDetectorKey(detectorKey) {
184
- if (!isValidPrivateKey(detectorKey)) {
185
- throw new ProsopoApiError("INVALID_DETECTOR_KEY", {
186
- context: { detectorKey },
187
- logger: this.logger,
188
- });
189
- }
190
- await this.providerDB.removeDetectorKey(detectorKey);
227
+ }
228
+ async registerSiteKey(siteKey, tier, settings) {
229
+ validateSiteKey(siteKey);
230
+ await this.providerDB.updateClientRecords([
231
+ {
232
+ account: siteKey,
233
+ tier,
234
+ settings
235
+ }
236
+ ]);
237
+ }
238
+ async updateDetectorKey(detectorKey) {
239
+ if (!isValidPrivateKey(detectorKey)) {
240
+ throw new ProsopoApiError("INVALID_DETECTOR_KEY", {
241
+ context: { detectorKey },
242
+ logger: this.logger
243
+ });
191
244
  }
192
- isSubdomainOrExactMatch(referrer, clientDomain) {
193
- if (!referrer || !clientDomain)
194
- return false;
195
- if (clientDomain === "*")
196
- return true;
197
- try {
198
- const referrerDomain = parseUrl(referrer).hostname.replace(/\.$/, "");
199
- const allowedDomain = parseUrl(clientDomain).hostname.replace(/\.$/, "");
200
- return (referrerDomain === allowedDomain ||
201
- referrerDomain.endsWith(`.${allowedDomain}`));
202
- }
203
- catch {
204
- this.logger.error(() => ({
205
- msg: "Error in isSubdomainOrExactMatch",
206
- data: { referrer, clientDomain },
207
- }));
208
- return false;
209
- }
245
+ await this.providerDB.storeDetectorKey(detectorKey);
246
+ const activeDetectorKeys = await this.providerDB.getDetectorKeys();
247
+ return activeDetectorKeys;
248
+ }
249
+ async removeDetectorKey(detectorKey) {
250
+ if (!isValidPrivateKey(detectorKey)) {
251
+ throw new ProsopoApiError("INVALID_DETECTOR_KEY", {
252
+ context: { detectorKey },
253
+ logger: this.logger
254
+ });
210
255
  }
211
- isRecordUpdated(record) {
212
- const { lastUpdatedTimestamp, storedAtTimestamp } = record;
213
- return (!lastUpdatedTimestamp ||
214
- !storedAtTimestamp ||
215
- lastUpdatedTimestamp > storedAtTimestamp);
256
+ await this.providerDB.removeDetectorKey(detectorKey);
257
+ }
258
+ isSubdomainOrExactMatch(referrer, clientDomain) {
259
+ if (!referrer || !clientDomain) return false;
260
+ if (clientDomain === "*") return true;
261
+ try {
262
+ const referrerDomain = parseUrl(referrer).hostname.replace(/\.$/, "");
263
+ const allowedDomain = parseUrl(clientDomain).hostname.replace(/\.$/, "");
264
+ return referrerDomain === allowedDomain || referrerDomain.endsWith(`.${allowedDomain}`);
265
+ } catch {
266
+ this.logger.error(() => ({
267
+ msg: "Error in isSubdomainOrExactMatch",
268
+ data: { referrer, clientDomain }
269
+ }));
270
+ return false;
216
271
  }
217
- async processBatchesWithCursor(fetchBatch, processBatch) {
218
- let skip = 0;
219
- while (true) {
220
- const batch = await fetchBatch(skip);
221
- if (!batch.length)
222
- break;
223
- await processBatch(batch);
224
- skip += batch.length;
225
- }
272
+ }
273
+ isRecordUpdated(record) {
274
+ const { lastUpdatedTimestamp, storedAtTimestamp } = record;
275
+ return !lastUpdatedTimestamp || !storedAtTimestamp || lastUpdatedTimestamp > storedAtTimestamp;
276
+ }
277
+ async processBatchesWithCursor(fetchBatch, processBatch) {
278
+ let skip = 0;
279
+ while (true) {
280
+ const batch = await fetchBatch(skip);
281
+ if (!batch.length) break;
282
+ await processBatch(batch);
283
+ skip += batch.length;
226
284
  }
285
+ }
227
286
  }
228
- //# sourceMappingURL=clientTasks.js.map
287
+ export {
288
+ ClientTaskManager
289
+ };
@@ -1,19 +1,30 @@
1
1
  import { parseCaptchaDataset } from "@prosopo/datasets";
2
2
  import { providerValidateDataset } from "./datasetTasksUtils.js";
3
- export class DatasetManager {
4
- constructor(config, logger, captchaConfig, db) {
5
- this.config = config;
6
- this.logger = logger;
7
- this.captchaConfig = captchaConfig;
8
- this.db = db;
9
- }
10
- async providerSetDatasetFromFile(file) {
11
- const datasetRaw = parseCaptchaDataset(file);
12
- return await this.providerSetDataset(datasetRaw);
13
- }
14
- async providerSetDataset(datasetRaw) {
15
- const dataset = await providerValidateDataset(datasetRaw, this.captchaConfig.solved.count, this.captchaConfig.unsolved.count);
16
- await this.db?.storeDataset(dataset);
17
- }
3
+ class DatasetManager {
4
+ constructor(config, logger, captchaConfig, db) {
5
+ this.config = config;
6
+ this.logger = logger;
7
+ this.captchaConfig = captchaConfig;
8
+ this.db = db;
9
+ }
10
+ /**
11
+ * @description Set the provider dataset from a file
12
+ *
13
+ * @param file JSON of the captcha dataset
14
+ */
15
+ async providerSetDatasetFromFile(file) {
16
+ const datasetRaw = parseCaptchaDataset(file);
17
+ return await this.providerSetDataset(datasetRaw);
18
+ }
19
+ async providerSetDataset(datasetRaw) {
20
+ const dataset = await providerValidateDataset(
21
+ datasetRaw,
22
+ this.captchaConfig.solved.count,
23
+ this.captchaConfig.unsolved.count
24
+ );
25
+ await this.db?.storeDataset(dataset);
26
+ }
18
27
  }
19
- //# sourceMappingURL=datasetTasks.js.map
28
+ export {
29
+ DatasetManager
30
+ };
@@ -1,34 +1,34 @@
1
1
  import { ProsopoEnvError } from "@prosopo/common";
2
2
  import { buildDataset } from "@prosopo/datasets";
3
- export const providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
4
- if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) {
5
- throw new ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", {
6
- context: { failedFuncName: providerValidateDataset.name },
7
- });
8
- }
9
- const solutions = datasetRaw.captchas
10
- .map((captcha) => (captcha.solution ? 1 : 0))
11
- .reduce((partialSum, b) => partialSum + b, 0);
12
- if (solutions < minSolvedCaptchas) {
13
- throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
14
- context: { failedFuncName: providerValidateDataset.name },
15
- });
16
- }
17
- if (solutions < minUnsolvedCaptchas) {
18
- throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
19
- context: { failedFuncName: providerValidateDataset.name },
20
- });
21
- }
22
- const dataset = await buildDataset(datasetRaw);
23
- if (!dataset.datasetId || !dataset.datasetContentId) {
24
- throw new ProsopoEnvError("DATASET.DATASET_ID_UNDEFINED", {
25
- context: {
26
- failedFuncName: providerValidateDataset.name,
27
- datasetId: dataset.datasetId,
28
- datasetContentId: dataset.datasetContentId,
29
- },
30
- });
31
- }
32
- return dataset;
3
+ const providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
4
+ if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) {
5
+ throw new ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", {
6
+ context: { failedFuncName: providerValidateDataset.name }
7
+ });
8
+ }
9
+ const solutions = datasetRaw.captchas.map((captcha) => captcha.solution ? 1 : 0).reduce((partialSum, b) => partialSum + b, 0);
10
+ if (solutions < minSolvedCaptchas) {
11
+ throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
12
+ context: { failedFuncName: providerValidateDataset.name }
13
+ });
14
+ }
15
+ if (solutions < minUnsolvedCaptchas) {
16
+ throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
17
+ context: { failedFuncName: providerValidateDataset.name }
18
+ });
19
+ }
20
+ const dataset = await buildDataset(datasetRaw);
21
+ if (!dataset.datasetId || !dataset.datasetContentId) {
22
+ throw new ProsopoEnvError("DATASET.DATASET_ID_UNDEFINED", {
23
+ context: {
24
+ failedFuncName: providerValidateDataset.name,
25
+ datasetId: dataset.datasetId,
26
+ datasetContentId: dataset.datasetContentId
27
+ }
28
+ });
29
+ }
30
+ return dataset;
31
+ };
32
+ export {
33
+ providerValidateDataset
33
34
  };
34
- //# sourceMappingURL=datasetTasksUtils.js.map