@prosopo/types-database 4.1.5 → 4.8.1

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 (42) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +16 -12
  2. package/.turbo/turbo-build$colon$tsc.log +17 -14
  3. package/.turbo/turbo-build.log +17 -13
  4. package/CHANGELOG.md +514 -0
  5. package/dist/cjs/index.cjs +6 -7
  6. package/dist/cjs/types/bannedDomain.cjs +8 -0
  7. package/dist/cjs/types/client.cjs +77 -5
  8. package/dist/cjs/types/index.cjs +6 -7
  9. package/dist/cjs/types/provider.cjs +299 -88
  10. package/dist/cjs/types/spamEmailDomain.cjs +8 -0
  11. package/dist/index.d.ts +0 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +8 -9
  14. package/dist/types/bannedDomain.d.ts +15 -0
  15. package/dist/types/bannedDomain.d.ts.map +1 -0
  16. package/dist/types/bannedDomain.js +8 -0
  17. package/dist/types/bannedDomain.js.map +1 -0
  18. package/dist/types/captcha.d.ts +2 -2
  19. package/dist/types/captcha.d.ts.map +1 -1
  20. package/dist/types/captcha.js.map +1 -1
  21. package/dist/types/client.d.ts +111 -12
  22. package/dist/types/client.d.ts.map +1 -1
  23. package/dist/types/client.js +78 -6
  24. package/dist/types/client.js.map +1 -1
  25. package/dist/types/index.d.ts +2 -0
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/index.js +8 -9
  28. package/dist/types/index.js.map +1 -1
  29. package/dist/types/mongo.d.ts +1 -1
  30. package/dist/types/provider.d.ts +59 -463
  31. package/dist/types/provider.d.ts.map +1 -1
  32. package/dist/types/provider.js +301 -90
  33. package/dist/types/provider.js.map +1 -1
  34. package/dist/types/spamEmailDomain.d.ts +15 -0
  35. package/dist/types/spamEmailDomain.d.ts.map +1 -0
  36. package/dist/types/spamEmailDomain.js +8 -0
  37. package/dist/types/spamEmailDomain.js.map +1 -0
  38. package/package.json +9 -7
  39. package/dist/provider/pendingCaptchaRequest.d.ts +0 -14
  40. package/dist/provider/pendingCaptchaRequest.d.ts.map +0 -1
  41. package/dist/provider/pendingCaptchaRequest.js +0 -2
  42. package/dist/provider/pendingCaptchaRequest.js.map +0 -1
@@ -5,26 +5,23 @@ const provider = require("./provider.cjs");
5
5
  const client = require("./client.cjs");
6
6
  const captcha = require("./captcha.cjs");
7
7
  require("./userAgent.cjs");
8
+ const spamEmailDomain = require("./spamEmailDomain.cjs");
9
+ const bannedDomain = require("./bannedDomain.cjs");
8
10
  exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
9
11
  exports.ClientContextEntropyRecordSchema = provider.ClientContextEntropyRecordSchema;
10
12
  exports.ClientRecordSchema = provider.ClientRecordSchema;
11
13
  exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
12
- exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
13
14
  exports.DatasetRecordSchema = provider.DatasetRecordSchema;
15
+ exports.DecisionMachineArtifactRecordSchema = provider.DecisionMachineArtifactRecordSchema;
14
16
  exports.DetectorRecordSchema = provider.DetectorRecordSchema;
15
- exports.IpAddressType = provider.IpAddressType;
16
- exports.PendingRecordSchema = provider.PendingRecordSchema;
17
17
  exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
18
+ exports.PuzzleCaptchaRecordSchema = provider.PuzzleCaptchaRecordSchema;
18
19
  exports.ScheduledTaskRecordSchema = provider.ScheduledTaskRecordSchema;
19
20
  exports.ScheduledTaskSchema = provider.ScheduledTaskSchema;
20
21
  exports.SessionRecordSchema = provider.SessionRecordSchema;
21
22
  exports.SolutionRecordSchema = provider.SolutionRecordSchema;
22
23
  exports.UserCommitmentRecordSchema = provider.UserCommitmentRecordSchema;
23
- exports.UserCommitmentSchema = provider.UserCommitmentSchema;
24
- exports.UserCommitmentWithSolutionsSchema = provider.UserCommitmentWithSolutionsSchema;
25
24
  exports.UserSolutionRecordSchema = provider.UserSolutionRecordSchema;
26
- exports.UserSolutionSchema = provider.UserSolutionSchema;
27
- exports.parseMongooseCompositeIpAddress = provider.parseMongooseCompositeIpAddress;
28
25
  exports.AccountSchema = client.AccountSchema;
29
26
  exports.IPValidationRulesSchema = client.IPValidationRulesSchema;
30
27
  exports.TableNames = client.TableNames;
@@ -33,3 +30,5 @@ exports.UserSettingsSchema = client.UserSettingsSchema;
33
30
  exports.StoredPoWCaptchaRecordSchema = captcha.StoredPoWCaptchaRecordSchema;
34
31
  exports.StoredSessionRecordSchema = captcha.StoredSessionRecordSchema;
35
32
  exports.StoredUserCommitmentRecordSchema = captcha.StoredUserCommitmentRecordSchema;
33
+ exports.SpamEmailDomainRecordSchema = spamEmailDomain.SpamEmailDomainRecordSchema;
34
+ exports.BannedDomainRecordSchema = bannedDomain.BannedDomainRecordSchema;
@@ -9,23 +9,12 @@ const ONE_HOUR = 60 * 60;
9
9
  const ONE_DAY = ONE_HOUR * 24;
10
10
  const ONE_WEEK = ONE_DAY * 7;
11
11
  const ONE_MONTH = ONE_WEEK * 4;
12
- const TEN_MINUTES = 10 * 60;
13
12
  const ClientRecordSchema = new mongoose.Schema({
14
13
  account: String,
15
14
  settings: client.UserSettingsSchema,
16
15
  tier: { type: String, enum: types.Tier, required: true }
17
16
  });
18
17
  ClientRecordSchema.index({ account: 1 });
19
- var IpAddressType = /* @__PURE__ */ ((IpAddressType2) => {
20
- IpAddressType2["v4"] = "v4";
21
- IpAddressType2["v6"] = "v6";
22
- return IpAddressType2;
23
- })(IpAddressType || {});
24
- const CompositeIpAddressSchema = zod.object({
25
- lower: zod.bigint(),
26
- upper: zod.bigint().optional(),
27
- type: zod.nativeEnum(IpAddressType)
28
- });
29
18
  const CompositeIpAddressRecordSchemaObj = {
30
19
  lower: {
31
20
  // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
@@ -41,40 +30,8 @@ const CompositeIpAddressRecordSchemaObj = {
41
30
  // without casting to string Mongoose not able to set bigint to Decimal128
42
31
  set: (value) => "bigint" === typeof value ? value.toString() : value
43
32
  },
44
- type: { type: String, enum: IpAddressType, required: true }
45
- };
46
- const parseMongooseCompositeIpAddress = (ip) => {
47
- return {
48
- lower: BigInt(ip.lower.$numberDecimal ?? ip.lower),
49
- upper: ip.upper ? BigInt(ip.upper?.$numberDecimal ?? ip.upper) : void 0,
50
- type: ip.type
51
- };
33
+ type: { type: String, enum: types.IpAddressType, required: true }
52
34
  };
53
- const CaptchaResultSchema = zod.object({
54
- status: zod.nativeEnum(types.CaptchaStatus),
55
- reason: locale.TranslationKeysSchema.optional(),
56
- error: zod.string().optional()
57
- });
58
- const UserCommitmentSchema = zod.object({
59
- userAccount: zod.string(),
60
- dappAccount: zod.string(),
61
- datasetId: zod.string(),
62
- providerAccount: zod.string(),
63
- id: zod.string(),
64
- result: CaptchaResultSchema,
65
- userSignature: zod.string(),
66
- ipAddress: CompositeIpAddressSchema,
67
- providedIp: CompositeIpAddressSchema.optional(),
68
- headers: zod.object({}).catchall(zod.string()),
69
- ja4: zod.string(),
70
- userSubmitted: zod.boolean(),
71
- serverChecked: zod.boolean(),
72
- storedAtTimestamp: zod.date().optional(),
73
- requestedAtTimestamp: zod.date(),
74
- lastUpdatedTimestamp: zod.date().optional(),
75
- sessionId: zod.string().optional(),
76
- coords: zod.array(zod.array(zod.array(zod.number()))).optional()
77
- });
78
35
  const CaptchaRecordSchema = new mongoose.Schema({
79
36
  captchaId: { type: String, required: true },
80
37
  captchaContentId: { type: String, required: true },
@@ -122,24 +79,38 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
122
79
  type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
123
80
  required: false
124
81
  },
82
+ metadata: {
83
+ type: new mongoose.Schema(
84
+ { email: { type: String, required: false } },
85
+ { _id: false }
86
+ ),
87
+ required: false
88
+ },
89
+ clientMetaData: {
90
+ type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
91
+ required: false
92
+ },
125
93
  headers: { type: Object, required: true },
126
94
  ja4: { type: String, required: true },
127
95
  userSignature: { type: String, required: false },
128
96
  userSubmitted: { type: Boolean, required: true },
129
97
  serverChecked: { type: Boolean, required: true },
130
98
  storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
131
- geolocation: { type: String, required: false },
132
- vpn: { type: Boolean, required: false },
99
+ // See `StoredCaptcha.pendingStage` `true` while the record has
100
+ // unstaged changes. Indexed via a tiny partial index so the
101
+ // StoreCommitmentsExternal sweep scans only pending rows instead of
102
+ // the whole collection.
103
+ pendingStage: { type: Boolean, required: false },
104
+ // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
105
+ // `geolocation` and other per-flag fields — consumers narrow on
106
+ // `ipInfo.isValid` and read whichever sub-field they need.
107
+ ipInfo: { type: Object, required: false },
133
108
  parsedUserAgentInfo: { type: Object, required: false },
134
109
  sessionId: {
135
110
  type: String,
136
111
  required: false
137
112
  },
138
113
  coords: { type: [[[Number]]], required: false },
139
- // Legacy fields - kept for backward compatibility with existing data
140
- mouseEvents: { type: [Object], required: false },
141
- touchEvents: { type: [Object], required: false },
142
- clickEvents: { type: [Object], required: false },
143
114
  // Current behavioral data storage format (packed)
144
115
  deviceCapability: { type: String, required: false },
145
116
  behavioralDataPacked: {
@@ -150,14 +121,129 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
150
121
  d: { type: String, required: true }
151
122
  },
152
123
  required: false
153
- }
124
+ },
125
+ providerSignature: { type: String, required: true },
126
+ // Internal ML labelling applied by superadmins via the audit page.
127
+ label: { type: String, enum: Object.values(types.CaptchaLabel), required: false },
128
+ labelReason: { type: String, required: false },
129
+ labelledBy: { type: String, required: false },
130
+ labelledAt: { type: Date, required: false }
154
131
  });
155
132
  PoWCaptchaRecordSchema.index({ challenge: 1 });
133
+ PoWCaptchaRecordSchema.index({ label: 1, dappAccount: 1 });
156
134
  PoWCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
157
135
  PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
158
136
  PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
159
137
  PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
160
138
  PoWCaptchaRecordSchema.index({ "result.reason": 1 });
139
+ PoWCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
140
+ PoWCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
141
+ PoWCaptchaRecordSchema.index({ ipInfo: 1 });
142
+ PoWCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
143
+ PoWCaptchaRecordSchema.index(
144
+ { pendingStage: 1 },
145
+ {
146
+ name: "pendingStage_partial",
147
+ partialFilterExpression: { pendingStage: true }
148
+ }
149
+ );
150
+ const PuzzleCaptchaRecordSchema = new mongoose.Schema({
151
+ challenge: { type: String, required: true },
152
+ dappAccount: { type: String, required: true },
153
+ userAccount: { type: String, required: true },
154
+ requestedAtTimestamp: { type: Date, required: true },
155
+ lastUpdatedTimestamp: { type: Date, required: false },
156
+ result: {
157
+ status: { type: String, enum: types.CaptchaStatus, required: true },
158
+ reason: {
159
+ type: String,
160
+ enum: locale.TranslationKeysSchema.options,
161
+ required: false
162
+ },
163
+ error: { type: String, required: false }
164
+ },
165
+ targetX: { type: Number, required: true },
166
+ targetY: { type: Number, required: true },
167
+ originX: { type: Number, required: true },
168
+ originY: { type: Number, required: true },
169
+ tolerance: { type: Number, required: true },
170
+ puzzleEvents: {
171
+ type: [
172
+ new mongoose.Schema(
173
+ {
174
+ x: { type: Number, required: true },
175
+ y: { type: Number, required: true },
176
+ t: { type: Number, required: true }
177
+ },
178
+ { _id: false }
179
+ )
180
+ ],
181
+ required: false
182
+ },
183
+ ipAddress: CompositeIpAddressRecordSchemaObj,
184
+ providedIp: {
185
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
186
+ required: false
187
+ },
188
+ metadata: {
189
+ type: new mongoose.Schema(
190
+ { email: { type: String, required: false } },
191
+ { _id: false }
192
+ ),
193
+ required: false
194
+ },
195
+ clientMetaData: {
196
+ type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
197
+ required: false
198
+ },
199
+ headers: { type: Object, required: true },
200
+ ja4: { type: String, required: true },
201
+ userSignature: { type: String, required: false },
202
+ userSubmitted: { type: Boolean, required: true },
203
+ serverChecked: { type: Boolean, required: true },
204
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
205
+ // See `StoredCaptcha.pendingStage`.
206
+ pendingStage: { type: Boolean, required: false },
207
+ // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
208
+ // `geolocation` and other per-flag fields — consumers narrow on
209
+ // `ipInfo.isValid` and read whichever sub-field they need.
210
+ ipInfo: { type: Object, required: false },
211
+ parsedUserAgentInfo: { type: Object, required: false },
212
+ sessionId: {
213
+ type: String,
214
+ required: false
215
+ },
216
+ coords: { type: [[[Number]]], required: false },
217
+ // Current behavioral data storage format (packed)
218
+ deviceCapability: { type: String, required: false },
219
+ behavioralDataPacked: {
220
+ type: {
221
+ c1: { type: [mongoose.Schema.Types.Mixed], required: true },
222
+ c2: { type: [mongoose.Schema.Types.Mixed], required: true },
223
+ c3: { type: [mongoose.Schema.Types.Mixed], required: true },
224
+ d: { type: String, required: true }
225
+ },
226
+ required: false
227
+ },
228
+ providerSignature: { type: String, required: true }
229
+ });
230
+ PuzzleCaptchaRecordSchema.index({ challenge: 1 });
231
+ PuzzleCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
232
+ PuzzleCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
233
+ PuzzleCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
234
+ PuzzleCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
235
+ PuzzleCaptchaRecordSchema.index({ "result.reason": 1 });
236
+ PuzzleCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
237
+ PuzzleCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
238
+ PuzzleCaptchaRecordSchema.index({ ipInfo: 1 });
239
+ PuzzleCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
240
+ PuzzleCaptchaRecordSchema.index(
241
+ { pendingStage: 1 },
242
+ {
243
+ name: "pendingStage_partial",
244
+ partialFilterExpression: { pendingStage: true }
245
+ }
246
+ );
161
247
  const UserCommitmentRecordSchema = new mongoose.Schema({
162
248
  userAccount: { type: String, required: true },
163
249
  dappAccount: { type: String, required: true },
@@ -178,6 +264,17 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
178
264
  type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
179
265
  required: false
180
266
  },
267
+ metadata: {
268
+ type: new mongoose.Schema(
269
+ { email: { type: String, required: false } },
270
+ { _id: false }
271
+ ),
272
+ required: false
273
+ },
274
+ clientMetaData: {
275
+ type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
276
+ required: false
277
+ },
181
278
  headers: { type: Object, required: true },
182
279
  ja4: { type: String, required: true },
183
280
  userSignature: { type: String, required: true },
@@ -186,16 +283,43 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
186
283
  storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
187
284
  requestedAtTimestamp: { type: Date, required: true },
188
285
  lastUpdatedTimestamp: { type: Date, required: false },
189
- geolocation: { type: String, required: false },
190
- vpn: { type: Boolean, required: false },
286
+ // See `StoredCaptcha.pendingStage`.
287
+ pendingStage: { type: Boolean, required: false },
288
+ // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
289
+ // `geolocation` and other per-flag fields — consumers narrow on
290
+ // `ipInfo.isValid` and read whichever sub-field they need.
291
+ ipInfo: { type: Object, required: false },
191
292
  parsedUserAgentInfo: { type: Object, required: false },
192
293
  sessionId: {
193
294
  type: String,
194
295
  required: false
195
296
  },
196
- coords: { type: [[[Number]]], required: false }
297
+ coords: { type: [[[Number]]], required: false },
298
+ // Pending request fields for image captcha workflow
299
+ pending: { type: Boolean, required: true },
300
+ salt: { type: String, required: true },
301
+ requestHash: { type: String, required: true },
302
+ deadlineTimestamp: { type: Date, required: true },
303
+ threshold: { type: Number, required: true },
304
+ // Current behavioral data storage format (packed)
305
+ deviceCapability: { type: String, required: false },
306
+ behavioralDataPacked: {
307
+ type: {
308
+ c1: { type: [mongoose.Schema.Types.Mixed], required: true },
309
+ c2: { type: [mongoose.Schema.Types.Mixed], required: true },
310
+ c3: { type: [mongoose.Schema.Types.Mixed], required: true },
311
+ d: { type: String, required: true }
312
+ },
313
+ required: false
314
+ },
315
+ // Internal ML labelling applied by superadmins via the audit page.
316
+ label: { type: String, enum: Object.values(types.CaptchaLabel), required: false },
317
+ labelReason: { type: String, required: false },
318
+ labelledBy: { type: String, required: false },
319
+ labelledAt: { type: Date, required: false }
197
320
  });
198
321
  UserCommitmentRecordSchema.index({ id: -1 });
322
+ UserCommitmentRecordSchema.index({ label: 1, dappAccount: 1 });
199
323
  UserCommitmentRecordSchema.index({
200
324
  lastUpdatedTimestamp: 1
201
325
  });
@@ -203,6 +327,19 @@ UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
203
327
  UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
204
328
  UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
205
329
  UserCommitmentRecordSchema.index({ "result.reason": 1 });
330
+ UserCommitmentRecordSchema.index({ "ipInfo.countryCode": 1 });
331
+ UserCommitmentRecordSchema.index({ "ipInfo.isVPN": 1 });
332
+ UserCommitmentRecordSchema.index({ requestHash: -1 });
333
+ UserCommitmentRecordSchema.index({ pending: 1 });
334
+ UserCommitmentRecordSchema.index({ ipInfo: 1 });
335
+ UserCommitmentRecordSchema.index({ parsedUserAgentInfo: 1 });
336
+ UserCommitmentRecordSchema.index(
337
+ { pendingStage: 1 },
338
+ {
339
+ name: "pendingStage_partial",
340
+ partialFilterExpression: { pendingStage: true }
341
+ }
342
+ );
206
343
  const DatasetRecordSchema = new mongoose.Schema({
207
344
  contentTree: { type: [[String]], required: true },
208
345
  datasetContentId: { type: String, required: true },
@@ -220,12 +357,6 @@ const SolutionRecordSchema = new mongoose.Schema({
220
357
  solution: { type: [String], required: true }
221
358
  });
222
359
  SolutionRecordSchema.index({ captchaId: 1 });
223
- const UserSolutionSchema = types.CaptchaSolutionSchema.extend({
224
- processed: zod.boolean(),
225
- checked: zod.boolean(),
226
- commitmentId: zod.string(),
227
- createdAt: zod.date()
228
- });
229
360
  const UserSolutionRecordSchema = new mongoose.Schema(
230
361
  {
231
362
  captchaId: { type: String, required: true },
@@ -241,25 +372,6 @@ const UserSolutionRecordSchema = new mongoose.Schema(
241
372
  );
242
373
  UserSolutionRecordSchema.index({ captchaId: 1 });
243
374
  UserSolutionRecordSchema.index({ commitmentId: -1 });
244
- const UserCommitmentWithSolutionsSchema = UserCommitmentSchema.extend({
245
- captchas: zod.array(UserSolutionSchema)
246
- });
247
- const PendingRecordSchema = new mongoose.Schema({
248
- accountId: { type: String, required: true },
249
- pending: { type: Boolean, required: true },
250
- salt: { type: String, required: true },
251
- requestHash: { type: String, required: true },
252
- deadlineTimestamp: { type: Number, required: true },
253
- // unix timestamp
254
- requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
255
- ipAddress: CompositeIpAddressRecordSchemaObj,
256
- sessionId: {
257
- type: String,
258
- required: false
259
- },
260
- threshold: { type: Number, required: true, default: 0.8 }
261
- });
262
- PendingRecordSchema.index({ requestHash: -1 });
263
375
  const ScheduledTaskSchema = zod.object({
264
376
  processName: zod.nativeEnum(types.ScheduledTaskNames),
265
377
  datetime: zod.date(),
@@ -301,28 +413,99 @@ const SessionRecordSchema = new mongoose.Schema({
301
413
  timeout: { type: Number, required: false },
302
414
  accessPolicy: { type: Number, required: false },
303
415
  unverifiedHost: { type: Number, required: false },
304
- webView: { type: Number, required: false }
416
+ webView: { type: Number, required: false },
417
+ triggeredDetectors: { type: [Number], required: false },
418
+ shadowDomPenalty: { type: Boolean, required: false }
305
419
  },
306
420
  providerSelectEntropy: { type: Number, required: true },
307
421
  ipAddress: CompositeIpAddressRecordSchemaObj,
308
422
  captchaType: { type: String, enum: types.CaptchaType, required: true },
423
+ mode: { type: String, enum: types.ModeEnum, required: false },
309
424
  solvedImagesCount: { type: Number, required: false },
310
425
  powDifficulty: { type: Number, required: false },
311
426
  storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
312
427
  lastUpdatedTimestamp: { type: Date, required: false },
428
+ // See `StoredCaptcha.pendingStage` — same semantics on Session records.
429
+ pendingStage: { type: Boolean, required: false },
313
430
  deleted: { type: Boolean, required: false },
314
431
  userSitekeyIpHash: { type: String, required: false },
315
432
  webView: { type: Boolean, required: true, default: false },
316
433
  iFrame: { type: Boolean, required: true, default: false },
317
434
  decryptedHeadHash: { type: String, required: false, default: "" },
318
- reason: { type: String, required: false }
435
+ siteKey: { type: String, required: false },
436
+ reason: { type: String, required: false },
437
+ blocked: { type: Boolean, required: false },
438
+ // Full ipinfo payload — replaces flat `countryCode` / `geolocation`
439
+ // fields. Mirrors the captcha record schemas (PoW / Puzzle /
440
+ // UserCommitment).
441
+ ipInfo: { type: Object, required: false },
442
+ headers: { type: Object, required: false },
443
+ result: {
444
+ type: new mongoose.Schema(
445
+ {
446
+ status: {
447
+ type: String,
448
+ enum: Object.values(types.CaptchaStatus),
449
+ required: true
450
+ },
451
+ reason: { type: String, required: false },
452
+ error: { type: String, required: false }
453
+ },
454
+ { _id: false }
455
+ ),
456
+ required: false
457
+ },
458
+ userSubmitted: { type: Boolean, required: false },
459
+ serverChecked: { type: Boolean, required: false },
460
+ // WASM SIMD CPU fingerprint readings collected by the catcher client.
461
+ // Stored as a free-form Mixed sub-document because the shape is a
462
+ // discriminated union and the dataset is still evolving — Zod validates
463
+ // at the boundary, Mongoose just persists it.
464
+ simdReadings: { type: mongoose.Schema.Types.Mixed, required: false },
465
+ // Stage at which the SIMD readings first arrived on this session
466
+ // (frictionless / challenge / submit). First-hop-wins.
467
+ simdReadingsStage: { type: String, required: false },
468
+ // DNS observation merge target. Populated by
469
+ // POST /v1/prosopo/provider/admin/dns/event from the dns-event
470
+ // sidecar (see types/provider/database.ts → Session.dnsEvent).
471
+ dnsEvent: {
472
+ type: new mongoose.Schema(
473
+ {
474
+ resolverIp: { type: String, required: false },
475
+ peerIp: { type: String, required: false },
476
+ pathValid: { type: Boolean, required: false },
477
+ receivedAt: { type: Date, required: true }
478
+ },
479
+ { _id: false }
480
+ ),
481
+ required: false
482
+ }
319
483
  });
320
484
  SessionRecordSchema.index({ createdAt: 1 });
321
485
  SessionRecordSchema.index({ deleted: 1 });
486
+ SessionRecordSchema.index({ blocked: 1 });
322
487
  SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
323
488
  SessionRecordSchema.index({ userSitekeyIpHash: 1 });
324
489
  SessionRecordSchema.index({ providerSelectEntropy: 1 });
325
490
  SessionRecordSchema.index({ token: 1 });
491
+ SessionRecordSchema.index({ siteKey: 1 }, { background: true, sparse: true });
492
+ SessionRecordSchema.index({
493
+ createdAt: 1,
494
+ captchaType: 1,
495
+ "scoreComponents.baseScore": 1
496
+ });
497
+ SessionRecordSchema.index({ createdAt: 1, deleted: 1 });
498
+ SessionRecordSchema.index(
499
+ { "result.status": 1 },
500
+ { background: true, sparse: true }
501
+ );
502
+ SessionRecordSchema.index(
503
+ { pendingStage: 1 },
504
+ {
505
+ name: "pendingStage_partial",
506
+ partialFilterExpression: { pendingStage: true }
507
+ }
508
+ );
326
509
  const DetectorRecordSchema = new mongoose.Schema({
327
510
  createdAt: { type: Date, required: true },
328
511
  detectorKey: { type: String, required: true },
@@ -330,6 +513,39 @@ const DetectorRecordSchema = new mongoose.Schema({
330
513
  });
331
514
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
332
515
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
516
+ const DecisionMachineArtifactRecordSchema = new mongoose.Schema({
517
+ scope: {
518
+ type: String,
519
+ enum: Object.values(types.DecisionMachineScope),
520
+ required: true
521
+ },
522
+ dappAccount: { type: String, required: false },
523
+ runtime: {
524
+ type: String,
525
+ enum: Object.values(types.DecisionMachineRuntime),
526
+ required: true
527
+ },
528
+ language: {
529
+ type: String,
530
+ enum: Object.values(types.DecisionMachineLanguage),
531
+ required: false
532
+ },
533
+ source: { type: String, required: true },
534
+ name: { type: String, required: false },
535
+ version: { type: String, required: false },
536
+ captchaType: {
537
+ type: String,
538
+ enum: [types.CaptchaType.pow, types.CaptchaType.image],
539
+ required: false
540
+ },
541
+ createdAt: { type: Date, required: true },
542
+ updatedAt: { type: Date, required: true }
543
+ });
544
+ DecisionMachineArtifactRecordSchema.index(
545
+ { scope: 1, dappAccount: 1 },
546
+ { unique: true }
547
+ );
548
+ DecisionMachineArtifactRecordSchema.index({ updatedAt: -1 });
333
549
  const ClientContextEntropyRecordSchema = new mongoose.Schema(
334
550
  {
335
551
  account: { type: String, required: true },
@@ -350,19 +566,14 @@ exports.CaptchaRecordSchema = CaptchaRecordSchema;
350
566
  exports.ClientContextEntropyRecordSchema = ClientContextEntropyRecordSchema;
351
567
  exports.ClientRecordSchema = ClientRecordSchema;
352
568
  exports.CompositeIpAddressRecordSchemaObj = CompositeIpAddressRecordSchemaObj;
353
- exports.CompositeIpAddressSchema = CompositeIpAddressSchema;
354
569
  exports.DatasetRecordSchema = DatasetRecordSchema;
570
+ exports.DecisionMachineArtifactRecordSchema = DecisionMachineArtifactRecordSchema;
355
571
  exports.DetectorRecordSchema = DetectorRecordSchema;
356
- exports.IpAddressType = IpAddressType;
357
- exports.PendingRecordSchema = PendingRecordSchema;
358
572
  exports.PoWCaptchaRecordSchema = PoWCaptchaRecordSchema;
573
+ exports.PuzzleCaptchaRecordSchema = PuzzleCaptchaRecordSchema;
359
574
  exports.ScheduledTaskRecordSchema = ScheduledTaskRecordSchema;
360
575
  exports.ScheduledTaskSchema = ScheduledTaskSchema;
361
576
  exports.SessionRecordSchema = SessionRecordSchema;
362
577
  exports.SolutionRecordSchema = SolutionRecordSchema;
363
578
  exports.UserCommitmentRecordSchema = UserCommitmentRecordSchema;
364
- exports.UserCommitmentSchema = UserCommitmentSchema;
365
- exports.UserCommitmentWithSolutionsSchema = UserCommitmentWithSolutionsSchema;
366
579
  exports.UserSolutionRecordSchema = UserSolutionRecordSchema;
367
- exports.UserSolutionSchema = UserSolutionSchema;
368
- exports.parseMongooseCompositeIpAddress = parseMongooseCompositeIpAddress;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const mongoose = require("mongoose");
4
+ const SpamEmailDomainRecordSchema = new mongoose.Schema({
5
+ domain: { type: String, required: true, unique: true }
6
+ });
7
+ SpamEmailDomainRecordSchema.index({ domain: 1 });
8
+ exports.SpamEmailDomainRecordSchema = SpamEmailDomainRecordSchema;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from "./types/index.js";
2
- export type { PendingCaptchaRequest } from "./provider/pendingCaptchaRequest.js";
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,34 +1,33 @@
1
1
  import "./types/index.js";
2
- import { CaptchaRecordSchema, ClientContextEntropyRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./types/provider.js";
2
+ import { CaptchaRecordSchema, ClientContextEntropyRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, DatasetRecordSchema, DecisionMachineArtifactRecordSchema, DetectorRecordSchema, PoWCaptchaRecordSchema, PuzzleCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserSolutionRecordSchema } from "./types/provider.js";
3
3
  import { AccountSchema, IPValidationRulesSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./types/client.js";
4
4
  import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "./types/captcha.js";
5
+ import { SpamEmailDomainRecordSchema } from "./types/spamEmailDomain.js";
6
+ import { BannedDomainRecordSchema } from "./types/bannedDomain.js";
5
7
  export {
6
8
  AccountSchema,
9
+ BannedDomainRecordSchema,
7
10
  CaptchaRecordSchema,
8
11
  ClientContextEntropyRecordSchema,
9
12
  ClientRecordSchema,
10
13
  CompositeIpAddressRecordSchemaObj,
11
- CompositeIpAddressSchema,
12
14
  DatasetRecordSchema,
15
+ DecisionMachineArtifactRecordSchema,
13
16
  DetectorRecordSchema,
14
17
  IPValidationRulesSchema,
15
- IpAddressType,
16
- PendingRecordSchema,
17
18
  PoWCaptchaRecordSchema,
19
+ PuzzleCaptchaRecordSchema,
18
20
  ScheduledTaskRecordSchema,
19
21
  ScheduledTaskSchema,
20
22
  SessionRecordSchema,
21
23
  SolutionRecordSchema,
24
+ SpamEmailDomainRecordSchema,
22
25
  StoredPoWCaptchaRecordSchema,
23
26
  StoredSessionRecordSchema,
24
27
  StoredUserCommitmentRecordSchema,
25
28
  TableNames,
26
29
  UserCommitmentRecordSchema,
27
- UserCommitmentSchema,
28
- UserCommitmentWithSolutionsSchema,
29
30
  UserDataSchema,
30
31
  UserSettingsSchema,
31
- UserSolutionRecordSchema,
32
- UserSolutionSchema,
33
- parseMongooseCompositeIpAddress
32
+ UserSolutionRecordSchema
34
33
  };
@@ -0,0 +1,15 @@
1
+ import type mongoose from "mongoose";
2
+ export type BannedDomain = {
3
+ domain: string;
4
+ };
5
+ export type BannedDomainRecord = mongoose.Document & BannedDomain;
6
+ export declare const BannedDomainRecordSchema: mongoose.Schema<BannedDomainRecord, mongoose.Model<BannedDomainRecord, any, any, any, mongoose.Document<unknown, any, BannedDomainRecord> & mongoose.Document<unknown, any, any> & BannedDomain & Required<{
7
+ _id: unknown;
8
+ }> & {
9
+ __v: number;
10
+ }, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, BannedDomainRecord, mongoose.Document<unknown, {}, mongoose.FlatRecord<BannedDomainRecord>> & mongoose.FlatRecord<BannedDomainRecord> & Required<{
11
+ _id: unknown;
12
+ }> & {
13
+ __v: number;
14
+ }>;
15
+ //# sourceMappingURL=bannedDomain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bannedDomain.d.ts","sourceRoot":"","sources":["../../src/types/bannedDomain.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC;AAElE,eAAO,MAAM,wBAAwB;;;;;;;;EAEnC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Schema } from "mongoose";
2
+ const BannedDomainRecordSchema = new Schema({
3
+ domain: { type: String, required: true, unique: true }
4
+ });
5
+ BannedDomainRecordSchema.index({ domain: 1 });
6
+ export {
7
+ BannedDomainRecordSchema
8
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bannedDomain.js","sourceRoot":"","sources":["../../src/types/bannedDomain.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQlC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,MAAM,CAAqB;IACtE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACtD,CAAC,CAAC;AAEH,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { PoWCaptcha } from "@prosopo/types";
1
+ import type { PoWCaptcha, UserCommitment } from "@prosopo/types";
2
2
  import { type RootFilterQuery, Schema } from "mongoose";
3
3
  import type { IDatabase } from "./mongo.js";
4
- import { type PoWCaptchaRecord, type SessionRecord, type UserCommitment, type UserCommitmentRecord } from "./provider.js";
4
+ import { type PoWCaptchaRecord, type SessionRecord, type UserCommitmentRecord } from "./provider.js";
5
5
  export type StoredSession = SessionRecord;
6
6
  export declare const StoredSessionRecordSchema: Schema;
7
7
  export declare const StoredUserCommitmentRecordSchema: Schema;
@@ -1 +1 @@
1
- {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/types/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACN,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;AAE1C,eAAO,MAAM,yBAAyB,EAAE,MAA4B,CAAC;AAErE,eAAO,MAAM,gCAAgC,EAAE,MAE7C,CAAC;AAGH,eAAO,MAAM,4BAA4B,EAAE,MAEzC,CAAC;AAGH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,YAAY,CACX,aAAa,EAAE,aAAa,EAAE,EAC9B,kBAAkB,EAAE,oBAAoB,EAAE,EAC1C,gBAAgB,EAAE,gBAAgB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CACV,MAAM,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAC1C,KAAK,EAAE,MAAM,GACX,OAAO,CAAC;QACV,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;QAC9C,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;KACtC,CAAC,CAAC;CACH;AAED,MAAM,WAAW,iBAChB,SAAQ,OAAO,CAAC,cAAc,GAAG,UAAU,CAAC;CAAG"}
1
+ {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/types/captcha.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACN,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,oBAAoB,EAEzB,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;AAE1C,eAAO,MAAM,yBAAyB,EAAE,MAA4B,CAAC;AAErE,eAAO,MAAM,gCAAgC,EAAE,MAE7C,CAAC;AAGH,eAAO,MAAM,4BAA4B,EAAE,MAEzC,CAAC;AAGH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IAClD,YAAY,CACX,aAAa,EAAE,aAAa,EAAE,EAC9B,kBAAkB,EAAE,oBAAoB,EAAE,EAC1C,gBAAgB,EAAE,gBAAgB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CACV,MAAM,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAC1C,KAAK,EAAE,MAAM,GACX,OAAO,CAAC;QACV,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;QAC9C,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;KACtC,CAAC,CAAC;CACH;AAED,MAAM,WAAW,iBAChB,SAAQ,OAAO,CAAC,cAAc,GAAG,UAAU,CAAC;CAAG"}