@prosopo/types-database 4.11.16 → 4.11.18

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.
@@ -1,156 +1,288 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const locale = require("@prosopo/locale");
4
- const types = require("@prosopo/types");
5
- const bson = require("bson");
6
- const mongoose = require("mongoose");
7
- const zod = require("zod");
8
- const client = require("./client.cjs");
9
- const ONE_HOUR = 60 * 60;
10
- const ONE_DAY = ONE_HOUR * 24;
11
- const ONE_WEEK = ONE_DAY * 7;
12
- const ONE_MONTH = ONE_WEEK * 4;
13
- const ClientRecordSchema = new mongoose.Schema({
14
- account: String,
15
- settings: client.UserSettingsSchema,
16
- tier: { type: String, enum: types.Tier, required: true }
1
+ const require_client = require("./client.cjs");
2
+ let _prosopo_locale = require("@prosopo/locale");
3
+ let _prosopo_types = require("@prosopo/types");
4
+ let bson = require("bson");
5
+ let mongoose = require("mongoose");
6
+ let zod = require("zod");
7
+ var ONE_DAY = 3600 * 24;
8
+ var ONE_WEEK = ONE_DAY * 7;
9
+ var ONE_MONTH = ONE_WEEK * 4;
10
+ var ClientRecordSchema = new mongoose.Schema({
11
+ account: String,
12
+ settings: require_client.UserSettingsSchema,
13
+ tier: {
14
+ type: String,
15
+ enum: _prosopo_types.Tier,
16
+ required: true
17
+ }
17
18
  });
18
19
  ClientRecordSchema.index({ account: 1 });
19
- const isBsonLong = (value) => typeof value === "object" && value !== null && "_bsontype" in value && value._bsontype === "Long";
20
- const normaliseIpHalf = (value) => {
21
- if (typeof value === "bigint") return value.toString();
22
- if (isBsonLong(value)) {
23
- const lng = value;
24
- return bson.Long.fromBits(lng.low, lng.high, true).toString();
25
- }
26
- return value;
20
+ var isBsonLong = (value) => typeof value === "object" && value !== null && "_bsontype" in value && value._bsontype === "Long";
21
+ var normaliseIpHalf = (value) => {
22
+ if (typeof value === "bigint") return value.toString();
23
+ if (isBsonLong(value)) {
24
+ const lng = value;
25
+ return bson.Long.fromBits(lng.low, lng.high, true).toString();
26
+ }
27
+ return value;
27
28
  };
28
- const CompositeIpAddressRecordSchemaObj = {
29
- lower: {
30
- // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
31
- type: mongoose.Schema.Types.Decimal128,
32
- required: true,
33
- set: normaliseIpHalf
34
- },
35
- upper: {
36
- // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
37
- type: mongoose.Schema.Types.Decimal128,
38
- required: false,
39
- set: normaliseIpHalf
40
- },
41
- type: { type: String, enum: types.IpAddressType, required: true }
29
+ var CompositeIpAddressRecordSchemaObj = {
30
+ lower: {
31
+ type: mongoose.Schema.Types.Decimal128,
32
+ required: true,
33
+ set: normaliseIpHalf
34
+ },
35
+ upper: {
36
+ type: mongoose.Schema.Types.Decimal128,
37
+ required: false,
38
+ set: normaliseIpHalf
39
+ },
40
+ type: {
41
+ type: String,
42
+ enum: _prosopo_types.IpAddressType,
43
+ required: true
44
+ }
42
45
  };
43
- const CaptchaRecordSchema = new mongoose.Schema({
44
- captchaId: { type: String, required: true },
45
- captchaContentId: { type: String, required: true },
46
- assetURI: { type: String, required: false },
47
- datasetId: { type: String, required: true },
48
- datasetContentId: { type: String, required: true },
49
- solved: { type: Boolean, required: true },
50
- target: { type: String, required: true },
51
- salt: { type: String, required: true },
52
- // Random pivot in [0,1) stamped at insert time and never updated.
53
- // Powers `ProviderDatabase.getRandomCaptcha`, which walks at most
54
- // `sampleSize` keys of the compound index below instead of
55
- // materialising the full matched set via `$sample`. Pre-existing
56
- // rows are filled by providerBackfillCaptchaRandomKey.yml.
57
- randomKey: { type: Number, required: false },
58
- items: {
59
- type: [
60
- new mongoose.Schema(
61
- {
62
- hash: { type: String, required: true },
63
- data: { type: String, required: true },
64
- type: { type: String, required: true }
65
- },
66
- { _id: false }
67
- )
68
- ],
69
- required: true
70
- }
46
+ var CaptchaRecordSchema = new mongoose.Schema({
47
+ captchaId: {
48
+ type: String,
49
+ required: true
50
+ },
51
+ captchaContentId: {
52
+ type: String,
53
+ required: true
54
+ },
55
+ assetURI: {
56
+ type: String,
57
+ required: false
58
+ },
59
+ datasetId: {
60
+ type: String,
61
+ required: true
62
+ },
63
+ datasetContentId: {
64
+ type: String,
65
+ required: true
66
+ },
67
+ solved: {
68
+ type: Boolean,
69
+ required: true
70
+ },
71
+ target: {
72
+ type: String,
73
+ required: true
74
+ },
75
+ salt: {
76
+ type: String,
77
+ required: true
78
+ },
79
+ randomKey: {
80
+ type: Number,
81
+ required: false
82
+ },
83
+ items: {
84
+ type: [new mongoose.Schema({
85
+ hash: {
86
+ type: String,
87
+ required: true
88
+ },
89
+ data: {
90
+ type: String,
91
+ required: true
92
+ },
93
+ type: {
94
+ type: String,
95
+ required: true
96
+ }
97
+ }, { _id: false })],
98
+ required: true
99
+ }
71
100
  });
72
101
  CaptchaRecordSchema.index({ captchaId: 1 });
73
102
  CaptchaRecordSchema.index({ datasetId: 1 });
74
- CaptchaRecordSchema.index({ datasetId: 1, solved: 1 });
75
- CaptchaRecordSchema.index({ datasetId: 1, solved: 1, randomKey: 1 });
76
- const PoWCaptchaRecordSchema = new mongoose.Schema({
77
- challenge: { type: String, required: true },
78
- dappAccount: { type: String, required: true },
79
- userAccount: { type: String, required: true },
80
- requestedAtTimestamp: { type: Date, required: true },
81
- submittedAtTimestamp: { type: Date, required: false },
82
- verifiedAtTimestamp: { type: Date, required: false },
83
- failedAtTimestamp: { type: Date, required: false },
84
- lastUpdatedTimestamp: { type: Date, required: false },
85
- result: {
86
- status: { type: String, enum: types.CaptchaStatus, required: true },
87
- reason: {
88
- type: String,
89
- enum: locale.TranslationKeysSchema.options,
90
- required: false
91
- },
92
- error: { type: String, required: false }
93
- },
94
- difficulty: { type: Number, required: true },
95
- ipAddress: CompositeIpAddressRecordSchemaObj,
96
- providedIp: {
97
- type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
98
- required: false
99
- },
100
- metadata: {
101
- type: new mongoose.Schema(
102
- { email: { type: String, required: false } },
103
- { _id: false }
104
- ),
105
- required: false
106
- },
107
- clientMetaData: {
108
- type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
109
- required: false
110
- },
111
- headers: { type: Object, required: true },
112
- ja4: { type: String, required: true },
113
- userSignature: { type: String, required: false },
114
- userSubmitted: { type: Boolean, required: true },
115
- serverChecked: { type: Boolean, required: true },
116
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
117
- // See `StoredCaptcha.pendingStage` — `true` while the record has
118
- // unstaged changes. Indexed via a tiny partial index so the
119
- // StoreCommitmentsExternal sweep scans only pending rows instead of
120
- // the whole collection.
121
- pendingStage: { type: Boolean, required: false },
122
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
123
- // `geolocation` and other per-flag fields — consumers narrow on
124
- // `ipInfo.isValid` and read whichever sub-field they need.
125
- ipInfo: { type: Object, required: false },
126
- parsedUserAgentInfo: { type: Object, required: false },
127
- sessionId: {
128
- type: String,
129
- required: false
130
- },
131
- coords: { type: [[[Number]]], required: false },
132
- // Current behavioral data storage format (packed)
133
- deviceCapability: { type: String, required: false },
134
- behavioralDataPacked: {
135
- type: {
136
- c1: { type: [mongoose.Schema.Types.Mixed], required: true },
137
- c2: { type: [mongoose.Schema.Types.Mixed], required: true },
138
- c3: { type: [mongoose.Schema.Types.Mixed], required: true },
139
- d: { type: String, required: true }
140
- },
141
- required: false
142
- },
143
- providerSignature: { type: String, required: true },
144
- // Internal ML labelling applied by superadmins via the audit page.
145
- label: { type: String, enum: Object.values(types.CaptchaLabel), required: false },
146
- labelReason: { type: String, required: false },
147
- labelledBy: { type: String, required: false },
148
- labelledAt: { type: Date, required: false }
103
+ CaptchaRecordSchema.index({
104
+ datasetId: 1,
105
+ solved: 1
106
+ });
107
+ CaptchaRecordSchema.index({
108
+ datasetId: 1,
109
+ solved: 1,
110
+ randomKey: 1
111
+ });
112
+ var PoWCaptchaRecordSchema = new mongoose.Schema({
113
+ challenge: {
114
+ type: String,
115
+ required: true
116
+ },
117
+ dappAccount: {
118
+ type: String,
119
+ required: true
120
+ },
121
+ userAccount: {
122
+ type: String,
123
+ required: true
124
+ },
125
+ requestedAtTimestamp: {
126
+ type: Date,
127
+ required: true
128
+ },
129
+ submittedAtTimestamp: {
130
+ type: Date,
131
+ required: false
132
+ },
133
+ verifiedAtTimestamp: {
134
+ type: Date,
135
+ required: false
136
+ },
137
+ failedAtTimestamp: {
138
+ type: Date,
139
+ required: false
140
+ },
141
+ lastUpdatedTimestamp: {
142
+ type: Date,
143
+ required: false
144
+ },
145
+ result: {
146
+ status: {
147
+ type: String,
148
+ enum: _prosopo_types.CaptchaStatus,
149
+ required: true
150
+ },
151
+ reason: {
152
+ type: String,
153
+ enum: _prosopo_locale.TranslationKeysSchema.options,
154
+ required: false
155
+ },
156
+ error: {
157
+ type: String,
158
+ required: false
159
+ }
160
+ },
161
+ difficulty: {
162
+ type: Number,
163
+ required: true
164
+ },
165
+ ipAddress: CompositeIpAddressRecordSchemaObj,
166
+ providedIp: {
167
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
168
+ required: false
169
+ },
170
+ metadata: {
171
+ type: new mongoose.Schema({ email: {
172
+ type: String,
173
+ required: false
174
+ } }, { _id: false }),
175
+ required: false
176
+ },
177
+ clientMetaData: {
178
+ type: new mongoose.Schema({ hp: {
179
+ type: String,
180
+ required: false
181
+ } }, { _id: false }),
182
+ required: false
183
+ },
184
+ headers: {
185
+ type: Object,
186
+ required: true
187
+ },
188
+ ja4: {
189
+ type: String,
190
+ required: true
191
+ },
192
+ userSignature: {
193
+ type: String,
194
+ required: false
195
+ },
196
+ userSubmitted: {
197
+ type: Boolean,
198
+ required: true
199
+ },
200
+ serverChecked: {
201
+ type: Boolean,
202
+ required: true
203
+ },
204
+ storedAtTimestamp: {
205
+ type: Date,
206
+ required: false,
207
+ expires: ONE_MONTH
208
+ },
209
+ pendingStage: {
210
+ type: Boolean,
211
+ required: false
212
+ },
213
+ ipInfo: {
214
+ type: Object,
215
+ required: false
216
+ },
217
+ parsedUserAgentInfo: {
218
+ type: Object,
219
+ required: false
220
+ },
221
+ sessionId: {
222
+ type: String,
223
+ required: false
224
+ },
225
+ coords: {
226
+ type: [[[Number]]],
227
+ required: false
228
+ },
229
+ deviceCapability: {
230
+ type: String,
231
+ required: false
232
+ },
233
+ behavioralDataPacked: {
234
+ type: {
235
+ c1: {
236
+ type: [mongoose.Schema.Types.Mixed],
237
+ required: true
238
+ },
239
+ c2: {
240
+ type: [mongoose.Schema.Types.Mixed],
241
+ required: true
242
+ },
243
+ c3: {
244
+ type: [mongoose.Schema.Types.Mixed],
245
+ required: true
246
+ },
247
+ d: {
248
+ type: String,
249
+ required: true
250
+ }
251
+ },
252
+ required: false
253
+ },
254
+ providerSignature: {
255
+ type: String,
256
+ required: true
257
+ },
258
+ label: {
259
+ type: String,
260
+ enum: Object.values(_prosopo_types.CaptchaLabel),
261
+ required: false
262
+ },
263
+ labelReason: {
264
+ type: String,
265
+ required: false
266
+ },
267
+ labelledBy: {
268
+ type: String,
269
+ required: false
270
+ },
271
+ labelledAt: {
272
+ type: Date,
273
+ required: false
274
+ }
149
275
  });
150
276
  PoWCaptchaRecordSchema.index({ challenge: 1 });
151
- PoWCaptchaRecordSchema.index({ label: 1, dappAccount: 1 });
277
+ PoWCaptchaRecordSchema.index({
278
+ label: 1,
279
+ dappAccount: 1
280
+ });
152
281
  PoWCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
153
- PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
282
+ PoWCaptchaRecordSchema.index({
283
+ dappAccount: 1,
284
+ requestedAtTimestamp: 1
285
+ });
154
286
  PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
155
287
  PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
156
288
  PoWCaptchaRecordSchema.index({ "result.reason": 1 });
@@ -158,99 +290,196 @@ PoWCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
158
290
  PoWCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
159
291
  PoWCaptchaRecordSchema.index({ ipInfo: 1 });
160
292
  PoWCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
161
- PoWCaptchaRecordSchema.index(
162
- { pendingStage: 1 },
163
- {
164
- name: "pendingStage_partial",
165
- partialFilterExpression: { pendingStage: true }
166
- }
167
- );
168
- const PuzzleCaptchaRecordSchema = new mongoose.Schema({
169
- challenge: { type: String, required: true },
170
- dappAccount: { type: String, required: true },
171
- userAccount: { type: String, required: true },
172
- requestedAtTimestamp: { type: Date, required: true },
173
- submittedAtTimestamp: { type: Date, required: false },
174
- verifiedAtTimestamp: { type: Date, required: false },
175
- failedAtTimestamp: { type: Date, required: false },
176
- lastUpdatedTimestamp: { type: Date, required: false },
177
- result: {
178
- status: { type: String, enum: types.CaptchaStatus, required: true },
179
- reason: {
180
- type: String,
181
- enum: locale.TranslationKeysSchema.options,
182
- required: false
183
- },
184
- error: { type: String, required: false }
185
- },
186
- targetX: { type: Number, required: true },
187
- targetY: { type: Number, required: true },
188
- originX: { type: Number, required: true },
189
- originY: { type: Number, required: true },
190
- tolerance: { type: Number, required: true },
191
- puzzleEvents: {
192
- type: [
193
- new mongoose.Schema(
194
- {
195
- x: { type: Number, required: true },
196
- y: { type: Number, required: true },
197
- t: { type: Number, required: true }
198
- },
199
- { _id: false }
200
- )
201
- ],
202
- required: false
203
- },
204
- ipAddress: CompositeIpAddressRecordSchemaObj,
205
- providedIp: {
206
- type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
207
- required: false
208
- },
209
- metadata: {
210
- type: new mongoose.Schema(
211
- { email: { type: String, required: false } },
212
- { _id: false }
213
- ),
214
- required: false
215
- },
216
- clientMetaData: {
217
- type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
218
- required: false
219
- },
220
- headers: { type: Object, required: true },
221
- ja4: { type: String, required: true },
222
- userSignature: { type: String, required: false },
223
- userSubmitted: { type: Boolean, required: true },
224
- serverChecked: { type: Boolean, required: true },
225
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
226
- // See `StoredCaptcha.pendingStage`.
227
- pendingStage: { type: Boolean, required: false },
228
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
229
- // `geolocation` and other per-flag fields — consumers narrow on
230
- // `ipInfo.isValid` and read whichever sub-field they need.
231
- ipInfo: { type: Object, required: false },
232
- parsedUserAgentInfo: { type: Object, required: false },
233
- sessionId: {
234
- type: String,
235
- required: false
236
- },
237
- coords: { type: [[[Number]]], required: false },
238
- // Current behavioral data storage format (packed)
239
- deviceCapability: { type: String, required: false },
240
- behavioralDataPacked: {
241
- type: {
242
- c1: { type: [mongoose.Schema.Types.Mixed], required: true },
243
- c2: { type: [mongoose.Schema.Types.Mixed], required: true },
244
- c3: { type: [mongoose.Schema.Types.Mixed], required: true },
245
- d: { type: String, required: true }
246
- },
247
- required: false
248
- },
249
- providerSignature: { type: String, required: true }
293
+ PoWCaptchaRecordSchema.index({ pendingStage: 1 }, {
294
+ name: "pendingStage_partial",
295
+ partialFilterExpression: { pendingStage: true }
296
+ });
297
+ var PuzzleCaptchaRecordSchema = new mongoose.Schema({
298
+ challenge: {
299
+ type: String,
300
+ required: true
301
+ },
302
+ dappAccount: {
303
+ type: String,
304
+ required: true
305
+ },
306
+ userAccount: {
307
+ type: String,
308
+ required: true
309
+ },
310
+ requestedAtTimestamp: {
311
+ type: Date,
312
+ required: true
313
+ },
314
+ submittedAtTimestamp: {
315
+ type: Date,
316
+ required: false
317
+ },
318
+ verifiedAtTimestamp: {
319
+ type: Date,
320
+ required: false
321
+ },
322
+ failedAtTimestamp: {
323
+ type: Date,
324
+ required: false
325
+ },
326
+ lastUpdatedTimestamp: {
327
+ type: Date,
328
+ required: false
329
+ },
330
+ result: {
331
+ status: {
332
+ type: String,
333
+ enum: _prosopo_types.CaptchaStatus,
334
+ required: true
335
+ },
336
+ reason: {
337
+ type: String,
338
+ enum: _prosopo_locale.TranslationKeysSchema.options,
339
+ required: false
340
+ },
341
+ error: {
342
+ type: String,
343
+ required: false
344
+ }
345
+ },
346
+ targetX: {
347
+ type: Number,
348
+ required: true
349
+ },
350
+ targetY: {
351
+ type: Number,
352
+ required: true
353
+ },
354
+ originX: {
355
+ type: Number,
356
+ required: true
357
+ },
358
+ originY: {
359
+ type: Number,
360
+ required: true
361
+ },
362
+ tolerance: {
363
+ type: Number,
364
+ required: true
365
+ },
366
+ puzzleEvents: {
367
+ type: [new mongoose.Schema({
368
+ x: {
369
+ type: Number,
370
+ required: true
371
+ },
372
+ y: {
373
+ type: Number,
374
+ required: true
375
+ },
376
+ t: {
377
+ type: Number,
378
+ required: true
379
+ }
380
+ }, { _id: false })],
381
+ required: false
382
+ },
383
+ ipAddress: CompositeIpAddressRecordSchemaObj,
384
+ providedIp: {
385
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
386
+ required: false
387
+ },
388
+ metadata: {
389
+ type: new mongoose.Schema({ email: {
390
+ type: String,
391
+ required: false
392
+ } }, { _id: false }),
393
+ required: false
394
+ },
395
+ clientMetaData: {
396
+ type: new mongoose.Schema({ hp: {
397
+ type: String,
398
+ required: false
399
+ } }, { _id: false }),
400
+ required: false
401
+ },
402
+ headers: {
403
+ type: Object,
404
+ required: true
405
+ },
406
+ ja4: {
407
+ type: String,
408
+ required: true
409
+ },
410
+ userSignature: {
411
+ type: String,
412
+ required: false
413
+ },
414
+ userSubmitted: {
415
+ type: Boolean,
416
+ required: true
417
+ },
418
+ serverChecked: {
419
+ type: Boolean,
420
+ required: true
421
+ },
422
+ storedAtTimestamp: {
423
+ type: Date,
424
+ required: false,
425
+ expires: ONE_MONTH
426
+ },
427
+ pendingStage: {
428
+ type: Boolean,
429
+ required: false
430
+ },
431
+ ipInfo: {
432
+ type: Object,
433
+ required: false
434
+ },
435
+ parsedUserAgentInfo: {
436
+ type: Object,
437
+ required: false
438
+ },
439
+ sessionId: {
440
+ type: String,
441
+ required: false
442
+ },
443
+ coords: {
444
+ type: [[[Number]]],
445
+ required: false
446
+ },
447
+ deviceCapability: {
448
+ type: String,
449
+ required: false
450
+ },
451
+ behavioralDataPacked: {
452
+ type: {
453
+ c1: {
454
+ type: [mongoose.Schema.Types.Mixed],
455
+ required: true
456
+ },
457
+ c2: {
458
+ type: [mongoose.Schema.Types.Mixed],
459
+ required: true
460
+ },
461
+ c3: {
462
+ type: [mongoose.Schema.Types.Mixed],
463
+ required: true
464
+ },
465
+ d: {
466
+ type: String,
467
+ required: true
468
+ }
469
+ },
470
+ required: false
471
+ },
472
+ providerSignature: {
473
+ type: String,
474
+ required: true
475
+ }
250
476
  });
251
477
  PuzzleCaptchaRecordSchema.index({ challenge: 1 });
252
478
  PuzzleCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
253
- PuzzleCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
479
+ PuzzleCaptchaRecordSchema.index({
480
+ dappAccount: 1,
481
+ requestedAtTimestamp: 1
482
+ });
254
483
  PuzzleCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
255
484
  PuzzleCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
256
485
  PuzzleCaptchaRecordSchema.index({ "result.reason": 1 });
@@ -258,96 +487,204 @@ PuzzleCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
258
487
  PuzzleCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
259
488
  PuzzleCaptchaRecordSchema.index({ ipInfo: 1 });
260
489
  PuzzleCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
261
- PuzzleCaptchaRecordSchema.index(
262
- { pendingStage: 1 },
263
- {
264
- name: "pendingStage_partial",
265
- partialFilterExpression: { pendingStage: true }
266
- }
267
- );
268
- const UserCommitmentRecordSchema = new mongoose.Schema({
269
- userAccount: { type: String, required: true },
270
- dappAccount: { type: String, required: true },
271
- providerAccount: { type: String, required: true },
272
- datasetId: { type: String, required: true },
273
- id: { type: String, required: true },
274
- result: {
275
- status: { type: String, enum: types.CaptchaStatus, required: true },
276
- reason: {
277
- type: String,
278
- enum: locale.TranslationKeysSchema.options,
279
- required: false
280
- },
281
- error: { type: String, required: false }
282
- },
283
- ipAddress: CompositeIpAddressRecordSchemaObj,
284
- providedIp: {
285
- type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
286
- required: false
287
- },
288
- metadata: {
289
- type: new mongoose.Schema(
290
- { email: { type: String, required: false } },
291
- { _id: false }
292
- ),
293
- required: false
294
- },
295
- clientMetaData: {
296
- type: new mongoose.Schema({ hp: { type: String, required: false } }, { _id: false }),
297
- required: false
298
- },
299
- headers: { type: Object, required: true },
300
- ja4: { type: String, required: true },
301
- userSignature: { type: String, required: true },
302
- userSubmitted: { type: Boolean, required: true },
303
- serverChecked: { type: Boolean, required: true },
304
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
305
- requestedAtTimestamp: { type: Date, required: true },
306
- submittedAtTimestamp: { type: Date, required: false },
307
- verifiedAtTimestamp: { type: Date, required: false },
308
- failedAtTimestamp: { type: Date, required: false },
309
- lastUpdatedTimestamp: { type: Date, required: false },
310
- // See `StoredCaptcha.pendingStage`.
311
- pendingStage: { type: Boolean, required: false },
312
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
313
- // `geolocation` and other per-flag fields — consumers narrow on
314
- // `ipInfo.isValid` and read whichever sub-field they need.
315
- ipInfo: { type: Object, required: false },
316
- parsedUserAgentInfo: { type: Object, required: false },
317
- sessionId: {
318
- type: String,
319
- required: false
320
- },
321
- coords: { type: [[[Number]]], required: false },
322
- // Pending request fields for image captcha workflow
323
- pending: { type: Boolean, required: true },
324
- salt: { type: String, required: true },
325
- requestHash: { type: String, required: true },
326
- deadlineTimestamp: { type: Date, required: true },
327
- threshold: { type: Number, required: true },
328
- // Current behavioral data storage format (packed)
329
- deviceCapability: { type: String, required: false },
330
- behavioralDataPacked: {
331
- type: {
332
- c1: { type: [mongoose.Schema.Types.Mixed], required: true },
333
- c2: { type: [mongoose.Schema.Types.Mixed], required: true },
334
- c3: { type: [mongoose.Schema.Types.Mixed], required: true },
335
- d: { type: String, required: true }
336
- },
337
- required: false
338
- },
339
- // Internal ML labelling applied by superadmins via the audit page.
340
- label: { type: String, enum: Object.values(types.CaptchaLabel), required: false },
341
- labelReason: { type: String, required: false },
342
- labelledBy: { type: String, required: false },
343
- labelledAt: { type: Date, required: false }
490
+ PuzzleCaptchaRecordSchema.index({ pendingStage: 1 }, {
491
+ name: "pendingStage_partial",
492
+ partialFilterExpression: { pendingStage: true }
493
+ });
494
+ var UserCommitmentRecordSchema = new mongoose.Schema({
495
+ userAccount: {
496
+ type: String,
497
+ required: true
498
+ },
499
+ dappAccount: {
500
+ type: String,
501
+ required: true
502
+ },
503
+ providerAccount: {
504
+ type: String,
505
+ required: true
506
+ },
507
+ datasetId: {
508
+ type: String,
509
+ required: true
510
+ },
511
+ id: {
512
+ type: String,
513
+ required: true
514
+ },
515
+ result: {
516
+ status: {
517
+ type: String,
518
+ enum: _prosopo_types.CaptchaStatus,
519
+ required: true
520
+ },
521
+ reason: {
522
+ type: String,
523
+ enum: _prosopo_locale.TranslationKeysSchema.options,
524
+ required: false
525
+ },
526
+ error: {
527
+ type: String,
528
+ required: false
529
+ }
530
+ },
531
+ ipAddress: CompositeIpAddressRecordSchemaObj,
532
+ providedIp: {
533
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
534
+ required: false
535
+ },
536
+ metadata: {
537
+ type: new mongoose.Schema({ email: {
538
+ type: String,
539
+ required: false
540
+ } }, { _id: false }),
541
+ required: false
542
+ },
543
+ clientMetaData: {
544
+ type: new mongoose.Schema({ hp: {
545
+ type: String,
546
+ required: false
547
+ } }, { _id: false }),
548
+ required: false
549
+ },
550
+ headers: {
551
+ type: Object,
552
+ required: true
553
+ },
554
+ ja4: {
555
+ type: String,
556
+ required: true
557
+ },
558
+ userSignature: {
559
+ type: String,
560
+ required: true
561
+ },
562
+ userSubmitted: {
563
+ type: Boolean,
564
+ required: true
565
+ },
566
+ serverChecked: {
567
+ type: Boolean,
568
+ required: true
569
+ },
570
+ storedAtTimestamp: {
571
+ type: Date,
572
+ required: false,
573
+ expires: ONE_MONTH
574
+ },
575
+ requestedAtTimestamp: {
576
+ type: Date,
577
+ required: true
578
+ },
579
+ submittedAtTimestamp: {
580
+ type: Date,
581
+ required: false
582
+ },
583
+ verifiedAtTimestamp: {
584
+ type: Date,
585
+ required: false
586
+ },
587
+ failedAtTimestamp: {
588
+ type: Date,
589
+ required: false
590
+ },
591
+ lastUpdatedTimestamp: {
592
+ type: Date,
593
+ required: false
594
+ },
595
+ pendingStage: {
596
+ type: Boolean,
597
+ required: false
598
+ },
599
+ ipInfo: {
600
+ type: Object,
601
+ required: false
602
+ },
603
+ parsedUserAgentInfo: {
604
+ type: Object,
605
+ required: false
606
+ },
607
+ sessionId: {
608
+ type: String,
609
+ required: false
610
+ },
611
+ coords: {
612
+ type: [[[Number]]],
613
+ required: false
614
+ },
615
+ pending: {
616
+ type: Boolean,
617
+ required: true
618
+ },
619
+ salt: {
620
+ type: String,
621
+ required: true
622
+ },
623
+ requestHash: {
624
+ type: String,
625
+ required: true
626
+ },
627
+ deadlineTimestamp: {
628
+ type: Date,
629
+ required: true
630
+ },
631
+ threshold: {
632
+ type: Number,
633
+ required: true
634
+ },
635
+ deviceCapability: {
636
+ type: String,
637
+ required: false
638
+ },
639
+ behavioralDataPacked: {
640
+ type: {
641
+ c1: {
642
+ type: [mongoose.Schema.Types.Mixed],
643
+ required: true
644
+ },
645
+ c2: {
646
+ type: [mongoose.Schema.Types.Mixed],
647
+ required: true
648
+ },
649
+ c3: {
650
+ type: [mongoose.Schema.Types.Mixed],
651
+ required: true
652
+ },
653
+ d: {
654
+ type: String,
655
+ required: true
656
+ }
657
+ },
658
+ required: false
659
+ },
660
+ label: {
661
+ type: String,
662
+ enum: Object.values(_prosopo_types.CaptchaLabel),
663
+ required: false
664
+ },
665
+ labelReason: {
666
+ type: String,
667
+ required: false
668
+ },
669
+ labelledBy: {
670
+ type: String,
671
+ required: false
672
+ },
673
+ labelledAt: {
674
+ type: Date,
675
+ required: false
676
+ }
344
677
  });
345
678
  UserCommitmentRecordSchema.index({ id: -1 });
346
- UserCommitmentRecordSchema.index({ label: 1, dappAccount: 1 });
347
679
  UserCommitmentRecordSchema.index({
348
- lastUpdatedTimestamp: 1
680
+ label: 1,
681
+ dappAccount: 1
682
+ });
683
+ UserCommitmentRecordSchema.index({ lastUpdatedTimestamp: 1 });
684
+ UserCommitmentRecordSchema.index({
685
+ userAccount: 1,
686
+ dappAccount: 1
349
687
  });
350
- UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
351
688
  UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
352
689
  UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
353
690
  UserCommitmentRecordSchema.index({ "result.reason": 1 });
@@ -357,286 +694,550 @@ UserCommitmentRecordSchema.index({ requestHash: -1 });
357
694
  UserCommitmentRecordSchema.index({ pending: 1 });
358
695
  UserCommitmentRecordSchema.index({ ipInfo: 1 });
359
696
  UserCommitmentRecordSchema.index({ parsedUserAgentInfo: 1 });
360
- UserCommitmentRecordSchema.index(
361
- { pendingStage: 1 },
362
- {
363
- name: "pendingStage_partial",
364
- partialFilterExpression: { pendingStage: true }
365
- }
366
- );
367
- const DatasetRecordSchema = new mongoose.Schema({
368
- contentTree: { type: [[String]], required: true },
369
- datasetContentId: { type: String, required: true },
370
- datasetId: { type: String, required: true },
371
- format: { type: String, required: true },
372
- solutionTree: { type: [[String]], required: true }
697
+ UserCommitmentRecordSchema.index({ pendingStage: 1 }, {
698
+ name: "pendingStage_partial",
699
+ partialFilterExpression: { pendingStage: true }
700
+ });
701
+ var DatasetRecordSchema = new mongoose.Schema({
702
+ contentTree: {
703
+ type: [[String]],
704
+ required: true
705
+ },
706
+ datasetContentId: {
707
+ type: String,
708
+ required: true
709
+ },
710
+ datasetId: {
711
+ type: String,
712
+ required: true
713
+ },
714
+ format: {
715
+ type: String,
716
+ required: true
717
+ },
718
+ solutionTree: {
719
+ type: [[String]],
720
+ required: true
721
+ }
373
722
  });
374
723
  DatasetRecordSchema.index({ datasetId: 1 });
375
- const SolutionRecordSchema = new mongoose.Schema({
376
- captchaId: { type: String, required: true },
377
- captchaContentId: { type: String, required: true },
378
- datasetId: { type: String, required: true },
379
- datasetContentId: { type: String, required: true },
380
- salt: { type: String, required: true },
381
- solution: { type: [String], required: true }
724
+ var SolutionRecordSchema = new mongoose.Schema({
725
+ captchaId: {
726
+ type: String,
727
+ required: true
728
+ },
729
+ captchaContentId: {
730
+ type: String,
731
+ required: true
732
+ },
733
+ datasetId: {
734
+ type: String,
735
+ required: true
736
+ },
737
+ datasetContentId: {
738
+ type: String,
739
+ required: true
740
+ },
741
+ salt: {
742
+ type: String,
743
+ required: true
744
+ },
745
+ solution: {
746
+ type: [String],
747
+ required: true
748
+ }
382
749
  });
383
750
  SolutionRecordSchema.index({ captchaId: 1 });
384
- const UserSolutionRecordSchema = new mongoose.Schema(
385
- {
386
- captchaId: { type: String, required: true },
387
- captchaContentId: { type: String, required: true },
388
- salt: { type: String, required: true },
389
- solution: [{ type: String, required: true }],
390
- processed: { type: Boolean, required: true },
391
- checked: { type: Boolean, required: true },
392
- commitmentId: { type: String, required: true },
393
- createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
394
- },
395
- { _id: false }
396
- );
751
+ var UserSolutionRecordSchema = new mongoose.Schema({
752
+ captchaId: {
753
+ type: String,
754
+ required: true
755
+ },
756
+ captchaContentId: {
757
+ type: String,
758
+ required: true
759
+ },
760
+ salt: {
761
+ type: String,
762
+ required: true
763
+ },
764
+ solution: [{
765
+ type: String,
766
+ required: true
767
+ }],
768
+ processed: {
769
+ type: Boolean,
770
+ required: true
771
+ },
772
+ checked: {
773
+ type: Boolean,
774
+ required: true
775
+ },
776
+ commitmentId: {
777
+ type: String,
778
+ required: true
779
+ },
780
+ createdAt: {
781
+ type: Date,
782
+ default: Date.now,
783
+ expires: ONE_MONTH
784
+ }
785
+ }, { _id: false });
397
786
  UserSolutionRecordSchema.index({ captchaId: 1 });
398
787
  UserSolutionRecordSchema.index({ commitmentId: -1 });
399
- const ScheduledTaskSchema = zod.object({
400
- processName: zod.nativeEnum(types.ScheduledTaskNames),
401
- datetime: zod.date(),
402
- updated: zod.date().optional(),
403
- status: zod.nativeEnum(types.ScheduledTaskStatus),
404
- result: zod.object({
405
- data: zod.any().optional(),
406
- error: zod.any().optional()
407
- }).optional()
408
- });
409
- const ScheduledTaskRecordSchema = new mongoose.Schema({
410
- processName: { type: String, enum: types.ScheduledTaskNames, required: true },
411
- datetime: { type: Date, required: true, expires: ONE_WEEK },
412
- updated: { type: Date, required: false },
413
- status: { type: String, enum: types.ScheduledTaskStatus, required: true },
414
- result: {
415
- type: new mongoose.Schema(
416
- {
417
- error: { type: String, required: false },
418
- data: { type: Object, required: false }
419
- },
420
- { _id: false }
421
- ),
422
- required: false
423
- }
788
+ var ScheduledTaskSchema = (0, zod.object)({
789
+ processName: (0, zod.nativeEnum)(_prosopo_types.ScheduledTaskNames),
790
+ datetime: (0, zod.date)(),
791
+ updated: (0, zod.date)().optional(),
792
+ status: (0, zod.nativeEnum)(_prosopo_types.ScheduledTaskStatus),
793
+ result: (0, zod.object)({
794
+ data: (0, zod.any)().optional(),
795
+ error: (0, zod.any)().optional()
796
+ }).optional()
797
+ });
798
+ var ScheduledTaskRecordSchema = new mongoose.Schema({
799
+ processName: {
800
+ type: String,
801
+ enum: _prosopo_types.ScheduledTaskNames,
802
+ required: true
803
+ },
804
+ datetime: {
805
+ type: Date,
806
+ required: true,
807
+ expires: ONE_WEEK
808
+ },
809
+ updated: {
810
+ type: Date,
811
+ required: false
812
+ },
813
+ status: {
814
+ type: String,
815
+ enum: _prosopo_types.ScheduledTaskStatus,
816
+ required: true
817
+ },
818
+ result: {
819
+ type: new mongoose.Schema({
820
+ error: {
821
+ type: String,
822
+ required: false
823
+ },
824
+ data: {
825
+ type: Object,
826
+ required: false
827
+ }
828
+ }, { _id: false }),
829
+ required: false
830
+ }
424
831
  });
425
832
  ScheduledTaskRecordSchema.index({ processName: 1 });
426
- ScheduledTaskRecordSchema.index({ processName: 1, status: 1 });
427
- ScheduledTaskRecordSchema.index({ _id: 1, status: 1 });
428
- const SessionRecordSchema = new mongoose.Schema({
429
- sessionId: { type: String, required: true },
430
- createdAt: { type: Date, required: true },
431
- token: { type: String, required: true },
432
- score: { type: Number, required: true },
433
- threshold: { type: Number, required: true },
434
- scoreComponents: {
435
- baseScore: { type: Number, required: true },
436
- lScore: { type: Number, required: false },
437
- timeout: { type: Number, required: false },
438
- accessPolicy: { type: Number, required: false },
439
- unverifiedHost: { type: Number, required: false },
440
- webView: { type: Number, required: false },
441
- triggeredDetectors: { type: [Number], required: false },
442
- shadowDomPenalty: { type: Boolean, required: false },
443
- dnsAsymmetry: { type: Number, required: false }
444
- },
445
- ipAddress: CompositeIpAddressRecordSchemaObj,
446
- captchaType: { type: String, enum: types.CaptchaType, required: true },
447
- mode: { type: String, enum: types.ModeEnum, required: false },
448
- solvedImagesCount: { type: Number, required: false },
449
- powDifficulty: { type: Number, required: false },
450
- storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
451
- lastUpdatedTimestamp: { type: Date, required: false },
452
- // See `StoredCaptcha.pendingStage` — same semantics on Session records.
453
- pendingStage: { type: Boolean, required: false },
454
- deleted: { type: Boolean, required: false },
455
- userSitekeyIpHash: { type: String, required: false },
456
- webView: { type: Boolean, required: true, default: false },
457
- iFrame: { type: Boolean, required: true, default: false },
458
- // True when this session was created by the post-PoW routing machine as
459
- // an escalation of an earlier session. Optional so ordinary
460
- // frictionless-created sessions can omit it and stay slim.
461
- isEscalation: { type: Boolean, required: false },
462
- decryptedHeadHash: { type: String, required: false, default: "" },
463
- siteKey: { type: String, required: false },
464
- // Full page URL the widget was rendered on (origin + path only; query
465
- // string, fragment and credentials stripped). See Session.currentUrl —
466
- // `currentUrl` is the top-frame URL, `iframeUrl` is the widget's own
467
- // frame URL when embedded (undefined when the widget IS the top frame).
468
- currentUrl: { type: String, required: false },
469
- iframeUrl: { type: String, required: false },
470
- // Computed at session-creation time from (currentUrl, iframeUrl) via
471
- // isProtectDeployment. Persisted only when true so ordinary sessions
472
- // stay slim and the sparse index below only carries Protect records.
473
- isProtect: { type: Boolean, required: false },
474
- reason: { type: String, required: false },
475
- blocked: { type: Boolean, required: false },
476
- // On synthetic blocked-session records (blocked=true, deleted=true)
477
- // these carry the identity of the access-policy rule that fired at the
478
- // request-time block middleware — the Traffic page joins on these to
479
- // surface which rules are blocking traffic and at what volume.
480
- ruleHash: { type: String, required: false },
481
- ruleType: { type: [String], required: false },
482
- ruleDescription: { type: String, required: false },
483
- // Full ipinfo payload — replaces flat `countryCode` / `geolocation`
484
- // fields. Mirrors the captcha record schemas (PoW / Puzzle /
485
- // UserCommitment).
486
- ipInfo: { type: Object, required: false },
487
- headers: { type: Object, required: false },
488
- result: {
489
- type: new mongoose.Schema(
490
- {
491
- status: {
492
- type: String,
493
- enum: Object.values(types.CaptchaStatus),
494
- required: true
495
- },
496
- reason: { type: String, required: false },
497
- error: { type: String, required: false }
498
- },
499
- { _id: false }
500
- ),
501
- required: false
502
- },
503
- userSubmitted: { type: Boolean, required: false },
504
- serverChecked: { type: Boolean, required: false },
505
- // WASM SIMD CPU fingerprint readings collected by the catcher client.
506
- // Stored as a free-form Mixed sub-document because the shape is a
507
- // discriminated union and the dataset is still evolving — Zod validates
508
- // at the boundary, Mongoose just persists it.
509
- simdReadings: { type: mongoose.Schema.Types.Mixed, required: false },
510
- // Stage at which the SIMD readings first arrived on this session
511
- // (frictionless / challenge / submit). First-hop-wins.
512
- simdReadingsStage: { type: String, required: false },
513
- entropyMathRandomFingerprint: { type: String, required: false },
514
- entropyCryptoFingerprint: { type: String, required: false },
515
- entropyWallClockOffsetMs: { type: Number, required: false },
516
- entropyMathRandomFirst: { type: Number, required: false },
517
- // Per-TLS-connection handshake timings forwarded by the chaddy Caddy
518
- // plugin (X-TLS-TCP-To-Chello-Us / X-TLS-Chello-To-Handshake-Us).
519
- // See @prosopo/types Session.tcpToChelloUs for full semantics.
520
- tcpToChelloUs: { type: Number, required: false },
521
- chelloToHandshakeUs: { type: Number, required: false },
522
- // DNS observation merge target. Populated by
523
- // POST /v1/prosopo/provider/admin/dns/event from the dns-event
524
- // sidecar (see types/provider/database.ts → Session.dnsEvent).
525
- dnsEvent: {
526
- type: new mongoose.Schema(
527
- {
528
- resolverIp: { type: String, required: false },
529
- peerIp: { type: String, required: false },
530
- pathValid: { type: Boolean, required: false },
531
- receivedAt: { type: Date, required: true }
532
- },
533
- { _id: false }
534
- ),
535
- required: false
536
- }
833
+ ScheduledTaskRecordSchema.index({
834
+ processName: 1,
835
+ status: 1
836
+ });
837
+ ScheduledTaskRecordSchema.index({
838
+ _id: 1,
839
+ status: 1
840
+ });
841
+ var SessionRecordSchema = new mongoose.Schema({
842
+ sessionId: {
843
+ type: String,
844
+ required: true
845
+ },
846
+ createdAt: {
847
+ type: Date,
848
+ required: true
849
+ },
850
+ token: {
851
+ type: String,
852
+ required: true
853
+ },
854
+ score: {
855
+ type: Number,
856
+ required: true
857
+ },
858
+ threshold: {
859
+ type: Number,
860
+ required: true
861
+ },
862
+ scoreComponents: {
863
+ baseScore: {
864
+ type: Number,
865
+ required: true
866
+ },
867
+ lScore: {
868
+ type: Number,
869
+ required: false
870
+ },
871
+ timeout: {
872
+ type: Number,
873
+ required: false
874
+ },
875
+ accessPolicy: {
876
+ type: Number,
877
+ required: false
878
+ },
879
+ unverifiedHost: {
880
+ type: Number,
881
+ required: false
882
+ },
883
+ webView: {
884
+ type: Number,
885
+ required: false
886
+ },
887
+ triggeredDetectors: {
888
+ type: [Number],
889
+ required: false
890
+ },
891
+ shadowDomPenalty: {
892
+ type: Boolean,
893
+ required: false
894
+ },
895
+ dnsAsymmetry: {
896
+ type: Number,
897
+ required: false
898
+ }
899
+ },
900
+ ipAddress: CompositeIpAddressRecordSchemaObj,
901
+ captchaType: {
902
+ type: String,
903
+ enum: _prosopo_types.CaptchaType,
904
+ required: true
905
+ },
906
+ mode: {
907
+ type: String,
908
+ enum: _prosopo_types.ModeEnum,
909
+ required: false
910
+ },
911
+ solvedImagesCount: {
912
+ type: Number,
913
+ required: false
914
+ },
915
+ powDifficulty: {
916
+ type: Number,
917
+ required: false
918
+ },
919
+ storedAtTimestamp: {
920
+ type: Date,
921
+ required: false,
922
+ expires: ONE_DAY
923
+ },
924
+ lastUpdatedTimestamp: {
925
+ type: Date,
926
+ required: false
927
+ },
928
+ pendingStage: {
929
+ type: Boolean,
930
+ required: false
931
+ },
932
+ deleted: {
933
+ type: Boolean,
934
+ required: false
935
+ },
936
+ userSitekeyIpHash: {
937
+ type: String,
938
+ required: false
939
+ },
940
+ webView: {
941
+ type: Boolean,
942
+ required: true,
943
+ default: false
944
+ },
945
+ iFrame: {
946
+ type: Boolean,
947
+ required: true,
948
+ default: false
949
+ },
950
+ isEscalation: {
951
+ type: Boolean,
952
+ required: false
953
+ },
954
+ decryptedHeadHash: {
955
+ type: String,
956
+ required: false,
957
+ default: ""
958
+ },
959
+ siteKey: {
960
+ type: String,
961
+ required: false
962
+ },
963
+ currentUrl: {
964
+ type: String,
965
+ required: false
966
+ },
967
+ iframeUrl: {
968
+ type: String,
969
+ required: false
970
+ },
971
+ isProtect: {
972
+ type: Boolean,
973
+ required: false
974
+ },
975
+ reason: {
976
+ type: String,
977
+ required: false
978
+ },
979
+ blocked: {
980
+ type: Boolean,
981
+ required: false
982
+ },
983
+ ruleHash: {
984
+ type: String,
985
+ required: false
986
+ },
987
+ ruleType: {
988
+ type: [String],
989
+ required: false
990
+ },
991
+ ruleDescription: {
992
+ type: String,
993
+ required: false
994
+ },
995
+ ipInfo: {
996
+ type: Object,
997
+ required: false
998
+ },
999
+ headers: {
1000
+ type: Object,
1001
+ required: false
1002
+ },
1003
+ result: {
1004
+ type: new mongoose.Schema({
1005
+ status: {
1006
+ type: String,
1007
+ enum: Object.values(_prosopo_types.CaptchaStatus),
1008
+ required: true
1009
+ },
1010
+ reason: {
1011
+ type: String,
1012
+ required: false
1013
+ },
1014
+ error: {
1015
+ type: String,
1016
+ required: false
1017
+ }
1018
+ }, { _id: false }),
1019
+ required: false
1020
+ },
1021
+ userSubmitted: {
1022
+ type: Boolean,
1023
+ required: false
1024
+ },
1025
+ serverChecked: {
1026
+ type: Boolean,
1027
+ required: false
1028
+ },
1029
+ simdReadings: {
1030
+ type: mongoose.Schema.Types.Mixed,
1031
+ required: false
1032
+ },
1033
+ simdReadingsStage: {
1034
+ type: String,
1035
+ required: false
1036
+ },
1037
+ entropyMathRandomFingerprint: {
1038
+ type: String,
1039
+ required: false
1040
+ },
1041
+ entropyCryptoFingerprint: {
1042
+ type: String,
1043
+ required: false
1044
+ },
1045
+ entropyWallClockOffsetMs: {
1046
+ type: Number,
1047
+ required: false
1048
+ },
1049
+ entropyMathRandomFirst: {
1050
+ type: Number,
1051
+ required: false
1052
+ },
1053
+ tcpToChelloUs: {
1054
+ type: Number,
1055
+ required: false
1056
+ },
1057
+ chelloToHandshakeUs: {
1058
+ type: Number,
1059
+ required: false
1060
+ },
1061
+ dnsEvent: {
1062
+ type: new mongoose.Schema({
1063
+ resolverIp: {
1064
+ type: String,
1065
+ required: false
1066
+ },
1067
+ peerIp: {
1068
+ type: String,
1069
+ required: false
1070
+ },
1071
+ pathValid: {
1072
+ type: Boolean,
1073
+ required: false
1074
+ },
1075
+ receivedAt: {
1076
+ type: Date,
1077
+ required: true
1078
+ }
1079
+ }, { _id: false }),
1080
+ required: false
1081
+ }
537
1082
  });
538
1083
  SessionRecordSchema.index({ createdAt: 1 });
539
1084
  SessionRecordSchema.index({ deleted: 1 });
540
1085
  SessionRecordSchema.index({ blocked: 1 });
541
1086
  SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
542
1087
  SessionRecordSchema.index({ userSitekeyIpHash: 1 });
543
- SessionRecordSchema.index(
544
- { siteKey: 1, entropyMathRandomFingerprint: 1, createdAt: -1 },
545
- { sparse: true }
546
- );
1088
+ SessionRecordSchema.index({
1089
+ siteKey: 1,
1090
+ entropyMathRandomFingerprint: 1,
1091
+ createdAt: -1
1092
+ }, { sparse: true });
547
1093
  SessionRecordSchema.index({ token: 1 });
548
- SessionRecordSchema.index({ siteKey: 1 }, { background: true, sparse: true });
549
- SessionRecordSchema.index(
550
- { siteKey: 1, blocked: 1, createdAt: 1 },
551
- { background: true, sparse: true }
552
- );
553
- SessionRecordSchema.index({ ruleHash: 1 }, { background: true, sparse: true });
554
- SessionRecordSchema.index(
555
- { isEscalation: 1, createdAt: 1 },
556
- { background: true, sparse: true }
557
- );
558
- SessionRecordSchema.index(
559
- { isProtect: 1, createdAt: 1 },
560
- { background: true, sparse: true }
561
- );
1094
+ SessionRecordSchema.index({ siteKey: 1 }, {
1095
+ background: true,
1096
+ sparse: true
1097
+ });
1098
+ SessionRecordSchema.index({
1099
+ siteKey: 1,
1100
+ blocked: 1,
1101
+ createdAt: 1
1102
+ }, {
1103
+ background: true,
1104
+ sparse: true
1105
+ });
1106
+ SessionRecordSchema.index({ ruleHash: 1 }, {
1107
+ background: true,
1108
+ sparse: true
1109
+ });
1110
+ SessionRecordSchema.index({
1111
+ isEscalation: 1,
1112
+ createdAt: 1
1113
+ }, {
1114
+ background: true,
1115
+ sparse: true
1116
+ });
1117
+ SessionRecordSchema.index({
1118
+ isProtect: 1,
1119
+ createdAt: 1
1120
+ }, {
1121
+ background: true,
1122
+ sparse: true
1123
+ });
1124
+ SessionRecordSchema.index({
1125
+ createdAt: 1,
1126
+ captchaType: 1,
1127
+ "scoreComponents.baseScore": 1
1128
+ });
562
1129
  SessionRecordSchema.index({
563
- createdAt: 1,
564
- captchaType: 1,
565
- "scoreComponents.baseScore": 1
566
- });
567
- SessionRecordSchema.index({ createdAt: 1, deleted: 1 });
568
- SessionRecordSchema.index(
569
- { "result.status": 1 },
570
- { background: true, sparse: true }
571
- );
572
- SessionRecordSchema.index(
573
- { pendingStage: 1 },
574
- {
575
- name: "pendingStage_partial",
576
- partialFilterExpression: { pendingStage: true }
577
- }
578
- );
579
- const DetectorRecordSchema = new mongoose.Schema({
580
- createdAt: { type: Date, required: true },
581
- detectorKey: { type: String, required: true },
582
- expiresAt: { type: Date, required: false }
1130
+ createdAt: 1,
1131
+ deleted: 1
1132
+ });
1133
+ SessionRecordSchema.index({ "result.status": 1 }, {
1134
+ background: true,
1135
+ sparse: true
1136
+ });
1137
+ SessionRecordSchema.index({ pendingStage: 1 }, {
1138
+ name: "pendingStage_partial",
1139
+ partialFilterExpression: { pendingStage: true }
1140
+ });
1141
+ var DetectorRecordSchema = new mongoose.Schema({
1142
+ createdAt: {
1143
+ type: Date,
1144
+ required: true
1145
+ },
1146
+ detectorKey: {
1147
+ type: String,
1148
+ required: true
1149
+ },
1150
+ expiresAt: {
1151
+ type: Date,
1152
+ required: false
1153
+ }
583
1154
  });
584
1155
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
585
1156
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
586
- const DecisionMachineArtifactRecordSchema = new mongoose.Schema({
587
- scope: {
588
- type: String,
589
- enum: Object.values(types.DecisionMachineScope),
590
- required: true
591
- },
592
- dappAccount: { type: String, required: false },
593
- kind: {
594
- type: String,
595
- enum: Object.values(types.DecisionMachineKind),
596
- required: false
597
- },
598
- runtime: {
599
- type: String,
600
- enum: Object.values(types.DecisionMachineRuntime),
601
- required: true
602
- },
603
- language: {
604
- type: String,
605
- enum: Object.values(types.DecisionMachineLanguage),
606
- required: false
607
- },
608
- source: { type: String, required: true },
609
- name: { type: String, required: false },
610
- version: { type: String, required: false },
611
- captchaType: {
612
- type: String,
613
- enum: [types.CaptchaType.pow, types.CaptchaType.image, types.CaptchaType.puzzle],
614
- required: false
615
- },
616
- createdAt: { type: Date, required: true },
617
- updatedAt: { type: Date, required: true }
618
- });
619
- DecisionMachineArtifactRecordSchema.index(
620
- { scope: 1, dappAccount: 1, kind: 1 },
621
- { unique: true }
622
- );
1157
+ var DecisionMachineArtifactRecordSchema = new mongoose.Schema({
1158
+ scope: {
1159
+ type: String,
1160
+ enum: Object.values(_prosopo_types.DecisionMachineScope),
1161
+ required: true
1162
+ },
1163
+ dappAccount: {
1164
+ type: String,
1165
+ required: false
1166
+ },
1167
+ kind: {
1168
+ type: String,
1169
+ enum: Object.values(_prosopo_types.DecisionMachineKind),
1170
+ required: false
1171
+ },
1172
+ runtime: {
1173
+ type: String,
1174
+ enum: Object.values(_prosopo_types.DecisionMachineRuntime),
1175
+ required: true
1176
+ },
1177
+ language: {
1178
+ type: String,
1179
+ enum: Object.values(_prosopo_types.DecisionMachineLanguage),
1180
+ required: false
1181
+ },
1182
+ source: {
1183
+ type: String,
1184
+ required: true
1185
+ },
1186
+ name: {
1187
+ type: String,
1188
+ required: false
1189
+ },
1190
+ version: {
1191
+ type: String,
1192
+ required: false
1193
+ },
1194
+ captchaType: {
1195
+ type: String,
1196
+ enum: [
1197
+ _prosopo_types.CaptchaType.pow,
1198
+ _prosopo_types.CaptchaType.image,
1199
+ _prosopo_types.CaptchaType.puzzle
1200
+ ],
1201
+ required: false
1202
+ },
1203
+ createdAt: {
1204
+ type: Date,
1205
+ required: true
1206
+ },
1207
+ updatedAt: {
1208
+ type: Date,
1209
+ required: true
1210
+ }
1211
+ });
1212
+ DecisionMachineArtifactRecordSchema.index({
1213
+ scope: 1,
1214
+ dappAccount: 1,
1215
+ kind: 1
1216
+ }, { unique: true });
623
1217
  DecisionMachineArtifactRecordSchema.index({ updatedAt: -1 });
624
- const ClientContextEntropyRecordSchema = new mongoose.Schema(
625
- {
626
- account: { type: String, required: true },
627
- contextType: {
628
- type: String,
629
- enum: Object.values(types.ContextType),
630
- required: true
631
- },
632
- entropy: { type: String, required: true }
633
- },
634
- { timestamps: { createdAt: true, updatedAt: true } }
635
- );
636
- ClientContextEntropyRecordSchema.index(
637
- { account: 1, contextType: 1 },
638
- { unique: true }
639
- );
1218
+ var ClientContextEntropyRecordSchema = new mongoose.Schema({
1219
+ account: {
1220
+ type: String,
1221
+ required: true
1222
+ },
1223
+ contextType: {
1224
+ type: String,
1225
+ enum: Object.values(_prosopo_types.ContextType),
1226
+ required: true
1227
+ },
1228
+ entropy: {
1229
+ type: String,
1230
+ required: true
1231
+ }
1232
+ }, { timestamps: {
1233
+ createdAt: true,
1234
+ updatedAt: true
1235
+ } });
1236
+ ClientContextEntropyRecordSchema.index({
1237
+ account: 1,
1238
+ contextType: 1
1239
+ }, { unique: true });
1240
+ //#endregion
640
1241
  exports.CaptchaRecordSchema = CaptchaRecordSchema;
641
1242
  exports.ClientContextEntropyRecordSchema = ClientContextEntropyRecordSchema;
642
1243
  exports.ClientRecordSchema = ClientRecordSchema;