@prosopo/database 2.6.5 → 3.0.5
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.
- package/CHANGELOG.md +92 -0
- package/dist/base/mongo.d.ts +3 -1
- package/dist/base/mongo.d.ts.map +1 -1
- package/dist/base/mongo.js +63 -29
- package/dist/base/mongo.js.map +1 -1
- package/dist/cjs/base/mongo.cjs +62 -30
- package/dist/cjs/databases/captcha.cjs +13 -4
- package/dist/cjs/databases/provider.cjs +103 -63
- package/dist/databases/captcha.d.ts.map +1 -1
- package/dist/databases/captcha.js +14 -5
- package/dist/databases/captcha.js.map +1 -1
- package/dist/databases/provider.d.ts +22 -7
- package/dist/databases/provider.d.ts.map +1 -1
- package/dist/databases/provider.js +106 -63
- package/dist/databases/provider.js.map +1 -1
- package/package.json +16 -10
|
@@ -5,6 +5,7 @@ const common = require("@prosopo/common");
|
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
6
|
const typesDatabase = require("@prosopo/types-database");
|
|
7
7
|
const userAccessPolicy = require("@prosopo/user-access-policy");
|
|
8
|
+
const redis = require("redis");
|
|
8
9
|
const mongo = require("../base/mongo.cjs");
|
|
9
10
|
var TableNames = /* @__PURE__ */ ((TableNames2) => {
|
|
10
11
|
TableNames2["captcha"] = "captcha";
|
|
@@ -18,7 +19,6 @@ var TableNames = /* @__PURE__ */ ((TableNames2) => {
|
|
|
18
19
|
TableNames2["client"] = "client";
|
|
19
20
|
TableNames2["frictionlessToken"] = "frictionlessToken";
|
|
20
21
|
TableNames2["session"] = "session";
|
|
21
|
-
TableNames2["userAccessRules"] = "userAccessRules";
|
|
22
22
|
TableNames2["detector"] = "detector";
|
|
23
23
|
return TableNames2;
|
|
24
24
|
})(TableNames || {});
|
|
@@ -78,11 +78,6 @@ const PROVIDER_TABLES = [
|
|
|
78
78
|
modelName: "Session",
|
|
79
79
|
schema: typesDatabase.SessionRecordSchema
|
|
80
80
|
},
|
|
81
|
-
{
|
|
82
|
-
collectionName: "userAccessRules",
|
|
83
|
-
modelName: "UserAccessRules",
|
|
84
|
-
schema: userAccessPolicy.getRuleMongooseSchema()
|
|
85
|
-
},
|
|
86
81
|
{
|
|
87
82
|
collectionName: "detector",
|
|
88
83
|
modelName: "Detector",
|
|
@@ -90,20 +85,42 @@ const PROVIDER_TABLES = [
|
|
|
90
85
|
}
|
|
91
86
|
];
|
|
92
87
|
class ProviderDatabase extends mongo.MongoDatabase {
|
|
93
|
-
constructor(
|
|
94
|
-
super(
|
|
88
|
+
constructor(options) {
|
|
89
|
+
super(
|
|
90
|
+
options.mongo.url,
|
|
91
|
+
options.mongo.dbname,
|
|
92
|
+
options.mongo.authSource,
|
|
93
|
+
options.logger
|
|
94
|
+
);
|
|
95
|
+
this.options = options;
|
|
95
96
|
this.tables = {};
|
|
96
97
|
this.tables = {};
|
|
97
|
-
this.
|
|
98
|
+
this.userAccessRulesStorage = null;
|
|
98
99
|
}
|
|
99
100
|
async connect() {
|
|
100
101
|
await super.connect();
|
|
101
102
|
this.loadTables();
|
|
102
|
-
this.
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
await this.setupRedis();
|
|
104
|
+
}
|
|
105
|
+
async setupRedis() {
|
|
106
|
+
const redisClient = await this.createRedisClient();
|
|
107
|
+
await userAccessPolicy.createRedisAccessRulesIndex(redisClient);
|
|
108
|
+
this.userAccessRulesStorage = userAccessPolicy.createRedisAccessRulesStorage(
|
|
109
|
+
redisClient,
|
|
110
|
+
this.logger
|
|
105
111
|
);
|
|
106
112
|
}
|
|
113
|
+
async createRedisClient() {
|
|
114
|
+
return await redis.createClient({
|
|
115
|
+
url: this.options.redis?.url,
|
|
116
|
+
password: this.options.redis?.password
|
|
117
|
+
}).on("error", (error) => {
|
|
118
|
+
this.logger.error(() => ({
|
|
119
|
+
err: error,
|
|
120
|
+
msg: "Redis client error"
|
|
121
|
+
}));
|
|
122
|
+
}).connect();
|
|
123
|
+
}
|
|
107
124
|
loadTables() {
|
|
108
125
|
const tables = {};
|
|
109
126
|
PROVIDER_TABLES.map(({ collectionName, modelName, schema }) => {
|
|
@@ -123,10 +140,10 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
123
140
|
return this.tables;
|
|
124
141
|
}
|
|
125
142
|
getUserAccessRulesStorage() {
|
|
126
|
-
if (null === this.
|
|
127
|
-
throw new common.ProsopoDBError("DATABASE.
|
|
143
|
+
if (null === this.userAccessRulesStorage) {
|
|
144
|
+
throw new common.ProsopoDBError("DATABASE.USER_ACCESS_RULES_STORAGE_UNDEFINED");
|
|
128
145
|
}
|
|
129
|
-
return this.
|
|
146
|
+
return this.userAccessRulesStorage;
|
|
130
147
|
}
|
|
131
148
|
/**
|
|
132
149
|
* @description Load a dataset to the database
|
|
@@ -134,7 +151,10 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
134
151
|
*/
|
|
135
152
|
async storeDataset(dataset) {
|
|
136
153
|
try {
|
|
137
|
-
this.logger.debug(
|
|
154
|
+
this.logger.debug(() => ({
|
|
155
|
+
data: { datasetId: dataset.datasetId },
|
|
156
|
+
msg: "Storing dataset in database"
|
|
157
|
+
}));
|
|
138
158
|
const parsedDataset = types.DatasetWithIdsAndTreeSchema.parse(dataset);
|
|
139
159
|
const datasetDoc = {
|
|
140
160
|
datasetId: parsedDataset.datasetId,
|
|
@@ -160,7 +180,9 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
160
180
|
solved: !!solution?.length
|
|
161
181
|
})
|
|
162
182
|
);
|
|
163
|
-
this.logger.debug(
|
|
183
|
+
this.logger.debug(() => ({
|
|
184
|
+
msg: "Inserting captcha records"
|
|
185
|
+
}));
|
|
164
186
|
if (captchaDocs.length) {
|
|
165
187
|
await this.tables?.captcha.bulkWrite(
|
|
166
188
|
captchaDocs.map((captchaDoc) => ({
|
|
@@ -180,7 +202,9 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
180
202
|
datasetId: parsedDataset.datasetId,
|
|
181
203
|
datasetContentId: parsedDataset.datasetContentId
|
|
182
204
|
}));
|
|
183
|
-
this.logger.debug(
|
|
205
|
+
this.logger.debug(() => ({
|
|
206
|
+
msg: "Inserting solution records"
|
|
207
|
+
}));
|
|
184
208
|
if (captchaSolutionDocs.length) {
|
|
185
209
|
await this.tables?.solution.bulkWrite(
|
|
186
210
|
captchaSolutionDocs.map((captchaSolutionDoc) => ({
|
|
@@ -192,7 +216,9 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
192
216
|
}))
|
|
193
217
|
);
|
|
194
218
|
}
|
|
195
|
-
this.logger.debug(
|
|
219
|
+
this.logger.debug(() => ({
|
|
220
|
+
msg: "Dataset stored in database"
|
|
221
|
+
}));
|
|
196
222
|
} catch (err) {
|
|
197
223
|
throw new common.ProsopoDBError("DATABASE.DATASET_LOAD_FAILED", {
|
|
198
224
|
context: { failedFuncName: this.storeDataset.name, error: err },
|
|
@@ -416,7 +442,7 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
416
442
|
* @param userSignature
|
|
417
443
|
* @returns {Promise<void>} A promise that resolves when the record is added.
|
|
418
444
|
*/
|
|
419
|
-
async storePowCaptchaRecord(challenge, components, difficulty, providerSignature, ipAddress, headers, ja4, frictionlessTokenId, serverChecked = false, userSubmitted = false, storedStatus =
|
|
445
|
+
async storePowCaptchaRecord(challenge, components, difficulty, providerSignature, ipAddress, headers, ja4, frictionlessTokenId, serverChecked = false, userSubmitted = false, storedStatus = types.StoredStatusNames.notStored, userSignature) {
|
|
420
446
|
const tables = this.getTables();
|
|
421
447
|
const powCaptchaRecord = {
|
|
422
448
|
challenge,
|
|
@@ -435,21 +461,17 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
435
461
|
};
|
|
436
462
|
try {
|
|
437
463
|
await tables.powcaptcha.create(powCaptchaRecord);
|
|
438
|
-
this.logger.info(
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
464
|
+
this.logger.info(() => ({
|
|
465
|
+
data: {
|
|
466
|
+
challenge,
|
|
467
|
+
userSubmitted,
|
|
468
|
+
serverChecked,
|
|
469
|
+
storedStatus
|
|
470
|
+
},
|
|
471
|
+
msg: "PowCaptcha record added successfully"
|
|
472
|
+
}));
|
|
444
473
|
} catch (error) {
|
|
445
|
-
|
|
446
|
-
error,
|
|
447
|
-
challenge,
|
|
448
|
-
userSubmitted,
|
|
449
|
-
serverChecked,
|
|
450
|
-
storedStatus
|
|
451
|
-
});
|
|
452
|
-
throw new common.ProsopoDBError("DATABASE.CAPTCHA_UPDATE_FAILED", {
|
|
474
|
+
const err = new common.ProsopoDBError("DATABASE.CAPTCHA_UPDATE_FAILED", {
|
|
453
475
|
context: {
|
|
454
476
|
error,
|
|
455
477
|
challenge,
|
|
@@ -459,6 +481,11 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
459
481
|
},
|
|
460
482
|
logger: this.logger
|
|
461
483
|
});
|
|
484
|
+
this.logger.error(() => ({
|
|
485
|
+
err: error,
|
|
486
|
+
msg: "Failed to add PowCaptcha record"
|
|
487
|
+
}));
|
|
488
|
+
throw err;
|
|
462
489
|
}
|
|
463
490
|
}
|
|
464
491
|
/**
|
|
@@ -477,22 +504,27 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
477
504
|
const filter = { challenge };
|
|
478
505
|
const record = await this.tables.powcaptcha.findOne(filter).lean();
|
|
479
506
|
if (record) {
|
|
480
|
-
this.logger.info(
|
|
481
|
-
challenge
|
|
482
|
-
|
|
507
|
+
this.logger.info(() => ({
|
|
508
|
+
data: { challenge },
|
|
509
|
+
msg: "PowCaptcha record retrieved successfully"
|
|
510
|
+
}));
|
|
483
511
|
return record;
|
|
484
512
|
}
|
|
485
|
-
this.logger.info(
|
|
513
|
+
this.logger.info(() => ({
|
|
514
|
+
data: { challenge },
|
|
515
|
+
msg: "No PowCaptcha record found"
|
|
516
|
+
}));
|
|
486
517
|
return null;
|
|
487
518
|
} catch (error) {
|
|
488
|
-
|
|
489
|
-
error,
|
|
490
|
-
challenge
|
|
491
|
-
});
|
|
492
|
-
throw new common.ProsopoDBError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
519
|
+
const err = new common.ProsopoDBError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
493
520
|
context: { error, challenge },
|
|
494
521
|
logger: this.logger
|
|
495
522
|
});
|
|
523
|
+
this.logger.error(() => ({
|
|
524
|
+
err,
|
|
525
|
+
msg: "Failed to retrieve PowCaptcha record"
|
|
526
|
+
}));
|
|
527
|
+
throw err;
|
|
496
528
|
}
|
|
497
529
|
}
|
|
498
530
|
/**
|
|
@@ -522,29 +554,28 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
522
554
|
}
|
|
523
555
|
);
|
|
524
556
|
if (updateResult.matchedCount === 0) {
|
|
525
|
-
|
|
526
|
-
challenge,
|
|
527
|
-
...update
|
|
528
|
-
});
|
|
529
|
-
throw new common.ProsopoDBError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
557
|
+
const err = new common.ProsopoDBError("DATABASE.CAPTCHA_GET_FAILED", {
|
|
530
558
|
context: {
|
|
531
559
|
challenge,
|
|
532
560
|
...update
|
|
533
561
|
},
|
|
534
562
|
logger: this.logger
|
|
535
563
|
});
|
|
564
|
+
this.logger.info(() => ({
|
|
565
|
+
err,
|
|
566
|
+
msg: "No PowCaptcha record found to update"
|
|
567
|
+
}));
|
|
568
|
+
throw err;
|
|
536
569
|
}
|
|
537
|
-
this.logger.info(
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
570
|
+
this.logger.info(() => ({
|
|
571
|
+
data: {
|
|
572
|
+
challenge,
|
|
573
|
+
...update
|
|
574
|
+
},
|
|
575
|
+
msg: "PowCaptcha record updated successfully"
|
|
576
|
+
}));
|
|
541
577
|
} catch (error) {
|
|
542
|
-
|
|
543
|
-
error,
|
|
544
|
-
challenge,
|
|
545
|
-
...update
|
|
546
|
-
});
|
|
547
|
-
throw new common.ProsopoDBError("DATABASE.CAPTCHA_UPDATE_FAILED", {
|
|
578
|
+
const err = new common.ProsopoDBError("DATABASE.CAPTCHA_UPDATE_FAILED", {
|
|
548
579
|
context: {
|
|
549
580
|
error,
|
|
550
581
|
challenge,
|
|
@@ -552,12 +583,17 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
552
583
|
},
|
|
553
584
|
logger: this.logger
|
|
554
585
|
});
|
|
586
|
+
this.logger.error(() => ({
|
|
587
|
+
err,
|
|
588
|
+
msg: "Failed to update PowCaptcha record"
|
|
589
|
+
}));
|
|
590
|
+
throw err;
|
|
555
591
|
}
|
|
556
592
|
}
|
|
557
593
|
/** @description Get serverChecked Dapp User image captcha commitments from the commitments table
|
|
558
594
|
*/
|
|
559
595
|
async getCheckedDappUserCommitments() {
|
|
560
|
-
const filter = { [
|
|
596
|
+
const filter = { [types.StoredStatusNames.serverChecked]: true };
|
|
561
597
|
const docs = await this.tables?.commitment.find(filter).lean();
|
|
562
598
|
return docs || [];
|
|
563
599
|
}
|
|
@@ -607,7 +643,7 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
607
643
|
*/
|
|
608
644
|
async markDappUserCommitmentsChecked(commitmentIds) {
|
|
609
645
|
const updateDoc = {
|
|
610
|
-
[
|
|
646
|
+
[types.StoredStatusNames.serverChecked]: true,
|
|
611
647
|
lastUpdatedTimestamp: Date.now()
|
|
612
648
|
};
|
|
613
649
|
await this.tables?.commitment.updateMany(
|
|
@@ -678,7 +714,7 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
678
714
|
*/
|
|
679
715
|
async markDappUserPoWCommitmentsChecked(challenges) {
|
|
680
716
|
const updateDoc = {
|
|
681
|
-
[
|
|
717
|
+
[types.StoredStatusNames.serverChecked]: true,
|
|
682
718
|
lastUpdatedTimestamp: Date.now()
|
|
683
719
|
};
|
|
684
720
|
await this.tables?.powcaptcha.updateMany(
|
|
@@ -734,7 +770,9 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
734
770
|
*/
|
|
735
771
|
async storeSessionRecord(sessionRecord) {
|
|
736
772
|
try {
|
|
737
|
-
this.logger.debug(
|
|
773
|
+
this.logger.debug(() => ({
|
|
774
|
+
data: { action: "storing", sessionRecord }
|
|
775
|
+
}));
|
|
738
776
|
await this.tables.session.create(sessionRecord);
|
|
739
777
|
} catch (err) {
|
|
740
778
|
throw new common.ProsopoDBError("DATABASE.SESSION_STORE_FAILED", {
|
|
@@ -748,7 +786,9 @@ class ProviderDatabase extends mongo.MongoDatabase {
|
|
|
748
786
|
* @returns The session record if it existed, undefined otherwise
|
|
749
787
|
*/
|
|
750
788
|
async checkAndRemoveSession(sessionId) {
|
|
751
|
-
this.logger.debug(
|
|
789
|
+
this.logger.debug(() => ({
|
|
790
|
+
data: { action: "checking and removing", sessionId }
|
|
791
|
+
}));
|
|
752
792
|
const filter = {
|
|
753
793
|
sessionId,
|
|
754
794
|
deleted: { $exists: false }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,MAAM,EAA6B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAGlB,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,MAAM,yBAAyB,CAAC;AACjC,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;CACzB;AAoBD,qBAAa,eAAgB,SAAQ,aAAc,YAAW,gBAAgB;IAC7E,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBAG1B,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;IASvC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC;IAUzB,YAAY,CACjB,aAAa,EAAE,aAAa,EAAE,EAC9B,kBAAkB,EAAE,oBAAoB,EAAE,EAC1C,gBAAgB,EAAE,gBAAgB,EAAE;IA8D/B,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;KACtC,CAAC;CAgCF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ProsopoDBError,
|
|
1
|
+
import { ProsopoDBError, getLogger } from "@prosopo/common";
|
|
2
2
|
import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema, } from "@prosopo/types-database";
|
|
3
3
|
import { MongoDatabase } from "../base/index.js";
|
|
4
|
-
const logger =
|
|
4
|
+
const logger = getLogger("info", import.meta.url);
|
|
5
5
|
var TableNames;
|
|
6
6
|
(function (TableNames) {
|
|
7
7
|
TableNames["frictionlessToken"] = "frictionlessToken";
|
|
@@ -59,7 +59,10 @@ export class CaptchaDatabase extends MongoDatabase {
|
|
|
59
59
|
},
|
|
60
60
|
};
|
|
61
61
|
}));
|
|
62
|
-
logger.info(
|
|
62
|
+
logger.info(() => ({
|
|
63
|
+
data: { insertedCount: result.insertedCount },
|
|
64
|
+
msg: "Mongo Saved Session Events",
|
|
65
|
+
}));
|
|
63
66
|
}
|
|
64
67
|
if (imageCaptchaEvents.length) {
|
|
65
68
|
const result = await this.tables.commitment.bulkWrite(imageCaptchaEvents.map((doc) => {
|
|
@@ -72,7 +75,10 @@ export class CaptchaDatabase extends MongoDatabase {
|
|
|
72
75
|
},
|
|
73
76
|
};
|
|
74
77
|
}));
|
|
75
|
-
logger.info(
|
|
78
|
+
logger.info(() => ({
|
|
79
|
+
data: { upsertedCount: result.upsertedCount },
|
|
80
|
+
msg: "Mongo Saved Image Events",
|
|
81
|
+
}));
|
|
76
82
|
}
|
|
77
83
|
if (powCaptchaEvents.length) {
|
|
78
84
|
const result = await this.tables.powcaptcha.bulkWrite(powCaptchaEvents.map((doc) => {
|
|
@@ -85,7 +91,10 @@ export class CaptchaDatabase extends MongoDatabase {
|
|
|
85
91
|
},
|
|
86
92
|
};
|
|
87
93
|
}));
|
|
88
|
-
logger.info(
|
|
94
|
+
logger.info(() => ({
|
|
95
|
+
data: { upsertedCount: result.upsertedCount },
|
|
96
|
+
msg: "Mongo Saved PoW Events",
|
|
97
|
+
}));
|
|
89
98
|
}
|
|
90
99
|
await this.close();
|
|
91
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,EAAe,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/databases/captcha.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type Logger } from "@prosopo/common";
|
|
2
2
|
import type { TranslationKey } from "@prosopo/locale";
|
|
3
|
-
import { type Captcha, type CaptchaResult, type CaptchaSolution, CaptchaStates, type Dataset, type DatasetBase, type DatasetWithIds, type DatasetWithIdsAndTree, type Hash, type PoWChallengeComponents, type PoWChallengeId, type RequestHeaders, type ScheduledTaskNames, type ScheduledTaskResult, type ScheduledTaskStatus } from "@prosopo/types";
|
|
3
|
+
import { type Captcha, type CaptchaResult, type CaptchaSolution, CaptchaStates, type Dataset, type DatasetBase, type DatasetWithIds, type DatasetWithIdsAndTree, type Hash, type PoWChallengeComponents, type PoWChallengeId, type RequestHeaders, type ScheduledTaskNames, type ScheduledTaskResult, type ScheduledTaskStatus, type StoredStatus } from "@prosopo/types";
|
|
4
4
|
import type { FrictionlessTokenRecord, SessionRecord } from "@prosopo/types-database";
|
|
5
|
-
import { type ClientRecord, type FrictionlessToken, type FrictionlessTokenId, type IProviderDatabase, type PendingCaptchaRequest, type PoWCaptchaRecord, type ScheduledTaskRecord, type SolutionRecord, type
|
|
6
|
-
import { type
|
|
5
|
+
import { type ClientRecord, type FrictionlessToken, type FrictionlessTokenId, type IProviderDatabase, type PendingCaptchaRequest, type PoWCaptchaRecord, type ScheduledTaskRecord, type SolutionRecord, type Tables, type UserCommitment, type UserCommitmentRecord, type UserSolutionRecord } from "@prosopo/types-database";
|
|
6
|
+
import { type AccessRulesStorage } from "@prosopo/user-access-policy";
|
|
7
7
|
import type { ObjectId } from "mongoose";
|
|
8
|
+
import { type RedisClientType } from "redis";
|
|
8
9
|
import { MongoDatabase } from "../base/mongo.js";
|
|
9
10
|
declare enum TableNames {
|
|
10
11
|
captcha = "captcha",
|
|
@@ -18,17 +19,31 @@ declare enum TableNames {
|
|
|
18
19
|
client = "client",
|
|
19
20
|
frictionlessToken = "frictionlessToken",
|
|
20
21
|
session = "session",
|
|
21
|
-
userAccessRules = "userAccessRules",
|
|
22
22
|
detector = "detector"
|
|
23
23
|
}
|
|
24
|
+
type ProviderDatabaseOptions = {
|
|
25
|
+
mongo: {
|
|
26
|
+
url: string;
|
|
27
|
+
dbname?: string;
|
|
28
|
+
authSource?: string;
|
|
29
|
+
};
|
|
30
|
+
redis?: {
|
|
31
|
+
url: string;
|
|
32
|
+
password: string;
|
|
33
|
+
};
|
|
34
|
+
logger?: Logger;
|
|
35
|
+
};
|
|
24
36
|
export declare class ProviderDatabase extends MongoDatabase implements IProviderDatabase {
|
|
37
|
+
private readonly options;
|
|
25
38
|
tables: Tables<TableNames>;
|
|
26
|
-
private
|
|
27
|
-
constructor(
|
|
39
|
+
private userAccessRulesStorage;
|
|
40
|
+
constructor(options: ProviderDatabaseOptions);
|
|
28
41
|
connect(): Promise<void>;
|
|
42
|
+
protected setupRedis(): Promise<void>;
|
|
43
|
+
protected createRedisClient(): Promise<RedisClientType>;
|
|
29
44
|
loadTables(): void;
|
|
30
45
|
getTables(): Tables<TableNames>;
|
|
31
|
-
getUserAccessRulesStorage():
|
|
46
|
+
getUserAccessRulesStorage(): AccessRulesStorage;
|
|
32
47
|
storeDataset(dataset: Dataset | DatasetWithIdsAndTree): Promise<void>;
|
|
33
48
|
getSolutions(datasetId: string): Promise<SolutionRecord[]>;
|
|
34
49
|
getSolutionByCaptchaId(captchaId: string): Promise<SolutionRecord | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/databases/provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/databases/provider.ts"],"names":[],"mappings":"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"}
|