@prosopo/database 4.0.40 → 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.
- package/.turbo/turbo-build$colon$cjs.log +4 -4
- package/.turbo/turbo-build$colon$tsc.log +16 -16
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +39 -0
- package/dist/cjs/databases/provider.cjs +55 -5
- package/dist/cjs/redisCache.cjs +56 -135
- package/dist/databases/provider.d.ts +5 -3
- package/dist/databases/provider.d.ts.map +1 -1
- package/dist/databases/provider.js +55 -5
- package/dist/databases/provider.js.map +1 -1
- package/dist/redisCache.d.ts +1 -12
- package/dist/redisCache.d.ts.map +1 -1
- package/dist/redisCache.js +56 -135
- package/dist/redisCache.js.map +1 -1
- package/dist/tests/integration/redisCacheSessionPatch.integration.test.d.ts +2 -0
- package/dist/tests/integration/redisCacheSessionPatch.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/redisCacheSessionPatch.integration.test.js +100 -0
- package/dist/tests/integration/redisCacheSessionPatch.integration.test.js.map +1 -0
- package/dist/tests/integration/serverCheckClaim.integration.test.d.ts +2 -0
- package/dist/tests/integration/serverCheckClaim.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/serverCheckClaim.integration.test.js +124 -0
- package/dist/tests/integration/serverCheckClaim.integration.test.js.map +1 -0
- package/dist/tests/unit/inputMethods.unit.test.d.ts +2 -0
- package/dist/tests/unit/inputMethods.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/inputMethods.unit.test.js +35 -0
- package/dist/tests/unit/inputMethods.unit.test.js.map +1 -0
- package/package.json +9 -9
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/database@4.0
|
|
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
|
|
54
|
-
dist/cjs/databases/provider.cjs
|
|
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
|
-
[32m✓ built in
|
|
56
|
+
[32m✓ built in 107ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/database@4.0
|
|
2
|
+
> @prosopo/database@4.1.0 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
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
|
-
9:
|
|
44
|
+
9:56:52 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
45
45
|
|
|
46
|
-
9:
|
|
46
|
+
9:56:52 AM - Building project '/home/runner/work/captcha/captcha/packages/database/tsconfig.json'...
|
|
47
47
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/database@4.0
|
|
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
|
|
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: .
|
|
@@ -23,7 +23,6 @@ ViteEsmConfig: .
|
|
|
23
23
|
]
|
|
24
24
|
}
|
|
25
25
|
{
|
|
26
|
-
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
27
26
|
externals: [
|
|
28
27
|
'@prosopo/common',
|
|
29
28
|
'@prosopo/locale',
|
|
@@ -38,6 +37,7 @@ ViteEsmConfig: .
|
|
|
38
37
|
'@prosopo/api'
|
|
39
38
|
]
|
|
40
39
|
}
|
|
40
|
+
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
41
41
|
[36mvite v8.1.5 [32mbuilding ssr environment for production...[36m[39m
|
|
42
42
|
Bundle build started
|
|
43
43
|
[2K
|
|
@@ -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
|
|
58
|
-
dist/databases/provider.js
|
|
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
|
-
[32m✓ built in
|
|
60
|
+
[32m✓ built in 102ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
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
|
+
|
|
31
|
+
## 4.0.41
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- Updated dependencies [fda0eba]
|
|
35
|
+
- Updated dependencies [1728cd0]
|
|
36
|
+
- Updated dependencies [20542d8]
|
|
37
|
+
- Updated dependencies [eebe6ee]
|
|
38
|
+
- @prosopo/types@5.10.2
|
|
39
|
+
- @prosopo/types-database@5.6.5
|
|
40
|
+
- @prosopo/user-access-policy@3.14.11
|
|
41
|
+
|
|
3
42
|
## 4.0.40
|
|
4
43
|
### Patch Changes
|
|
5
44
|
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
package/dist/cjs/redisCache.cjs
CHANGED
|
@@ -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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
|
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<
|
|
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<
|
|
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<
|
|
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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"}
|