@prosopo/types-database 3.0.12 → 3.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,285 @@
1
1
  # @prosopo/types-database
2
2
 
3
+ ## 3.3.5
4
+ ### Patch Changes
5
+
6
+ - Updated dependencies [1e3a838]
7
+ - @prosopo/config@3.1.20
8
+ - @prosopo/common@3.1.20
9
+ - @prosopo/locale@3.1.20
10
+ - @prosopo/types@3.5.3
11
+ - @prosopo/user-access-policy@3.5.19
12
+
13
+ ## 3.3.4
14
+ ### Patch Changes
15
+
16
+ - 5659b24: Release 3.4.4
17
+ - Updated dependencies [f912439]
18
+ - Updated dependencies [5659b24]
19
+ - @prosopo/common@3.1.19
20
+ - @prosopo/user-access-policy@3.5.18
21
+ - @prosopo/locale@3.1.19
22
+ - @prosopo/types@3.5.2
23
+ - @prosopo/config@3.1.19
24
+
25
+ ## 3.3.3
26
+ ### Patch Changes
27
+
28
+ - 50c4120: Release 3.4.3
29
+ - Updated dependencies [52cd544]
30
+ - Updated dependencies [b117ba3]
31
+ - Updated dependencies [50c4120]
32
+ - @prosopo/types@3.5.1
33
+ - @prosopo/user-access-policy@3.5.17
34
+ - @prosopo/common@3.1.18
35
+ - @prosopo/locale@3.1.18
36
+ - @prosopo/config@3.1.18
37
+
38
+ ## 3.3.2
39
+ ### Patch Changes
40
+
41
+ - 618703f: Release 3.4.2
42
+ - Updated dependencies [618703f]
43
+ - Updated dependencies [e20ad6b]
44
+ - @prosopo/user-access-policy@3.5.16
45
+ - @prosopo/common@3.1.17
46
+ - @prosopo/locale@3.1.17
47
+ - @prosopo/types@3.5.0
48
+ - @prosopo/config@3.1.17
49
+
50
+ ## 3.3.1
51
+ ### Patch Changes
52
+
53
+ - b6794f8: Timestamp decay fn
54
+ - 11303d9: Release 3.4.0
55
+ - bac2d91: Fix mongoose composite ip getting
56
+ - 18cb28b: Release 3.4.1
57
+ - Updated dependencies [11303d9]
58
+ - Updated dependencies [11303d9]
59
+ - Updated dependencies [18cb28b]
60
+ - Updated dependencies [11303d9]
61
+ - @prosopo/user-access-policy@3.5.15
62
+ - @prosopo/common@3.1.16
63
+ - @prosopo/locale@3.1.16
64
+ - @prosopo/types@3.4.1
65
+ - @prosopo/config@3.1.16
66
+
67
+ ## 3.3.0
68
+ ### Minor Changes
69
+
70
+ - 6768f14: Update salt
71
+
72
+ ### Patch Changes
73
+
74
+ - f3f7aec: Release 3.4.0
75
+ - Updated dependencies [f3f7aec]
76
+ - Updated dependencies [6768f14]
77
+ - @prosopo/user-access-policy@3.5.14
78
+ - @prosopo/common@3.1.15
79
+ - @prosopo/locale@3.1.15
80
+ - @prosopo/types@3.4.0
81
+ - @prosopo/config@3.1.15
82
+
83
+ ## 3.2.2
84
+ ### Patch Changes
85
+
86
+ - Release 3.3.1
87
+ - 0824221: Release 3.2.4
88
+ - Updated dependencies [97edf3f]
89
+ - Updated dependencies
90
+ - Updated dependencies [0824221]
91
+ - @prosopo/types@3.3.0
92
+ - @prosopo/user-access-policy@3.5.13
93
+ - @prosopo/common@3.1.14
94
+ - @prosopo/locale@3.1.14
95
+ - @prosopo/config@3.1.14
96
+
97
+ ## 3.2.1
98
+ ### Patch Changes
99
+
100
+ - 5137f01: Update pow record at verify
101
+ - 0555cd8: Fix type
102
+ - 008d112: Release 3.3.0
103
+ - Updated dependencies [509be28]
104
+ - Updated dependencies [008d112]
105
+ - @prosopo/types@3.2.1
106
+ - @prosopo/user-access-policy@3.5.12
107
+ - @prosopo/common@3.1.13
108
+ - @prosopo/locale@3.1.13
109
+ - @prosopo/config@3.1.13
110
+
111
+ ## 3.2.0
112
+ ### Minor Changes
113
+
114
+ - cf48565: Store additional details. Remove duplicate indexes.
115
+ - 260de39: Fix indexes so that stuff properly expires
116
+
117
+ ### Patch Changes
118
+
119
+ - d644c04: Make schema public
120
+ - 0824221: Release 3.2.4
121
+ - Updated dependencies [cf48565]
122
+ - Updated dependencies [0824221]
123
+ - @prosopo/types@3.2.0
124
+ - @prosopo/user-access-policy@3.5.11
125
+ - @prosopo/common@3.1.12
126
+ - @prosopo/locale@3.1.12
127
+ - @prosopo/config@3.1.12
128
+
129
+ ## 3.1.5
130
+ ### Patch Changes
131
+
132
+ - 0d1a33e: Adding ipcomparison service with user features
133
+ - 1a23649: Release 3.2.3
134
+ - Updated dependencies [0d1a33e]
135
+ - Updated dependencies [0d1a33e]
136
+ - Updated dependencies [1a23649]
137
+ - @prosopo/locale@3.1.11
138
+ - @prosopo/types@3.1.4
139
+ - @prosopo/user-access-policy@3.5.10
140
+ - @prosopo/common@3.1.11
141
+ - @prosopo/config@3.1.11
142
+
143
+ ## 3.1.4
144
+ ### Patch Changes
145
+
146
+ - a8a9251: Add index on IP parts
147
+ - 657a827: Release 3.2.2
148
+ - Updated dependencies [657a827]
149
+ - @prosopo/user-access-policy@3.5.9
150
+ - @prosopo/common@3.1.10
151
+ - @prosopo/locale@3.1.10
152
+ - @prosopo/types@3.1.3
153
+ - @prosopo/config@3.1.10
154
+
155
+ ## 3.1.3
156
+ ### Patch Changes
157
+
158
+ - 4440947: fix type-only tsc compilation
159
+ - 7bdaca6: Release 3.2.1
160
+ - 1249ce0: Be more lenient with random provider selection
161
+ - Updated dependencies [4440947]
162
+ - Updated dependencies [7bdaca6]
163
+ - Updated dependencies [809b984]
164
+ - Updated dependencies [1249ce0]
165
+ - Updated dependencies [809b984]
166
+ - @prosopo/user-access-policy@3.5.8
167
+ - @prosopo/common@3.1.9
168
+ - @prosopo/locale@3.1.9
169
+ - @prosopo/types@3.1.2
170
+ - @prosopo/config@3.1.9
171
+
172
+ ## 3.1.2
173
+ ### Patch Changes
174
+
175
+ - 6fe8570: Release 3.2.0
176
+ - Updated dependencies [1f980c4]
177
+ - Updated dependencies [6fe8570]
178
+ - @prosopo/types@3.1.1
179
+ - @prosopo/user-access-policy@3.5.7
180
+ - @prosopo/common@3.1.8
181
+ - @prosopo/locale@3.1.8
182
+ - @prosopo/config@3.1.8
183
+
184
+ ## 3.1.1
185
+ ### Patch Changes
186
+
187
+ - f304be9: Release 3.1.13
188
+ - Updated dependencies [f304be9]
189
+ - Updated dependencies [8bdc7f0]
190
+ - @prosopo/user-access-policy@3.5.6
191
+ - @prosopo/common@3.1.7
192
+ - @prosopo/locale@3.1.7
193
+ - @prosopo/types@3.1.0
194
+ - @prosopo/config@3.1.7
195
+
196
+ ## 3.1.0
197
+ ### Minor Changes
198
+
199
+ - 9b92339: fix/ipv6-in-captcha-flow
200
+
201
+ ### Patch Changes
202
+
203
+ - a07db04: Release 3.1.12
204
+ - Updated dependencies [9eed772]
205
+ - Updated dependencies [a07db04]
206
+ - @prosopo/config@3.1.6
207
+ - @prosopo/user-access-policy@3.5.5
208
+ - @prosopo/common@3.1.6
209
+ - @prosopo/locale@3.1.6
210
+ - @prosopo/types@3.0.10
211
+
212
+ ## 3.0.19
213
+ ### Patch Changes
214
+
215
+ - Updated dependencies [553025d]
216
+ - @prosopo/user-access-policy@3.5.4
217
+
218
+ ## 3.0.18
219
+ ### Patch Changes
220
+
221
+ - d8e855c: Adding checks for IP consistency throughout the verification process
222
+ - 6960643: lint detect missing and unneccessary imports
223
+ - Updated dependencies [d8e855c]
224
+ - Updated dependencies [6960643]
225
+ - @prosopo/locale@3.1.5
226
+ - @prosopo/user-access-policy@3.5.3
227
+ - @prosopo/common@3.1.5
228
+ - @prosopo/types@3.0.9
229
+
230
+ ## 3.0.17
231
+ ### Patch Changes
232
+
233
+ - Updated dependencies [30e7d4d]
234
+ - @prosopo/config@3.1.5
235
+ - @prosopo/common@3.1.4
236
+ - @prosopo/types@3.0.8
237
+ - @prosopo/user-access-policy@3.5.2
238
+
239
+ ## 3.0.16
240
+ ### Patch Changes
241
+
242
+ - 1f3a02f: Release 3.1.8
243
+ - Updated dependencies [1f3a02f]
244
+ - @prosopo/user-access-policy@3.5.1
245
+
246
+ ## 3.0.15
247
+ ### Patch Changes
248
+
249
+ - Updated dependencies [e0628d9]
250
+ - @prosopo/user-access-policy@3.5.0
251
+
252
+ ## 3.0.14
253
+ ### Patch Changes
254
+
255
+ - Updated dependencies [44ffda2]
256
+ - Updated dependencies [a49b538]
257
+ - Updated dependencies [e090e2f]
258
+ - @prosopo/config@3.1.4
259
+ - @prosopo/user-access-policy@3.4.1
260
+ - @prosopo/common@3.1.3
261
+ - @prosopo/types@3.0.7
262
+
263
+ ## 3.0.13
264
+ ### Patch Changes
265
+
266
+ - 828066d: remove empty test npm scripts, add missing npm test scripts
267
+ - 91bbe87: configure typecheck before bundle for vue packages
268
+ - 91bbe87: make typecheck script always recompile
269
+ - 346e092: NODE_ENV default to "development"
270
+ - 5d36e05: remove tsc --force
271
+ - Updated dependencies [828066d]
272
+ - Updated dependencies [df4e030]
273
+ - Updated dependencies [91bbe87]
274
+ - Updated dependencies [3ef4fd2]
275
+ - Updated dependencies [91bbe87]
276
+ - Updated dependencies [346e092]
277
+ - Updated dependencies [5d36e05]
278
+ - @prosopo/common@3.1.2
279
+ - @prosopo/types@3.0.6
280
+ - @prosopo/config@3.1.3
281
+ - @prosopo/user-access-policy@3.4.0
282
+
3
283
  ## 3.0.12
4
284
  ### Patch Changes
5
285
 
@@ -6,9 +6,12 @@ const client = require("./types/client.cjs");
6
6
  const captcha = require("./types/captcha.cjs");
7
7
  exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
8
8
  exports.ClientRecordSchema = provider.ClientRecordSchema;
9
+ exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
10
+ exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
9
11
  exports.DatasetRecordSchema = provider.DatasetRecordSchema;
10
12
  exports.DetectorRecordSchema = provider.DetectorRecordSchema;
11
13
  exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
14
+ exports.IpAddressType = provider.IpAddressType;
12
15
  exports.PendingRecordSchema = provider.PendingRecordSchema;
13
16
  exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
14
17
  exports.ScheduledTaskRecordSchema = provider.ScheduledTaskRecordSchema;
@@ -20,7 +23,9 @@ exports.UserCommitmentSchema = provider.UserCommitmentSchema;
20
23
  exports.UserCommitmentWithSolutionsSchema = provider.UserCommitmentWithSolutionsSchema;
21
24
  exports.UserSolutionRecordSchema = provider.UserSolutionRecordSchema;
22
25
  exports.UserSolutionSchema = provider.UserSolutionSchema;
26
+ exports.parseMongooseCompositeIpAddress = provider.parseMongooseCompositeIpAddress;
23
27
  exports.AccountSchema = client.AccountSchema;
28
+ exports.IPValidationRulesSchema = client.IPValidationRulesSchema;
24
29
  exports.TableNames = client.TableNames;
25
30
  exports.UserDataSchema = client.UserDataSchema;
26
31
  exports.UserSettingsSchema = client.UserSettingsSchema;
@@ -3,15 +3,22 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mongoose = require("mongoose");
4
4
  const provider = require("./provider.cjs");
5
5
  const StoredSessionRecordSchema = new mongoose.Schema({
6
- sessionId: provider.SessionRecordSchema.obj.sessionId,
7
- createdAt: provider.SessionRecordSchema.obj.createdAt,
8
- captchaType: provider.SessionRecordSchema.obj.captchaType,
9
- tokenId: provider.SessionRecordSchema.obj.tokenId,
10
- deleted: provider.SessionRecordSchema.obj.deleted,
11
- score: provider.FrictionlessTokenRecordSchema.obj.score,
12
- scoreComponents: provider.FrictionlessTokenRecordSchema.obj.scoreComponents,
13
- threshold: provider.FrictionlessTokenRecordSchema.obj.threshold
6
+ ...provider.SessionRecordSchema.obj,
7
+ ...Object.fromEntries(
8
+ Object.entries(provider.FrictionlessTokenRecordSchema.obj).filter(
9
+ ([key]) => key !== "token"
10
+ )
11
+ )
14
12
  });
13
+ const existingIndexes = StoredSessionRecordSchema.indexes();
14
+ const filteredIndexes = existingIndexes.filter(
15
+ (idx) => !("sessionId" in idx[0])
16
+ );
17
+ for (const [fields, options] of filteredIndexes) {
18
+ StoredSessionRecordSchema.index(fields, options);
19
+ }
20
+ StoredSessionRecordSchema.index({ tokenId: 1 });
21
+ StoredSessionRecordSchema.index({ sessionId: 1 }, { unique: false });
15
22
  const StoredUserCommitmentRecordSchema = new mongoose.Schema({
16
23
  ...provider.UserCommitmentRecordSchema.obj
17
24
  });
@@ -20,8 +27,6 @@ const StoredPoWCaptchaRecordSchema = new mongoose.Schema({
20
27
  ...provider.PoWCaptchaRecordSchema.obj
21
28
  });
22
29
  StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
23
- StoredSessionRecordSchema.index({ sessionId: 1 });
24
- StoredSessionRecordSchema.index({ tokenId: 1 });
25
30
  exports.StoredPoWCaptchaRecordSchema = StoredPoWCaptchaRecordSchema;
26
31
  exports.StoredSessionRecordSchema = StoredSessionRecordSchema;
27
32
  exports.StoredUserCommitmentRecordSchema = StoredUserCommitmentRecordSchema;
@@ -1,11 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mongoose = require("mongoose");
4
+ const IPValidationRulesSchema = new mongoose.Schema({
5
+ countryChangeAction: String,
6
+ ispChangeAction: String,
7
+ distanceThresholdKm: Number,
8
+ distanceExceedAction: String,
9
+ requireAllConditions: Boolean
10
+ });
4
11
  const UserSettingsSchema = new mongoose.Schema({
5
12
  captchaType: String,
6
13
  frictionlessThreshold: Number,
7
14
  powDifficulty: Number,
8
15
  imageThreshold: Number,
16
+ ipValidationRules: IPValidationRulesSchema,
9
17
  domains: [String]
10
18
  });
11
19
  const UserDataSchema = new mongoose.Schema({
@@ -49,7 +57,8 @@ const AccountSchema = new mongoose.Schema({
49
57
  domains: [String],
50
58
  powDifficulty: Number,
51
59
  captchaType: String,
52
- frictionlessThreshold: Number
60
+ frictionlessThreshold: Number,
61
+ ipValidationRules: IPValidationRulesSchema
53
62
  },
54
63
  createdAt: Number,
55
64
  updatedAt: Number,
@@ -63,6 +72,7 @@ var TableNames = /* @__PURE__ */ ((TableNames2) => {
63
72
  return TableNames2;
64
73
  })(TableNames || {});
65
74
  exports.AccountSchema = AccountSchema;
75
+ exports.IPValidationRulesSchema = IPValidationRulesSchema;
66
76
  exports.TableNames = TableNames;
67
77
  exports.UserDataSchema = UserDataSchema;
68
78
  exports.UserSettingsSchema = UserSettingsSchema;
@@ -7,9 +7,12 @@ const captcha = require("./captcha.cjs");
7
7
  require("./userAgent.cjs");
8
8
  exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
9
9
  exports.ClientRecordSchema = provider.ClientRecordSchema;
10
+ exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
11
+ exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
10
12
  exports.DatasetRecordSchema = provider.DatasetRecordSchema;
11
13
  exports.DetectorRecordSchema = provider.DetectorRecordSchema;
12
14
  exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
15
+ exports.IpAddressType = provider.IpAddressType;
13
16
  exports.PendingRecordSchema = provider.PendingRecordSchema;
14
17
  exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
15
18
  exports.ScheduledTaskRecordSchema = provider.ScheduledTaskRecordSchema;
@@ -21,7 +24,9 @@ exports.UserCommitmentSchema = provider.UserCommitmentSchema;
21
24
  exports.UserCommitmentWithSolutionsSchema = provider.UserCommitmentWithSolutionsSchema;
22
25
  exports.UserSolutionRecordSchema = provider.UserSolutionRecordSchema;
23
26
  exports.UserSolutionSchema = provider.UserSolutionSchema;
27
+ exports.parseMongooseCompositeIpAddress = provider.parseMongooseCompositeIpAddress;
24
28
  exports.AccountSchema = client.AccountSchema;
29
+ exports.IPValidationRulesSchema = client.IPValidationRulesSchema;
25
30
  exports.TableNames = client.TableNames;
26
31
  exports.UserDataSchema = client.UserDataSchema;
27
32
  exports.UserSettingsSchema = client.UserSettingsSchema;
@@ -16,6 +16,40 @@ const ClientRecordSchema = new mongoose.Schema({
16
16
  tier: { type: String, enum: types.Tier, required: true }
17
17
  });
18
18
  ClientRecordSchema.index({ account: 1 });
19
+ var IpAddressType = /* @__PURE__ */ ((IpAddressType2) => {
20
+ IpAddressType2["v4"] = "v4";
21
+ IpAddressType2["v6"] = "v6";
22
+ return IpAddressType2;
23
+ })(IpAddressType || {});
24
+ const CompositeIpAddressSchema = zod.object({
25
+ lower: zod.bigint(),
26
+ upper: zod.bigint().optional(),
27
+ type: zod.nativeEnum(IpAddressType)
28
+ });
29
+ const CompositeIpAddressRecordSchemaObj = {
30
+ lower: {
31
+ // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
32
+ type: mongoose.Schema.Types.Decimal128,
33
+ required: true,
34
+ // without casting to string Mongoose not able to set bigint to Decimal128
35
+ set: (value) => "bigint" === typeof value ? value.toString() : value
36
+ },
37
+ upper: {
38
+ // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
39
+ type: mongoose.Schema.Types.Decimal128,
40
+ required: false,
41
+ // without casting to string Mongoose not able to set bigint to Decimal128
42
+ set: (value) => "bigint" === typeof value ? value.toString() : value
43
+ },
44
+ type: { type: String, enum: IpAddressType, required: true }
45
+ };
46
+ const parseMongooseCompositeIpAddress = (ip) => {
47
+ return {
48
+ lower: BigInt(ip.lower.$numberDecimal ?? ip.lower),
49
+ upper: ip.upper ? BigInt(ip.upper?.$numberDecimal ?? ip.upper) : void 0,
50
+ type: ip.type
51
+ };
52
+ };
19
53
  const CaptchaResultSchema = zod.object({
20
54
  status: zod.nativeEnum(types.CaptchaStatus),
21
55
  reason: locale.TranslationKeysSchema.optional(),
@@ -29,7 +63,8 @@ const UserCommitmentSchema = zod.object({
29
63
  id: zod.string(),
30
64
  result: CaptchaResultSchema,
31
65
  userSignature: zod.string(),
32
- ipAddress: zod.bigint(),
66
+ ipAddress: CompositeIpAddressSchema,
67
+ providedIp: CompositeIpAddressSchema.optional(),
33
68
  headers: zod.object({}).catchall(zod.string()),
34
69
  ja4: zod.string(),
35
70
  userSubmitted: zod.boolean(),
@@ -40,7 +75,8 @@ const UserCommitmentSchema = zod.object({
40
75
  frictionlessTokenId: zod.union([
41
76
  zod.string(),
42
77
  zod.instanceof(mongoose.Types.ObjectId)
43
- ]).optional()
78
+ ]).optional(),
79
+ coords: zod.array(zod.array(zod.array(zod.number()))).optional()
44
80
  });
45
81
  const CaptchaRecordSchema = new mongoose.Schema({
46
82
  captchaId: { type: String, required: true },
@@ -84,7 +120,11 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
84
120
  error: { type: String, required: false }
85
121
  },
86
122
  difficulty: { type: Number, required: true },
87
- ipAddress: { type: BigInt, required: true },
123
+ ipAddress: CompositeIpAddressRecordSchemaObj,
124
+ providedIp: {
125
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
126
+ required: false
127
+ },
88
128
  headers: { type: Object, required: true },
89
129
  ja4: { type: String, required: true },
90
130
  userSignature: { type: String, required: false },
@@ -97,12 +137,14 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
97
137
  frictionlessTokenId: {
98
138
  type: mongoose.Schema.Types.ObjectId,
99
139
  required: false
100
- }
140
+ },
141
+ coords: { type: [[[Number]]], required: false }
101
142
  });
102
143
  PoWCaptchaRecordSchema.index({ challenge: 1 });
103
- PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1 });
104
144
  PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1, lastUpdatedTimestamp: 1 });
105
145
  PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
146
+ PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
147
+ PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
106
148
  const UserCommitmentRecordSchema = new mongoose.Schema({
107
149
  userAccount: { type: String, required: true },
108
150
  dappAccount: { type: String, required: true },
@@ -118,13 +160,17 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
118
160
  },
119
161
  error: { type: String, required: false }
120
162
  },
121
- ipAddress: { type: BigInt, required: true },
163
+ ipAddress: CompositeIpAddressRecordSchemaObj,
164
+ providedIp: {
165
+ type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
166
+ required: false
167
+ },
122
168
  headers: { type: Object, required: true },
123
169
  ja4: { type: String, required: true },
124
170
  userSignature: { type: String, required: true },
125
171
  userSubmitted: { type: Boolean, required: true },
126
172
  serverChecked: { type: Boolean, required: true },
127
- storedAtTimestamp: { type: Number, required: false },
173
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
128
174
  requestedAtTimestamp: { type: Number, required: true },
129
175
  lastUpdatedTimestamp: { type: Number, required: false },
130
176
  geolocation: { type: String, required: false },
@@ -133,15 +179,17 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
133
179
  frictionlessTokenId: {
134
180
  type: mongoose.Schema.Types.ObjectId,
135
181
  required: false
136
- }
182
+ },
183
+ coords: { type: [[[Number]]], required: false }
137
184
  });
138
185
  UserCommitmentRecordSchema.index({ id: -1 });
139
- UserCommitmentRecordSchema.index({ storedAtTimestamp: 1 });
140
186
  UserCommitmentRecordSchema.index({
141
187
  storedAtTimestamp: 1,
142
188
  lastUpdatedTimestamp: 1
143
189
  });
144
190
  UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
191
+ UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
192
+ UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
145
193
  const DatasetRecordSchema = new mongoose.Schema({
146
194
  contentTree: { type: [[String]], required: true },
147
195
  datasetContentId: { type: String, required: true },
@@ -162,7 +210,8 @@ SolutionRecordSchema.index({ captchaId: 1 });
162
210
  const UserSolutionSchema = types.CaptchaSolutionSchema.extend({
163
211
  processed: zod.boolean(),
164
212
  checked: zod.boolean(),
165
- commitmentId: zod.string()
213
+ commitmentId: zod.string(),
214
+ createdAt: zod.date()
166
215
  });
167
216
  const UserSolutionRecordSchema = new mongoose.Schema(
168
217
  {
@@ -172,7 +221,8 @@ const UserSolutionRecordSchema = new mongoose.Schema(
172
221
  solution: [{ type: String, required: true }],
173
222
  processed: { type: Boolean, required: true },
174
223
  checked: { type: Boolean, required: true },
175
- commitmentId: { type: String, required: true }
224
+ commitmentId: { type: String, required: true },
225
+ createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
176
226
  },
177
227
  { _id: false }
178
228
  );
@@ -189,7 +239,7 @@ const PendingRecordSchema = new mongoose.Schema({
189
239
  deadlineTimestamp: { type: Number, required: true },
190
240
  // unix timestamp
191
241
  requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
192
- ipAddress: { type: BigInt, required: true },
242
+ ipAddress: CompositeIpAddressRecordSchemaObj,
193
243
  frictionlessTokenId: {
194
244
  type: mongoose.Schema.Types.ObjectId,
195
245
  required: false
@@ -236,38 +286,45 @@ const FrictionlessTokenRecordSchema = new mongoose.Schema({
236
286
  timeout: { type: Number, required: false },
237
287
  accessPolicy: { type: Number, required: false }
238
288
  },
239
- createdAt: { type: Date, default: Date.now, expires: ONE_DAY },
240
- storedAtTimestamp: { type: Date, required: false },
241
- lastUpdatedTimestamp: { type: Date, required: false }
289
+ providerSelectEntropy: { type: Number, required: true },
290
+ ipAddress: CompositeIpAddressRecordSchemaObj,
291
+ createdAt: { type: Date, default: Date.now },
292
+ lastUpdatedTimestamp: { type: Date, required: false },
293
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
242
294
  });
243
- FrictionlessTokenRecordSchema.index({ token: 1 }, { unique: true });
244
- FrictionlessTokenRecordSchema.index({ storedAtTimestamp: 1 });
295
+ FrictionlessTokenRecordSchema.index({ createdAt: 1 });
296
+ FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
245
297
  const SessionRecordSchema = new mongoose.Schema({
246
- sessionId: { type: String, required: true, unique: true },
247
- createdAt: { type: Date, required: true, expires: ONE_DAY },
298
+ sessionId: { type: String, required: true },
299
+ createdAt: { type: Date, required: true },
248
300
  tokenId: {
249
301
  type: mongoose.Schema.Types.ObjectId
250
302
  },
251
303
  captchaType: { type: String, enum: types.CaptchaType, required: true },
252
- storedAtTimestamp: { type: Date, required: false },
304
+ solvedImagesCount: { type: Number, required: false },
305
+ powDifficulty: { type: Number, required: false },
306
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
253
307
  lastUpdatedTimestamp: { type: Date, required: false },
254
308
  deleted: { type: Boolean, required: false }
255
309
  });
256
- SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
257
- SessionRecordSchema.index({ storedAtTimestamp: 1 });
310
+ SessionRecordSchema.index({ createdAt: 1 });
258
311
  SessionRecordSchema.index({ deleted: 1 });
312
+ SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
259
313
  const DetectorRecordSchema = new mongoose.Schema({
260
314
  createdAt: { type: Date, required: true },
261
315
  detectorKey: { type: String, required: true },
262
- expiresAt: { type: Date, required: false, expires: 0 }
316
+ expiresAt: { type: Date, required: false }
263
317
  });
264
318
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
265
319
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
266
320
  exports.CaptchaRecordSchema = CaptchaRecordSchema;
267
321
  exports.ClientRecordSchema = ClientRecordSchema;
322
+ exports.CompositeIpAddressRecordSchemaObj = CompositeIpAddressRecordSchemaObj;
323
+ exports.CompositeIpAddressSchema = CompositeIpAddressSchema;
268
324
  exports.DatasetRecordSchema = DatasetRecordSchema;
269
325
  exports.DetectorRecordSchema = DetectorRecordSchema;
270
326
  exports.FrictionlessTokenRecordSchema = FrictionlessTokenRecordSchema;
327
+ exports.IpAddressType = IpAddressType;
271
328
  exports.PendingRecordSchema = PendingRecordSchema;
272
329
  exports.PoWCaptchaRecordSchema = PoWCaptchaRecordSchema;
273
330
  exports.ScheduledTaskRecordSchema = ScheduledTaskRecordSchema;
@@ -279,3 +336,4 @@ exports.UserCommitmentSchema = UserCommitmentSchema;
279
336
  exports.UserCommitmentWithSolutionsSchema = UserCommitmentWithSolutionsSchema;
280
337
  exports.UserSolutionRecordSchema = UserSolutionRecordSchema;
281
338
  exports.UserSolutionSchema = UserSolutionSchema;
339
+ exports.parseMongooseCompositeIpAddress = parseMongooseCompositeIpAddress;
package/dist/index.js CHANGED
@@ -1,14 +1,18 @@
1
1
  import "./types/index.js";
2
- import { CaptchaRecordSchema, ClientRecordSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema } from "./types/provider.js";
3
- import { AccountSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./types/client.js";
2
+ import { CaptchaRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./types/provider.js";
3
+ import { AccountSchema, IPValidationRulesSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./types/client.js";
4
4
  import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "./types/captcha.js";
5
5
  export {
6
6
  AccountSchema,
7
7
  CaptchaRecordSchema,
8
8
  ClientRecordSchema,
9
+ CompositeIpAddressRecordSchemaObj,
10
+ CompositeIpAddressSchema,
9
11
  DatasetRecordSchema,
10
12
  DetectorRecordSchema,
11
13
  FrictionlessTokenRecordSchema,
14
+ IPValidationRulesSchema,
15
+ IpAddressType,
12
16
  PendingRecordSchema,
13
17
  PoWCaptchaRecordSchema,
14
18
  ScheduledTaskRecordSchema,
@@ -25,5 +29,6 @@ export {
25
29
  UserDataSchema,
26
30
  UserSettingsSchema,
27
31
  UserSolutionRecordSchema,
28
- UserSolutionSchema
32
+ UserSolutionSchema,
33
+ parseMongooseCompositeIpAddress
29
34
  };
@@ -1,15 +1,22 @@
1
1
  import { Schema } from "mongoose";
2
2
  import { FrictionlessTokenRecordSchema, SessionRecordSchema, UserCommitmentRecordSchema, PoWCaptchaRecordSchema } from "./provider.js";
3
3
  const StoredSessionRecordSchema = new Schema({
4
- sessionId: SessionRecordSchema.obj.sessionId,
5
- createdAt: SessionRecordSchema.obj.createdAt,
6
- captchaType: SessionRecordSchema.obj.captchaType,
7
- tokenId: SessionRecordSchema.obj.tokenId,
8
- deleted: SessionRecordSchema.obj.deleted,
9
- score: FrictionlessTokenRecordSchema.obj.score,
10
- scoreComponents: FrictionlessTokenRecordSchema.obj.scoreComponents,
11
- threshold: FrictionlessTokenRecordSchema.obj.threshold
4
+ ...SessionRecordSchema.obj,
5
+ ...Object.fromEntries(
6
+ Object.entries(FrictionlessTokenRecordSchema.obj).filter(
7
+ ([key]) => key !== "token"
8
+ )
9
+ )
12
10
  });
11
+ const existingIndexes = StoredSessionRecordSchema.indexes();
12
+ const filteredIndexes = existingIndexes.filter(
13
+ (idx) => !("sessionId" in idx[0])
14
+ );
15
+ for (const [fields, options] of filteredIndexes) {
16
+ StoredSessionRecordSchema.index(fields, options);
17
+ }
18
+ StoredSessionRecordSchema.index({ tokenId: 1 });
19
+ StoredSessionRecordSchema.index({ sessionId: 1 }, { unique: false });
13
20
  const StoredUserCommitmentRecordSchema = new Schema({
14
21
  ...UserCommitmentRecordSchema.obj
15
22
  });
@@ -18,8 +25,6 @@ const StoredPoWCaptchaRecordSchema = new Schema({
18
25
  ...PoWCaptchaRecordSchema.obj
19
26
  });
20
27
  StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
21
- StoredSessionRecordSchema.index({ sessionId: 1 });
22
- StoredSessionRecordSchema.index({ tokenId: 1 });
23
28
  export {
24
29
  StoredPoWCaptchaRecordSchema,
25
30
  StoredSessionRecordSchema,
@@ -1,9 +1,17 @@
1
1
  import { Schema } from "mongoose";
2
+ const IPValidationRulesSchema = new Schema({
3
+ countryChangeAction: String,
4
+ ispChangeAction: String,
5
+ distanceThresholdKm: Number,
6
+ distanceExceedAction: String,
7
+ requireAllConditions: Boolean
8
+ });
2
9
  const UserSettingsSchema = new Schema({
3
10
  captchaType: String,
4
11
  frictionlessThreshold: Number,
5
12
  powDifficulty: Number,
6
13
  imageThreshold: Number,
14
+ ipValidationRules: IPValidationRulesSchema,
7
15
  domains: [String]
8
16
  });
9
17
  const UserDataSchema = new Schema({
@@ -47,7 +55,8 @@ const AccountSchema = new Schema({
47
55
  domains: [String],
48
56
  powDifficulty: Number,
49
57
  captchaType: String,
50
- frictionlessThreshold: Number
58
+ frictionlessThreshold: Number,
59
+ ipValidationRules: IPValidationRulesSchema
51
60
  },
52
61
  createdAt: Number,
53
62
  updatedAt: Number,
@@ -62,6 +71,7 @@ var TableNames = /* @__PURE__ */ ((TableNames2) => {
62
71
  })(TableNames || {});
63
72
  export {
64
73
  AccountSchema,
74
+ IPValidationRulesSchema,
65
75
  TableNames,
66
76
  UserDataSchema,
67
77
  UserSettingsSchema
@@ -1,15 +1,19 @@
1
1
  import "./mongo.js";
2
- import { CaptchaRecordSchema, ClientRecordSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema } from "./provider.js";
3
- import { AccountSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./client.js";
2
+ import { CaptchaRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./provider.js";
3
+ import { AccountSchema, IPValidationRulesSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./client.js";
4
4
  import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "./captcha.js";
5
5
  import "./userAgent.js";
6
6
  export {
7
7
  AccountSchema,
8
8
  CaptchaRecordSchema,
9
9
  ClientRecordSchema,
10
+ CompositeIpAddressRecordSchemaObj,
11
+ CompositeIpAddressSchema,
10
12
  DatasetRecordSchema,
11
13
  DetectorRecordSchema,
12
14
  FrictionlessTokenRecordSchema,
15
+ IPValidationRulesSchema,
16
+ IpAddressType,
13
17
  PendingRecordSchema,
14
18
  PoWCaptchaRecordSchema,
15
19
  ScheduledTaskRecordSchema,
@@ -26,5 +30,6 @@ export {
26
30
  UserDataSchema,
27
31
  UserSettingsSchema,
28
32
  UserSolutionRecordSchema,
29
- UserSolutionSchema
33
+ UserSolutionSchema,
34
+ parseMongooseCompositeIpAddress
30
35
  };
@@ -1,7 +1,7 @@
1
1
  import { TranslationKeysSchema } from "@prosopo/locale";
2
2
  import { Tier, CaptchaStatus, TimestampSchema, CaptchaSolutionSchema, ScheduledTaskStatus, ScheduledTaskNames, CaptchaType } from "@prosopo/types";
3
3
  import mongoose, { Schema } from "mongoose";
4
- import { object, string, nativeEnum, union, instanceof as _instanceof, boolean, bigint, array, any } from "zod";
4
+ import { object, nativeEnum, bigint, string, array, number, union, instanceof as _instanceof, boolean, date, any } from "zod";
5
5
  import { UserSettingsSchema } from "./client.js";
6
6
  const ONE_HOUR = 60 * 60;
7
7
  const ONE_DAY = ONE_HOUR * 24;
@@ -14,6 +14,40 @@ const ClientRecordSchema = new Schema({
14
14
  tier: { type: String, enum: Tier, required: true }
15
15
  });
16
16
  ClientRecordSchema.index({ account: 1 });
17
+ var IpAddressType = /* @__PURE__ */ ((IpAddressType2) => {
18
+ IpAddressType2["v4"] = "v4";
19
+ IpAddressType2["v6"] = "v6";
20
+ return IpAddressType2;
21
+ })(IpAddressType || {});
22
+ const CompositeIpAddressSchema = object({
23
+ lower: bigint(),
24
+ upper: bigint().optional(),
25
+ type: nativeEnum(IpAddressType)
26
+ });
27
+ const CompositeIpAddressRecordSchemaObj = {
28
+ lower: {
29
+ // INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
30
+ type: Schema.Types.Decimal128,
31
+ required: true,
32
+ // without casting to string Mongoose not able to set bigint to Decimal128
33
+ set: (value) => "bigint" === typeof value ? value.toString() : value
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: Schema.Types.Decimal128,
38
+ required: false,
39
+ // without casting to string Mongoose not able to set bigint to Decimal128
40
+ set: (value) => "bigint" === typeof value ? value.toString() : value
41
+ },
42
+ type: { type: String, enum: IpAddressType, required: true }
43
+ };
44
+ const parseMongooseCompositeIpAddress = (ip) => {
45
+ return {
46
+ lower: BigInt(ip.lower.$numberDecimal ?? ip.lower),
47
+ upper: ip.upper ? BigInt(ip.upper?.$numberDecimal ?? ip.upper) : void 0,
48
+ type: ip.type
49
+ };
50
+ };
17
51
  const CaptchaResultSchema = object({
18
52
  status: nativeEnum(CaptchaStatus),
19
53
  reason: TranslationKeysSchema.optional(),
@@ -27,7 +61,8 @@ const UserCommitmentSchema = object({
27
61
  id: string(),
28
62
  result: CaptchaResultSchema,
29
63
  userSignature: string(),
30
- ipAddress: bigint(),
64
+ ipAddress: CompositeIpAddressSchema,
65
+ providedIp: CompositeIpAddressSchema.optional(),
31
66
  headers: object({}).catchall(string()),
32
67
  ja4: string(),
33
68
  userSubmitted: boolean(),
@@ -38,7 +73,8 @@ const UserCommitmentSchema = object({
38
73
  frictionlessTokenId: union([
39
74
  string(),
40
75
  _instanceof(mongoose.Types.ObjectId)
41
- ]).optional()
76
+ ]).optional(),
77
+ coords: array(array(array(number()))).optional()
42
78
  });
43
79
  const CaptchaRecordSchema = new Schema({
44
80
  captchaId: { type: String, required: true },
@@ -82,7 +118,11 @@ const PoWCaptchaRecordSchema = new Schema({
82
118
  error: { type: String, required: false }
83
119
  },
84
120
  difficulty: { type: Number, required: true },
85
- ipAddress: { type: BigInt, required: true },
121
+ ipAddress: CompositeIpAddressRecordSchemaObj,
122
+ providedIp: {
123
+ type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
124
+ required: false
125
+ },
86
126
  headers: { type: Object, required: true },
87
127
  ja4: { type: String, required: true },
88
128
  userSignature: { type: String, required: false },
@@ -95,12 +135,14 @@ const PoWCaptchaRecordSchema = new Schema({
95
135
  frictionlessTokenId: {
96
136
  type: mongoose.Schema.Types.ObjectId,
97
137
  required: false
98
- }
138
+ },
139
+ coords: { type: [[[Number]]], required: false }
99
140
  });
100
141
  PoWCaptchaRecordSchema.index({ challenge: 1 });
101
- PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1 });
102
142
  PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1, lastUpdatedTimestamp: 1 });
103
143
  PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
144
+ PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
145
+ PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
104
146
  const UserCommitmentRecordSchema = new Schema({
105
147
  userAccount: { type: String, required: true },
106
148
  dappAccount: { type: String, required: true },
@@ -116,13 +158,17 @@ const UserCommitmentRecordSchema = new Schema({
116
158
  },
117
159
  error: { type: String, required: false }
118
160
  },
119
- ipAddress: { type: BigInt, required: true },
161
+ ipAddress: CompositeIpAddressRecordSchemaObj,
162
+ providedIp: {
163
+ type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
164
+ required: false
165
+ },
120
166
  headers: { type: Object, required: true },
121
167
  ja4: { type: String, required: true },
122
168
  userSignature: { type: String, required: true },
123
169
  userSubmitted: { type: Boolean, required: true },
124
170
  serverChecked: { type: Boolean, required: true },
125
- storedAtTimestamp: { type: Number, required: false },
171
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
126
172
  requestedAtTimestamp: { type: Number, required: true },
127
173
  lastUpdatedTimestamp: { type: Number, required: false },
128
174
  geolocation: { type: String, required: false },
@@ -131,15 +177,17 @@ const UserCommitmentRecordSchema = new Schema({
131
177
  frictionlessTokenId: {
132
178
  type: mongoose.Schema.Types.ObjectId,
133
179
  required: false
134
- }
180
+ },
181
+ coords: { type: [[[Number]]], required: false }
135
182
  });
136
183
  UserCommitmentRecordSchema.index({ id: -1 });
137
- UserCommitmentRecordSchema.index({ storedAtTimestamp: 1 });
138
184
  UserCommitmentRecordSchema.index({
139
185
  storedAtTimestamp: 1,
140
186
  lastUpdatedTimestamp: 1
141
187
  });
142
188
  UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
189
+ UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
190
+ UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
143
191
  const DatasetRecordSchema = new Schema({
144
192
  contentTree: { type: [[String]], required: true },
145
193
  datasetContentId: { type: String, required: true },
@@ -160,7 +208,8 @@ SolutionRecordSchema.index({ captchaId: 1 });
160
208
  const UserSolutionSchema = CaptchaSolutionSchema.extend({
161
209
  processed: boolean(),
162
210
  checked: boolean(),
163
- commitmentId: string()
211
+ commitmentId: string(),
212
+ createdAt: date()
164
213
  });
165
214
  const UserSolutionRecordSchema = new Schema(
166
215
  {
@@ -170,7 +219,8 @@ const UserSolutionRecordSchema = new Schema(
170
219
  solution: [{ type: String, required: true }],
171
220
  processed: { type: Boolean, required: true },
172
221
  checked: { type: Boolean, required: true },
173
- commitmentId: { type: String, required: true }
222
+ commitmentId: { type: String, required: true },
223
+ createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
174
224
  },
175
225
  { _id: false }
176
226
  );
@@ -187,7 +237,7 @@ const PendingRecordSchema = new Schema({
187
237
  deadlineTimestamp: { type: Number, required: true },
188
238
  // unix timestamp
189
239
  requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
190
- ipAddress: { type: BigInt, required: true },
240
+ ipAddress: CompositeIpAddressRecordSchemaObj,
191
241
  frictionlessTokenId: {
192
242
  type: mongoose.Schema.Types.ObjectId,
193
243
  required: false
@@ -234,39 +284,46 @@ const FrictionlessTokenRecordSchema = new Schema({
234
284
  timeout: { type: Number, required: false },
235
285
  accessPolicy: { type: Number, required: false }
236
286
  },
237
- createdAt: { type: Date, default: Date.now, expires: ONE_DAY },
238
- storedAtTimestamp: { type: Date, required: false },
239
- lastUpdatedTimestamp: { type: Date, required: false }
287
+ providerSelectEntropy: { type: Number, required: true },
288
+ ipAddress: CompositeIpAddressRecordSchemaObj,
289
+ createdAt: { type: Date, default: Date.now },
290
+ lastUpdatedTimestamp: { type: Date, required: false },
291
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
240
292
  });
241
- FrictionlessTokenRecordSchema.index({ token: 1 }, { unique: true });
242
- FrictionlessTokenRecordSchema.index({ storedAtTimestamp: 1 });
293
+ FrictionlessTokenRecordSchema.index({ createdAt: 1 });
294
+ FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
243
295
  const SessionRecordSchema = new Schema({
244
- sessionId: { type: String, required: true, unique: true },
245
- createdAt: { type: Date, required: true, expires: ONE_DAY },
296
+ sessionId: { type: String, required: true },
297
+ createdAt: { type: Date, required: true },
246
298
  tokenId: {
247
299
  type: mongoose.Schema.Types.ObjectId
248
300
  },
249
301
  captchaType: { type: String, enum: CaptchaType, required: true },
250
- storedAtTimestamp: { type: Date, required: false },
302
+ solvedImagesCount: { type: Number, required: false },
303
+ powDifficulty: { type: Number, required: false },
304
+ storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
251
305
  lastUpdatedTimestamp: { type: Date, required: false },
252
306
  deleted: { type: Boolean, required: false }
253
307
  });
254
- SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
255
- SessionRecordSchema.index({ storedAtTimestamp: 1 });
308
+ SessionRecordSchema.index({ createdAt: 1 });
256
309
  SessionRecordSchema.index({ deleted: 1 });
310
+ SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
257
311
  const DetectorRecordSchema = new Schema({
258
312
  createdAt: { type: Date, required: true },
259
313
  detectorKey: { type: String, required: true },
260
- expiresAt: { type: Date, required: false, expires: 0 }
314
+ expiresAt: { type: Date, required: false }
261
315
  });
262
316
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
263
317
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
264
318
  export {
265
319
  CaptchaRecordSchema,
266
320
  ClientRecordSchema,
321
+ CompositeIpAddressRecordSchemaObj,
322
+ CompositeIpAddressSchema,
267
323
  DatasetRecordSchema,
268
324
  DetectorRecordSchema,
269
325
  FrictionlessTokenRecordSchema,
326
+ IpAddressType,
270
327
  PendingRecordSchema,
271
328
  PoWCaptchaRecordSchema,
272
329
  ScheduledTaskRecordSchema,
@@ -277,5 +334,6 @@ export {
277
334
  UserCommitmentSchema,
278
335
  UserCommitmentWithSolutionsSchema,
279
336
  UserSolutionRecordSchema,
280
- UserSolutionSchema
337
+ UserSolutionSchema,
338
+ parseMongooseCompositeIpAddress
281
339
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/types-database",
3
- "version": "3.0.12",
3
+ "version": "3.3.5",
4
4
  "description": "Types for prosopo database",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -18,11 +18,10 @@
18
18
  },
19
19
  "scripts": {
20
20
  "clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
21
- "build": "NODE_ENV=${NODE_ENV:-production}; vite build --config vite.esm.config.ts --mode $NODE_ENV",
21
+ "build": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.esm.config.ts --mode $NODE_ENV",
22
22
  "build:tsc": "tsc --build --verbose",
23
- "build:cjs": "NODE_ENV=${NODE_ENV:-production}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
24
- "typecheck": "tsc --build --declaration --emitDeclarationOnly --force",
25
- "test": "echo no tests"
23
+ "build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
24
+ "typecheck": "tsc --project tsconfig.types.json"
26
25
  },
27
26
  "repository": {
28
27
  "type": "git",
@@ -35,21 +34,16 @@
35
34
  },
36
35
  "homepage": "https://github.com/prosopo/captcha#readme",
37
36
  "dependencies": {
38
- "@prosopo/common": "3.1.1",
39
- "@prosopo/types": "3.0.5",
40
- "@prosopo/user-access-policy": "3.3.2",
41
- "@typegoose/auto-increment": "4.13.0",
42
- "axios": "1.10.0",
43
- "esbuild": "0.25.6",
44
- "express": "4.21.2",
45
- "mongodb": "6.9.0",
46
- "mongoose": "8.6.2",
47
- "zod": "3.23.8",
48
- "@prosopo/config": "3.1.2",
49
- "openpgp": "5.11.3",
50
- "webpack-dev-server": "5.2.2"
37
+ "@prosopo/common": "3.1.20",
38
+ "@prosopo/locale": "3.1.20",
39
+ "@prosopo/types": "3.5.3",
40
+ "@prosopo/user-access-policy": "3.5.19",
41
+ "@prosopo/config": "3.1.20",
42
+ "mongoose": "8.13.0",
43
+ "zod": "3.23.8"
51
44
  },
52
45
  "devDependencies": {
46
+ "@types/node": "22.10.2",
53
47
  "@vitest/coverage-v8": "3.0.9",
54
48
  "concurrently": "9.0.1",
55
49
  "del-cli": "6.0.0",