@prosopo/procaptcha-frictionless 2.14.0 → 2.15.1
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 +9 -9
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +59 -0
- package/dist/ProcaptchaFrictionless.d.ts.map +1 -1
- package/dist/ProcaptchaFrictionless.js +22 -9
- package/dist/ProcaptchaFrictionless.js.map +1 -1
- package/dist/cjs/ProcaptchaFrictionless.cjs +22 -9
- package/dist/cjs/sessionInvalidatedRecovery.cjs +16 -9
- package/dist/sessionInvalidatedRecovery.d.ts +3 -1
- package/dist/sessionInvalidatedRecovery.d.ts.map +1 -1
- package/dist/sessionInvalidatedRecovery.js +16 -9
- package/dist/sessionInvalidatedRecovery.js.map +1 -1
- package/dist/tests/escalationHandoff.integration.test.d.ts +5 -0
- package/dist/tests/escalationHandoff.integration.test.d.ts.map +1 -0
- package/dist/tests/escalationHandoff.integration.test.js +216 -0
- package/dist/tests/escalationHandoff.integration.test.js.map +1 -0
- package/dist/tests/sessionInvalidatedRecovery.test.js +41 -21
- package/dist/tests/sessionInvalidatedRecovery.test.js.map +1 -1
- package/dist/tests/sessionInvalidatedRemint.test.d.ts +5 -0
- package/dist/tests/sessionInvalidatedRemint.test.d.ts.map +1 -0
- package/dist/tests/sessionInvalidatedRemint.test.js +150 -0
- package/dist/tests/sessionInvalidatedRemint.test.js.map +1 -0
- package/package.json +9 -9
- package/src/ProcaptchaFrictionless.tsx +61 -15
- package/src/sessionInvalidatedRecovery.ts +30 -10
- package/src/tests/escalationHandoff.integration.test.tsx +354 -0
- package/src/tests/sessionInvalidatedRecovery.test.ts +49 -21
- package/src/tests/sessionInvalidatedRemint.test.tsx +245 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-frictionless@2.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.15.1 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -56,12 +56,12 @@ Bundle build started
|
|
|
56
56
|
✓ 8 modules transformed.
|
|
57
57
|
rendering chunks...
|
|
58
58
|
computing gzip size...
|
|
59
|
-
dist/cjs/index.cjs
|
|
60
|
-
dist/cjs/detectorLoader.cjs
|
|
61
|
-
dist/cjs/frictionlessResultGuard.cjs
|
|
62
|
-
dist/cjs/sessionInvalidatedRecovery.cjs
|
|
63
|
-
dist/cjs/detectorPrefetch.cjs
|
|
64
|
-
dist/cjs/customDetectBot.cjs
|
|
65
|
-
dist/cjs/ProcaptchaFrictionless.cjs
|
|
59
|
+
dist/cjs/index.cjs 0.54 kB │ gzip: 0.21 kB
|
|
60
|
+
dist/cjs/detectorLoader.cjs 0.62 kB │ gzip: 0.40 kB
|
|
61
|
+
dist/cjs/frictionlessResultGuard.cjs 1.55 kB │ gzip: 0.80 kB
|
|
62
|
+
dist/cjs/sessionInvalidatedRecovery.cjs 2.50 kB │ gzip: 1.14 kB
|
|
63
|
+
dist/cjs/detectorPrefetch.cjs 2.98 kB │ gzip: 1.35 kB
|
|
64
|
+
dist/cjs/customDetectBot.cjs 5.55 kB │ gzip: 1.70 kB
|
|
65
|
+
dist/cjs/ProcaptchaFrictionless.cjs 10.03 kB │ gzip: 2.69 kB
|
|
66
66
|
|
|
67
|
-
[32m✓ built in
|
|
67
|
+
[32m✓ built in 32ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-frictionless@2.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.15.1 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
8:02:20 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
|
+
8:02:20 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/NodejsPolarsNativeFilePlugin.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/balancer.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
8:02:20 PM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/webComponent/createWidget.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
8:02:20 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
|
+
8:02:20 PM - Project '../account/tsconfig.json' is up to date because newest input '../account/src/index.ts' is older than output '../account/tsconfig.tsbuildinfo'
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
8:02:20 PM - Project '../procaptcha-common/tsconfig.json' is up to date because newest input '../procaptcha-common/src/clientMetaData.ts' is older than output '../procaptcha-common/tsconfig.tsbuildinfo'
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 PM - Project '../datasets/tsconfig.json' is up to date because newest input '../datasets/src/index.ts' is older than output '../datasets/tsconfig.tsbuildinfo'
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
8:02:20 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
|
+
8:02:20 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
|
+
8:02:20 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
8:02:20 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.
|
|
2
|
+
> @prosopo/procaptcha-frictionless@2.15.1 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/procaptcha-frictionless@2.
|
|
6
|
+
> @prosopo/procaptcha-frictionless@2.15.1 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -32,7 +32,6 @@ ViteEsmConfig: .
|
|
|
32
32
|
}
|
|
33
33
|
{
|
|
34
34
|
externals: [
|
|
35
|
-
[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
|
|
36
35
|
'@prosopo/locale',
|
|
37
36
|
'@prosopo/procaptcha-pow',
|
|
38
37
|
'@prosopo/api',
|
|
@@ -54,6 +53,7 @@ ViteEsmConfig: .
|
|
|
54
53
|
'@prosopo/datasets'
|
|
55
54
|
]
|
|
56
55
|
}
|
|
56
|
+
[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
|
|
57
57
|
[36mvite v8.1.5 [32mbuilding ssr environment for production...[36m[39m
|
|
58
58
|
Bundle build started
|
|
59
59
|
[2K
|
|
@@ -64,9 +64,9 @@ dist/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
|
|
|
64
64
|
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/frictionlessResultGuard.js 1.48 kB │ gzip: 0.80 kB
|
|
67
|
-
dist/sessionInvalidatedRecovery.js 2.
|
|
67
|
+
dist/sessionInvalidatedRecovery.js 2.41 kB │ gzip: 1.13 kB
|
|
68
68
|
dist/detectorPrefetch.js 2.86 kB │ gzip: 1.32 kB
|
|
69
69
|
dist/customDetectBot.js 5.37 kB │ gzip: 1.67 kB
|
|
70
|
-
dist/ProcaptchaFrictionless.js
|
|
70
|
+
dist/ProcaptchaFrictionless.js 9.36 kB │ gzip: 2.65 kB
|
|
71
71
|
|
|
72
|
-
[32m✓ built in
|
|
72
|
+
[32m✓ built in 28ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# @prosopo/procaptcha-frictionless
|
|
2
2
|
|
|
3
|
+
## 2.15.1
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 46cca63: Make the post-PoW escalation handoff idempotent.
|
|
7
|
+
|
|
8
|
+
Follow-up to the `CAPTCHA.NO_SESSION_FOUND` recovery fix: this is the other producer of the duplicate `/captcha/image` POST that fix had to recover from.
|
|
9
|
+
|
|
10
|
+
Production, 2026-09-07, the same affected user:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
11:27:49.910 POST /pow/solution 200 escalation envelope returned
|
|
14
|
+
11:27:50.263 POST /captcha/image 200 escalation session issued
|
|
15
|
+
11:27:55.030 POST /captcha/image 400 CAPTCHA.NO_SESSION_FOUND, same session
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The provider mints exactly one escalation session per PoW solution and consumes it on the first challenge fetch. The PoW manager fires `onEscalate` from inside its `providerRetry`-wrapped `submit()`, so a throw anywhere after the handoff re-runs `submit()` and escalates a second time on the same envelope — mounting a second image widget against a session the first one already spent. `onEscalate` now ignores a repeat handoff for a sessionId it has already mounted; a genuinely new escalation session is still followed.
|
|
19
|
+
|
|
20
|
+
Adds `escalationHandoff.integration.test.tsx`, which drives the real `ProcaptchaFrictionless` wrapper into the real image widget and its real `Manager` with only the network stubbed. The stub enforces the provider's one-shot session contract and returns the `NO_SESSION_FOUND` envelope in the response body rather than throwing — `HttpClientBase` only throws when a failure isn't JSON, so a 400 from the provider arrives as `challenge.error`, which is what the widget's recovery path keys off.
|
|
21
|
+
- 9e06d72: Stop `CAPTCHA.NO_SESSION_FOUND` leaving the widget on a dead checkbox.
|
|
22
|
+
|
|
23
|
+
Users reported a checkbox reading "No session found" that never recovered, usually after pressing the image-challenge reload button. Provider logs show the shape clearly: `POST /captcha/image` returns 200 and issues a challenge, then 2-6 seconds later the *same* sessionId is POSTed again and the provider answers 400 `CAPTCHA.NO_SESSION_FOUND` — `checkAndRemoveSession` consumed the session when it issued the first challenge, so a second challenge fetch on that id can never succeed.
|
|
24
|
+
|
|
25
|
+
Three defects combined to turn that into a permanent dead end.
|
|
26
|
+
|
|
27
|
+
- **The manager re-sent a sessionId it had already spent.** `defaultState()` doesn't clear `sessionId` and `buildUpdateState` skips `undefined`, so a stale id survives `resetState()` and any path that re-enters `start()` re-sends it. `Manager` now remembers the id it exchanged for a challenge and, rather than making a request it knows the provider will reject, routes straight to the `CAPTCHA.NO_SESSION_FOUND` state the wrapper already listens for.
|
|
28
|
+
|
|
29
|
+
- **Recovery was one-shot per outer widget lifetime and had no terminal branch.** `ProcaptchaWidget` always takes the `onSessionInvalidated` branch and returns before its own `frictionlessState.restart()` fallback, and its guard ref is fresh on every re-mount because the wrapper bumps the mount key. So once the wrapper's one-shot was spent, the second failure was handled by nobody: no re-mint, no restart, no message — just a stuck checkbox. `handleSessionInvalidated` is now a bounded counter (`MAX_SESSION_INVALIDATED_RETRIES`) rather than a boolean, it reports `exhausted` to the caller, a reload press clears it (a reload mints a genuinely new session, so it shouldn't spend the budget for the old one), and exhaustion falls over visibly through `fallOverWithStyle` — which schedules the existing 10-second full restart, so there is always a way back.
|
|
30
|
+
|
|
31
|
+
- **`resetState(0)` never reset anything.** `0 || stateRef.current.attemptCount` kept the old count, so `attemptCount` accumulated across every re-mint and `start()`'s own `attemptCount >= 5` fall-over fired after five *cumulative* runs in a widget lifetime. Five successful reload presses were enough to drop the user onto the error placeholder. Now `??`, so callers passing literal `0` get the reset they asked for.
|
|
32
|
+
- @prosopo/procaptcha-react@2.10.1
|
|
33
|
+
|
|
34
|
+
## 2.15.0
|
|
35
|
+
### Minor Changes
|
|
36
|
+
|
|
37
|
+
- d288371: Let a site choose where a challenge opens, and which button triggers it.
|
|
38
|
+
|
|
39
|
+
- `placement: "popup" | "float"`, also `data-placement`. `popup` is the default and unchanged. `float` opens the challenge directly above the widget and keeps it pinned there as the page scrolls, leaves the page usable behind it, and dismisses on Escape or an outside click. An invisible widget always uses popup.
|
|
40
|
+
- `bind: "#selector"`, also `data-bind`. The matching host-page button triggers that one widget, in visible or invisible mode. The click's default action is prevented so a submit button does not post the form before a token exists.
|
|
41
|
+
- `execute(widgetId?)`. Called with no argument every widget responds, as before. Called with the id `render()` returns, only that widget runs. Implicitly rendered invisible buttons now trigger only their own widget.
|
|
42
|
+
|
|
43
|
+
Behaviour changes for existing widgets:
|
|
44
|
+
|
|
45
|
+
- Escape now closes the image and puzzle challenge in both placements. For the image captcha this runs the cancel path, which fires `onClose` and restarts frictionless.
|
|
46
|
+
- Image and puzzle now present on one shared `ChallengeSurface`. Both were already portalled to `document.body`, so neither moves in the page, but the markup around them changed: the outer layer keeps `prosopo-modalOuter` for the image captcha and also carries `prosopo-challenge-surface`, and a new `prosopo-challenge-content` element sits between it and `prosopo-modalInner`. A direct-child selector such as `.prosopo-modalOuter > .prosopo-modalInner` no longer matches, and the centring transform now lives on `prosopo-challenge-content` rather than on `prosopo-modalInner`.
|
|
47
|
+
|
|
48
|
+
`createConfig` takes a named options object.
|
|
49
|
+
|
|
50
|
+
### Patch Changes
|
|
51
|
+
|
|
52
|
+
- Updated dependencies [6f57ee9]
|
|
53
|
+
- Updated dependencies [d288371]
|
|
54
|
+
- @prosopo/types@5.7.0
|
|
55
|
+
- @prosopo/procaptcha-common@2.13.0
|
|
56
|
+
- @prosopo/procaptcha-react@2.10.0
|
|
57
|
+
- @prosopo/procaptcha-puzzle@2.12.0
|
|
58
|
+
- @prosopo/procaptcha-pow@2.12.0
|
|
59
|
+
- @prosopo/api@4.1.6
|
|
60
|
+
- @prosopo/common@3.1.54
|
|
61
|
+
|
|
3
62
|
## 2.14.0
|
|
4
63
|
### Minor Changes
|
|
5
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcaptchaFrictionless.d.ts","sourceRoot":"","sources":["../src/ProcaptchaFrictionless.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAMN,KAAK,2BAA2B,EAGhC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProcaptchaFrictionless.d.ts","sourceRoot":"","sources":["../src/ProcaptchaFrictionless.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAMN,KAAK,2BAA2B,EAGhC,MAAM,gBAAgB,CAAC;AAsExB,eAAO,MAAM,sBAAsB,gEAOhC,2BAA2B,gCAoa7B,CAAC"}
|
|
@@ -8,6 +8,7 @@ import { darkTheme, lightTheme } from "@prosopo/widget-skeleton";
|
|
|
8
8
|
import { useEffect, useRef, useState } from "react";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
//#region src/ProcaptchaFrictionless.tsx
|
|
11
|
+
var NO_SESSION_FOUND_KEY = "CAPTCHA.NO_SESSION_FOUND";
|
|
11
12
|
var ProcaptchaLoader = async () => (await import("@prosopo/procaptcha-react")).Procaptcha;
|
|
12
13
|
var ProcaptchaPuzzleLoader = async () => (await import("@prosopo/procaptcha-puzzle")).ProcaptchaPuzzle;
|
|
13
14
|
var ProcaptchaPowLoader = async () => (await import("@prosopo/procaptcha-pow")).ProcaptchaPow;
|
|
@@ -28,13 +29,14 @@ var renderPlaceholder = (theme, mode, errorMessage, isTranslationLoaded, transla
|
|
|
28
29
|
};
|
|
29
30
|
var defaultLoadingState = (attemptCount) => ({
|
|
30
31
|
loading: false,
|
|
31
|
-
attemptCount
|
|
32
|
+
attemptCount
|
|
32
33
|
});
|
|
33
34
|
var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = customDetectBot, container }) => {
|
|
34
35
|
const stateRef = useRef(defaultLoadingState(0));
|
|
35
36
|
const events = getDefaultEvents(callbacks);
|
|
36
37
|
const pendingRetryCoordsRef = useRef(null);
|
|
37
|
-
const
|
|
38
|
+
const sessionInvalidatedAttemptsRef = useRef(0);
|
|
39
|
+
const escalatedSessionIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
38
40
|
const mountCountRef = useRef(0);
|
|
39
41
|
const nextMountAutoStartRef = useRef(false);
|
|
40
42
|
const manualStart = config.startMode === StartModeEnum.manual;
|
|
@@ -50,7 +52,7 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = cu
|
|
|
50
52
|
}, [i18n, config.language]);
|
|
51
53
|
const [componentToRender, setComponentToRender] = useState(renderPlaceholder(config.theme, config.mode, stateRef.current.errorMessage, i18n.isInitialized, i18n.t, !manualStart, manualStart ? (event) => manualCheckboxHandlerRef.current(event) : void 0));
|
|
52
54
|
const resetState = (attemptCount) => {
|
|
53
|
-
stateRef.current = defaultLoadingState(attemptCount
|
|
55
|
+
stateRef.current = defaultLoadingState(attemptCount ?? stateRef.current.attemptCount);
|
|
54
56
|
};
|
|
55
57
|
const fallOverWithStyle = (errorMessage, errorKey) => {
|
|
56
58
|
if (errorKey === "CAPTCHA.NO_SESSION_FOUND") setTimeout(() => {
|
|
@@ -67,20 +69,28 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = cu
|
|
|
67
69
|
};
|
|
68
70
|
const renderForCaptchaType = async (captchaType, frictionlessState, autoStart = false, escalationCoords) => {
|
|
69
71
|
const onEscalate = (next, newSessionId, coords) => {
|
|
72
|
+
if (escalatedSessionIdsRef.current.has(newSessionId)) return;
|
|
73
|
+
escalatedSessionIdsRef.current.add(newSessionId);
|
|
70
74
|
renderForCaptchaType(next, {
|
|
71
75
|
...frictionlessState,
|
|
72
76
|
sessionId: newSessionId
|
|
73
77
|
}, true, coords);
|
|
74
78
|
};
|
|
75
79
|
const onSessionInvalidated = (x, y) => {
|
|
76
|
-
const { shouldRestart } = handleSessionInvalidated(x, y,
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
const { shouldRestart } = handleSessionInvalidated(x, y, sessionInvalidatedAttemptsRef, pendingRetryCoordsRef);
|
|
81
|
+
if (shouldRestart) {
|
|
82
|
+
resetState(0);
|
|
83
|
+
start();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const message = i18n.isInitialized ? i18n.t(NO_SESSION_FOUND_KEY) : "No session found";
|
|
87
|
+
events.onError(new Error(message));
|
|
88
|
+
fallOverWithStyle(message, NO_SESSION_FOUND_KEY);
|
|
80
89
|
};
|
|
81
90
|
const onReload = (x, y) => {
|
|
82
91
|
pendingRetryCoordsRef.current = normaliseRetryCoords(x, y);
|
|
83
92
|
nextMountAutoStartRef.current = true;
|
|
93
|
+
sessionInvalidatedAttemptsRef.current = 0;
|
|
84
94
|
resetState(0);
|
|
85
95
|
start();
|
|
86
96
|
};
|
|
@@ -100,6 +110,7 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = cu
|
|
|
100
110
|
autoStart: resumedAutoStart,
|
|
101
111
|
startCoords,
|
|
102
112
|
onSessionInvalidated,
|
|
113
|
+
container,
|
|
103
114
|
onReload
|
|
104
115
|
}, mountKey));
|
|
105
116
|
} else if (captchaType === CaptchaType.puzzle) {
|
|
@@ -111,7 +122,8 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = cu
|
|
|
111
122
|
i18n,
|
|
112
123
|
autoStart: resumedAutoStart,
|
|
113
124
|
startCoords,
|
|
114
|
-
onSessionInvalidated
|
|
125
|
+
onSessionInvalidated,
|
|
126
|
+
container
|
|
115
127
|
}, mountKey));
|
|
116
128
|
} else {
|
|
117
129
|
const ProcaptchaPow = await ProcaptchaPowLoader();
|
|
@@ -123,7 +135,8 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = cu
|
|
|
123
135
|
onEscalate,
|
|
124
136
|
autoStart: resumedAutoStart,
|
|
125
137
|
startCoords,
|
|
126
|
-
onSessionInvalidated
|
|
138
|
+
onSessionInvalidated,
|
|
139
|
+
container
|
|
127
140
|
}, mountKey));
|
|
128
141
|
}
|
|
129
142
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcaptchaFrictionless.js","sourceRoot":"","sources":["../src/ProcaptchaFrictionless.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACN,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,WAAW,EAGX,sBAAsB,EACtB,sBAAsB,EAGtB,aAAa,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,eAAe,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAEN,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,GACpB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"ProcaptchaFrictionless.js","sourceRoot":"","sources":["../src/ProcaptchaFrictionless.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ let _prosopo_widget_skeleton = require("@prosopo/widget-skeleton");
|
|
|
8
8
|
let react = require("react");
|
|
9
9
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
10
|
//#region src/ProcaptchaFrictionless.tsx
|
|
11
|
+
var NO_SESSION_FOUND_KEY = "CAPTCHA.NO_SESSION_FOUND";
|
|
11
12
|
var ProcaptchaLoader = async () => (await import("@prosopo/procaptcha-react")).Procaptcha;
|
|
12
13
|
var ProcaptchaPuzzleLoader = async () => (await import("@prosopo/procaptcha-puzzle")).ProcaptchaPuzzle;
|
|
13
14
|
var ProcaptchaPowLoader = async () => (await import("@prosopo/procaptcha-pow")).ProcaptchaPow;
|
|
@@ -28,13 +29,14 @@ var renderPlaceholder = (theme, mode, errorMessage, isTranslationLoaded, transla
|
|
|
28
29
|
};
|
|
29
30
|
var defaultLoadingState = (attemptCount) => ({
|
|
30
31
|
loading: false,
|
|
31
|
-
attemptCount
|
|
32
|
+
attemptCount
|
|
32
33
|
});
|
|
33
34
|
var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = require_customDetectBot.default, container }) => {
|
|
34
35
|
const stateRef = (0, react.useRef)(defaultLoadingState(0));
|
|
35
36
|
const events = (0, _prosopo_procaptcha_common.getDefaultEvents)(callbacks);
|
|
36
37
|
const pendingRetryCoordsRef = (0, react.useRef)(null);
|
|
37
|
-
const
|
|
38
|
+
const sessionInvalidatedAttemptsRef = (0, react.useRef)(0);
|
|
39
|
+
const escalatedSessionIdsRef = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
38
40
|
const mountCountRef = (0, react.useRef)(0);
|
|
39
41
|
const nextMountAutoStartRef = (0, react.useRef)(false);
|
|
40
42
|
const manualStart = config.startMode === _prosopo_types.StartModeEnum.manual;
|
|
@@ -50,7 +52,7 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = re
|
|
|
50
52
|
}, [i18n, config.language]);
|
|
51
53
|
const [componentToRender, setComponentToRender] = (0, react.useState)(renderPlaceholder(config.theme, config.mode, stateRef.current.errorMessage, i18n.isInitialized, i18n.t, !manualStart, manualStart ? (event) => manualCheckboxHandlerRef.current(event) : void 0));
|
|
52
54
|
const resetState = (attemptCount) => {
|
|
53
|
-
stateRef.current = defaultLoadingState(attemptCount
|
|
55
|
+
stateRef.current = defaultLoadingState(attemptCount ?? stateRef.current.attemptCount);
|
|
54
56
|
};
|
|
55
57
|
const fallOverWithStyle = (errorMessage, errorKey) => {
|
|
56
58
|
if (errorKey === "CAPTCHA.NO_SESSION_FOUND") setTimeout(() => {
|
|
@@ -67,20 +69,28 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = re
|
|
|
67
69
|
};
|
|
68
70
|
const renderForCaptchaType = async (captchaType, frictionlessState, autoStart = false, escalationCoords) => {
|
|
69
71
|
const onEscalate = (next, newSessionId, coords) => {
|
|
72
|
+
if (escalatedSessionIdsRef.current.has(newSessionId)) return;
|
|
73
|
+
escalatedSessionIdsRef.current.add(newSessionId);
|
|
70
74
|
renderForCaptchaType(next, {
|
|
71
75
|
...frictionlessState,
|
|
72
76
|
sessionId: newSessionId
|
|
73
77
|
}, true, coords);
|
|
74
78
|
};
|
|
75
79
|
const onSessionInvalidated = (x, y) => {
|
|
76
|
-
const { shouldRestart } = require_sessionInvalidatedRecovery.handleSessionInvalidated(x, y,
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
const { shouldRestart } = require_sessionInvalidatedRecovery.handleSessionInvalidated(x, y, sessionInvalidatedAttemptsRef, pendingRetryCoordsRef);
|
|
81
|
+
if (shouldRestart) {
|
|
82
|
+
resetState(0);
|
|
83
|
+
start();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const message = i18n.isInitialized ? i18n.t(NO_SESSION_FOUND_KEY) : "No session found";
|
|
87
|
+
events.onError(new Error(message));
|
|
88
|
+
fallOverWithStyle(message, NO_SESSION_FOUND_KEY);
|
|
80
89
|
};
|
|
81
90
|
const onReload = (x, y) => {
|
|
82
91
|
pendingRetryCoordsRef.current = require_sessionInvalidatedRecovery.normaliseRetryCoords(x, y);
|
|
83
92
|
nextMountAutoStartRef.current = true;
|
|
93
|
+
sessionInvalidatedAttemptsRef.current = 0;
|
|
84
94
|
resetState(0);
|
|
85
95
|
start();
|
|
86
96
|
};
|
|
@@ -100,6 +110,7 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = re
|
|
|
100
110
|
autoStart: resumedAutoStart,
|
|
101
111
|
startCoords,
|
|
102
112
|
onSessionInvalidated,
|
|
113
|
+
container,
|
|
103
114
|
onReload
|
|
104
115
|
}, mountKey));
|
|
105
116
|
} else if (captchaType === _prosopo_types.CaptchaType.puzzle) {
|
|
@@ -111,7 +122,8 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = re
|
|
|
111
122
|
i18n,
|
|
112
123
|
autoStart: resumedAutoStart,
|
|
113
124
|
startCoords,
|
|
114
|
-
onSessionInvalidated
|
|
125
|
+
onSessionInvalidated,
|
|
126
|
+
container
|
|
115
127
|
}, mountKey));
|
|
116
128
|
} else {
|
|
117
129
|
const ProcaptchaPow = await ProcaptchaPowLoader();
|
|
@@ -123,7 +135,8 @@ var ProcaptchaFrictionless = ({ config, callbacks, restart, i18n, detectBot = re
|
|
|
123
135
|
onEscalate,
|
|
124
136
|
autoStart: resumedAutoStart,
|
|
125
137
|
startCoords,
|
|
126
|
-
onSessionInvalidated
|
|
138
|
+
onSessionInvalidated,
|
|
139
|
+
container
|
|
127
140
|
}, mountKey));
|
|
128
141
|
}
|
|
129
142
|
};
|
|
@@ -22,18 +22,25 @@ var normaliseRetryCoords = (x, y) => {
|
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
-
* Semantics of the outer recovery handler. Returns whether the caller
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* Semantics of the outer recovery handler. Returns whether the caller should
|
|
26
|
+
* proceed to re-run the frictionless flow (`start()`), and mutates the passed
|
|
27
|
+
* refs to record the attempt + pending coords.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* Bounded rather than one-shot: a persistently broken session still stops
|
|
30
|
+
* looping, but the caller is told (`exhausted`) so it can fall back visibly
|
|
31
|
+
* instead of silently doing nothing.
|
|
31
32
|
*/
|
|
32
|
-
var handleSessionInvalidated = (x, y,
|
|
33
|
-
if (
|
|
34
|
-
|
|
33
|
+
var handleSessionInvalidated = (x, y, attemptsRef, pendingCoordsRef, maxAttempts = 3) => {
|
|
34
|
+
if (attemptsRef.current >= maxAttempts) return {
|
|
35
|
+
shouldRestart: false,
|
|
36
|
+
exhausted: true
|
|
37
|
+
};
|
|
38
|
+
attemptsRef.current += 1;
|
|
35
39
|
pendingCoordsRef.current = normaliseRetryCoords(x, y);
|
|
36
|
-
return {
|
|
40
|
+
return {
|
|
41
|
+
shouldRestart: true,
|
|
42
|
+
exhausted: false
|
|
43
|
+
};
|
|
37
44
|
};
|
|
38
45
|
/**
|
|
39
46
|
* Compute the props a resumed inner widget mounts with. Consumes the
|
|
@@ -6,8 +6,10 @@ export type MutableRef<T> = {
|
|
|
6
6
|
current: T;
|
|
7
7
|
};
|
|
8
8
|
export declare const normaliseRetryCoords: (x: number | undefined, y: number | undefined) => RetryCoords | null;
|
|
9
|
-
export declare const
|
|
9
|
+
export declare const MAX_SESSION_INVALIDATED_RETRIES = 3;
|
|
10
|
+
export declare const handleSessionInvalidated: (x: number | undefined, y: number | undefined, attemptsRef: MutableRef<number>, pendingCoordsRef: MutableRef<RetryCoords | null>, maxAttempts?: number) => {
|
|
10
11
|
shouldRestart: boolean;
|
|
12
|
+
exhausted: boolean;
|
|
11
13
|
};
|
|
12
14
|
export declare const consumeRetryMountProps: (pendingCoordsRef: MutableRef<RetryCoords | null>, escalationAutoStart: boolean) => {
|
|
13
15
|
autoStart: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionInvalidatedRecovery.d.ts","sourceRoot":"","sources":["../src/sessionInvalidatedRecovery.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAMnD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAgB3C,eAAO,MAAM,oBAAoB,MAC7B,MAAM,GAAG,SAAS,KAClB,MAAM,GAAG,SAAS,KACnB,WAAW,GAAG,IAIhB,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionInvalidatedRecovery.d.ts","sourceRoot":"","sources":["../src/sessionInvalidatedRecovery.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAMnD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAgB3C,eAAO,MAAM,oBAAoB,MAC7B,MAAM,GAAG,SAAS,KAClB,MAAM,GAAG,SAAS,KACnB,WAAW,GAAG,IAIhB,CAAC;AAgBF,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAWjD,eAAO,MAAM,wBAAwB,MACjC,MAAM,GAAG,SAAS,KAClB,MAAM,GAAG,SAAS,eACR,UAAU,CAAC,MAAM,CAAC,oBACb,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,gBACnC,MAAM,KACjB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAO9C,CAAC;AAWF,eAAO,MAAM,sBAAsB,qBAChB,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,uBAC3B,OAAO,KAC1B;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;CAO5D,CAAC"}
|
|
@@ -22,18 +22,25 @@ var normaliseRetryCoords = (x, y) => {
|
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
-
* Semantics of the outer recovery handler. Returns whether the caller
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* Semantics of the outer recovery handler. Returns whether the caller should
|
|
26
|
+
* proceed to re-run the frictionless flow (`start()`), and mutates the passed
|
|
27
|
+
* refs to record the attempt + pending coords.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* Bounded rather than one-shot: a persistently broken session still stops
|
|
30
|
+
* looping, but the caller is told (`exhausted`) so it can fall back visibly
|
|
31
|
+
* instead of silently doing nothing.
|
|
31
32
|
*/
|
|
32
|
-
var handleSessionInvalidated = (x, y,
|
|
33
|
-
if (
|
|
34
|
-
|
|
33
|
+
var handleSessionInvalidated = (x, y, attemptsRef, pendingCoordsRef, maxAttempts = 3) => {
|
|
34
|
+
if (attemptsRef.current >= maxAttempts) return {
|
|
35
|
+
shouldRestart: false,
|
|
36
|
+
exhausted: true
|
|
37
|
+
};
|
|
38
|
+
attemptsRef.current += 1;
|
|
35
39
|
pendingCoordsRef.current = normaliseRetryCoords(x, y);
|
|
36
|
-
return {
|
|
40
|
+
return {
|
|
41
|
+
shouldRestart: true,
|
|
42
|
+
exhausted: false
|
|
43
|
+
};
|
|
37
44
|
};
|
|
38
45
|
/**
|
|
39
46
|
* Compute the props a resumed inner widget mounts with. Consumes the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionInvalidatedRecovery.js","sourceRoot":"","sources":["../src/sessionInvalidatedRecovery.ts"],"names":[],"mappings":"AAyCA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,CAAqB,EACrB,CAAqB,EACA,EAAE;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACjB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionInvalidatedRecovery.js","sourceRoot":"","sources":["../src/sessionInvalidatedRecovery.ts"],"names":[],"mappings":"AAyCA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,CAAqB,EACrB,CAAqB,EACA,EAAE;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACjB,CAAC,CAAC;AAgBF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAWjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACvC,CAAqB,EACrB,CAAqB,EACrB,WAA+B,EAC/B,gBAAgD,EAChD,cAAsB,+BAA+B,EACJ,EAAE;IACnD,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;QACxC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IACD,WAAW,CAAC,OAAO,IAAI,CAAC,CAAC;IACzB,gBAAgB,CAAC,OAAO,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACrC,gBAAgD,EAChD,mBAA4B,EACmC,EAAE;IACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1D,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;IAChC,OAAO;QACN,SAAS,EAAE,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;QACtD,WAAW;KACX,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalationHandoff.integration.test.d.ts","sourceRoot":"","sources":["../../src/tests/escalationHandoff.integration.test.tsx"],"names":[],"mappings":"AAyDA,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,wBAAwB,EAAE,OAAO,CAAC;CACtC"}
|