@prosopo/database 4.0.41 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +4 -4
  2. package/.turbo/turbo-build$colon$tsc.log +16 -16
  3. package/.turbo/turbo-build.log +5 -5
  4. package/CHANGELOG.md +28 -0
  5. package/dist/cjs/databases/provider.cjs +55 -5
  6. package/dist/cjs/redisCache.cjs +56 -135
  7. package/dist/databases/provider.d.ts +5 -3
  8. package/dist/databases/provider.d.ts.map +1 -1
  9. package/dist/databases/provider.js +55 -5
  10. package/dist/databases/provider.js.map +1 -1
  11. package/dist/redisCache.d.ts +1 -12
  12. package/dist/redisCache.d.ts.map +1 -1
  13. package/dist/redisCache.js +56 -135
  14. package/dist/redisCache.js.map +1 -1
  15. package/dist/tests/integration/redisCacheSessionPatch.integration.test.d.ts +2 -0
  16. package/dist/tests/integration/redisCacheSessionPatch.integration.test.d.ts.map +1 -0
  17. package/dist/tests/integration/redisCacheSessionPatch.integration.test.js +100 -0
  18. package/dist/tests/integration/redisCacheSessionPatch.integration.test.js.map +1 -0
  19. package/dist/tests/integration/serverCheckClaim.integration.test.d.ts +2 -0
  20. package/dist/tests/integration/serverCheckClaim.integration.test.d.ts.map +1 -0
  21. package/dist/tests/integration/serverCheckClaim.integration.test.js +124 -0
  22. package/dist/tests/integration/serverCheckClaim.integration.test.js.map +1 -0
  23. package/dist/tests/unit/inputMethods.unit.test.d.ts +2 -0
  24. package/dist/tests/unit/inputMethods.unit.test.d.ts.map +1 -0
  25. package/dist/tests/unit/inputMethods.unit.test.js +35 -0
  26. package/dist/tests/unit/inputMethods.unit.test.js.map +1 -0
  27. package/package.json +9 -9
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/database@4.0.41 build:cjs
2
+ > @prosopo/database@4.1.0 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -50,7 +50,7 @@ dist/cjs/mongooseOptions.cjs 3.74 kB │ gzip: 1.56 kB
50
50
  dist/cjs/base/mongo.cjs 4.27 kB │ gzip: 1.41 kB
51
51
  dist/cjs/databases/centralDbStreamer.cjs 5.53 kB │ gzip: 1.37 kB
52
52
  dist/cjs/databases/captcha.cjs 7.38 kB │ gzip: 2.18 kB
53
- dist/cjs/redisCache.cjs 16.50 kB │ gzip: 4.86 kB
54
- dist/cjs/databases/provider.cjs 59.35 kB │ gzip: 11.88 kB
53
+ dist/cjs/redisCache.cjs 14.31 kB │ gzip: 4.46 kB
54
+ dist/cjs/databases/provider.cjs 60.73 kB │ gzip: 12.02 kB
55
55
 
56
- ✓ built in 85ms
56
+ ✓ built in 107ms
@@ -1,8 +1,8 @@
1
1
 
2
- > @prosopo/database@4.0.41 build:tsc
2
+ > @prosopo/database@4.1.0 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 3:37:25 PM - Projects in this build:
5
+ 9:56:52 AM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../util/tsconfig.json
8
8
  * ../locale/tsconfig.json
@@ -17,31 +17,31 @@
17
17
  * ../types-database/tsconfig.json
18
18
  * tsconfig.json
19
19
 
20
- 3:37:25 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
20
+ 9:56:52 AM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/vite.frontend.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
21
21
 
22
- 3:37:25 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
22
+ 9:56:52 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/verifyRecency.ts' is older than output '../util/tsconfig.tsbuildinfo'
23
23
 
24
- 3:37:25 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
24
+ 9:56:52 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/util.ts' is older than output '../locale/tsconfig.tsbuildinfo'
25
25
 
26
- 3:37:25 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
26
+ 9:56:52 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/tests/loggerBrowser.unit.test.ts' is older than output '../logger/tsconfig.tsbuildinfo'
27
27
 
28
- 3:37:25 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
28
+ 9:56:52 AM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
29
29
 
30
- 3:37:25 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
30
+ 9:56:52 AM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
31
31
 
32
- 3:37:25 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
32
+ 9:56:52 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
33
33
 
34
- 3:37:25 PM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/apiRoutes.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
34
+ 9:56:52 AM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/apiRoutes.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
35
35
 
36
- 3:37:25 PM - Project '../redis-client/tsconfig.json' is up to date because newest input '../redis-client/src/tests/testRedisConnection.ts' is older than output '../redis-client/tsconfig.tsbuildinfo'
36
+ 9:56:52 AM - Project '../redis-client/tsconfig.json' is up to date because newest input '../redis-client/src/index.ts' is older than output '../redis-client/tsconfig.tsbuildinfo'
37
37
 
38
- 3:37:25 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
38
+ 9:56:52 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/tests/apiHarness.ts' is older than output '../api/tsconfig.tsbuildinfo'
39
39
 
40
- 3:37:25 PM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/transformRule.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
40
+ 9:56:52 AM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/transformRule.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
41
41
 
42
- 3:37:25 PM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/types.test-d.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
42
+ 9:56:52 AM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/index.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
43
43
 
44
- 3:37:25 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
44
+ 9:56:52 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
45
45
 
46
- 3:37:25 PM - Building project '/home/runner/work/captcha/captcha/packages/database/tsconfig.json'...
46
+ 9:56:52 AM - Building project '/home/runner/work/captcha/captcha/packages/database/tsconfig.json'...
47
47
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/database@4.0.41 build
2
+ > @prosopo/database@4.1.0 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/database@4.0.41 build:cross-env
6
+ > @prosopo/database@4.1.0 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -54,7 +54,7 @@ dist/mongooseOptions.js 3.58 kB │ gzip: 1.53 kB
54
54
  dist/base/mongo.js 4.01 kB │ gzip: 1.32 kB
55
55
  dist/databases/centralDbStreamer.js 5.47 kB │ gzip: 1.35 kB
56
56
  dist/databases/captcha.js 7.30 kB │ gzip: 2.17 kB
57
- dist/redisCache.js 16.44 kB │ gzip: 4.85 kB
58
- dist/databases/provider.js 58.05 kB │ gzip: 11.91 kB
57
+ dist/redisCache.js 14.26 kB │ gzip: 4.44 kB
58
+ dist/databases/provider.js 59.41 kB │ gzip: 12.04 kB
59
59
 
60
- ✓ built in 95ms
60
+ ✓ built in 102ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @prosopo/database
2
2
 
3
+ ## 4.1.0
4
+ ### Minor Changes
5
+
6
+ - 7065689: Removed the Redis session write queue. Nothing ever put a session on it, yet every provider polled Redis for it every 10 seconds, and its drain step could duplicate, drop or delete records if it had ever been used. `RedisWriteQueue` loses `queueSessionRecord`, `drainSessionRecords`, `startPeriodicFlush` and `stopPeriodicFlush`, and `Tasks.flushWriteQueue` is gone. The session read cache is unchanged.
7
+
8
+ ### Patch Changes
9
+
10
+ - f650c66: A Web Bot Auth (authenticated) token can now only be verified once, even when several verify requests for it arrive at the same time. Before, the provider checked whether the session was already used and then marked it used in a separate step, so parallel verifies could all return `verified: true`. Marking the session used is now a single conditional database write, and only the request that wins it is verified; the rest get `API.USER_ALREADY_VERIFIED`.
11
+ - b77c5f4: The image captcha widget now tells the provider whether each tile, and the checkbox, was picked with a mouse or finger or with the keyboard. Keyboard presses have no screen position, so they all arrive as (0, 0). The provider used to see those repeats as a script clicking the same pixel and reject people who solve with the keyboard. It now looks for repeated positions among pointer selections only. It rejects a keyboard selection that claims a position. Requests from older widgets, which send no input method, are checked as strictly as before. The input method is stored on the commitment next to the coordinates.
12
+ - dffecf0: Patching a cached session in Redis no longer brings back a session that was invalidated between the read and the write, and no longer drops a field written by a concurrent patch. The write now only lands if the cached value is unchanged since it was read (checked inside Redis); on a conflict the patch is recomputed, and if the session has gone the patch does nothing.
13
+ - fa316d6: A captcha token now verifies at most once even when a site's server sends several verify requests for it at the same moment. Before, each request read the record, saw it had not been checked yet, and then marked it checked, so every request that arrived before the first write finished was accepted. Marking a PoW, puzzle or image result as checked is now a single conditional write, and only the request that wins it is verified. The same applies to image captcha submissions: a request hash can now only be spent by one submission, so answers can no longer be tried in parallel against one challenge.
14
+ - Updated dependencies [f650c66]
15
+ - Updated dependencies [59b7e87]
16
+ - Updated dependencies [b5e55a6]
17
+ - Updated dependencies [0c8678e]
18
+ - Updated dependencies [b77c5f4]
19
+ - Updated dependencies [4109641]
20
+ - Updated dependencies [dab0338]
21
+ - Updated dependencies [0d29dde]
22
+ - Updated dependencies [fa316d6]
23
+ - @prosopo/types-database@5.7.0
24
+ - @prosopo/types@5.11.0
25
+ - @prosopo/common@3.1.60
26
+ - @prosopo/redis-client@1.0.38
27
+ - @prosopo/util@3.3.12
28
+ - @prosopo/user-access-policy@3.14.12
29
+ - @prosopo/logger@2.1.1
30
+
3
31
  ## 4.0.41
4
32
  ### Patch Changes
5
33
 
@@ -852,6 +852,27 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
852
852
  $unset: { pendingStage: 1 }
853
853
  }).then(() => {}));
854
854
  }
855
+ async markPuzzleCaptchaRecordChecked(challenge) {
856
+ const tables = this.getTables();
857
+ const timestamp = /* @__PURE__ */ new Date();
858
+ if ((await tables.puzzlecaptcha.updateOne({
859
+ challenge,
860
+ serverChecked: { $ne: true }
861
+ }, { $set: {
862
+ serverChecked: true,
863
+ lastUpdatedTimestamp: timestamp,
864
+ verifiedAtTimestamp: timestamp,
865
+ pendingStage: true
866
+ } })).modifiedCount === 0) return false;
867
+ this.centralStreamer?.streamPuzzleUpdate(() => this.getPuzzleCaptchaRecordByChallenge(challenge), (ts) => this.tables.puzzlecaptcha.updateOne({
868
+ challenge,
869
+ lastUpdatedTimestamp: { $lte: ts }
870
+ }, {
871
+ $set: { storedAtTimestamp: ts },
872
+ $unset: { pendingStage: 1 }
873
+ }).then(() => {}));
874
+ return true;
875
+ }
855
876
  /** @description Get serverChecked Dapp User image captcha commitments from the commitments table
856
877
  */
857
878
  async getCheckedDappUserCommitments() {
@@ -911,12 +932,15 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
911
932
  */
912
933
  async markDappUserCommitmentsChecked(commitmentIds) {
913
934
  const timestamp = /* @__PURE__ */ new Date();
914
- await this.tables?.commitment.updateMany({ id: { $in: commitmentIds } }, [{ $set: {
935
+ return (await this.getTables().commitment.updateMany({
936
+ id: { $in: commitmentIds },
937
+ serverChecked: { $ne: true }
938
+ }, [{ $set: {
915
939
  serverChecked: true,
916
940
  lastUpdatedTimestamp: timestamp,
917
941
  pendingStage: true,
918
942
  verifiedAtTimestamp: { $ifNull: ["$verifiedAtTimestamp", timestamp] }
919
- } }], { updatePipeline: true });
943
+ } }], { updatePipeline: true })).modifiedCount;
920
944
  }
921
945
  /** @description Update an image captcha commitment
922
946
  */
@@ -995,7 +1019,10 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
995
1019
  */
996
1020
  async markDappUserPoWCommitmentsChecked(challenges) {
997
1021
  const timestamp = /* @__PURE__ */ new Date();
998
- await this.tables?.powcaptcha.updateMany({ challenge: { $in: challenges } }, [{ $set: {
1022
+ return (await this.getTables().powcaptcha.updateMany({
1023
+ challenge: { $in: challenges },
1024
+ serverChecked: { $ne: true }
1025
+ }, [{ $set: {
999
1026
  serverChecked: true,
1000
1027
  lastUpdatedTimestamp: timestamp,
1001
1028
  pendingStage: true,
@@ -1003,7 +1030,7 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
1003
1030
  } }], {
1004
1031
  upsert: false,
1005
1032
  updatePipeline: true
1006
- });
1033
+ })).modifiedCount;
1007
1034
  }
1008
1035
  /**
1009
1036
  * Store a new session record
@@ -1123,6 +1150,26 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
1123
1150
  });
1124
1151
  }
1125
1152
  }
1153
+ async claimSessionServerCheck(sessionId) {
1154
+ try {
1155
+ return (await this.tables.session.updateOne({
1156
+ sessionId,
1157
+ serverChecked: { $ne: true }
1158
+ }, { $set: {
1159
+ serverChecked: true,
1160
+ lastUpdatedTimestamp: /* @__PURE__ */ new Date(),
1161
+ pendingStage: true
1162
+ } })).modifiedCount > 0;
1163
+ } catch (err) {
1164
+ throw new _prosopo_common.ProsopoDBError("DATABASE.SESSION_GET_FAILED", {
1165
+ context: {
1166
+ error: err,
1167
+ sessionId
1168
+ },
1169
+ logger: this.logger
1170
+ });
1171
+ }
1172
+ }
1126
1173
  /**
1127
1174
  * Update a session record by sessionId. Pure Mongo write — callers in
1128
1175
  * the provider package are responsible for refreshing the Redis cache
@@ -1340,7 +1387,10 @@ var ProviderDatabase = class ProviderDatabase extends require_mongo.MongoDatabas
1340
1387
  failedFuncName: this.updatePendingImageCommitmentStatus.name,
1341
1388
  requestHash
1342
1389
  } });
1343
- await this.tables?.commitment.updateOne({ requestHash }, { $set: { pending: false } });
1390
+ return (await this.getTables().commitment.updateOne({
1391
+ requestHash,
1392
+ pending: true
1393
+ }, { $set: { pending: false } })).modifiedCount > 0;
1344
1394
  }
1345
1395
  /**
1346
1396
  * @description Get all unsolved captchas
@@ -5,12 +5,14 @@ var BIGINT_TAG = "__bigint__:";
5
5
  var bigIntReplacer = (_key, value) => "bigint" === typeof value ? `${BIGINT_TAG}${value.toString()}` : value;
6
6
  /** JSON reviver that restores tagged BigInt values produced by bigIntReplacer. */
7
7
  var bigIntReviver = (_key, value) => "string" === typeof value && value.startsWith(BIGINT_TAG) ? BigInt(value.slice(BIGINT_TAG.length)) : value;
8
- var SESSION_KEY_PATTERNS = [
9
- "cache:session:*",
10
- "cache:detector:*",
11
- "writeq:session:*",
12
- "writeq:session:pending"
13
- ];
8
+ var SESSION_PATCH_MAX_ATTEMPTS = 5;
9
+ /** SET KEYS[1] to ARGV[2] with EX ARGV[3] only if it still holds ARGV[1]. */
10
+ var COMPARE_AND_SET_SCRIPT = `
11
+ if redis.call("GET", KEYS[1]) ~= ARGV[1] then return 0 end
12
+ redis.call("SET", KEYS[1], ARGV[2], "EX", ARGV[3])
13
+ return 1
14
+ `;
15
+ var SESSION_KEY_PATTERNS = ["cache:session:*", "cache:detector:*"];
14
16
  /**
15
17
  * TTL (seconds) for the ephemeral detector-session → bundle mapping. It bridges
16
18
  * bundle assignment → the first provider call (load + run detector + submit);
@@ -28,20 +30,17 @@ var SESSION_KEY_PATTERNS = [
28
30
  */
29
31
  var DETECTOR_BUNDLE_TTL_SECONDS = _prosopo_types.DEFAULT_MAX_TIMESTAMP_AGE / 1e3;
30
32
  /**
31
- * Redis-backed write queue and read cache for reducing MongoDB load.
33
+ * Redis-backed session read cache for reducing MongoDB load.
32
34
  *
33
35
  * Provides:
34
36
  * - Session record caching (reduces MongoDB reads)
35
37
  * - Session-by-hash caching for frictionless deduplication
36
- * - Session write queuing with periodic flush to MongoDB
37
38
  *
38
39
  * Uses an existing RedisConnection from @prosopo/redis-client rather than
39
40
  * creating its own connection.
40
41
  */
41
42
  var RedisWriteQueue = class {
42
43
  constructor(connection, logger) {
43
- this.flushTimer = null;
44
- this.flushCallback = null;
45
44
  this.connection = connection;
46
45
  this.logger = logger;
47
46
  }
@@ -100,31 +99,64 @@ var RedisWriteQueue = class {
100
99
  * Redis consistent with the DB after every in-request write.
101
100
  */
102
101
  async patchCachedSession(sessionId, updates, ttlSeconds = 86400) {
103
- const existing = await this.getCachedSession(sessionId);
104
- if (!existing) return false;
105
- return this.cacheSession(sessionId, {
102
+ return this.compareAndSetCachedSession(sessionId, ttlSeconds, (existing) => ({
106
103
  ...existing,
107
104
  ...updates,
108
105
  lastUpdatedTimestamp: /* @__PURE__ */ new Date()
109
- }, ttlSeconds);
106
+ }));
110
107
  }
111
108
  /**
112
109
  * First-hop-wins SIMD attach on the cache — mirrors the atomic Mongo
113
110
  * `$ifNull` pipeline update in `db.recordSessionSimdReadingsIfAbsent`.
114
- * Reads the cache; if it doesn't already carry `simdReadings`, merges
115
- * the new readings + stage. No-op on cache miss or when readings are
116
- * already present.
111
+ * No-op on cache miss or when readings are already present.
117
112
  */
118
113
  async patchCachedSimdReadingsIfAbsent(sessionId, readings, stage, ttlSeconds = 86400) {
119
- const existing = await this.getCachedSession(sessionId);
120
- if (!existing) return false;
121
- if (existing.simdReadings) return false;
122
- return this.cacheSession(sessionId, {
114
+ return this.compareAndSetCachedSession(sessionId, ttlSeconds, (existing) => existing.simdReadings ? null : {
123
115
  ...existing,
124
116
  simdReadings: readings,
125
117
  simdReadingsStage: stage,
126
118
  lastUpdatedTimestamp: /* @__PURE__ */ new Date()
127
- }, ttlSeconds);
119
+ });
120
+ }
121
+ /**
122
+ * Read-modify-write of a cached session that only lands if the entry is
123
+ * unchanged since it was read. A plain GET then SET would recreate a
124
+ * session invalidated in between (with a fresh TTL) and drop fields written
125
+ * by a concurrent patch. On a conflict the patch is recomputed from the
126
+ * new value; a vanished entry ends the patch.
127
+ */
128
+ async compareAndSetCachedSession(sessionId, ttlSeconds, patch) {
129
+ const client = await this.getClient();
130
+ if (!client) return false;
131
+ const key = `cache:session:${sessionId}`;
132
+ try {
133
+ for (let attempt = 0; attempt < SESSION_PATCH_MAX_ATTEMPTS; attempt++) {
134
+ const current = await client.get(key);
135
+ if (!current) return false;
136
+ const next = patch(JSON.parse(current, bigIntReviver));
137
+ if (!next) return false;
138
+ if (await client.eval(COMPARE_AND_SET_SCRIPT, {
139
+ keys: [key],
140
+ arguments: [
141
+ current,
142
+ JSON.stringify(next, bigIntReplacer),
143
+ String(ttlSeconds)
144
+ ]
145
+ }) === 1) return true;
146
+ }
147
+ this.logger.warn(() => ({
148
+ msg: "Gave up patching cached session after repeated conflicts",
149
+ sessionId
150
+ }));
151
+ return false;
152
+ } catch (error) {
153
+ this.logger.warn(() => ({
154
+ msg: "Failed to patch cached session in Redis",
155
+ err: error,
156
+ sessionId
157
+ }));
158
+ return false;
159
+ }
128
160
  }
129
161
  /**
130
162
  * Invalidate a cached session when it's updated.
@@ -322,120 +354,9 @@ var RedisWriteQueue = class {
322
354
  }
323
355
  }
324
356
  /**
325
- * Queue a session record for batched insertion into MongoDB.
326
- * The session data is also cached in Redis for immediate reads.
327
- */
328
- async queueSessionRecord(sessionId, record, ttlSeconds = 86400) {
329
- const client = await this.getClient();
330
- if (!client) return false;
331
- try {
332
- const key = `writeq:session:${sessionId}`;
333
- const serialized = JSON.stringify(record, bigIntReplacer);
334
- await client.set(key, serialized, { EX: ttlSeconds });
335
- await client.sAdd("writeq:session:pending", sessionId);
336
- await client.set(`cache:session:${sessionId}`, serialized, { EX: ttlSeconds });
337
- this.triggerEarlyFlushIfNeeded();
338
- return true;
339
- } catch (error) {
340
- this.logger.warn(() => ({
341
- msg: "Failed to queue session record in Redis",
342
- err: error,
343
- sessionId
344
- }));
345
- return false;
346
- }
347
- }
348
- /**
349
- * Get all pending session records ready for batch flush.
350
- */
351
- async drainSessionRecords(limit = 500) {
352
- const client = await this.getClient();
353
- if (!client) return [];
354
- try {
355
- const batch = (await client.sMembers("writeq:session:pending")).slice(0, limit);
356
- const results = [];
357
- for (const sessionId of batch) {
358
- const key = `writeq:session:${sessionId}`;
359
- const data = await client.get(key);
360
- if (data) results.push({
361
- sessionId,
362
- record: JSON.parse(data, bigIntReviver)
363
- });
364
- await client.sRem("writeq:session:pending", sessionId);
365
- await client.del(key);
366
- }
367
- return results;
368
- } catch (error) {
369
- this.logger.warn(() => ({
370
- msg: "Failed to drain session records from Redis",
371
- err: error
372
- }));
373
- return [];
374
- }
375
- }
376
- /**
377
- * Start periodic background flush of queued records.
378
- * The callback receives this queue instance and should drain + bulk-write records.
379
- *
380
- * When the queue depth exceeds `earlyFlushThreshold`, an early flush is
381
- * triggered on the next `queueSessionRecord` call without waiting for
382
- * the regular interval.
383
- */
384
- startPeriodicFlush(callback, intervalMs = 1e4, earlyFlushThreshold = 50) {
385
- this.stopPeriodicFlush();
386
- this.flushCallback = callback;
387
- this.earlyFlushThreshold = earlyFlushThreshold;
388
- this.flushTimer = setInterval(() => {
389
- this.flushCallback?.(this).catch((error) => {
390
- this.logger.error(() => ({
391
- msg: "Periodic flush failed",
392
- err: error
393
- }));
394
- });
395
- }, intervalMs);
396
- }
397
- /**
398
- * Trigger an early flush if the pending queue exceeds the threshold.
399
- * Called automatically after queueing a record. This avoids large
400
- * batch build-ups between regular interval flushes.
401
- */
402
- triggerEarlyFlushIfNeeded() {
403
- if (!this.flushCallback || !this.earlyFlushThreshold) return;
404
- this.getPendingCount().then((count) => {
405
- if (count >= (this.earlyFlushThreshold ?? 50)) return this.flushCallback?.(this);
406
- }).catch((error) => {
407
- this.logger.error(() => ({
408
- msg: "Early flush failed",
409
- err: error
410
- }));
411
- });
412
- }
413
- /** Get the number of pending session records awaiting flush. */
414
- async getPendingCount() {
415
- const client = await this.getClient();
416
- if (!client) return 0;
417
- try {
418
- return await client.sCard("writeq:session:pending");
419
- } catch {
420
- return 0;
421
- }
422
- }
423
- /**
424
- * Stop the periodic flush timer.
425
- */
426
- stopPeriodicFlush() {
427
- if (this.flushTimer) {
428
- clearInterval(this.flushTimer);
429
- this.flushTimer = null;
430
- }
431
- this.flushCallback = null;
432
- this.earlyFlushThreshold = void 0;
433
- }
434
- /**
435
357
  * Drop every session-related key from Redis. Intended for provider
436
- * startup so a fresh process can never inherit stale read-cache,
437
- * dedup-by-hash, or pending-write-queue entries written by an
438
- * earlier (possibly crashed) run.
358
+ * startup so a fresh process can never inherit stale read-cache or
359
+ * dedup-by-hash entries written by an earlier (possibly crashed) run.
439
360
  *
440
361
  * Uses SCAN — KEYS would block the Redis server on large keyspaces.
441
362
  *
@@ -73,20 +73,22 @@ export declare class ProviderDatabase extends MongoDatabase implements IProvider
73
73
  getPuzzleCaptchaRecordByChallenge(challenge: string): Promise<PuzzleCaptchaRecord | null>;
74
74
  updatePuzzleCaptchaRecordResult(challenge: PoWChallengeId, result: CaptchaResult, serverChecked?: boolean, userSubmitted?: boolean, userSignature?: string, coords?: [number, number][][], lastUpdatedTimestamp?: Date): Promise<void>;
75
75
  updatePuzzleCaptchaRecord(challenge: PoWChallengeId, updates: Partial<PuzzleCaptchaRecord>): Promise<void>;
76
+ markPuzzleCaptchaRecordChecked(challenge: PoWChallengeId): Promise<boolean>;
76
77
  getCheckedDappUserCommitments(): Promise<UserCommitmentRecord[]>;
77
78
  getUnstoredDappUserCommitments(limit?: number, afterId?: unknown): Promise<UserCommitmentRecord[]>;
78
79
  markDappUserCommitmentsStored(commitmentIds: Hash[], asOfTimestamp?: Date): Promise<void>;
79
- markDappUserCommitmentsChecked(commitmentIds: Hash[]): Promise<void>;
80
+ markDappUserCommitmentsChecked(commitmentIds: Hash[]): Promise<number>;
80
81
  updateDappUserCommitment(commitmentId: UserCommitment["id"], updates: Partial<UserCommitment>): Promise<void>;
81
82
  countCommitmentsByNormalisedEmail(dappAccount: string, emailNormalised: string): Promise<number>;
82
83
  getUnstoredDappUserPoWCommitments(limit?: number, afterId?: unknown): Promise<PoWCaptchaRecord[]>;
83
84
  markDappUserPoWCommitmentsStored(challenges: string[], asOfTimestamp?: Date): Promise<void>;
84
- markDappUserPoWCommitmentsChecked(challenges: string[]): Promise<void>;
85
+ markDappUserPoWCommitmentsChecked(challenges: string[]): Promise<number>;
85
86
  storeSessionRecord(sessionRecord: Session): Promise<void>;
86
87
  storeBlockedSession(record: Session): Promise<void>;
87
88
  getSessionRecordBySessionId(sessionId: string): Promise<ProjectedSession | undefined>;
88
89
  getSessionRecordByToken(token: string): Promise<Session | undefined>;
89
90
  checkAndRemoveSession(sessionId: string): Promise<SessionRecord | undefined>;
91
+ claimSessionServerCheck(sessionId: string): Promise<boolean>;
90
92
  updateSessionRecord(sessionId: string, updates: Partial<Session>, streamToCentral?: boolean): Promise<void>;
91
93
  recordSessionSimdReadingsIfAbsent(sessionId: string, readings: NonNullable<Session["simdReadings"]>, stage: SimdReadingsStage): Promise<void>;
92
94
  mergeSessionDnsEvent(sessionId: string, fields: {
@@ -99,7 +101,7 @@ export declare class ProviderDatabase extends MongoDatabase implements IProvider
99
101
  markSessionRecordsStored(sessionIds: string[], asOfTimestamp?: Date): Promise<void>;
100
102
  storePendingImageCommitment(userAccount: string, requestHash: string, salt: string, deadlineTimestamp: Date, requestedAtTimestamp: Date, ipAddress: CompositeIpAddress, threshold: number, sessionId?: string, ipInfo?: IPInfoResponse): Promise<void>;
101
103
  getPendingImageCommitment(requestHash: string): Promise<PendingImageCaptchaRequest>;
102
- updatePendingImageCommitmentStatus(requestHash: string): Promise<void>;
104
+ updatePendingImageCommitmentStatus(requestHash: string): Promise<boolean>;
103
105
  getAllCaptchasByDatasetId(datasetId: string, state?: CaptchaStates): Promise<Captcha[] | undefined>;
104
106
  getAllDappUserSolutions(captchaId: string[]): Promise<UserSolutionRecord[] | undefined>;
105
107
  getDatasetIdWithSolvedCaptchasOfSizeN(solvedCaptchaCount: number): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/databases/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/databases/provider.ts"],"names":[],"mappings":"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"}