@prosopo/database 3.6.6 → 3.13.8

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 (57) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +17 -13
  2. package/.turbo/turbo-build$colon$tsc.log +18 -15
  3. package/.turbo/turbo-build.log +18 -14
  4. package/CHANGELOG.md +612 -0
  5. package/dist/base/mongo.d.ts +1 -1
  6. package/dist/base/mongo.d.ts.map +1 -1
  7. package/dist/base/mongo.js +5 -2
  8. package/dist/base/mongo.js.map +1 -1
  9. package/dist/base/mongoMemory.d.ts +1 -1
  10. package/dist/cjs/base/mongo.cjs +6 -3
  11. package/dist/cjs/databases/captcha.cjs +2 -1
  12. package/dist/cjs/databases/centralDbStreamer.cjs +136 -0
  13. package/dist/cjs/databases/index.cjs +2 -0
  14. package/dist/cjs/databases/provider.cjs +687 -162
  15. package/dist/cjs/index.cjs +4 -0
  16. package/dist/cjs/redisCache.cjs +388 -0
  17. package/dist/databases/captcha.d.ts +1 -1
  18. package/dist/databases/captcha.d.ts.map +1 -1
  19. package/dist/databases/captcha.js +2 -1
  20. package/dist/databases/captcha.js.map +1 -1
  21. package/dist/databases/centralDbStreamer.d.ts +19 -0
  22. package/dist/databases/centralDbStreamer.d.ts.map +1 -0
  23. package/dist/databases/centralDbStreamer.js +136 -0
  24. package/dist/databases/centralDbStreamer.js.map +1 -0
  25. package/dist/databases/client.d.ts +1 -1
  26. package/dist/databases/client.d.ts.map +1 -1
  27. package/dist/databases/client.js.map +1 -1
  28. package/dist/databases/index.d.ts +1 -0
  29. package/dist/databases/index.d.ts.map +1 -1
  30. package/dist/databases/index.js +2 -0
  31. package/dist/databases/index.js.map +1 -1
  32. package/dist/databases/provider.d.ts +45 -14
  33. package/dist/databases/provider.d.ts.map +1 -1
  34. package/dist/databases/provider.js +688 -163
  35. package/dist/databases/provider.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/redisCache.d.ts +31 -0
  41. package/dist/redisCache.d.ts.map +1 -0
  42. package/dist/redisCache.js +388 -0
  43. package/dist/redisCache.js.map +1 -0
  44. package/dist/tests/integration/ipInfoPersistence.integration.test.d.ts +2 -0
  45. package/dist/tests/integration/ipInfoPersistence.integration.test.d.ts.map +1 -0
  46. package/dist/tests/integration/ipInfoPersistence.integration.test.js +243 -0
  47. package/dist/tests/integration/ipInfoPersistence.integration.test.js.map +1 -0
  48. package/dist/tests/unit/captchaLabel.unit.test.d.ts +2 -0
  49. package/dist/tests/unit/captchaLabel.unit.test.d.ts.map +1 -0
  50. package/dist/tests/unit/captchaLabel.unit.test.js +41 -0
  51. package/dist/tests/unit/captchaLabel.unit.test.js.map +1 -0
  52. package/dist/tests/unit/databases/centralDbStreamer.unit.test.d.ts +2 -0
  53. package/dist/tests/unit/databases/centralDbStreamer.unit.test.d.ts.map +1 -0
  54. package/dist/tests/unit/databases/centralDbStreamer.unit.test.js +221 -0
  55. package/dist/tests/unit/databases/centralDbStreamer.unit.test.js.map +1 -0
  56. package/package.json +12 -9
  57. package/vite.test.config.ts +18 -0
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const common = require("@prosopo/common");
4
+ const logger = require("@prosopo/logger");
4
5
  const mongodb = require("mongodb");
5
6
  const mongoose = require("mongoose");
6
7
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
7
8
  mongoose.set("strictQuery", false);
8
9
  const DEFAULT_ENDPOINT = "mongodb://127.0.0.1:27017";
9
10
  class MongoDatabase {
10
- constructor(url, dbname, authSource, logger) {
11
+ constructor(url, dbname, authSource, logger$1) {
11
12
  this.connected = false;
12
13
  const baseEndpoint = url || DEFAULT_ENDPOINT;
13
14
  const parsedUrl = new URL(baseEndpoint);
@@ -20,7 +21,7 @@ class MongoDatabase {
20
21
  this._url = parsedUrl.toString();
21
22
  this.safeURL = this.url.replace(/\w+:\w+/, "<Credentials>");
22
23
  this.dbname = dbname || parsedUrl.pathname.replace("/", "");
23
- this.logger = logger || common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("base/mongo.cjs", document.baseURI).href);
24
+ this.logger = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("base/mongo.cjs", document.baseURI).href);
24
25
  }
25
26
  get url() {
26
27
  return this._url;
@@ -60,7 +61,9 @@ class MongoDatabase {
60
61
  this.connecting = new Promise((resolve, reject) => {
61
62
  const connection = mongoose.createConnection(this.url, {
62
63
  dbName: this.dbname,
63
- serverApi: mongodb.ServerApiVersion.v1
64
+ serverApi: mongodb.ServerApiVersion.v1,
65
+ maxPoolSize: 50,
66
+ minPoolSize: 5
64
67
  });
65
68
  const onConnected = () => {
66
69
  this.logger.debug(() => ({
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const common = require("@prosopo/common");
4
+ const logger$1 = require("@prosopo/logger");
4
5
  const typesDatabase = require("@prosopo/types-database");
5
6
  require("../base/index.cjs");
6
7
  const mongo = require("../base/mongo.cjs");
7
8
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
8
- const logger = common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("databases/captcha.cjs", document.baseURI).href);
9
+ const logger = logger$1.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("databases/captcha.cjs", document.baseURI).href);
9
10
  var TableNames = /* @__PURE__ */ ((TableNames2) => {
10
11
  TableNames2["frictionlessToken"] = "frictionlessToken";
11
12
  TableNames2["session"] = "session";
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const logger = require("@prosopo/logger");
4
+ const captcha = require("./captcha.cjs");
5
+ class CentralDbStreamer {
6
+ constructor(mongoCaptchaUri, logger$1) {
7
+ this.lastFailureTime = 0;
8
+ this.logger = logger$1 || logger.getLogger("info", "CentralDbStreamer");
9
+ this.db = new captcha.CaptchaDatabase(
10
+ mongoCaptchaUri,
11
+ void 0,
12
+ void 0,
13
+ this.logger
14
+ );
15
+ }
16
+ static {
17
+ this.RECONNECT_COOLDOWN_MS = 5e3;
18
+ }
19
+ ensureConnected() {
20
+ if (this.connectPromise && !this.db.connected) {
21
+ this.connectPromise = void 0;
22
+ }
23
+ if (!this.connectPromise) {
24
+ const elapsed = Date.now() - this.lastFailureTime;
25
+ if (elapsed < CentralDbStreamer.RECONNECT_COOLDOWN_MS) {
26
+ return Promise.reject(
27
+ new Error("CentralDbStreamer reconnect cooldown")
28
+ );
29
+ }
30
+ this.connectPromise = this.db.connect().catch((err) => {
31
+ this.logger.error(() => ({
32
+ err,
33
+ msg: "CentralDbStreamer failed to connect"
34
+ }));
35
+ this.lastFailureTime = Date.now();
36
+ this.connectPromise = void 0;
37
+ throw err;
38
+ });
39
+ }
40
+ return this.connectPromise;
41
+ }
42
+ getRecordTimestamp(record) {
43
+ return record.lastUpdatedTimestamp ?? record.createdAt ?? record.requestedAtTimestamp ?? /* @__PURE__ */ new Date();
44
+ }
45
+ /**
46
+ * Stream a PoW captcha record (create or update) to the central DB.
47
+ * Fire-and-forget: errors are logged, never thrown.
48
+ */
49
+ streamPowRecord(record, markStored) {
50
+ const timestamp = this.getRecordTimestamp(record);
51
+ this.ensureConnected().then(() => {
52
+ const { _id, ...safeDoc } = record;
53
+ return this.db.tables.powcaptcha.updateOne(
54
+ { challenge: safeDoc.challenge },
55
+ { $set: safeDoc },
56
+ { upsert: true }
57
+ );
58
+ }).then(() => markStored?.(timestamp)).catch((err) => {
59
+ this.logger.error(() => ({
60
+ err,
61
+ msg: "Failed to stream PoW record to central DB"
62
+ }));
63
+ });
64
+ }
65
+ /**
66
+ * Stream a partial PoW update by fetching the full record first, then upserting.
67
+ */
68
+ streamPowUpdate(getFullRecord, markStored) {
69
+ getFullRecord().then((record) => {
70
+ if (record) {
71
+ this.streamPowRecord(record, markStored);
72
+ }
73
+ }).catch((err) => {
74
+ this.logger.error(() => ({
75
+ err,
76
+ msg: "Failed to fetch PoW record for central DB streaming"
77
+ }));
78
+ });
79
+ }
80
+ /**
81
+ * Stream an image captcha commitment record to the central DB.
82
+ * Fire-and-forget: errors are logged, never thrown.
83
+ */
84
+ streamImageRecord(record, markStored) {
85
+ const timestamp = this.getRecordTimestamp(record);
86
+ this.ensureConnected().then(() => {
87
+ const { _id, ...safeDoc } = record;
88
+ return this.db.tables.commitment.updateOne(
89
+ { id: safeDoc.id },
90
+ { $set: safeDoc },
91
+ { upsert: true }
92
+ );
93
+ }).then(() => markStored?.(timestamp)).catch((err) => {
94
+ this.logger.error(() => ({
95
+ err,
96
+ msg: "Failed to stream image record to central DB"
97
+ }));
98
+ });
99
+ }
100
+ /**
101
+ * Stream an image captcha update by fetching the full record first.
102
+ */
103
+ streamImageUpdate(getFullRecord, markStored) {
104
+ getFullRecord().then((record) => {
105
+ if (record) {
106
+ this.streamImageRecord(record, markStored);
107
+ }
108
+ }).catch((err) => {
109
+ this.logger.error(() => ({
110
+ err,
111
+ msg: "Failed to fetch image record for central DB streaming"
112
+ }));
113
+ });
114
+ }
115
+ /**
116
+ * Stream a session record to the central DB.
117
+ * Fire-and-forget: errors are logged, never thrown.
118
+ */
119
+ streamSessionRecord(record, markStored) {
120
+ const timestamp = this.getRecordTimestamp(record);
121
+ this.ensureConnected().then(() => {
122
+ const { _id, ...safeDoc } = record;
123
+ return this.db.tables.session.updateOne(
124
+ { sessionId: safeDoc.sessionId },
125
+ { $set: safeDoc },
126
+ { upsert: true }
127
+ );
128
+ }).then(() => markStored?.(timestamp)).catch((err) => {
129
+ this.logger.error(() => ({
130
+ err,
131
+ msg: "Failed to stream session record to central DB"
132
+ }));
133
+ });
134
+ }
135
+ }
136
+ exports.CentralDbStreamer = CentralDbStreamer;
@@ -6,6 +6,7 @@ const mongoMemory = require("../base/mongoMemory.cjs");
6
6
  const captcha = require("./captcha.cjs");
7
7
  const client = require("./client.cjs");
8
8
  const provider = require("./provider.cjs");
9
+ const centralDbStreamer = require("./centralDbStreamer.cjs");
9
10
  const Databases = {
10
11
  [types.DatabaseTypes.Values.mongo]: mongo.MongoDatabase,
11
12
  [types.DatabaseTypes.Values.provider]: provider.ProviderDatabase,
@@ -16,4 +17,5 @@ const Databases = {
16
17
  exports.CaptchaDatabase = captcha.CaptchaDatabase;
17
18
  exports.ClientDatabase = client.ClientDatabase;
18
19
  exports.ProviderDatabase = provider.ProviderDatabase;
20
+ exports.CentralDbStreamer = centralDbStreamer.CentralDbStreamer;
19
21
  exports.Databases = Databases;