@prosopo/procaptcha-frictionless 2.13.1 → 2.13.2
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 +3 -3
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +23 -0
- package/dist/cjs/customDetectBot.cjs +11 -11
- package/dist/customDetectBot.d.ts.map +1 -1
- package/dist/customDetectBot.js +11 -11
- package/dist/customDetectBot.js.map +1 -1
- package/dist/tests/customDetectBotAssignTimeout.test.d.ts +2 -0
- package/dist/tests/customDetectBotAssignTimeout.test.d.ts.map +1 -0
- package/dist/tests/customDetectBotAssignTimeout.test.js +118 -0
- package/dist/tests/customDetectBotAssignTimeout.test.js.map +1 -0
- package/package.json +10 -10
- package/src/customDetectBot.ts +22 -24
- package/src/tests/customDetectBotAssignTimeout.test.ts +180 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-frictionless@2.13.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.13.2 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -60,7 +60,7 @@ dist/cjs/index.cjs 0.54 kB │ gzip: 0.21 kB
|
|
|
60
60
|
dist/cjs/detectorLoader.cjs 0.62 kB │ gzip: 0.40 kB
|
|
61
61
|
dist/cjs/sessionInvalidatedRecovery.cjs 2.07 kB │ gzip: 0.99 kB
|
|
62
62
|
dist/cjs/detectorPrefetch.cjs 2.98 kB │ gzip: 1.35 kB
|
|
63
|
-
dist/cjs/customDetectBot.cjs 5.
|
|
63
|
+
dist/cjs/customDetectBot.cjs 5.43 kB │ gzip: 1.64 kB
|
|
64
64
|
dist/cjs/ProcaptchaFrictionless.cjs 7.00 kB │ gzip: 2.02 kB
|
|
65
65
|
|
|
66
|
-
[32m✓ built in
|
|
66
|
+
[32m✓ built in 53ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-frictionless@2.13.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.13.2 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
1:57:48 PM - Projects in this build:
|
|
6
6
|
* ../../dev/config/tsconfig.json
|
|
7
7
|
* ../locale/tsconfig.json
|
|
8
8
|
* ../util/tsconfig.json
|
|
@@ -25,47 +25,47 @@
|
|
|
25
25
|
* ../procaptcha-react/tsconfig.json
|
|
26
26
|
* tsconfig.json
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
1:57:48 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'
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
1:57:48 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
1:57:48 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
1:57:48 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'
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
1:57:48 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'
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
1:57:48 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
1:57:48 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/logger.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
1:57:48 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
1:57:48 PM - Project '../fingerprintjs/tsconfig.json' is up to date because newest input '../fingerprintjs/src/utils/browser.ts' is older than output '../fingerprintjs/tsconfig.tsbuildinfo'
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
1:57:48 PM - Project '../fingerprint/tsconfig.json' is up to date because newest input '../fingerprint/src/index.ts' is older than output '../fingerprint/tsconfig.tsbuildinfo'
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
1:57:48 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/index.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
1:57:48 PM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/theme.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
1:57:48 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
1:57:48 PM - Project '../account/tsconfig.json' is up to date because newest input '../account/src/tests/cryptoWorker.unit.test.ts' is older than output '../account/tsconfig.tsbuildinfo'
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
1:57:48 PM - Project '../procaptcha-common/tsconfig.json' is up to date because newest input '../procaptcha-common/src/tests/defaultEvents.test.ts' is older than output '../procaptcha-common/tsconfig.tsbuildinfo'
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
1:57:48 PM - Project '../procaptcha-pow/tsconfig.json' is up to date because newest input '../procaptcha-pow/src/tests/managerHarness.ts' is older than output '../procaptcha-pow/tsconfig.tsbuildinfo'
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
1:57:48 PM - Project '../procaptcha-puzzle/tsconfig.json' is up to date because newest input '../procaptcha-puzzle/src/index.ts' is older than output '../procaptcha-puzzle/tsconfig.tsbuildinfo'
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
1:57:48 PM - Project '../datasets/tsconfig.json' is up to date because newest input '../datasets/src/tests/mocks/data/captchas.ts' is older than output '../datasets/tsconfig.tsbuildinfo'
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
1:57:48 PM - Project '../procaptcha/tsconfig.json' is up to date because newest input '../procaptcha/src/modules/Manager.ts' is older than output '../procaptcha/tsconfig.tsbuildinfo'
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
1:57:48 PM - Project '../procaptcha-react/tsconfig.json' is up to date because newest input '../procaptcha-react/src/tests/captchaComponent.unit.test.tsx' is older than output '../procaptcha-react/tsconfig.tsbuildinfo'
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
1:57:48 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
1:57:48 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-frictionless/tsconfig.json'...
|
|
71
71
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-frictionless@2.13.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.13.2 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/procaptcha-frictionless@2.13.
|
|
6
|
+
> @prosopo/procaptcha-frictionless@2.13.2 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -65,7 +65,7 @@ dist/index.js 0.32 kB │ gzip: 0.15 kB
|
|
|
65
65
|
dist/detectorLoader.js 0.60 kB │ gzip: 0.39 kB
|
|
66
66
|
dist/sessionInvalidatedRecovery.js 2.01 kB │ gzip: 0.98 kB
|
|
67
67
|
dist/detectorPrefetch.js 2.86 kB │ gzip: 1.32 kB
|
|
68
|
-
dist/customDetectBot.js 5.
|
|
68
|
+
dist/customDetectBot.js 5.26 kB │ gzip: 1.61 kB
|
|
69
69
|
dist/ProcaptchaFrictionless.js 6.49 kB │ gzip: 1.97 kB
|
|
70
70
|
|
|
71
|
-
[32m✓ built in
|
|
71
|
+
[32m✓ built in 50ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @prosopo/procaptcha-frictionless
|
|
2
2
|
|
|
3
|
+
## 2.13.2
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 5d60541: Stop dropping detector bundles that arrive slowly, which made the frictionless POST go out with an empty token and no `detectorSessionId` — the provider then scored the session at 0 and served a challenge.
|
|
7
|
+
|
|
8
|
+
`ASSIGN_TIMEOUT_MS` was 2000 ms and covered two legs. The assign POST serves the detector inline (~215 KB gzipped) over a connection that is always cold, because `/healthz` pins a different hostname than the assign target: fresh DNS, TLS and a CORS preflight all had to fit in the budget alongside the download, measured at 6.7s against staging. The cap is now 10 s and applies only to that request; the blob-URL import that parses and evaluates the bundle is untimed, since a timer cannot rescue a stalled main thread and only discards a bundle already in hand.
|
|
9
|
+
|
|
10
|
+
`render()` and the invisible-button path now start the detector prefetch too. Only implicit render did, so pages using the explicit API — including any page that loads the bundle via dynamic import, where implicit render never runs — assigned a detector inline on the widget's critical path with no prefetch to fall back on.
|
|
11
|
+
- 2aabe73: Remove the client-controlled `detectorUnavailable` frictionless bypass. A client could set the flag and be handed a PoW challenge without any detection running. The flag is gone from the wire format, the API client and the widget; the only remaining bypasses are provider-side (maintenance mode, empty detector bundle pool).
|
|
12
|
+
|
|
13
|
+
The frictionless decision machine now gates on payload presence after the access-rule ladder: no token serves a 3-round image captcha, a token without its head hash serves a 2-round one.
|
|
14
|
+
- Updated dependencies [9fec7bd]
|
|
15
|
+
- Updated dependencies [2aabe73]
|
|
16
|
+
- Updated dependencies [bcef918]
|
|
17
|
+
- @prosopo/common@3.1.49
|
|
18
|
+
- @prosopo/types@5.0.1
|
|
19
|
+
- @prosopo/api@4.0.1
|
|
20
|
+
- @prosopo/locale@3.2.9
|
|
21
|
+
- @prosopo/procaptcha-common@2.11.21
|
|
22
|
+
- @prosopo/procaptcha-pow@2.10.28
|
|
23
|
+
- @prosopo/procaptcha-puzzle@2.10.44
|
|
24
|
+
- @prosopo/procaptcha-react@2.9.101
|
|
25
|
+
|
|
3
26
|
## 2.13.1
|
|
4
27
|
### Patch Changes
|
|
5
28
|
|
|
@@ -4,7 +4,7 @@ let _prosopo_procaptcha_common = require("@prosopo/procaptcha-common");
|
|
|
4
4
|
let _prosopo_api = require("@prosopo/api");
|
|
5
5
|
let _prosopo_common = require("@prosopo/common");
|
|
6
6
|
//#region src/customDetectBot.ts
|
|
7
|
-
var ASSIGN_TIMEOUT_MS =
|
|
7
|
+
var ASSIGN_TIMEOUT_MS = 1e4;
|
|
8
8
|
var sanitiseHref = (href) => {
|
|
9
9
|
try {
|
|
10
10
|
const u = new URL(href);
|
|
@@ -82,17 +82,17 @@ var customDetectBot = async (config, container, restartFn, retryContext) => {
|
|
|
82
82
|
try {
|
|
83
83
|
const assigned = prefetchedResult?.assigned ?? await withTimeout(providerApi.assignDetectorBundle(config.account.address), ASSIGN_TIMEOUT_MS);
|
|
84
84
|
if (assigned.useProviderBundle && assigned.detectorScript) {
|
|
85
|
+
providerDetect = await require_detectorLoader.DetectorLoaderFromScript(assigned.detectorScript);
|
|
85
86
|
detectorSessionId = assigned.detectorSessionId;
|
|
86
|
-
providerDetect = await withTimeout(require_detectorLoader.DetectorLoaderFromScript(assigned.detectorScript), ASSIGN_TIMEOUT_MS);
|
|
87
87
|
}
|
|
88
88
|
} catch {}
|
|
89
89
|
const ext = new (await extClassPromise)();
|
|
90
90
|
if (providerDetect === void 0) {
|
|
91
91
|
const userAccount = await ext.getAccount(config);
|
|
92
92
|
const { currentUrl: fallbackUrl, iframeUrl: fallbackIframeUrl } = getCurrentPageUrls();
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
fetch(
|
|
93
|
+
const captcha = await withTimeout(providerApi.getFrictionlessCaptcha(void 0, void 0, config.account.address, userAccount.account.address, config.mode, void 0, void 0, fallbackUrl, fallbackIframeUrl), 1e4);
|
|
94
|
+
if (captcha.dns_url) try {
|
|
95
|
+
fetch(captcha.dns_url, {
|
|
96
96
|
method: "GET",
|
|
97
97
|
mode: "no-cors",
|
|
98
98
|
credentials: "omit",
|
|
@@ -101,19 +101,19 @@ var customDetectBot = async (config, container, restartFn, retryContext) => {
|
|
|
101
101
|
}).catch(() => void 0);
|
|
102
102
|
} catch {}
|
|
103
103
|
return {
|
|
104
|
-
captchaType:
|
|
105
|
-
sessionId:
|
|
104
|
+
captchaType: captcha.captchaType,
|
|
105
|
+
sessionId: captcha.sessionId,
|
|
106
106
|
provider,
|
|
107
|
-
status:
|
|
107
|
+
status: captcha.status,
|
|
108
108
|
userAccount,
|
|
109
|
-
error:
|
|
110
|
-
hp:
|
|
109
|
+
error: captcha.error,
|
|
110
|
+
hp: captcha.hp
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
const detectionResult = await providerDetect(container, restartFn, () => ext.getAccount(config));
|
|
114
114
|
const userAccount = detectionResult.userAccount;
|
|
115
115
|
const { currentUrl, iframeUrl } = getCurrentPageUrls();
|
|
116
|
-
const captchaPromise = providerApi.getFrictionlessCaptcha(detectionResult.token, detectionResult.encryptHeadHash, config.account.address, userAccount.account.address, config.mode, void 0, detectorSessionId,
|
|
116
|
+
const captchaPromise = providerApi.getFrictionlessCaptcha(detectionResult.token, detectionResult.encryptHeadHash, config.account.address, userAccount.account.address, config.mode, void 0, detectorSessionId, currentUrl, iframeUrl);
|
|
117
117
|
if (detectionResult.getSimdReadings) detectionResult.getSimdReadings(6e4).catch(() => void 0);
|
|
118
118
|
const captcha = await withTimeout(captchaPromise, 1e4);
|
|
119
119
|
if (captcha.dns_url) try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customDetectBot.d.ts","sourceRoot":"","sources":["../src/customDetectBot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACX,oBAAoB,EAGpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"customDetectBot.d.ts","sourceRoot":"","sources":["../src/customDetectBot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACX,oBAAoB,EAGpB,MAAM,gBAAgB,CAAC;AAyFxB,eAAO,MAAM,WAAW,GAAU,CAAC,WACzB,OAAO,CAAC,CAAC,CAAC,MACf,MAAM,KACR,OAAO,CAAC,CAAC,CAoBX,CAAC;AAEF,QAAA,MAAM,eAAe,EAAE,oBAwNtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
package/dist/customDetectBot.js
CHANGED
|
@@ -4,7 +4,7 @@ import { ExtensionLoader, getProcaptchaRandomActiveProvider, pickIpMode } from "
|
|
|
4
4
|
import { ProviderApi } from "@prosopo/api";
|
|
5
5
|
import { ProsopoEnvError } from "@prosopo/common";
|
|
6
6
|
//#region src/customDetectBot.ts
|
|
7
|
-
var ASSIGN_TIMEOUT_MS =
|
|
7
|
+
var ASSIGN_TIMEOUT_MS = 1e4;
|
|
8
8
|
var sanitiseHref = (href) => {
|
|
9
9
|
try {
|
|
10
10
|
const u = new URL(href);
|
|
@@ -82,17 +82,17 @@ var customDetectBot = async (config, container, restartFn, retryContext) => {
|
|
|
82
82
|
try {
|
|
83
83
|
const assigned = prefetchedResult?.assigned ?? await withTimeout(providerApi.assignDetectorBundle(config.account.address), ASSIGN_TIMEOUT_MS);
|
|
84
84
|
if (assigned.useProviderBundle && assigned.detectorScript) {
|
|
85
|
+
providerDetect = await DetectorLoaderFromScript(assigned.detectorScript);
|
|
85
86
|
detectorSessionId = assigned.detectorSessionId;
|
|
86
|
-
providerDetect = await withTimeout(DetectorLoaderFromScript(assigned.detectorScript), ASSIGN_TIMEOUT_MS);
|
|
87
87
|
}
|
|
88
88
|
} catch {}
|
|
89
89
|
const ext = new (await extClassPromise)();
|
|
90
90
|
if (providerDetect === void 0) {
|
|
91
91
|
const userAccount = await ext.getAccount(config);
|
|
92
92
|
const { currentUrl: fallbackUrl, iframeUrl: fallbackIframeUrl } = getCurrentPageUrls();
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
fetch(
|
|
93
|
+
const captcha = await withTimeout(providerApi.getFrictionlessCaptcha(void 0, void 0, config.account.address, userAccount.account.address, config.mode, void 0, void 0, fallbackUrl, fallbackIframeUrl), 1e4);
|
|
94
|
+
if (captcha.dns_url) try {
|
|
95
|
+
fetch(captcha.dns_url, {
|
|
96
96
|
method: "GET",
|
|
97
97
|
mode: "no-cors",
|
|
98
98
|
credentials: "omit",
|
|
@@ -101,19 +101,19 @@ var customDetectBot = async (config, container, restartFn, retryContext) => {
|
|
|
101
101
|
}).catch(() => void 0);
|
|
102
102
|
} catch {}
|
|
103
103
|
return {
|
|
104
|
-
captchaType:
|
|
105
|
-
sessionId:
|
|
104
|
+
captchaType: captcha.captchaType,
|
|
105
|
+
sessionId: captcha.sessionId,
|
|
106
106
|
provider,
|
|
107
|
-
status:
|
|
107
|
+
status: captcha.status,
|
|
108
108
|
userAccount,
|
|
109
|
-
error:
|
|
110
|
-
hp:
|
|
109
|
+
error: captcha.error,
|
|
110
|
+
hp: captcha.hp
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
const detectionResult = await providerDetect(container, restartFn, () => ext.getAccount(config));
|
|
114
114
|
const userAccount = detectionResult.userAccount;
|
|
115
115
|
const { currentUrl, iframeUrl } = getCurrentPageUrls();
|
|
116
|
-
const captchaPromise = providerApi.getFrictionlessCaptcha(detectionResult.token, detectionResult.encryptHeadHash, config.account.address, userAccount.account.address, config.mode, void 0, detectorSessionId,
|
|
116
|
+
const captchaPromise = providerApi.getFrictionlessCaptcha(detectionResult.token, detectionResult.encryptHeadHash, config.account.address, userAccount.account.address, config.mode, void 0, detectorSessionId, currentUrl, iframeUrl);
|
|
117
117
|
if (detectionResult.getSimdReadings) detectionResult.getSimdReadings(6e4).catch(() => void 0);
|
|
118
118
|
const captcha = await withTimeout(captchaPromise, 1e4);
|
|
119
119
|
if (captcha.dns_url) try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customDetectBot.js","sourceRoot":"","sources":["../src/customDetectBot.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,eAAe,EACf,iCAAiC,EACjC,UAAU,GACV,MAAM,4BAA4B,CAAC;AAOpC,OAAO,EACN,wBAAwB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,sBAAsB,GACtB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"customDetectBot.js","sourceRoot":"","sources":["../src/customDetectBot.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,eAAe,EACf,iCAAiC,EACjC,UAAU,GACV,MAAM,4BAA4B,CAAC;AAOpC,OAAO,EACN,wBAAwB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,sBAAsB,GACtB,MAAM,uBAAuB,CAAC;AAO/B,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAqBjC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAsB,EAAE;IACzD,IAAI,CAAC;QACJ,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACvD,OAAO,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC;AAOF,MAAM,kBAAkB,GAAG,GAAa,EAAE;IACzC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACnD,OAAO,GAAG,MAAM,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;IACrC,CAAC,CAAC,EAAE,CAAC;IAGL,IAAI,MAAM,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAGD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,SAAS;YAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAID,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,YAAY;YAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzE,CAAC;IAKD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC/B,OAAmB,EACnB,EAAU,EACG,EAAE;IACf,IAAI,SAAqC,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACvD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,MAAM,CAAC,IAAI,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,SAAS,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,eAAe,GAAyB,KAAK,EAClD,MAAoC,EACpC,SAAkC,EAClC,SAAqB,EACrB,YAAyC,EACH,EAAE;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAgBlC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAerD,MAAM,cAAc,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,cAAc;QAChC,CAAC,CAAC,sBAAsB,CACtB,MAAM,CAAC,kBAAkB,EACzB,MAAM,EACN,MAAM,CAAC,OAAO,CAAC,OAAO,CACtB;QACF,CAAC,CAAC,SAAS,CAAC;IAKb,IAAI,gBAAgD,CAAC;IACrD,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,gBAAgB,GAAG,MAAM,UAAU,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACR,gBAAgB,GAAG,SAAS,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GACb,gBAAgB,EAAE,QAAQ;QAC1B,CAAC,MAAM,iCAAiC,CACvC,MAAM,CAAC,kBAAkB,EACzB,MAAM,EACN,YAAY,CACZ,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,IAAI,WAAW,CAClC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EACrB,MAAM,CAAC,OAAO,CAAC,OAAO,CACtB,CAAC;IAOF,IAAI,iBAAqC,CAAC;IAC1C,IAAI,cAAwC,CAAC;IAC7C,IAAI,CAAC;QAGJ,MAAM,QAAQ,GACb,gBAAgB,EAAE,QAAQ;YAC1B,CAAC,MAAM,WAAW,CACjB,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACxD,iBAAiB,CACjB,CAAC,CAAC;QACJ,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAI3D,cAAc,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACzE,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;QAChD,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAK3B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAC9D,kBAAkB,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,WAAW,CAChC,WAAW,CAAC,sBAAsB,CACjC,SAAS,EACT,SAAS,EACT,MAAM,CAAC,OAAO,CAAC,OAAO,EACtB,WAAW,CAAC,OAAO,CAAC,OAAO,EAC3B,MAAM,CAAC,IAAI,EACX,SAAS,EACT,SAAS,EACT,WAAW,EACX,iBAAiB,CACjB,EACD,KAAK,CACL,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC;gBACJ,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC3B,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,UAAU;iBACjB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACF,CAAC;QACD,OAAO;YACN,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,WAAW;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,EAAE,EAAE,OAAO,CAAC,EAAE;SACd,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAiB,cAAc,CAAC;IAE5C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAC/D,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CACtB,CAAC;IAEF,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC;IAQhD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACvD,MAAM,cAAc,GAAG,WAAW,CAAC,sBAAsB,CACxD,eAAe,CAAC,KAAK,EACrB,eAAe,CAAC,eAAe,EAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,EACtB,WAAW,CAAC,OAAO,CAAC,OAAO,EAC3B,MAAM,CAAC,IAAI,EACX,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,SAAS,CACT,CAAC;IACF,IAAI,eAAe,CAAC,eAAe,EAAE,CAAC;QAGrC,KAAK,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAIzD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC3B,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,UAAU;aACjB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACF,CAAC;IAED,OAAO;QACN,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,WAAW;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,EAAE,EAAE,OAAO,CAAC,EAAE;QAEd,kBAAkB,EAAE,eAAe,CAAC,YAAY;QAChD,kBAAkB,EAAE,eAAe,CAAC,YAAY;QAChD,kBAAkB,EAAE,eAAe,CAAC,YAAY;QAChD,gBAAgB,EAAE,eAAe,CAAC,eAAe;QACjD,qBAAqB,EAAE,eAAe,CAAC,qBAAqB;QAC5D,kBAAkB,EAAE,eAAe,CAAC,kBAAkB;QACtD,eAAe,EAAE,eAAe,CAAC,eAAe;KAChD,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customDetectBotAssignTimeout.test.d.ts","sourceRoot":"","sources":["../../src/tests/customDetectBotAssignTimeout.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
const mocks = vi.hoisted(() => ({
|
|
3
|
+
getFrictionlessCaptcha: vi.fn(),
|
|
4
|
+
getProcaptchaRandomActiveProvider: vi.fn(),
|
|
5
|
+
assignDetectorBundle: vi.fn(),
|
|
6
|
+
detectorLoaderFromScript: vi.fn(),
|
|
7
|
+
detect: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
vi.mock("@prosopo/api", () => ({
|
|
10
|
+
ProviderApi: vi.fn(function () {
|
|
11
|
+
return {
|
|
12
|
+
getFrictionlessCaptcha: mocks.getFrictionlessCaptcha,
|
|
13
|
+
assignDetectorBundle: mocks.assignDetectorBundle,
|
|
14
|
+
};
|
|
15
|
+
}),
|
|
16
|
+
}));
|
|
17
|
+
vi.mock("@prosopo/procaptcha-common", () => ({
|
|
18
|
+
ExtensionLoader: vi.fn(async () => {
|
|
19
|
+
return class FakeExtension {
|
|
20
|
+
getAccount() {
|
|
21
|
+
return Promise.resolve({
|
|
22
|
+
account: { address: "5FakeUserAccountAddress" },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}),
|
|
27
|
+
getProcaptchaRandomActiveProvider: mocks.getProcaptchaRandomActiveProvider,
|
|
28
|
+
pickIpMode: vi.fn(() => undefined),
|
|
29
|
+
}));
|
|
30
|
+
vi.mock("../detectorLoader.js", () => ({
|
|
31
|
+
DetectorLoaderFromScript: mocks.detectorLoaderFromScript,
|
|
32
|
+
}));
|
|
33
|
+
import customDetectBot from "../customDetectBot.js";
|
|
34
|
+
const baseConfig = {
|
|
35
|
+
account: { address: "5CcNvLUdiXFpzKDMjThGLSK9rhWHA1H4EF3zrgkpkjAdqmuP" },
|
|
36
|
+
defaultEnvironment: "staging",
|
|
37
|
+
web2: true,
|
|
38
|
+
mode: "visible",
|
|
39
|
+
};
|
|
40
|
+
const assignResponse = {
|
|
41
|
+
useProviderBundle: true,
|
|
42
|
+
detectorSessionId: "det-5cad2419-43c0-41b7-a9b8-0117767624bc",
|
|
43
|
+
detectorScript: "SELF_CONTAINED_ESM",
|
|
44
|
+
status: "ok",
|
|
45
|
+
};
|
|
46
|
+
const detectionResult = {
|
|
47
|
+
token: "ENCRYPTED_TOKEN",
|
|
48
|
+
encryptHeadHash: "ENCRYPTED_HEAD_HASH",
|
|
49
|
+
userAccount: { account: { address: "5FakeUserAccountAddress" } },
|
|
50
|
+
shadowDomCleanup: () => undefined,
|
|
51
|
+
};
|
|
52
|
+
const captchaResponse = {
|
|
53
|
+
captchaType: "pow",
|
|
54
|
+
sessionId: "SID",
|
|
55
|
+
status: "ok",
|
|
56
|
+
};
|
|
57
|
+
const SLOW_MS = 6700;
|
|
58
|
+
const resolveAfter = (ms, value) => new Promise((resolve) => {
|
|
59
|
+
setTimeout(() => resolve(value), ms);
|
|
60
|
+
});
|
|
61
|
+
const postedToken = () => {
|
|
62
|
+
const call = mocks.getFrictionlessCaptcha.mock.calls[0];
|
|
63
|
+
return call?.[0];
|
|
64
|
+
};
|
|
65
|
+
const postedDetectorSessionId = () => {
|
|
66
|
+
const call = mocks.getFrictionlessCaptcha.mock.calls[0];
|
|
67
|
+
return call?.[6];
|
|
68
|
+
};
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
vi.useFakeTimers();
|
|
71
|
+
mocks.getFrictionlessCaptcha.mockReset();
|
|
72
|
+
mocks.getProcaptchaRandomActiveProvider.mockReset();
|
|
73
|
+
mocks.assignDetectorBundle.mockReset();
|
|
74
|
+
mocks.detectorLoaderFromScript.mockReset();
|
|
75
|
+
mocks.detect.mockReset();
|
|
76
|
+
mocks.getProcaptchaRandomActiveProvider.mockResolvedValue({
|
|
77
|
+
providerAccount: "dns-routed",
|
|
78
|
+
provider: { url: "https://staging-pronode3.prosopo.io" },
|
|
79
|
+
});
|
|
80
|
+
mocks.detect.mockResolvedValue(detectionResult);
|
|
81
|
+
mocks.detectorLoaderFromScript.mockResolvedValue(mocks.detect);
|
|
82
|
+
mocks.assignDetectorBundle.mockResolvedValue(assignResponse);
|
|
83
|
+
mocks.getFrictionlessCaptcha.mockResolvedValue(captchaResponse);
|
|
84
|
+
});
|
|
85
|
+
afterEach(() => {
|
|
86
|
+
vi.useRealTimers();
|
|
87
|
+
});
|
|
88
|
+
const runDetection = async () => {
|
|
89
|
+
const pending = customDetectBot(baseConfig, undefined, () => undefined);
|
|
90
|
+
await vi.advanceTimersByTimeAsync(SLOW_MS + 1000);
|
|
91
|
+
await pending;
|
|
92
|
+
};
|
|
93
|
+
describe("customDetectBot detector-assignment deadline", () => {
|
|
94
|
+
it("uses a bundle whose assign POST is slow", async () => {
|
|
95
|
+
mocks.assignDetectorBundle.mockImplementation(() => resolveAfter(SLOW_MS, assignResponse));
|
|
96
|
+
await runDetection();
|
|
97
|
+
expect(mocks.detectorLoaderFromScript).toHaveBeenCalledWith(assignResponse.detectorScript);
|
|
98
|
+
expect(postedToken()).toBe("ENCRYPTED_TOKEN");
|
|
99
|
+
expect(postedDetectorSessionId()).toBe(assignResponse.detectorSessionId);
|
|
100
|
+
});
|
|
101
|
+
it("uses a bundle whose blob import is slow", async () => {
|
|
102
|
+
mocks.detectorLoaderFromScript.mockImplementation(() => resolveAfter(SLOW_MS, mocks.detect));
|
|
103
|
+
await runDetection();
|
|
104
|
+
expect(postedToken()).toBe("ENCRYPTED_TOKEN");
|
|
105
|
+
expect(postedDetectorSessionId()).toBe(assignResponse.detectorSessionId);
|
|
106
|
+
});
|
|
107
|
+
it("still sends an empty token when the provider has no bundle to assign", async () => {
|
|
108
|
+
mocks.assignDetectorBundle.mockResolvedValue({
|
|
109
|
+
useProviderBundle: false,
|
|
110
|
+
status: "ok",
|
|
111
|
+
});
|
|
112
|
+
await runDetection();
|
|
113
|
+
expect(mocks.detectorLoaderFromScript).not.toHaveBeenCalled();
|
|
114
|
+
expect(postedToken()).toBeUndefined();
|
|
115
|
+
expect(postedDetectorSessionId()).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=customDetectBotAssignTimeout.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customDetectBotAssignTimeout.test.js","sourceRoot":"","sources":["../../src/tests/customDetectBotAssignTimeout.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/procaptcha-frictionless",
|
|
3
|
-
"version": "2.13.
|
|
3
|
+
"version": "2.13.2",
|
|
4
4
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,20 +30,20 @@
|
|
|
30
30
|
},
|
|
31
31
|
"browserslist": ["> 0.5%, last 2 versions, not dead"],
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@prosopo/api": "4.0.
|
|
34
|
-
"@prosopo/common": "3.1.
|
|
35
|
-
"@prosopo/locale": "3.2.
|
|
36
|
-
"@prosopo/procaptcha-common": "2.11.
|
|
37
|
-
"@prosopo/procaptcha-pow": "2.10.
|
|
38
|
-
"@prosopo/procaptcha-puzzle": "2.10.
|
|
39
|
-
"@prosopo/procaptcha-react": "2.9.
|
|
40
|
-
"@prosopo/types": "5.0.
|
|
33
|
+
"@prosopo/api": "4.0.1",
|
|
34
|
+
"@prosopo/common": "3.1.49",
|
|
35
|
+
"@prosopo/locale": "3.2.9",
|
|
36
|
+
"@prosopo/procaptcha-common": "2.11.21",
|
|
37
|
+
"@prosopo/procaptcha-pow": "2.10.28",
|
|
38
|
+
"@prosopo/procaptcha-puzzle": "2.10.44",
|
|
39
|
+
"@prosopo/procaptcha-react": "2.9.101",
|
|
40
|
+
"@prosopo/types": "5.0.1",
|
|
41
41
|
"@prosopo/widget-skeleton": "2.8.5",
|
|
42
42
|
"dotenv": "16.4.5",
|
|
43
43
|
"react": "18.3.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@prosopo/config": "3.3.
|
|
46
|
+
"@prosopo/config": "3.3.7",
|
|
47
47
|
"@types/node": "22.10.2",
|
|
48
48
|
"@vitest/coverage-v8": "4.1.10",
|
|
49
49
|
"concurrently": "9.0.1",
|
package/src/customDetectBot.ts
CHANGED
|
@@ -34,11 +34,12 @@ import {
|
|
|
34
34
|
takePrefetchedDetector,
|
|
35
35
|
} from "./detectorPrefetch.js";
|
|
36
36
|
|
|
37
|
-
// Upper bound on the
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
|
|
37
|
+
// Upper bound on the assign POST, which serves the detector bundle inline
|
|
38
|
+
// (~215 KB gzipped). The hop is always cold — /healthz pins a different
|
|
39
|
+
// hostname, so it pays fresh DNS + TLS + a CORS preflight before the download
|
|
40
|
+
// even starts, measured at 6.7s against staging. Anything tighter silently
|
|
41
|
+
// drops the detector and sends an empty token.
|
|
42
|
+
const ASSIGN_TIMEOUT_MS = 10_000;
|
|
42
43
|
|
|
43
44
|
// The page(s) the widget is rendered on, reduced to origin + path.
|
|
44
45
|
// Deliberately built from `origin` + `pathname` (never `href`) so the query
|
|
@@ -215,8 +216,7 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
215
216
|
// in the provider-served pool: when the provider has a populated pool it
|
|
216
217
|
// returns the obfuscated detector (each with its own keys + inner cipher)
|
|
217
218
|
// plus a detectorSessionId. When it cannot (no pool, network, decode, or
|
|
218
|
-
// timeout) we have NO detector to run
|
|
219
|
-
// signal `detectorUnavailable` and the provider serves a PoW challenge.
|
|
219
|
+
// timeout) we have NO detector to run and there is no bundled fallback.
|
|
220
220
|
let detectorSessionId: string | undefined;
|
|
221
221
|
let providerDetect: DetectorType | undefined;
|
|
222
222
|
try {
|
|
@@ -229,11 +229,11 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
229
229
|
ASSIGN_TIMEOUT_MS,
|
|
230
230
|
));
|
|
231
231
|
if (assigned.useProviderBundle && assigned.detectorScript) {
|
|
232
|
+
// Deliberately untimed: this is a local parse + evaluate, so a timer
|
|
233
|
+
// cannot rescue a stalled main thread — it can only throw away a bundle
|
|
234
|
+
// we are already holding.
|
|
235
|
+
providerDetect = await DetectorLoaderFromScript(assigned.detectorScript);
|
|
232
236
|
detectorSessionId = assigned.detectorSessionId;
|
|
233
|
-
providerDetect = await withTimeout(
|
|
234
|
-
DetectorLoaderFromScript(assigned.detectorScript),
|
|
235
|
-
ASSIGN_TIMEOUT_MS,
|
|
236
|
-
);
|
|
237
237
|
}
|
|
238
238
|
} catch {
|
|
239
239
|
// No detector available — fall through to the PoW request below.
|
|
@@ -242,14 +242,14 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
242
242
|
const ExtClass = await extClassPromise;
|
|
243
243
|
const ext = new ExtClass();
|
|
244
244
|
|
|
245
|
-
// No provider detector ⇒ no detection is possible
|
|
246
|
-
//
|
|
247
|
-
//
|
|
245
|
+
// No provider detector ⇒ no detection is possible, so there is nothing to
|
|
246
|
+
// send. The request goes out with an empty token and the provider decides
|
|
247
|
+
// what to serve; the client gets no say in that.
|
|
248
248
|
if (providerDetect === undefined) {
|
|
249
249
|
const userAccount = await ext.getAccount(config);
|
|
250
250
|
const { currentUrl: fallbackUrl, iframeUrl: fallbackIframeUrl } =
|
|
251
251
|
getCurrentPageUrls();
|
|
252
|
-
const
|
|
252
|
+
const captcha = await withTimeout(
|
|
253
253
|
providerApi.getFrictionlessCaptcha(
|
|
254
254
|
undefined,
|
|
255
255
|
undefined,
|
|
@@ -258,15 +258,14 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
258
258
|
config.mode,
|
|
259
259
|
undefined,
|
|
260
260
|
undefined,
|
|
261
|
-
true,
|
|
262
261
|
fallbackUrl,
|
|
263
262
|
fallbackIframeUrl,
|
|
264
263
|
),
|
|
265
264
|
10000,
|
|
266
265
|
);
|
|
267
|
-
if (
|
|
266
|
+
if (captcha.dns_url) {
|
|
268
267
|
try {
|
|
269
|
-
void fetch(
|
|
268
|
+
void fetch(captcha.dns_url, {
|
|
270
269
|
method: "GET",
|
|
271
270
|
mode: "no-cors",
|
|
272
271
|
credentials: "omit",
|
|
@@ -278,13 +277,13 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
return {
|
|
281
|
-
captchaType:
|
|
282
|
-
sessionId:
|
|
280
|
+
captchaType: captcha.captchaType,
|
|
281
|
+
sessionId: captcha.sessionId,
|
|
283
282
|
provider: provider,
|
|
284
|
-
status:
|
|
283
|
+
status: captcha.status,
|
|
285
284
|
userAccount: userAccount,
|
|
286
|
-
error:
|
|
287
|
-
hp:
|
|
285
|
+
error: captcha.error,
|
|
286
|
+
hp: captcha.hp,
|
|
288
287
|
};
|
|
289
288
|
}
|
|
290
289
|
|
|
@@ -311,7 +310,6 @@ const customDetectBot: BotDetectionFunction = async (
|
|
|
311
310
|
config.mode,
|
|
312
311
|
undefined,
|
|
313
312
|
detectorSessionId,
|
|
314
|
-
undefined,
|
|
315
313
|
currentUrl,
|
|
316
314
|
iframeUrl,
|
|
317
315
|
);
|