@prosopo/database 3.15.19 → 3.15.21

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 (38) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +20 -17
  2. package/.turbo/turbo-build$colon$tsc.log +16 -16
  3. package/.turbo/turbo-build.log +21 -18
  4. package/CHANGELOG.md +24 -0
  5. package/dist/_virtual/_rolldown/runtime.js +3 -0
  6. package/dist/base/index.js +1 -4
  7. package/dist/base/mongo.js +133 -137
  8. package/dist/base/mongoMemory.js +21 -21
  9. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/dist/cjs/base/index.cjs +4 -6
  11. package/dist/cjs/base/mongo.cjs +140 -143
  12. package/dist/cjs/base/mongoMemory.cjs +22 -22
  13. package/dist/cjs/databases/captcha.cjs +220 -256
  14. package/dist/cjs/databases/centralDbStreamer.cjs +148 -170
  15. package/dist/cjs/databases/client.cjs +46 -62
  16. package/dist/cjs/databases/index.cjs +19 -19
  17. package/dist/cjs/databases/provider.cjs +1827 -2251
  18. package/dist/cjs/index.cjs +25 -23
  19. package/dist/cjs/mongooseOptions.cjs +59 -58
  20. package/dist/cjs/redisCache.cjs +432 -474
  21. package/dist/databases/captcha.d.ts.map +1 -1
  22. package/dist/databases/captcha.js +217 -253
  23. package/dist/databases/captcha.js.map +1 -1
  24. package/dist/databases/centralDbStreamer.js +147 -169
  25. package/dist/databases/client.js +44 -60
  26. package/dist/databases/index.js +10 -14
  27. package/dist/databases/provider.d.ts +4 -4
  28. package/dist/databases/provider.d.ts.map +1 -1
  29. package/dist/databases/provider.js +1823 -2247
  30. package/dist/databases/provider.js.map +1 -1
  31. package/dist/index.js +9 -18
  32. package/dist/mongooseOptions.js +59 -59
  33. package/dist/redisCache.js +432 -474
  34. package/dist/tests/integration/saveCaptchasSessionUpsert.integration.test.d.ts +2 -0
  35. package/dist/tests/integration/saveCaptchasSessionUpsert.integration.test.d.ts.map +1 -0
  36. package/dist/tests/integration/saveCaptchasSessionUpsert.integration.test.js +64 -0
  37. package/dist/tests/integration/saveCaptchasSessionUpsert.integration.test.js.map +1 -0
  38. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAGxB,KAAK,aAAa,EAGlB,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,MAAM,yBAAyB,CAAC;AAajC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,aAAK,UAAU;IACd,iBAAiB,sBAAsB;IACvC,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,aAAa,kBAAkB;CAC/B;AAyBD,qBAAa,eAAgB,SAAQ,aAAc,YAAW,gBAAgB;IAC7E,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,CAAC,cAAc,CAAS;gBAG9B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM;IAMD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC;IAUzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqDpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAoBnC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAajC,YAAY,CACjB,aAAa,EAAE,aAAa,EAAE,EAC9B,kBAAkB,EAAE,oBAAoB,EAAE,EAC1C,gBAAgB,EAAE,gBAAgB,EAAE,EACpC,mBAAmB,GAAE,mBAAmB,EAAO;IAsG1C,WAAW,CAChB,MAAM,GAAE,eAAe,CAAC,iBAAiB,CAAM,EAC/C,KAAK,SAAM,GACT,OAAO,CAAC;QACV,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;QAC9C,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;QACtC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;KAC5C,CAAC;CAsCF"}
1
+ {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAGxB,KAAK,aAAa,EAGlB,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,MAAM,yBAAyB,CAAC;AAajC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,aAAK,UAAU;IACd,iBAAiB,sBAAsB;IACvC,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,aAAa,kBAAkB;CAC/B;AAyBD,qBAAa,eAAgB,SAAQ,aAAc,YAAW,gBAAgB;IAC7E,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,CAAC,cAAc,CAAS;gBAG9B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM;IAMD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC;IAUzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqDpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAoBnC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAajC,YAAY,CACjB,aAAa,EAAE,aAAa,EAAE,EAC9B,kBAAkB,EAAE,oBAAoB,EAAE,EAC1C,gBAAgB,EAAE,gBAAgB,EAAE,EACpC,mBAAmB,GAAE,mBAAmB,EAAO;IAmI1C,WAAW,CAChB,MAAM,GAAE,eAAe,CAAC,iBAAiB,CAAM,EAC/C,KAAK,SAAM,GACT,OAAO,CAAC;QACV,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;QAC9C,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;QACtC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;KAC5C,CAAC;CAsCF"}
@@ -1,258 +1,222 @@
1
+ import { MongoDatabase } from "../base/mongo.js";
1
2
  import { ProsopoDBError } from "@prosopo/common";
2
3
  import { getLogger } from "@prosopo/logger";
3
- import { StoredSessionRecordSchema, StoredPoWCaptchaRecordSchema, StoredUserCommitmentRecordSchema, StoredPuzzleCaptchaRecordSchema } from "@prosopo/types-database";
4
+ import { StoredPoWCaptchaRecordSchema, StoredPuzzleCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "@prosopo/types-database";
4
5
  import { Decimal128, Long } from "bson";
5
- import "../base/index.js";
6
- import { MongoDatabase } from "../base/mongo.js";
7
- const isBsonLong = (value) => typeof value === "object" && value !== null && "_bsontype" in value && value._bsontype === "Long";
8
- const logger = getLogger("info", "database:captcha");
9
- var TableNames = /* @__PURE__ */ ((TableNames2) => {
10
- TableNames2["frictionlessToken"] = "frictionlessToken";
11
- TableNames2["session"] = "session";
12
- TableNames2["commitment"] = "commitment";
13
- TableNames2["powcaptcha"] = "powcaptcha";
14
- TableNames2["puzzlecaptcha"] = "puzzlecaptcha";
15
- return TableNames2;
16
- })(TableNames || {});
17
- const CAPTCHA_TABLES = [
18
- {
19
- collectionName: "session",
20
- modelName: "Session",
21
- schema: StoredSessionRecordSchema
22
- },
23
- {
24
- collectionName: "powcaptcha",
25
- modelName: "PowCaptcha",
26
- schema: StoredPoWCaptchaRecordSchema
27
- },
28
- {
29
- collectionName: "commitment",
30
- modelName: "UserCommitment",
31
- schema: StoredUserCommitmentRecordSchema
32
- },
33
- {
34
- collectionName: "puzzlecaptcha",
35
- modelName: "PuzzleCaptcha",
36
- schema: StoredPuzzleCaptchaRecordSchema
37
- }
6
+ //#region src/databases/captcha.ts
7
+ var isBsonLong = (value) => typeof value === "object" && value !== null && "_bsontype" in value && value._bsontype === "Long";
8
+ var logger = getLogger("info", "database:captcha");
9
+ var CAPTCHA_TABLES = [
10
+ {
11
+ collectionName: "session",
12
+ modelName: "Session",
13
+ schema: StoredSessionRecordSchema
14
+ },
15
+ {
16
+ collectionName: "powcaptcha",
17
+ modelName: "PowCaptcha",
18
+ schema: StoredPoWCaptchaRecordSchema
19
+ },
20
+ {
21
+ collectionName: "commitment",
22
+ modelName: "UserCommitment",
23
+ schema: StoredUserCommitmentRecordSchema
24
+ },
25
+ {
26
+ collectionName: "puzzlecaptcha",
27
+ modelName: "PuzzleCaptcha",
28
+ schema: StoredPuzzleCaptchaRecordSchema
29
+ }
38
30
  ];
39
- class CaptchaDatabase extends MongoDatabase {
40
- constructor(url, dbname, authSource, logger2) {
41
- super(url, dbname, authSource, logger2);
42
- this.indexesEnsured = false;
43
- this.tables = {};
44
- }
45
- async connect() {
46
- await super.connect();
47
- CAPTCHA_TABLES.map(({ collectionName, modelName, schema }) => {
48
- if (this.connection) {
49
- this.tables[collectionName] = this.connection.model(modelName, schema);
50
- }
51
- });
52
- }
53
- getTables() {
54
- if (!this.tables) {
55
- throw new ProsopoDBError("DATABASE.TABLES_UNDEFINED", {
56
- context: { failedFuncName: this.getTables.name },
57
- logger: this.logger
58
- });
59
- }
60
- return this.tables;
61
- }
62
- async ensureIndexes() {
63
- const indexPromises = [];
64
- if (!this.indexesEnsured) {
65
- CAPTCHA_TABLES.map(({ collectionName }) => {
66
- indexPromises.push(
67
- new Promise((resolve) => {
68
- if (this.connected) {
69
- this.tables[collectionName].collection.dropIndexes().then(() => {
70
- this.tables[collectionName].ensureIndexes().then(() => {
71
- resolve();
72
- }).catch((err) => {
73
- this.logger.warn(() => ({
74
- err,
75
- msg: `Error creating indexes for collection ${collectionName}`
76
- }));
77
- resolve();
78
- });
79
- });
80
- } else {
81
- this.logger.info(() => ({
82
- msg: `Skipping index creation for collection ${collectionName} as not connected`
83
- }));
84
- resolve();
85
- }
86
- })
87
- );
88
- });
89
- }
90
- await Promise.all(indexPromises);
91
- this.indexesEnsured = true;
92
- }
93
- /**
94
- * Convert a BSON `Long` (which Mongoose's Decimal128 caster rejects)
95
- * into a Decimal128 with the *unsigned* numeric value — so a Long
96
- * representing an IPv6 lower half with bit 63 set (signed Long shows
97
- * as a negative integer) converts to a positive Decimal128 that
98
- * matches what `bigint→string→Decimal128` would have produced if the
99
- * schema setter had run on the original write.
100
- *
101
- * Production background: pipeline-form updates (`updateOne(filter,
102
- * [{ $set: ... }])`) bypass Mongoose schema casting, so a `bigint`
103
- * passed for an IP half is serialised by the driver as BSON Int64
104
- * (Long) instead of going through the `Decimal128` setter. The
105
- * central-streaming sweep below reads those docs via `.lean()` and
106
- * tries to replay them with `bulkWrite`, but `bulkWrite` also skips
107
- * setters — so the cast fires raw and throws. Normalising the lean
108
- * doc here is the only place that's guaranteed to run before the
109
- * bulkWrite sees it.
110
- */
111
- static normaliseCompositeIp(ip) {
112
- if (!ip) return ip;
113
- const normaliseHalf = (v) => {
114
- if (isBsonLong(v)) {
115
- const lng = v;
116
- return Decimal128.fromString(
117
- Long.fromBits(lng.low, lng.high, true).toString()
118
- );
119
- }
120
- return v;
121
- };
122
- return {
123
- ...ip,
124
- lower: normaliseHalf(ip.lower),
125
- upper: normaliseHalf(ip.upper)
126
- };
127
- }
128
- static normaliseDocCompositeIps(doc) {
129
- return {
130
- ...doc,
131
- ipAddress: CaptchaDatabase.normaliseCompositeIp(doc.ipAddress),
132
- providedIp: CaptchaDatabase.normaliseCompositeIp(doc.providedIp)
133
- };
134
- }
135
- async saveCaptchas(sessionEvents, imageCaptchaEvents, powCaptchaEvents, puzzleCaptchaEvents = []) {
136
- await this.connect();
137
- if (sessionEvents.length) {
138
- const result = await this.tables.session.bulkWrite(
139
- sessionEvents.map((document) => {
140
- const { _id, ...safeDoc } = document;
141
- return {
142
- insertOne: {
143
- document: CaptchaDatabase.normaliseDocCompositeIps(safeDoc)
144
- }
145
- };
146
- })
147
- );
148
- logger.info(() => ({
149
- data: {
150
- insertedCount: result.insertedCount,
151
- totalProcessed: sessionEvents.length
152
- },
153
- msg: "Mongo Saved Session Events"
154
- }));
155
- }
156
- if (imageCaptchaEvents.length) {
157
- const result = await this.tables.commitment.bulkWrite(
158
- imageCaptchaEvents.map((doc) => {
159
- const { _id, ...safeDoc } = doc;
160
- const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
161
- return {
162
- updateOne: {
163
- filter: { id: normalised.id },
164
- update: { $set: normalised },
165
- upsert: true
166
- }
167
- };
168
- })
169
- );
170
- logger.info(() => ({
171
- data: {
172
- upsertedCount: result.upsertedCount,
173
- matchedCount: result.matchedCount,
174
- modifiedCount: result.modifiedCount,
175
- totalProcessed: imageCaptchaEvents.length
176
- },
177
- msg: "Mongo Saved Image Events"
178
- }));
179
- }
180
- if (powCaptchaEvents.length) {
181
- const result = await this.tables.powcaptcha.bulkWrite(
182
- powCaptchaEvents.map((doc) => {
183
- const { _id, ...safeDoc } = doc;
184
- const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
185
- return {
186
- updateOne: {
187
- filter: { challenge: normalised.challenge },
188
- update: { $set: normalised },
189
- upsert: true
190
- }
191
- };
192
- })
193
- );
194
- logger.info(() => ({
195
- data: {
196
- upsertedCount: result.upsertedCount,
197
- matchedCount: result.matchedCount,
198
- modifiedCount: result.modifiedCount,
199
- totalProcessed: powCaptchaEvents.length
200
- },
201
- msg: "Mongo Saved PoW Events"
202
- }));
203
- }
204
- if (puzzleCaptchaEvents.length) {
205
- const result = await this.tables.puzzlecaptcha.bulkWrite(
206
- puzzleCaptchaEvents.map((doc) => {
207
- const { _id, ...safeDoc } = doc;
208
- const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
209
- return {
210
- updateOne: {
211
- filter: { challenge: normalised.challenge },
212
- update: { $set: normalised },
213
- upsert: true
214
- }
215
- };
216
- })
217
- );
218
- logger.info(() => ({
219
- data: {
220
- upsertedCount: result.upsertedCount,
221
- matchedCount: result.matchedCount,
222
- modifiedCount: result.modifiedCount,
223
- totalProcessed: puzzleCaptchaEvents.length
224
- },
225
- msg: "Mongo Saved Puzzle Events"
226
- }));
227
- }
228
- await this.close();
229
- }
230
- async getCaptchas(filter = {}, limit = 100) {
231
- await this.connect();
232
- try {
233
- const commitmentResults = await this.tables.commitment.find(filter).limit(limit).lean();
234
- const powCaptchaResults = await this.tables.powcaptcha.find(filter).limit(limit).lean();
235
- const puzzleCaptchaResults = await this.tables.puzzlecaptcha.find(filter).limit(limit).lean();
236
- return {
237
- userCommitmentRecords: commitmentResults,
238
- powCaptchaRecords: powCaptchaResults,
239
- puzzleCaptchaRecords: puzzleCaptchaResults
240
- };
241
- } catch (error) {
242
- throw new ProsopoDBError("DATABASE.QUERY_ERROR", {
243
- context: {
244
- error,
245
- filter,
246
- limit,
247
- failedFuncName: this.getCaptchas.name
248
- },
249
- logger: this.logger
250
- });
251
- } finally {
252
- await this.close();
253
- }
254
- }
255
- }
256
- export {
257
- CaptchaDatabase
31
+ var CaptchaDatabase = class CaptchaDatabase extends MongoDatabase {
32
+ constructor(url, dbname, authSource, logger) {
33
+ super(url, dbname, authSource, logger);
34
+ this.indexesEnsured = false;
35
+ this.tables = {};
36
+ }
37
+ async connect() {
38
+ await super.connect();
39
+ CAPTCHA_TABLES.map(({ collectionName, modelName, schema }) => {
40
+ if (this.connection) this.tables[collectionName] = this.connection.model(modelName, schema);
41
+ });
42
+ }
43
+ getTables() {
44
+ if (!this.tables) throw new ProsopoDBError("DATABASE.TABLES_UNDEFINED", {
45
+ context: { failedFuncName: this.getTables.name },
46
+ logger: this.logger
47
+ });
48
+ return this.tables;
49
+ }
50
+ async ensureIndexes() {
51
+ const indexPromises = [];
52
+ if (!this.indexesEnsured) CAPTCHA_TABLES.map(({ collectionName }) => {
53
+ indexPromises.push(new Promise((resolve) => {
54
+ if (this.connected) this.tables[collectionName].collection.dropIndexes().then(() => {
55
+ this.tables[collectionName].ensureIndexes().then(() => {
56
+ resolve();
57
+ }).catch((err) => {
58
+ this.logger.warn(() => ({
59
+ err,
60
+ msg: `Error creating indexes for collection ${collectionName}`
61
+ }));
62
+ resolve();
63
+ });
64
+ });
65
+ else {
66
+ this.logger.info(() => ({ msg: `Skipping index creation for collection ${collectionName} as not connected` }));
67
+ resolve();
68
+ }
69
+ }));
70
+ });
71
+ await Promise.all(indexPromises);
72
+ this.indexesEnsured = true;
73
+ }
74
+ /**
75
+ * Convert a BSON `Long` (which Mongoose's Decimal128 caster rejects)
76
+ * into a Decimal128 with the *unsigned* numeric value — so a Long
77
+ * representing an IPv6 lower half with bit 63 set (signed Long shows
78
+ * as a negative integer) converts to a positive Decimal128 that
79
+ * matches what `bigint→string→Decimal128` would have produced if the
80
+ * schema setter had run on the original write.
81
+ *
82
+ * Production background: pipeline-form updates (`updateOne(filter,
83
+ * [{ $set: ... }])`) bypass Mongoose schema casting, so a `bigint`
84
+ * passed for an IP half is serialised by the driver as BSON Int64
85
+ * (Long) instead of going through the `Decimal128` setter. The
86
+ * central-streaming sweep below reads those docs via `.lean()` and
87
+ * tries to replay them with `bulkWrite`, but `bulkWrite` also skips
88
+ * setters — so the cast fires raw and throws. Normalising the lean
89
+ * doc here is the only place that's guaranteed to run before the
90
+ * bulkWrite sees it.
91
+ */
92
+ static normaliseCompositeIp(ip) {
93
+ if (!ip) return ip;
94
+ const normaliseHalf = (v) => {
95
+ if (isBsonLong(v)) {
96
+ const lng = v;
97
+ return Decimal128.fromString(Long.fromBits(lng.low, lng.high, true).toString());
98
+ }
99
+ return v;
100
+ };
101
+ return {
102
+ ...ip,
103
+ lower: normaliseHalf(ip.lower),
104
+ upper: normaliseHalf(ip.upper)
105
+ };
106
+ }
107
+ static normaliseDocCompositeIps(doc) {
108
+ return {
109
+ ...doc,
110
+ ipAddress: CaptchaDatabase.normaliseCompositeIp(doc.ipAddress),
111
+ providedIp: CaptchaDatabase.normaliseCompositeIp(doc.providedIp)
112
+ };
113
+ }
114
+ async saveCaptchas(sessionEvents, imageCaptchaEvents, powCaptchaEvents, puzzleCaptchaEvents = []) {
115
+ await this.connect();
116
+ if (sessionEvents.length) {
117
+ const result = await this.tables.session.bulkWrite(sessionEvents.map((document) => {
118
+ const { _id, ...safeDoc } = document;
119
+ const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
120
+ return { updateOne: {
121
+ filter: { sessionId: normalised.sessionId },
122
+ update: { $set: normalised },
123
+ upsert: true
124
+ } };
125
+ }));
126
+ logger.info(() => ({
127
+ data: {
128
+ upsertedCount: result.upsertedCount,
129
+ matchedCount: result.matchedCount,
130
+ modifiedCount: result.modifiedCount,
131
+ totalProcessed: sessionEvents.length
132
+ },
133
+ msg: "Mongo Saved Session Events"
134
+ }));
135
+ }
136
+ if (imageCaptchaEvents.length) {
137
+ const result = await this.tables.commitment.bulkWrite(imageCaptchaEvents.map((doc) => {
138
+ const { _id, ...safeDoc } = doc;
139
+ const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
140
+ return { updateOne: {
141
+ filter: { id: normalised.id },
142
+ update: { $set: normalised },
143
+ upsert: true
144
+ } };
145
+ }));
146
+ logger.info(() => ({
147
+ data: {
148
+ upsertedCount: result.upsertedCount,
149
+ matchedCount: result.matchedCount,
150
+ modifiedCount: result.modifiedCount,
151
+ totalProcessed: imageCaptchaEvents.length
152
+ },
153
+ msg: "Mongo Saved Image Events"
154
+ }));
155
+ }
156
+ if (powCaptchaEvents.length) {
157
+ const result = await this.tables.powcaptcha.bulkWrite(powCaptchaEvents.map((doc) => {
158
+ const { _id, ...safeDoc } = doc;
159
+ const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
160
+ return { updateOne: {
161
+ filter: { challenge: normalised.challenge },
162
+ update: { $set: normalised },
163
+ upsert: true
164
+ } };
165
+ }));
166
+ logger.info(() => ({
167
+ data: {
168
+ upsertedCount: result.upsertedCount,
169
+ matchedCount: result.matchedCount,
170
+ modifiedCount: result.modifiedCount,
171
+ totalProcessed: powCaptchaEvents.length
172
+ },
173
+ msg: "Mongo Saved PoW Events"
174
+ }));
175
+ }
176
+ if (puzzleCaptchaEvents.length) {
177
+ const result = await this.tables.puzzlecaptcha.bulkWrite(puzzleCaptchaEvents.map((doc) => {
178
+ const { _id, ...safeDoc } = doc;
179
+ const normalised = CaptchaDatabase.normaliseDocCompositeIps(safeDoc);
180
+ return { updateOne: {
181
+ filter: { challenge: normalised.challenge },
182
+ update: { $set: normalised },
183
+ upsert: true
184
+ } };
185
+ }));
186
+ logger.info(() => ({
187
+ data: {
188
+ upsertedCount: result.upsertedCount,
189
+ matchedCount: result.matchedCount,
190
+ modifiedCount: result.modifiedCount,
191
+ totalProcessed: puzzleCaptchaEvents.length
192
+ },
193
+ msg: "Mongo Saved Puzzle Events"
194
+ }));
195
+ }
196
+ await this.close();
197
+ }
198
+ async getCaptchas(filter = {}, limit = 100) {
199
+ await this.connect();
200
+ try {
201
+ return {
202
+ userCommitmentRecords: await this.tables.commitment.find(filter).limit(limit).lean(),
203
+ powCaptchaRecords: await this.tables.powcaptcha.find(filter).limit(limit).lean(),
204
+ puzzleCaptchaRecords: await this.tables.puzzlecaptcha.find(filter).limit(limit).lean()
205
+ };
206
+ } catch (error) {
207
+ throw new ProsopoDBError("DATABASE.QUERY_ERROR", {
208
+ context: {
209
+ error,
210
+ filter,
211
+ limit,
212
+ failedFuncName: this.getCaptchas.name
213
+ },
214
+ logger: this.logger
215
+ });
216
+ } finally {
217
+ await this.close();
218
+ }
219
+ }
258
220
  };
221
+ //#endregion
222
+ export { CaptchaDatabase };
@@ -1 +1 @@
1
- {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAKN,4BAA4B,EAC5B,+BAA+B,EAE/B,yBAAyB,EACzB,gCAAgC,GAGhC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAOxC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAW,EAAE,CAC9C,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACd,WAAW,IAAI,KAAK;IACnB,KAA+B,CAAC,SAAS,KAAK,MAAM,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAErD,IAAK,UAMJ;AAND,WAAK,UAAU;IACd,qDAAuC,CAAA;IACvC,iCAAmB,CAAA;IACnB,uCAAyB,CAAA;IACzB,uCAAyB,CAAA;IACzB,6CAA+B,CAAA;AAChC,CAAC,EANI,UAAU,KAAV,UAAU,QAMd;AAED,MAAM,cAAc,GAAG;IACtB;QACC,cAAc,EAAE,UAAU,CAAC,OAAO;QAClC,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,yBAAyB;KACjC;IACD;QACC,cAAc,EAAE,UAAU,CAAC,UAAU;QACrC,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,4BAA4B;KACpC;IACD;QACC,cAAc,EAAE,UAAU,CAAC,UAAU;QACrC,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,gCAAgC;KACxC;IACD;QACC,cAAc,EAAE,UAAU,CAAC,aAAa;QACxC,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,+BAA+B;KACvC;CACD,CAAC;AAEF,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAIjD,YACC,GAAW,EACX,MAAe,EACf,UAAmB,EACnB,MAAe;QAEf,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QARhC,mBAAc,GAAG,KAAK,CAAC;QAS9B,IAAI,CAAC,MAAM,GAAG,EAAwB,CAAC;IACxC,CAAC;IAEQ,KAAK,CAAC,OAAO;QACrB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxE,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,SAAS;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,cAAc,CAAC,2BAA2B,EAAE;gBACrD,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBAChD,MAAM,EAAE,IAAI,CAAC,MAAM;aACnB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,aAAa;QAClB,MAAM,aAAa,GAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;gBACzC,aAAa,CAAC,IAAI,CACjB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACpB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;4BAC9D,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;iCACzB,aAAa,EAAE;iCACf,IAAI,CAAC,GAAG,EAAE;gCACV,OAAO,EAAE,CAAC;4BACX,CAAC,CAAC;iCACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gCACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oCACvB,GAAG;oCACH,GAAG,EAAE,yCAAyC,cAAc,EAAE;iCAC9D,CAAC,CAAC,CAAC;gCACJ,OAAO,EAAE,CAAC;4BACX,CAAC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;4BACvB,GAAG,EAAE,0CAA0C,cAAc,mBAAmB;yBAChF,CAAC,CAAC,CAAC;wBACJ,OAAO,EAAE,CAAC;oBACX,CAAC;gBACF,CAAC,CAAC,CACF,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,CAAC;IAoBO,MAAM,CAAC,oBAAoB,CAEjC,EAAK;QACN,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,CAAC,CAAU,EAAW,EAAE;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,CAAkC,CAAC;gBAC/C,OAAO,UAAU,CAAC,UAAU,CAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CACjD,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC;QACV,CAAC,CAAC;QACF,OAAO;YACN,GAAG,EAAE;YACL,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC;YAC9B,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC;SAC9B,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,wBAAwB,CAKrC,GAAM;QACP,OAAO;YACN,GAAG,GAAG;YACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9D,UAAU,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC;SAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CACjB,aAA8B,EAC9B,kBAA0C,EAC1C,gBAAoC,EACpC,sBAA6C,EAAE;QAE/C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CACjD,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC;gBACrC,OAAO;oBACN,SAAS,EAAE;wBACV,QAAQ,EAAE,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC;qBAC3D;iBACD,CAAC;YACH,CAAC,CAAC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE;oBACL,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,cAAc,EAAE,aAAa,CAAC,MAAM;iBACpC;gBACD,GAAG,EAAE,4BAA4B;aACjC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CACpD,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAE9B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC;gBAChC,MAAM,UAAU,GAAG,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACrE,OAAO;oBACN,SAAS,EAAE;wBACV,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE;wBAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;wBAC5B,MAAM,EAAE,IAAI;qBACZ;iBACD,CAAC;YACH,CAAC,CAAC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE;oBACL,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,cAAc,EAAE,kBAAkB,CAAC,MAAM;iBACzC;gBACD,GAAG,EAAE,0BAA0B;aAC/B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CACpD,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAE5B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC;gBAChC,MAAM,UAAU,GAAG,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACrE,OAAO;oBACN,SAAS,EAAE;wBACV,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE;wBAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;wBAC5B,MAAM,EAAE,IAAI;qBACZ;iBACD,CAAC;YACH,CAAC,CAAC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE;oBACL,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,cAAc,EAAE,gBAAgB,CAAC,MAAM;iBACvC;gBACD,GAAG,EAAE,wBAAwB;aAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CACvD,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC;gBAChC,MAAM,UAAU,GAAG,eAAe,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACrE,OAAO;oBACN,SAAS,EAAE;wBACV,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE;wBAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;wBAC5B,MAAM,EAAE,IAAI;qBACZ;iBACD,CAAC;YACH,CAAC,CAAC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE;oBACL,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,cAAc,EAAE,mBAAmB,CAAC,MAAM;iBAC1C;gBACD,GAAG,EAAE,2BAA2B;aAChC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,SAA6C,EAAE,EAC/C,KAAK,GAAG,GAAG;QAMX,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,IAAI,CAAC;YACJ,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU;iBACpD,IAAI,CAAC,MAAM,CAAC;iBACZ,KAAK,CAAC,KAAK,CAAC;iBACZ,IAAI,EAA0B,CAAC;YAEjC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU;iBACpD,IAAI,CAAC,MAAM,CAAC;iBACZ,KAAK,CAAC,KAAK,CAAC;iBACZ,IAAI,EAAsB,CAAC;YAE7B,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa;iBAC1D,IAAI,CAAC,MAAM,CAAC;iBACZ,KAAK,CAAC,KAAK,CAAC;iBACZ,IAAI,EAAyB,CAAC;YAEhC,OAAO;gBACN,qBAAqB,EAAE,iBAAiB;gBACxC,iBAAiB,EAAE,iBAAiB;gBACpC,oBAAoB,EAAE,oBAAoB;aAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,cAAc,CAAC,sBAAsB,EAAE;gBAChD,OAAO,EAAE;oBACR,KAAK;oBACL,MAAM;oBACN,KAAK;oBACL,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;iBACrC;gBACD,MAAM,EAAE,IAAI,CAAC,MAAM;aACnB,CAAC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACV,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACF,CAAC;CACD"}
1
+ {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"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"}