@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,154 +1,288 @@
1
+ import { UserSettingsSchema } from "./client.js";
1
2
  import { TranslationKeysSchema } from "@prosopo/locale";
2
- import { Tier, IpAddressType, CaptchaLabel, CaptchaStatus, ScheduledTaskStatus, ScheduledTaskNames, ModeEnum, CaptchaType, DecisionMachineLanguage, DecisionMachineRuntime, DecisionMachineKind, DecisionMachineScope, ContextType } from "@prosopo/types";
3
+ import { CaptchaLabel, CaptchaStatus, CaptchaType, ContextType, DecisionMachineKind, DecisionMachineLanguage, DecisionMachineRuntime, DecisionMachineScope, IpAddressType, ModeEnum, ScheduledTaskNames, ScheduledTaskStatus, Tier } from "@prosopo/types";
3
4
  import { Long } from "bson";
4
5
  import { Schema } from "mongoose";
5
- import { object, any, nativeEnum, date } from "zod";
6
- import { UserSettingsSchema } from "./client.js";
7
- const ONE_HOUR = 60 * 60;
8
- const ONE_DAY = ONE_HOUR * 24;
9
- const ONE_WEEK = ONE_DAY * 7;
10
- const ONE_MONTH = ONE_WEEK * 4;
11
- const ClientRecordSchema = new Schema({
12
- account: String,
13
- settings: UserSettingsSchema,
14
- tier: { type: String, enum: Tier, required: true }
6
+ import { any, date, nativeEnum, object } from "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 Schema({
11
+ account: String,
12
+ settings: UserSettingsSchema,
13
+ tier: {
14
+ type: String,
15
+ enum: Tier,
16
+ required: true
17
+ }
15
18
  });
16
19
  ClientRecordSchema.index({ account: 1 });
17
- const isBsonLong = (value) => typeof value === "object" && value !== null && "_bsontype" in value && value._bsontype === "Long";
18
- const normaliseIpHalf = (value) => {
19
- if (typeof value === "bigint") return value.toString();
20
- if (isBsonLong(value)) {
21
- const lng = value;
22
- return Long.fromBits(lng.low, lng.high, true).toString();
23
- }
24
- 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 Long.fromBits(lng.low, lng.high, true).toString();
26
+ }
27
+ return value;
25
28
  };
26
- const CompositeIpAddressRecordSchemaObj = {
27
- lower: {
28
- // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
29
- type: Schema.Types.Decimal128,
30
- required: true,
31
- set: normaliseIpHalf
32
- },
33
- upper: {
34
- // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
35
- type: Schema.Types.Decimal128,
36
- required: false,
37
- set: normaliseIpHalf
38
- },
39
- type: { type: String, enum: IpAddressType, required: true }
29
+ var CompositeIpAddressRecordSchemaObj = {
30
+ lower: {
31
+ type: Schema.Types.Decimal128,
32
+ required: true,
33
+ set: normaliseIpHalf
34
+ },
35
+ upper: {
36
+ type: Schema.Types.Decimal128,
37
+ required: false,
38
+ set: normaliseIpHalf
39
+ },
40
+ type: {
41
+ type: String,
42
+ enum: IpAddressType,
43
+ required: true
44
+ }
40
45
  };
41
- const CaptchaRecordSchema = new Schema({
42
- captchaId: { type: String, required: true },
43
- captchaContentId: { type: String, required: true },
44
- assetURI: { type: String, required: false },
45
- datasetId: { type: String, required: true },
46
- datasetContentId: { type: String, required: true },
47
- solved: { type: Boolean, required: true },
48
- target: { type: String, required: true },
49
- salt: { type: String, required: true },
50
- // Random pivot in [0,1) stamped at insert time and never updated.
51
- // Powers `ProviderDatabase.getRandomCaptcha`, which walks at most
52
- // `sampleSize` keys of the compound index below instead of
53
- // materialising the full matched set via `$sample`. Pre-existing
54
- // rows are filled by providerBackfillCaptchaRandomKey.yml.
55
- randomKey: { type: Number, required: false },
56
- items: {
57
- type: [
58
- new Schema(
59
- {
60
- hash: { type: String, required: true },
61
- data: { type: String, required: true },
62
- type: { type: String, required: true }
63
- },
64
- { _id: false }
65
- )
66
- ],
67
- required: true
68
- }
46
+ var CaptchaRecordSchema = new 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 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
+ }
69
100
  });
70
101
  CaptchaRecordSchema.index({ captchaId: 1 });
71
102
  CaptchaRecordSchema.index({ datasetId: 1 });
72
- CaptchaRecordSchema.index({ datasetId: 1, solved: 1 });
73
- CaptchaRecordSchema.index({ datasetId: 1, solved: 1, randomKey: 1 });
74
- const PoWCaptchaRecordSchema = new Schema({
75
- challenge: { type: String, required: true },
76
- dappAccount: { type: String, required: true },
77
- userAccount: { type: String, required: true },
78
- requestedAtTimestamp: { type: Date, required: true },
79
- submittedAtTimestamp: { type: Date, required: false },
80
- verifiedAtTimestamp: { type: Date, required: false },
81
- failedAtTimestamp: { type: Date, required: false },
82
- lastUpdatedTimestamp: { type: Date, required: false },
83
- result: {
84
- status: { type: String, enum: CaptchaStatus, required: true },
85
- reason: {
86
- type: String,
87
- enum: TranslationKeysSchema.options,
88
- required: false
89
- },
90
- error: { type: String, required: false }
91
- },
92
- difficulty: { type: Number, required: true },
93
- ipAddress: CompositeIpAddressRecordSchemaObj,
94
- providedIp: {
95
- type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
96
- required: false
97
- },
98
- metadata: {
99
- type: new Schema(
100
- { email: { type: String, required: false } },
101
- { _id: false }
102
- ),
103
- required: false
104
- },
105
- clientMetaData: {
106
- type: new Schema({ hp: { type: String, required: false } }, { _id: false }),
107
- required: false
108
- },
109
- headers: { type: Object, required: true },
110
- ja4: { type: String, required: true },
111
- userSignature: { type: String, required: false },
112
- userSubmitted: { type: Boolean, required: true },
113
- serverChecked: { type: Boolean, required: true },
114
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
115
- // See `StoredCaptcha.pendingStage` — `true` while the record has
116
- // unstaged changes. Indexed via a tiny partial index so the
117
- // StoreCommitmentsExternal sweep scans only pending rows instead of
118
- // the whole collection.
119
- pendingStage: { type: Boolean, required: false },
120
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
121
- // `geolocation` and other per-flag fields — consumers narrow on
122
- // `ipInfo.isValid` and read whichever sub-field they need.
123
- ipInfo: { type: Object, required: false },
124
- parsedUserAgentInfo: { type: Object, required: false },
125
- sessionId: {
126
- type: String,
127
- required: false
128
- },
129
- coords: { type: [[[Number]]], required: false },
130
- // Current behavioral data storage format (packed)
131
- deviceCapability: { type: String, required: false },
132
- behavioralDataPacked: {
133
- type: {
134
- c1: { type: [Schema.Types.Mixed], required: true },
135
- c2: { type: [Schema.Types.Mixed], required: true },
136
- c3: { type: [Schema.Types.Mixed], required: true },
137
- d: { type: String, required: true }
138
- },
139
- required: false
140
- },
141
- providerSignature: { type: String, required: true },
142
- // Internal ML labelling applied by superadmins via the audit page.
143
- label: { type: String, enum: Object.values(CaptchaLabel), required: false },
144
- labelReason: { type: String, required: false },
145
- labelledBy: { type: String, required: false },
146
- 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 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: CaptchaStatus,
149
+ required: true
150
+ },
151
+ reason: {
152
+ type: String,
153
+ enum: 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 Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
168
+ required: false
169
+ },
170
+ metadata: {
171
+ type: new Schema({ email: {
172
+ type: String,
173
+ required: false
174
+ } }, { _id: false }),
175
+ required: false
176
+ },
177
+ clientMetaData: {
178
+ type: new 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: [Schema.Types.Mixed],
237
+ required: true
238
+ },
239
+ c2: {
240
+ type: [Schema.Types.Mixed],
241
+ required: true
242
+ },
243
+ c3: {
244
+ type: [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(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
+ }
147
275
  });
148
276
  PoWCaptchaRecordSchema.index({ challenge: 1 });
149
- PoWCaptchaRecordSchema.index({ label: 1, dappAccount: 1 });
277
+ PoWCaptchaRecordSchema.index({
278
+ label: 1,
279
+ dappAccount: 1
280
+ });
150
281
  PoWCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
151
- PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
282
+ PoWCaptchaRecordSchema.index({
283
+ dappAccount: 1,
284
+ requestedAtTimestamp: 1
285
+ });
152
286
  PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
153
287
  PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
154
288
  PoWCaptchaRecordSchema.index({ "result.reason": 1 });
@@ -156,99 +290,196 @@ PoWCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
156
290
  PoWCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
157
291
  PoWCaptchaRecordSchema.index({ ipInfo: 1 });
158
292
  PoWCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
159
- PoWCaptchaRecordSchema.index(
160
- { pendingStage: 1 },
161
- {
162
- name: "pendingStage_partial",
163
- partialFilterExpression: { pendingStage: true }
164
- }
165
- );
166
- const PuzzleCaptchaRecordSchema = new Schema({
167
- challenge: { type: String, required: true },
168
- dappAccount: { type: String, required: true },
169
- userAccount: { type: String, required: true },
170
- requestedAtTimestamp: { type: Date, required: true },
171
- submittedAtTimestamp: { type: Date, required: false },
172
- verifiedAtTimestamp: { type: Date, required: false },
173
- failedAtTimestamp: { type: Date, required: false },
174
- lastUpdatedTimestamp: { type: Date, required: false },
175
- result: {
176
- status: { type: String, enum: CaptchaStatus, required: true },
177
- reason: {
178
- type: String,
179
- enum: TranslationKeysSchema.options,
180
- required: false
181
- },
182
- error: { type: String, required: false }
183
- },
184
- targetX: { type: Number, required: true },
185
- targetY: { type: Number, required: true },
186
- originX: { type: Number, required: true },
187
- originY: { type: Number, required: true },
188
- tolerance: { type: Number, required: true },
189
- puzzleEvents: {
190
- type: [
191
- new Schema(
192
- {
193
- x: { type: Number, required: true },
194
- y: { type: Number, required: true },
195
- t: { type: Number, required: true }
196
- },
197
- { _id: false }
198
- )
199
- ],
200
- required: false
201
- },
202
- ipAddress: CompositeIpAddressRecordSchemaObj,
203
- providedIp: {
204
- type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
205
- required: false
206
- },
207
- metadata: {
208
- type: new Schema(
209
- { email: { type: String, required: false } },
210
- { _id: false }
211
- ),
212
- required: false
213
- },
214
- clientMetaData: {
215
- type: new Schema({ hp: { type: String, required: false } }, { _id: false }),
216
- required: false
217
- },
218
- headers: { type: Object, required: true },
219
- ja4: { type: String, required: true },
220
- userSignature: { type: String, required: false },
221
- userSubmitted: { type: Boolean, required: true },
222
- serverChecked: { type: Boolean, required: true },
223
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
224
- // See `StoredCaptcha.pendingStage`.
225
- pendingStage: { type: Boolean, required: false },
226
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
227
- // `geolocation` and other per-flag fields — consumers narrow on
228
- // `ipInfo.isValid` and read whichever sub-field they need.
229
- ipInfo: { type: Object, required: false },
230
- parsedUserAgentInfo: { type: Object, required: false },
231
- sessionId: {
232
- type: String,
233
- required: false
234
- },
235
- coords: { type: [[[Number]]], required: false },
236
- // Current behavioral data storage format (packed)
237
- deviceCapability: { type: String, required: false },
238
- behavioralDataPacked: {
239
- type: {
240
- c1: { type: [Schema.Types.Mixed], required: true },
241
- c2: { type: [Schema.Types.Mixed], required: true },
242
- c3: { type: [Schema.Types.Mixed], required: true },
243
- d: { type: String, required: true }
244
- },
245
- required: false
246
- },
247
- providerSignature: { type: String, required: true }
293
+ PoWCaptchaRecordSchema.index({ pendingStage: 1 }, {
294
+ name: "pendingStage_partial",
295
+ partialFilterExpression: { pendingStage: true }
296
+ });
297
+ var PuzzleCaptchaRecordSchema = new 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: CaptchaStatus,
334
+ required: true
335
+ },
336
+ reason: {
337
+ type: String,
338
+ enum: 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 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 Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
386
+ required: false
387
+ },
388
+ metadata: {
389
+ type: new Schema({ email: {
390
+ type: String,
391
+ required: false
392
+ } }, { _id: false }),
393
+ required: false
394
+ },
395
+ clientMetaData: {
396
+ type: new 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: [Schema.Types.Mixed],
455
+ required: true
456
+ },
457
+ c2: {
458
+ type: [Schema.Types.Mixed],
459
+ required: true
460
+ },
461
+ c3: {
462
+ type: [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
+ }
248
476
  });
249
477
  PuzzleCaptchaRecordSchema.index({ challenge: 1 });
250
478
  PuzzleCaptchaRecordSchema.index({ lastUpdatedTimestamp: 1 });
251
- PuzzleCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
479
+ PuzzleCaptchaRecordSchema.index({
480
+ dappAccount: 1,
481
+ requestedAtTimestamp: 1
482
+ });
252
483
  PuzzleCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
253
484
  PuzzleCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
254
485
  PuzzleCaptchaRecordSchema.index({ "result.reason": 1 });
@@ -256,96 +487,204 @@ PuzzleCaptchaRecordSchema.index({ "ipInfo.countryCode": 1 });
256
487
  PuzzleCaptchaRecordSchema.index({ "ipInfo.isVPN": 1 });
257
488
  PuzzleCaptchaRecordSchema.index({ ipInfo: 1 });
258
489
  PuzzleCaptchaRecordSchema.index({ parsedUserAgentInfo: 1 });
259
- PuzzleCaptchaRecordSchema.index(
260
- { pendingStage: 1 },
261
- {
262
- name: "pendingStage_partial",
263
- partialFilterExpression: { pendingStage: true }
264
- }
265
- );
266
- const UserCommitmentRecordSchema = new Schema({
267
- userAccount: { type: String, required: true },
268
- dappAccount: { type: String, required: true },
269
- providerAccount: { type: String, required: true },
270
- datasetId: { type: String, required: true },
271
- id: { type: String, required: true },
272
- result: {
273
- status: { type: String, enum: CaptchaStatus, required: true },
274
- reason: {
275
- type: String,
276
- enum: TranslationKeysSchema.options,
277
- required: false
278
- },
279
- error: { type: String, required: false }
280
- },
281
- ipAddress: CompositeIpAddressRecordSchemaObj,
282
- providedIp: {
283
- type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
284
- required: false
285
- },
286
- metadata: {
287
- type: new Schema(
288
- { email: { type: String, required: false } },
289
- { _id: false }
290
- ),
291
- required: false
292
- },
293
- clientMetaData: {
294
- type: new Schema({ hp: { type: String, required: false } }, { _id: false }),
295
- required: false
296
- },
297
- headers: { type: Object, required: true },
298
- ja4: { type: String, required: true },
299
- userSignature: { type: String, required: true },
300
- userSubmitted: { type: Boolean, required: true },
301
- serverChecked: { type: Boolean, required: true },
302
- storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
303
- requestedAtTimestamp: { type: Date, required: true },
304
- submittedAtTimestamp: { type: Date, required: false },
305
- verifiedAtTimestamp: { type: Date, required: false },
306
- failedAtTimestamp: { type: Date, required: false },
307
- lastUpdatedTimestamp: { type: Date, required: false },
308
- // See `StoredCaptcha.pendingStage`.
309
- pendingStage: { type: Boolean, required: false },
310
- // Full ipinfo payload. Replaces the flat `vpn`, `countryCode`,
311
- // `geolocation` and other per-flag fields — consumers narrow on
312
- // `ipInfo.isValid` and read whichever sub-field they need.
313
- ipInfo: { type: Object, required: false },
314
- parsedUserAgentInfo: { type: Object, required: false },
315
- sessionId: {
316
- type: String,
317
- required: false
318
- },
319
- coords: { type: [[[Number]]], required: false },
320
- // Pending request fields for image captcha workflow
321
- pending: { type: Boolean, required: true },
322
- salt: { type: String, required: true },
323
- requestHash: { type: String, required: true },
324
- deadlineTimestamp: { type: Date, required: true },
325
- threshold: { type: Number, required: true },
326
- // Current behavioral data storage format (packed)
327
- deviceCapability: { type: String, required: false },
328
- behavioralDataPacked: {
329
- type: {
330
- c1: { type: [Schema.Types.Mixed], required: true },
331
- c2: { type: [Schema.Types.Mixed], required: true },
332
- c3: { type: [Schema.Types.Mixed], required: true },
333
- d: { type: String, required: true }
334
- },
335
- required: false
336
- },
337
- // Internal ML labelling applied by superadmins via the audit page.
338
- label: { type: String, enum: Object.values(CaptchaLabel), required: false },
339
- labelReason: { type: String, required: false },
340
- labelledBy: { type: String, required: false },
341
- labelledAt: { type: Date, required: false }
490
+ PuzzleCaptchaRecordSchema.index({ pendingStage: 1 }, {
491
+ name: "pendingStage_partial",
492
+ partialFilterExpression: { pendingStage: true }
493
+ });
494
+ var UserCommitmentRecordSchema = new 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: CaptchaStatus,
519
+ required: true
520
+ },
521
+ reason: {
522
+ type: String,
523
+ enum: TranslationKeysSchema.options,
524
+ required: false
525
+ },
526
+ error: {
527
+ type: String,
528
+ required: false
529
+ }
530
+ },
531
+ ipAddress: CompositeIpAddressRecordSchemaObj,
532
+ providedIp: {
533
+ type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
534
+ required: false
535
+ },
536
+ metadata: {
537
+ type: new Schema({ email: {
538
+ type: String,
539
+ required: false
540
+ } }, { _id: false }),
541
+ required: false
542
+ },
543
+ clientMetaData: {
544
+ type: new 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: [Schema.Types.Mixed],
643
+ required: true
644
+ },
645
+ c2: {
646
+ type: [Schema.Types.Mixed],
647
+ required: true
648
+ },
649
+ c3: {
650
+ type: [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(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
+ }
342
677
  });
343
678
  UserCommitmentRecordSchema.index({ id: -1 });
344
- UserCommitmentRecordSchema.index({ label: 1, dappAccount: 1 });
345
679
  UserCommitmentRecordSchema.index({
346
- lastUpdatedTimestamp: 1
680
+ label: 1,
681
+ dappAccount: 1
682
+ });
683
+ UserCommitmentRecordSchema.index({ lastUpdatedTimestamp: 1 });
684
+ UserCommitmentRecordSchema.index({
685
+ userAccount: 1,
686
+ dappAccount: 1
347
687
  });
348
- UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
349
688
  UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
350
689
  UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
351
690
  UserCommitmentRecordSchema.index({ "result.reason": 1 });
@@ -355,300 +694,548 @@ UserCommitmentRecordSchema.index({ requestHash: -1 });
355
694
  UserCommitmentRecordSchema.index({ pending: 1 });
356
695
  UserCommitmentRecordSchema.index({ ipInfo: 1 });
357
696
  UserCommitmentRecordSchema.index({ parsedUserAgentInfo: 1 });
358
- UserCommitmentRecordSchema.index(
359
- { pendingStage: 1 },
360
- {
361
- name: "pendingStage_partial",
362
- partialFilterExpression: { pendingStage: true }
363
- }
364
- );
365
- const DatasetRecordSchema = new Schema({
366
- contentTree: { type: [[String]], required: true },
367
- datasetContentId: { type: String, required: true },
368
- datasetId: { type: String, required: true },
369
- format: { type: String, required: true },
370
- solutionTree: { type: [[String]], required: true }
697
+ UserCommitmentRecordSchema.index({ pendingStage: 1 }, {
698
+ name: "pendingStage_partial",
699
+ partialFilterExpression: { pendingStage: true }
700
+ });
701
+ var DatasetRecordSchema = new 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
+ }
371
722
  });
372
723
  DatasetRecordSchema.index({ datasetId: 1 });
373
- const SolutionRecordSchema = new Schema({
374
- captchaId: { type: String, required: true },
375
- captchaContentId: { type: String, required: true },
376
- datasetId: { type: String, required: true },
377
- datasetContentId: { type: String, required: true },
378
- salt: { type: String, required: true },
379
- solution: { type: [String], required: true }
724
+ var SolutionRecordSchema = new 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
+ }
380
749
  });
381
750
  SolutionRecordSchema.index({ captchaId: 1 });
382
- const UserSolutionRecordSchema = new Schema(
383
- {
384
- captchaId: { type: String, required: true },
385
- captchaContentId: { type: String, required: true },
386
- salt: { type: String, required: true },
387
- solution: [{ type: String, required: true }],
388
- processed: { type: Boolean, required: true },
389
- checked: { type: Boolean, required: true },
390
- commitmentId: { type: String, required: true },
391
- createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
392
- },
393
- { _id: false }
394
- );
751
+ var UserSolutionRecordSchema = new 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 });
395
786
  UserSolutionRecordSchema.index({ captchaId: 1 });
396
787
  UserSolutionRecordSchema.index({ commitmentId: -1 });
397
- const ScheduledTaskSchema = object({
398
- processName: nativeEnum(ScheduledTaskNames),
399
- datetime: date(),
400
- updated: date().optional(),
401
- status: nativeEnum(ScheduledTaskStatus),
402
- result: object({
403
- data: any().optional(),
404
- error: any().optional()
405
- }).optional()
406
- });
407
- const ScheduledTaskRecordSchema = new Schema({
408
- processName: { type: String, enum: ScheduledTaskNames, required: true },
409
- datetime: { type: Date, required: true, expires: ONE_WEEK },
410
- updated: { type: Date, required: false },
411
- status: { type: String, enum: ScheduledTaskStatus, required: true },
412
- result: {
413
- type: new Schema(
414
- {
415
- error: { type: String, required: false },
416
- data: { type: Object, required: false }
417
- },
418
- { _id: false }
419
- ),
420
- required: false
421
- }
788
+ var ScheduledTaskSchema = object({
789
+ processName: nativeEnum(ScheduledTaskNames),
790
+ datetime: date(),
791
+ updated: date().optional(),
792
+ status: nativeEnum(ScheduledTaskStatus),
793
+ result: object({
794
+ data: any().optional(),
795
+ error: any().optional()
796
+ }).optional()
797
+ });
798
+ var ScheduledTaskRecordSchema = new Schema({
799
+ processName: {
800
+ type: String,
801
+ enum: 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: ScheduledTaskStatus,
816
+ required: true
817
+ },
818
+ result: {
819
+ type: new 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
+ }
422
831
  });
423
832
  ScheduledTaskRecordSchema.index({ processName: 1 });
424
- ScheduledTaskRecordSchema.index({ processName: 1, status: 1 });
425
- ScheduledTaskRecordSchema.index({ _id: 1, status: 1 });
426
- const SessionRecordSchema = new Schema({
427
- sessionId: { type: String, required: true },
428
- createdAt: { type: Date, required: true },
429
- token: { type: String, required: true },
430
- score: { type: Number, required: true },
431
- threshold: { type: Number, required: true },
432
- scoreComponents: {
433
- baseScore: { type: Number, required: true },
434
- lScore: { type: Number, required: false },
435
- timeout: { type: Number, required: false },
436
- accessPolicy: { type: Number, required: false },
437
- unverifiedHost: { type: Number, required: false },
438
- webView: { type: Number, required: false },
439
- triggeredDetectors: { type: [Number], required: false },
440
- shadowDomPenalty: { type: Boolean, required: false },
441
- dnsAsymmetry: { type: Number, required: false }
442
- },
443
- ipAddress: CompositeIpAddressRecordSchemaObj,
444
- captchaType: { type: String, enum: CaptchaType, required: true },
445
- mode: { type: String, enum: ModeEnum, required: false },
446
- solvedImagesCount: { type: Number, required: false },
447
- powDifficulty: { type: Number, required: false },
448
- storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
449
- lastUpdatedTimestamp: { type: Date, required: false },
450
- // See `StoredCaptcha.pendingStage` — same semantics on Session records.
451
- pendingStage: { type: Boolean, required: false },
452
- deleted: { type: Boolean, required: false },
453
- userSitekeyIpHash: { type: String, required: false },
454
- webView: { type: Boolean, required: true, default: false },
455
- iFrame: { type: Boolean, required: true, default: false },
456
- // True when this session was created by the post-PoW routing machine as
457
- // an escalation of an earlier session. Optional so ordinary
458
- // frictionless-created sessions can omit it and stay slim.
459
- isEscalation: { type: Boolean, required: false },
460
- decryptedHeadHash: { type: String, required: false, default: "" },
461
- siteKey: { type: String, required: false },
462
- // Full page URL the widget was rendered on (origin + path only; query
463
- // string, fragment and credentials stripped). See Session.currentUrl —
464
- // `currentUrl` is the top-frame URL, `iframeUrl` is the widget's own
465
- // frame URL when embedded (undefined when the widget IS the top frame).
466
- currentUrl: { type: String, required: false },
467
- iframeUrl: { type: String, required: false },
468
- // Computed at session-creation time from (currentUrl, iframeUrl) via
469
- // isProtectDeployment. Persisted only when true so ordinary sessions
470
- // stay slim and the sparse index below only carries Protect records.
471
- isProtect: { type: Boolean, required: false },
472
- reason: { type: String, required: false },
473
- blocked: { type: Boolean, required: false },
474
- // On synthetic blocked-session records (blocked=true, deleted=true)
475
- // these carry the identity of the access-policy rule that fired at the
476
- // request-time block middleware — the Traffic page joins on these to
477
- // surface which rules are blocking traffic and at what volume.
478
- ruleHash: { type: String, required: false },
479
- ruleType: { type: [String], required: false },
480
- ruleDescription: { type: String, required: false },
481
- // Full ipinfo payload — replaces flat `countryCode` / `geolocation`
482
- // fields. Mirrors the captcha record schemas (PoW / Puzzle /
483
- // UserCommitment).
484
- ipInfo: { type: Object, required: false },
485
- headers: { type: Object, required: false },
486
- result: {
487
- type: new Schema(
488
- {
489
- status: {
490
- type: String,
491
- enum: Object.values(CaptchaStatus),
492
- required: true
493
- },
494
- reason: { type: String, required: false },
495
- error: { type: String, required: false }
496
- },
497
- { _id: false }
498
- ),
499
- required: false
500
- },
501
- userSubmitted: { type: Boolean, required: false },
502
- serverChecked: { type: Boolean, required: false },
503
- // WASM SIMD CPU fingerprint readings collected by the catcher client.
504
- // Stored as a free-form Mixed sub-document because the shape is a
505
- // discriminated union and the dataset is still evolving — Zod validates
506
- // at the boundary, Mongoose just persists it.
507
- simdReadings: { type: Schema.Types.Mixed, required: false },
508
- // Stage at which the SIMD readings first arrived on this session
509
- // (frictionless / challenge / submit). First-hop-wins.
510
- simdReadingsStage: { type: String, required: false },
511
- entropyMathRandomFingerprint: { type: String, required: false },
512
- entropyCryptoFingerprint: { type: String, required: false },
513
- entropyWallClockOffsetMs: { type: Number, required: false },
514
- entropyMathRandomFirst: { type: Number, required: false },
515
- // Per-TLS-connection handshake timings forwarded by the chaddy Caddy
516
- // plugin (X-TLS-TCP-To-Chello-Us / X-TLS-Chello-To-Handshake-Us).
517
- // See @prosopo/types Session.tcpToChelloUs for full semantics.
518
- tcpToChelloUs: { type: Number, required: false },
519
- chelloToHandshakeUs: { type: Number, required: false },
520
- // DNS observation merge target. Populated by
521
- // POST /v1/prosopo/provider/admin/dns/event from the dns-event
522
- // sidecar (see types/provider/database.ts → Session.dnsEvent).
523
- dnsEvent: {
524
- type: new Schema(
525
- {
526
- resolverIp: { type: String, required: false },
527
- peerIp: { type: String, required: false },
528
- pathValid: { type: Boolean, required: false },
529
- receivedAt: { type: Date, required: true }
530
- },
531
- { _id: false }
532
- ),
533
- required: false
534
- }
833
+ ScheduledTaskRecordSchema.index({
834
+ processName: 1,
835
+ status: 1
836
+ });
837
+ ScheduledTaskRecordSchema.index({
838
+ _id: 1,
839
+ status: 1
840
+ });
841
+ var SessionRecordSchema = new 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: CaptchaType,
904
+ required: true
905
+ },
906
+ mode: {
907
+ type: String,
908
+ enum: 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 Schema({
1005
+ status: {
1006
+ type: String,
1007
+ enum: Object.values(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: 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 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
+ }
535
1082
  });
536
1083
  SessionRecordSchema.index({ createdAt: 1 });
537
1084
  SessionRecordSchema.index({ deleted: 1 });
538
1085
  SessionRecordSchema.index({ blocked: 1 });
539
1086
  SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
540
1087
  SessionRecordSchema.index({ userSitekeyIpHash: 1 });
541
- SessionRecordSchema.index(
542
- { siteKey: 1, entropyMathRandomFingerprint: 1, createdAt: -1 },
543
- { sparse: true }
544
- );
1088
+ SessionRecordSchema.index({
1089
+ siteKey: 1,
1090
+ entropyMathRandomFingerprint: 1,
1091
+ createdAt: -1
1092
+ }, { sparse: true });
545
1093
  SessionRecordSchema.index({ token: 1 });
546
- SessionRecordSchema.index({ siteKey: 1 }, { background: true, sparse: true });
547
- SessionRecordSchema.index(
548
- { siteKey: 1, blocked: 1, createdAt: 1 },
549
- { background: true, sparse: true }
550
- );
551
- SessionRecordSchema.index({ ruleHash: 1 }, { background: true, sparse: true });
552
- SessionRecordSchema.index(
553
- { isEscalation: 1, createdAt: 1 },
554
- { background: true, sparse: true }
555
- );
556
- SessionRecordSchema.index(
557
- { isProtect: 1, createdAt: 1 },
558
- { background: true, sparse: true }
559
- );
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
+ });
560
1124
  SessionRecordSchema.index({
561
- createdAt: 1,
562
- captchaType: 1,
563
- "scoreComponents.baseScore": 1
564
- });
565
- SessionRecordSchema.index({ createdAt: 1, deleted: 1 });
566
- SessionRecordSchema.index(
567
- { "result.status": 1 },
568
- { background: true, sparse: true }
569
- );
570
- SessionRecordSchema.index(
571
- { pendingStage: 1 },
572
- {
573
- name: "pendingStage_partial",
574
- partialFilterExpression: { pendingStage: true }
575
- }
576
- );
577
- const DetectorRecordSchema = new Schema({
578
- createdAt: { type: Date, required: true },
579
- detectorKey: { type: String, required: true },
580
- expiresAt: { type: Date, required: false }
1125
+ createdAt: 1,
1126
+ captchaType: 1,
1127
+ "scoreComponents.baseScore": 1
1128
+ });
1129
+ SessionRecordSchema.index({
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 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
+ }
581
1154
  });
582
1155
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
583
1156
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
584
- const DecisionMachineArtifactRecordSchema = new Schema({
585
- scope: {
586
- type: String,
587
- enum: Object.values(DecisionMachineScope),
588
- required: true
589
- },
590
- dappAccount: { type: String, required: false },
591
- kind: {
592
- type: String,
593
- enum: Object.values(DecisionMachineKind),
594
- required: false
595
- },
596
- runtime: {
597
- type: String,
598
- enum: Object.values(DecisionMachineRuntime),
599
- required: true
600
- },
601
- language: {
602
- type: String,
603
- enum: Object.values(DecisionMachineLanguage),
604
- required: false
605
- },
606
- source: { type: String, required: true },
607
- name: { type: String, required: false },
608
- version: { type: String, required: false },
609
- captchaType: {
610
- type: String,
611
- enum: [CaptchaType.pow, CaptchaType.image, CaptchaType.puzzle],
612
- required: false
613
- },
614
- createdAt: { type: Date, required: true },
615
- updatedAt: { type: Date, required: true }
616
- });
617
- DecisionMachineArtifactRecordSchema.index(
618
- { scope: 1, dappAccount: 1, kind: 1 },
619
- { unique: true }
620
- );
1157
+ var DecisionMachineArtifactRecordSchema = new Schema({
1158
+ scope: {
1159
+ type: String,
1160
+ enum: Object.values(DecisionMachineScope),
1161
+ required: true
1162
+ },
1163
+ dappAccount: {
1164
+ type: String,
1165
+ required: false
1166
+ },
1167
+ kind: {
1168
+ type: String,
1169
+ enum: Object.values(DecisionMachineKind),
1170
+ required: false
1171
+ },
1172
+ runtime: {
1173
+ type: String,
1174
+ enum: Object.values(DecisionMachineRuntime),
1175
+ required: true
1176
+ },
1177
+ language: {
1178
+ type: String,
1179
+ enum: Object.values(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
+ CaptchaType.pow,
1198
+ CaptchaType.image,
1199
+ 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 });
621
1217
  DecisionMachineArtifactRecordSchema.index({ updatedAt: -1 });
622
- const ClientContextEntropyRecordSchema = new Schema(
623
- {
624
- account: { type: String, required: true },
625
- contextType: {
626
- type: String,
627
- enum: Object.values(ContextType),
628
- required: true
629
- },
630
- entropy: { type: String, required: true }
631
- },
632
- { timestamps: { createdAt: true, updatedAt: true } }
633
- );
634
- ClientContextEntropyRecordSchema.index(
635
- { account: 1, contextType: 1 },
636
- { unique: true }
637
- );
638
- export {
639
- CaptchaRecordSchema,
640
- ClientContextEntropyRecordSchema,
641
- ClientRecordSchema,
642
- CompositeIpAddressRecordSchemaObj,
643
- DatasetRecordSchema,
644
- DecisionMachineArtifactRecordSchema,
645
- DetectorRecordSchema,
646
- PoWCaptchaRecordSchema,
647
- PuzzleCaptchaRecordSchema,
648
- ScheduledTaskRecordSchema,
649
- ScheduledTaskSchema,
650
- SessionRecordSchema,
651
- SolutionRecordSchema,
652
- UserCommitmentRecordSchema,
653
- UserSolutionRecordSchema
654
- };
1218
+ var ClientContextEntropyRecordSchema = new Schema({
1219
+ account: {
1220
+ type: String,
1221
+ required: true
1222
+ },
1223
+ contextType: {
1224
+ type: String,
1225
+ enum: Object.values(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
1241
+ export { CaptchaRecordSchema, ClientContextEntropyRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, DatasetRecordSchema, DecisionMachineArtifactRecordSchema, DetectorRecordSchema, PoWCaptchaRecordSchema, PuzzleCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserSolutionRecordSchema };