@prosopo/procaptcha-common 2.11.17 → 2.11.19
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 +22 -20
- package/.turbo/turbo-build$colon$tsc.log +18 -18
- package/.turbo/turbo-build.log +23 -19
- package/CHANGELOG.md +33 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/callbacks/defaultCallbacks.js +100 -152
- package/dist/callbacks/defaultEvents.js +6 -6
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/callbacks/defaultCallbacks.cjs +100 -151
- package/dist/cjs/callbacks/defaultEvents.cjs +6 -6
- package/dist/cjs/elements/form.cjs +10 -17
- package/dist/cjs/elements/window.cjs +17 -15
- package/dist/cjs/extensionLoader.cjs +3 -25
- package/dist/cjs/index.cjs +29 -27
- package/dist/cjs/providers.cjs +29 -42
- package/dist/cjs/reactComponents/Checkbox.cjs +102 -121
- package/dist/cjs/reactComponents/Honeypot.cjs +54 -62
- package/dist/cjs/reactComponents/Reload.cjs +59 -80
- package/dist/cjs/reactComponents/TestModeBanner.cjs +31 -44
- package/dist/cjs/simdReadings.cjs +24 -0
- package/dist/cjs/state/builder.cjs +70 -83
- package/dist/elements/form.js +10 -18
- package/dist/elements/window.js +18 -17
- package/dist/extensionLoader.js +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -19
- package/dist/index.js.map +1 -1
- package/dist/providers.js +29 -45
- package/dist/reactComponents/Checkbox.js +99 -121
- package/dist/reactComponents/Honeypot.js +53 -61
- package/dist/reactComponents/Reload.js +58 -80
- package/dist/reactComponents/TestModeBanner.js +30 -45
- package/dist/simdReadings.d.ts +6 -0
- package/dist/simdReadings.d.ts.map +1 -0
- package/dist/simdReadings.js +23 -0
- package/dist/simdReadings.js.map +1 -0
- package/dist/state/builder.js +71 -85
- package/dist/tests/simdReadings.test.d.ts +2 -0
- package/dist/tests/simdReadings.test.d.ts.map +1 -0
- package/dist/tests/simdReadings.test.js +76 -0
- package/dist/tests/simdReadings.test.js.map +1 -0
- package/package.json +8 -8
- package/src/index.ts +1 -0
- package/src/simdReadings.ts +45 -0
- package/src/tests/simdReadings.test.ts +149 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,67 +1,59 @@
|
|
|
1
|
+
import { forwardRef, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
1
2
|
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { forwardRef, useId, useMemo, useRef, useState, useEffect } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
//#region src/reactComponents/Honeypot.tsx
|
|
5
|
+
var offscreenStyle = {
|
|
6
|
+
position: "absolute",
|
|
7
|
+
left: "-9999px",
|
|
8
|
+
top: "-9999px",
|
|
9
|
+
width: "1px",
|
|
10
|
+
height: "1px",
|
|
11
|
+
overflow: "hidden",
|
|
12
|
+
opacity: 0
|
|
12
13
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
var decodeBase64Utf8 = (b64) => {
|
|
15
|
+
const binary = atob(b64);
|
|
16
|
+
const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
17
|
+
return new TextDecoder().decode(bytes);
|
|
17
18
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
var findAncestorForm = (anchor) => {
|
|
20
|
+
const root = anchor.getRootNode();
|
|
21
|
+
const lightDomEntry = root instanceof ShadowRoot ? root.host : anchor;
|
|
22
|
+
return lightDomEntry instanceof Element ? lightDomEntry.closest("form") : null;
|
|
22
23
|
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"aria-hidden": "true"
|
|
57
|
-
}
|
|
58
|
-
)
|
|
59
|
-
] }) }),
|
|
60
|
-
portalTarget
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
);
|
|
24
|
+
var Honeypot = forwardRef(({ encodedQuestion }, ref) => {
|
|
25
|
+
const id = useId();
|
|
26
|
+
const detachedFormId = `${id}-d`;
|
|
27
|
+
const question = useMemo(() => decodeBase64Utf8(encodedQuestion), [encodedQuestion]);
|
|
28
|
+
const anchorRef = useRef(null);
|
|
29
|
+
const [portalTarget, setPortalTarget] = useState(null);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
const anchor = anchorRef.current;
|
|
32
|
+
if (!anchor) return;
|
|
33
|
+
setPortalTarget(findAncestorForm(anchor) ?? document.body);
|
|
34
|
+
}, []);
|
|
35
|
+
if (typeof document === "undefined") return null;
|
|
36
|
+
if (!portalTarget) return /* @__PURE__ */ jsx("span", {
|
|
37
|
+
ref: anchorRef,
|
|
38
|
+
"aria-hidden": "true",
|
|
39
|
+
style: { display: "none" }
|
|
40
|
+
});
|
|
41
|
+
return createPortal(/* @__PURE__ */ jsx("div", {
|
|
42
|
+
"aria-hidden": "true",
|
|
43
|
+
style: offscreenStyle,
|
|
44
|
+
children: /* @__PURE__ */ jsxs("label", { children: [question, /* @__PURE__ */ jsx("input", {
|
|
45
|
+
ref,
|
|
46
|
+
id,
|
|
47
|
+
form: detachedFormId,
|
|
48
|
+
type: "text",
|
|
49
|
+
name: "email_confirm",
|
|
50
|
+
defaultValue: "",
|
|
51
|
+
tabIndex: -1,
|
|
52
|
+
autoComplete: "off",
|
|
53
|
+
"aria-hidden": "true"
|
|
54
|
+
})] })
|
|
55
|
+
}), portalTarget);
|
|
56
|
+
});
|
|
64
57
|
Honeypot.displayName = "Honeypot";
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
58
|
+
//#endregion
|
|
59
|
+
export { Honeypot };
|
|
@@ -1,83 +1,61 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { lightTheme, darkTheme } from "@prosopo/widget-skeleton";
|
|
1
|
+
import { darkTheme, lightTheme } from "@prosopo/widget-skeleton";
|
|
3
2
|
import { useMemo, useState } from "react";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
themeColor,
|
|
16
|
-
onReload
|
|
17
|
-
}) => {
|
|
18
|
-
const theme = useMemo(
|
|
19
|
-
() => themeColor === "light" ? lightTheme : darkTheme,
|
|
20
|
-
[themeColor]
|
|
21
|
-
);
|
|
22
|
-
const [hover, setHover] = useState(false);
|
|
23
|
-
const buttonStyle = useMemo(() => {
|
|
24
|
-
const baseStyle = {
|
|
25
|
-
...buttonStyleBase,
|
|
26
|
-
backgroundColor: theme.palette.background.default,
|
|
27
|
-
color: hover ? theme.palette.primary.contrastText : theme.palette.background.contrastText,
|
|
28
|
-
border: `1px solid ${theme.palette.grey[500]}`,
|
|
29
|
-
borderRadius: "50%",
|
|
30
|
-
transition: "background-color 0.3s",
|
|
31
|
-
boxShadow: `0px 1px 3px 0px ${theme.palette.grey[500]}`,
|
|
32
|
-
justifyContent: "center",
|
|
33
|
-
alignItems: "center",
|
|
34
|
-
margin: "0 auto"
|
|
35
|
-
};
|
|
36
|
-
return {
|
|
37
|
-
...baseStyle,
|
|
38
|
-
backgroundColor: hover ? theme.palette.grey[700] : theme.palette.background.default
|
|
39
|
-
};
|
|
40
|
-
}, [hover, theme]);
|
|
41
|
-
return /* @__PURE__ */ jsx(
|
|
42
|
-
"button",
|
|
43
|
-
{
|
|
44
|
-
className: "reload-button",
|
|
45
|
-
"aria-label": "Reload",
|
|
46
|
-
type: "button",
|
|
47
|
-
style: buttonStyle,
|
|
48
|
-
onMouseEnter: () => setHover(true),
|
|
49
|
-
onMouseLeave: () => setHover(false),
|
|
50
|
-
onClick: (e) => {
|
|
51
|
-
e.preventDefault();
|
|
52
|
-
onReload();
|
|
53
|
-
},
|
|
54
|
-
children: /* @__PURE__ */ jsxs(
|
|
55
|
-
"svg",
|
|
56
|
-
{
|
|
57
|
-
width: "16px",
|
|
58
|
-
height: "16px",
|
|
59
|
-
viewBox: "0 0 16 16",
|
|
60
|
-
version: "1.1",
|
|
61
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
62
|
-
xmlnsXlink: "http://www.w3.org/1999/xlink",
|
|
63
|
-
style: { display: "flex" },
|
|
64
|
-
children: [
|
|
65
|
-
/* @__PURE__ */ jsx("title", { children: "reload" }),
|
|
66
|
-
/* @__PURE__ */ jsx(
|
|
67
|
-
"path",
|
|
68
|
-
{
|
|
69
|
-
shapeRendering: "optimizeQuality",
|
|
70
|
-
fill: hover ? theme.palette.primary.contrastText : theme.palette.grey[700],
|
|
71
|
-
transform: "scale(0.0416)",
|
|
72
|
-
d: "M234.666667,149.333333 L234.666667,106.666667 L314.564847,106.664112 C287.579138,67.9778918 242.745446,42.6666667 192,42.6666667 C109.525477,42.6666667 42.6666667,109.525477 42.6666667,192 C42.6666667,274.474523 109.525477,341.333333 192,341.333333 C268.201293,341.333333 331.072074,284.258623 340.195444,210.526102 L382.537159,215.817985 C370.807686,310.617565 289.973536,384 192,384 C85.961328,384 1.42108547e-14,298.038672 1.42108547e-14,192 C1.42108547e-14,85.961328 85.961328,1.42108547e-14 192,1.42108547e-14 C252.316171,1.42108547e-14 306.136355,27.8126321 341.335366,71.3127128 L341.333333,1.42108547e-14 L384,1.42108547e-14 L384,149.333333 L234.666667,149.333333 Z"
|
|
73
|
-
}
|
|
74
|
-
)
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
);
|
|
3
|
+
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
4
|
+
//#region src/reactComponents/Reload.tsx
|
|
5
|
+
var buttonStyleBase = {
|
|
6
|
+
border: "none",
|
|
7
|
+
paddingTop: "6px",
|
|
8
|
+
paddingBottom: "6px",
|
|
9
|
+
cursor: "pointer",
|
|
10
|
+
height: "39px",
|
|
11
|
+
width: "39px",
|
|
12
|
+
borderRadius: "50%",
|
|
13
|
+
display: "flex"
|
|
80
14
|
};
|
|
81
|
-
|
|
82
|
-
|
|
15
|
+
var ReloadButton = ({ themeColor, onReload }) => {
|
|
16
|
+
const theme = useMemo(() => themeColor === "light" ? lightTheme : darkTheme, [themeColor]);
|
|
17
|
+
const [hover, setHover] = useState(false);
|
|
18
|
+
return /* @__PURE__ */ jsx("button", {
|
|
19
|
+
className: "reload-button",
|
|
20
|
+
"aria-label": "Reload",
|
|
21
|
+
type: "button",
|
|
22
|
+
style: useMemo(() => {
|
|
23
|
+
return {
|
|
24
|
+
...buttonStyleBase,
|
|
25
|
+
backgroundColor: theme.palette.background.default,
|
|
26
|
+
color: hover ? theme.palette.primary.contrastText : theme.palette.background.contrastText,
|
|
27
|
+
border: `1px solid ${theme.palette.grey[500]}`,
|
|
28
|
+
borderRadius: "50%",
|
|
29
|
+
transition: "background-color 0.3s",
|
|
30
|
+
boxShadow: `0px 1px 3px 0px ${theme.palette.grey[500]}`,
|
|
31
|
+
justifyContent: "center",
|
|
32
|
+
alignItems: "center",
|
|
33
|
+
margin: "0 auto",
|
|
34
|
+
backgroundColor: hover ? theme.palette.grey[700] : theme.palette.background.default
|
|
35
|
+
};
|
|
36
|
+
}, [hover, theme]),
|
|
37
|
+
onMouseEnter: () => setHover(true),
|
|
38
|
+
onMouseLeave: () => setHover(false),
|
|
39
|
+
onClick: (e) => {
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
onReload();
|
|
42
|
+
},
|
|
43
|
+
children: /* @__PURE__ */ jsxs("svg", {
|
|
44
|
+
width: "16px",
|
|
45
|
+
height: "16px",
|
|
46
|
+
viewBox: "0 0 16 16",
|
|
47
|
+
version: "1.1",
|
|
48
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
49
|
+
xmlnsXlink: "http://www.w3.org/1999/xlink",
|
|
50
|
+
style: { display: "flex" },
|
|
51
|
+
children: [/* @__PURE__ */ jsx("title", { children: "reload" }), /* @__PURE__ */ jsx("path", {
|
|
52
|
+
shapeRendering: "optimizeQuality",
|
|
53
|
+
fill: hover ? theme.palette.primary.contrastText : theme.palette.grey[700],
|
|
54
|
+
transform: "scale(0.0416)",
|
|
55
|
+
d: "M234.666667,149.333333 L234.666667,106.666667 L314.564847,106.664112 C287.579138,67.9778918 242.745446,42.6666667 192,42.6666667 C109.525477,42.6666667 42.6666667,109.525477 42.6666667,192 C42.6666667,274.474523 109.525477,341.333333 192,341.333333 C268.201293,341.333333 331.072074,284.258623 340.195444,210.526102 L382.537159,215.817985 C370.807686,310.617565 289.973536,384 192,384 C85.961328,384 1.42108547e-14,298.038672 1.42108547e-14,192 C1.42108547e-14,85.961328 85.961328,1.42108547e-14 192,1.42108547e-14 C252.316171,1.42108547e-14 306.136355,27.8126321 341.335366,71.3127128 L341.333333,1.42108547e-14 L384,1.42108547e-14 L384,149.333333 L234.666667,149.333333 Z"
|
|
56
|
+
})]
|
|
57
|
+
})
|
|
58
|
+
});
|
|
83
59
|
};
|
|
60
|
+
//#endregion
|
|
61
|
+
export { ReloadButton };
|
|
@@ -1,47 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getTestSiteKeyMode, TestSiteKeyMode } from "@prosopo/types";
|
|
1
|
+
import { TestSiteKeyMode, getTestSiteKeyMode } from "@prosopo/types";
|
|
3
2
|
import { useEffect } from "react";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
color: "#664d03",
|
|
32
|
-
border: "1px solid #ffe69c",
|
|
33
|
-
borderRadius: "4px",
|
|
34
|
-
fontSize: "11px",
|
|
35
|
-
lineHeight: "1.3",
|
|
36
|
-
fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
|
37
|
-
textAlign: "center"
|
|
38
|
-
},
|
|
39
|
-
children: `⚠ Test mode: this site key ${action}. Do not use in production.`
|
|
40
|
-
}
|
|
41
|
-
)
|
|
42
|
-
);
|
|
43
|
-
};
|
|
44
|
-
export {
|
|
45
|
-
TestModeBanner,
|
|
46
|
-
TestModeBanner as default
|
|
3
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
4
|
+
//#region src/reactComponents/TestModeBanner.tsx
|
|
5
|
+
/** @jsxImportSource @emotion/react */
|
|
6
|
+
var TestModeBanner = ({ siteKey }) => {
|
|
7
|
+
const mode = getTestSiteKeyMode(siteKey);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (mode !== null) console.warn(`[Procaptcha] WARNING: site key "${siteKey}" is a TEST key that ALWAYS ${mode === TestSiteKeyMode.Pass ? "PASSES" : "FAILS"}. Never use it in production.`);
|
|
10
|
+
}, [mode, siteKey]);
|
|
11
|
+
if (mode === null) return null;
|
|
12
|
+
return /* @__PURE__ */ jsx("div", {
|
|
13
|
+
role: "alert",
|
|
14
|
+
"data-cy": "test-mode-banner",
|
|
15
|
+
css: {
|
|
16
|
+
width: "100%",
|
|
17
|
+
boxSizing: "border-box",
|
|
18
|
+
padding: "6px 10px",
|
|
19
|
+
backgroundColor: "#fff3cd",
|
|
20
|
+
color: "#664d03",
|
|
21
|
+
border: "1px solid #ffe69c",
|
|
22
|
+
borderRadius: "4px",
|
|
23
|
+
fontSize: "11px",
|
|
24
|
+
lineHeight: "1.3",
|
|
25
|
+
fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
|
26
|
+
textAlign: "center"
|
|
27
|
+
},
|
|
28
|
+
children: `⚠ Test mode: this site key ${mode === TestSiteKeyMode.Pass ? "ALWAYS PASSES" : "ALWAYS FAILS"}. Do not use in production.`
|
|
29
|
+
});
|
|
47
30
|
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { TestModeBanner, TestModeBanner as default };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const SIMD_READINGS_SUBMIT_TIMEOUT_MS = 5000;
|
|
2
|
+
export interface SimdReadingsSource {
|
|
3
|
+
getSimdReadings?: (timeoutMs?: number) => Promise<string | undefined>;
|
|
4
|
+
}
|
|
5
|
+
export declare const getSimdReadingsForSubmit: (source: SimdReadingsSource | undefined, timeoutMs?: number) => Promise<string | undefined>;
|
|
6
|
+
//# sourceMappingURL=simdReadings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simdReadings.d.ts","sourceRoot":"","sources":["../src/simdReadings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAClC,eAAe,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtE;AAED,eAAO,MAAM,wBAAwB,WAC5B,kBAAkB,GAAG,SAAS,cAC3B,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAqB5B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/simdReadings.ts
|
|
2
|
+
var SIMD_READINGS_SUBMIT_TIMEOUT_MS = 5e3;
|
|
3
|
+
var getSimdReadingsForSubmit = async (source, timeoutMs = SIMD_READINGS_SUBMIT_TIMEOUT_MS) => {
|
|
4
|
+
if (!source?.getSimdReadings) return void 0;
|
|
5
|
+
const { getSimdReadings } = source;
|
|
6
|
+
let readings;
|
|
7
|
+
try {
|
|
8
|
+
readings = Promise.resolve(getSimdReadings.call(source, timeoutMs));
|
|
9
|
+
} catch {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
let timeoutId;
|
|
13
|
+
const timeout = new Promise((resolve) => {
|
|
14
|
+
timeoutId = setTimeout(() => resolve(void 0), timeoutMs);
|
|
15
|
+
});
|
|
16
|
+
try {
|
|
17
|
+
return await Promise.race([readings.catch(() => void 0), timeout]);
|
|
18
|
+
} finally {
|
|
19
|
+
if (timeoutId !== void 0) clearTimeout(timeoutId);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { SIMD_READINGS_SUBMIT_TIMEOUT_MS, getSimdReadingsForSubmit };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simdReadings.js","sourceRoot":"","sources":["../src/simdReadings.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAMpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC5C,MAAsC,EACtC,YAAoB,+BAA+B,EACrB,EAAE;IAChC,IAAI,CAAC,MAAM,EAAE,eAAe;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEnC,IAAI,QAAqC,CAAC;IAC1C,IAAI,CAAC;QACJ,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,SAAoD,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QAClD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACV,IAAI,SAAS,KAAK,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;AACF,CAAC,CAAC"}
|
package/dist/state/builder.js
CHANGED
|
@@ -1,88 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//#region src/state/builder.ts
|
|
2
|
+
var buildUpdateState = (state, onStateUpdate) => (nextState) => {
|
|
3
|
+
Object.assign(state, nextState);
|
|
4
|
+
onStateUpdate(nextState);
|
|
4
5
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a ref to be the same format as useState.
|
|
8
|
+
* @param useRef the useRef function from react
|
|
9
|
+
* @param defaultValue the default value if the state is not already initialised
|
|
10
|
+
* @returns a ref in the same format as a state, e.g. [value, setValue]
|
|
11
|
+
*/
|
|
12
|
+
var useRefAsState = (useRef, defaultValue) => {
|
|
13
|
+
const ref = useRef(defaultValue);
|
|
14
|
+
const setter = (value) => {
|
|
15
|
+
ref.current = value;
|
|
16
|
+
};
|
|
17
|
+
return [ref.current, setter];
|
|
12
18
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (nextState.showModal !== void 0) setShowModal(nextState.showModal);
|
|
67
|
-
if (nextState.challenge !== void 0) setChallenge(nextState.challenge);
|
|
68
|
-
if (nextState.loading !== void 0) setLoading(nextState.loading);
|
|
69
|
-
if (nextState.showModal !== void 0) setShowModal(nextState.showModal);
|
|
70
|
-
if (nextState.dappAccount !== void 0)
|
|
71
|
-
setDappAccount(nextState.dappAccount);
|
|
72
|
-
if (nextState.submission !== void 0)
|
|
73
|
-
setSubmission(nextState.submission);
|
|
74
|
-
if (nextState.timeout !== void 0) setTimeout(nextState.timeout);
|
|
75
|
-
if (nextState.successfullChallengeTimeout !== void 0)
|
|
76
|
-
setSuccessfullChallengeTimeout(nextState.timeout);
|
|
77
|
-
if (nextState.sendData !== void 0) setSendData(nextState.sendData);
|
|
78
|
-
if (nextState.attemptCount !== void 0)
|
|
79
|
-
setAttemptCount(nextState.attemptCount);
|
|
80
|
-
if (nextState.error !== void 0) setError(nextState.error);
|
|
81
|
-
if (nextState.sessionId !== void 0) setSessionId(nextState.sessionId);
|
|
82
|
-
}
|
|
83
|
-
];
|
|
84
|
-
};
|
|
85
|
-
export {
|
|
86
|
-
buildUpdateState,
|
|
87
|
-
useProcaptcha
|
|
19
|
+
var useProcaptcha = (useState, useRef) => {
|
|
20
|
+
const [isHuman, setIsHuman] = useState(false);
|
|
21
|
+
const [index, setIndex] = useState(0);
|
|
22
|
+
const [solutions, setSolutions] = useState([]);
|
|
23
|
+
const [captchaApi, setCaptchaApi] = useRefAsState(useRef, void 0);
|
|
24
|
+
const [showModal, setShowModal] = useState(false);
|
|
25
|
+
const [challenge, setChallenge] = useState(void 0);
|
|
26
|
+
const [loading, setLoading] = useState(false);
|
|
27
|
+
const [account, setAccount] = useState(void 0);
|
|
28
|
+
const [dappAccount, setDappAccount] = useState(void 0);
|
|
29
|
+
const [submission, setSubmission] = useRefAsState(useRef, void 0);
|
|
30
|
+
const [timeout, setTimeout] = useRefAsState(useRef, void 0);
|
|
31
|
+
const [successfullChallengeTimeout, setSuccessfullChallengeTimeout] = useRefAsState(useRef, void 0);
|
|
32
|
+
const [sendData, setSendData] = useState(false);
|
|
33
|
+
const [attemptCount, setAttemptCount] = useState(0);
|
|
34
|
+
const [error, setError] = useState(void 0);
|
|
35
|
+
const [sessionId, setSessionId] = useState(void 0);
|
|
36
|
+
return [{
|
|
37
|
+
isHuman,
|
|
38
|
+
index,
|
|
39
|
+
solutions,
|
|
40
|
+
captchaApi,
|
|
41
|
+
showModal,
|
|
42
|
+
challenge,
|
|
43
|
+
loading,
|
|
44
|
+
account,
|
|
45
|
+
dappAccount,
|
|
46
|
+
submission,
|
|
47
|
+
timeout,
|
|
48
|
+
successfullChallengeTimeout,
|
|
49
|
+
sendData,
|
|
50
|
+
attemptCount,
|
|
51
|
+
error,
|
|
52
|
+
sessionId
|
|
53
|
+
}, (nextState) => {
|
|
54
|
+
if (nextState.account !== void 0) setAccount(nextState.account);
|
|
55
|
+
if (nextState.isHuman !== void 0) setIsHuman(nextState.isHuman);
|
|
56
|
+
if (nextState.index !== void 0) setIndex(nextState.index);
|
|
57
|
+
if (nextState.solutions !== void 0) setSolutions(nextState.solutions.slice());
|
|
58
|
+
if (nextState.captchaApi !== void 0) setCaptchaApi(nextState.captchaApi);
|
|
59
|
+
if (nextState.showModal !== void 0) setShowModal(nextState.showModal);
|
|
60
|
+
if (nextState.challenge !== void 0) setChallenge(nextState.challenge);
|
|
61
|
+
if (nextState.loading !== void 0) setLoading(nextState.loading);
|
|
62
|
+
if (nextState.showModal !== void 0) setShowModal(nextState.showModal);
|
|
63
|
+
if (nextState.dappAccount !== void 0) setDappAccount(nextState.dappAccount);
|
|
64
|
+
if (nextState.submission !== void 0) setSubmission(nextState.submission);
|
|
65
|
+
if (nextState.timeout !== void 0) setTimeout(nextState.timeout);
|
|
66
|
+
if (nextState.successfullChallengeTimeout !== void 0) setSuccessfullChallengeTimeout(nextState.timeout);
|
|
67
|
+
if (nextState.sendData !== void 0) setSendData(nextState.sendData);
|
|
68
|
+
if (nextState.attemptCount !== void 0) setAttemptCount(nextState.attemptCount);
|
|
69
|
+
if (nextState.error !== void 0) setError(nextState.error);
|
|
70
|
+
if (nextState.sessionId !== void 0) setSessionId(nextState.sessionId);
|
|
71
|
+
}];
|
|
88
72
|
};
|
|
73
|
+
//#endregion
|
|
74
|
+
export { buildUpdateState, useProcaptcha };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simdReadings.test.d.ts","sourceRoot":"","sources":["../../src/tests/simdReadings.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { SIMD_READINGS_SUBMIT_TIMEOUT_MS, getSimdReadingsForSubmit, } from "../simdReadings.js";
|
|
3
|
+
afterEach(() => {
|
|
4
|
+
vi.useRealTimers();
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
describe("getSimdReadingsForSubmit", () => {
|
|
8
|
+
it("blocks on the readings and returns them", async () => {
|
|
9
|
+
const getSimdReadings = vi.fn(async () => "ENCODED_SIMD");
|
|
10
|
+
const source = { getSimdReadings };
|
|
11
|
+
await expect(getSimdReadingsForSubmit(source)).resolves.toBe("ENCODED_SIMD");
|
|
12
|
+
});
|
|
13
|
+
it("passes the submit timeout budget down to the detector", async () => {
|
|
14
|
+
const getSimdReadings = vi.fn(async () => "ENCODED_SIMD");
|
|
15
|
+
await getSimdReadingsForSubmit({ getSimdReadings });
|
|
16
|
+
expect(getSimdReadings).toHaveBeenCalledWith(SIMD_READINGS_SUBMIT_TIMEOUT_MS);
|
|
17
|
+
expect(SIMD_READINGS_SUBMIT_TIMEOUT_MS).toBe(5000);
|
|
18
|
+
});
|
|
19
|
+
it("waits for slow readings that still land inside the budget", async () => {
|
|
20
|
+
vi.useFakeTimers();
|
|
21
|
+
const getSimdReadings = vi.fn(() => new Promise((resolve) => {
|
|
22
|
+
setTimeout(() => resolve("LATE_SIMD"), 4000);
|
|
23
|
+
}));
|
|
24
|
+
const pending = getSimdReadingsForSubmit({ getSimdReadings });
|
|
25
|
+
await vi.advanceTimersByTimeAsync(4000);
|
|
26
|
+
await expect(pending).resolves.toBe("LATE_SIMD");
|
|
27
|
+
});
|
|
28
|
+
it("gives up at the timeout when the detector never resolves", async () => {
|
|
29
|
+
vi.useFakeTimers();
|
|
30
|
+
const getSimdReadings = vi.fn(() => new Promise(() => undefined));
|
|
31
|
+
const pending = getSimdReadingsForSubmit({ getSimdReadings });
|
|
32
|
+
await vi.advanceTimersByTimeAsync(SIMD_READINGS_SUBMIT_TIMEOUT_MS);
|
|
33
|
+
await expect(pending).resolves.toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it("honours an explicit timeout override", async () => {
|
|
36
|
+
vi.useFakeTimers();
|
|
37
|
+
const getSimdReadings = vi.fn(() => new Promise(() => undefined));
|
|
38
|
+
const pending = getSimdReadingsForSubmit({ getSimdReadings }, 100);
|
|
39
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
40
|
+
await expect(pending).resolves.toBeUndefined();
|
|
41
|
+
expect(getSimdReadings).toHaveBeenCalledWith(100);
|
|
42
|
+
});
|
|
43
|
+
it("resolves undefined when the readings promise rejects", async () => {
|
|
44
|
+
const getSimdReadings = vi.fn(async () => {
|
|
45
|
+
throw new Error("benchmark failed");
|
|
46
|
+
});
|
|
47
|
+
await expect(getSimdReadingsForSubmit({ getSimdReadings })).resolves.toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
it("resolves undefined when the accessor throws synchronously", async () => {
|
|
50
|
+
const getSimdReadings = vi.fn(() => {
|
|
51
|
+
throw new Error("detector exploded");
|
|
52
|
+
});
|
|
53
|
+
await expect(getSimdReadingsForSubmit({ getSimdReadings })).resolves.toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
it("resolves undefined without a source or accessor", async () => {
|
|
56
|
+
await expect(getSimdReadingsForSubmit(undefined)).resolves.toBeUndefined();
|
|
57
|
+
await expect(getSimdReadingsForSubmit({})).resolves.toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
it("calls the accessor with the source as `this`", async () => {
|
|
60
|
+
const source = {
|
|
61
|
+
marker: "SIMD_FROM_THIS",
|
|
62
|
+
getSimdReadings() {
|
|
63
|
+
return Promise.resolve(this.marker);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
await expect(getSimdReadingsForSubmit(source)).resolves.toBe("SIMD_FROM_THIS");
|
|
67
|
+
});
|
|
68
|
+
it("clears the timeout timer once readings arrive", async () => {
|
|
69
|
+
vi.useFakeTimers();
|
|
70
|
+
const clearTimeoutSpy = vi.spyOn(globalThis, "clearTimeout");
|
|
71
|
+
const getSimdReadings = vi.fn(async () => "ENCODED_SIMD");
|
|
72
|
+
await getSimdReadingsForSubmit({ getSimdReadings });
|
|
73
|
+
expect(clearTimeoutSpy).toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=simdReadings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simdReadings.test.js","sourceRoot":"","sources":["../../src/tests/simdReadings.test.ts"],"names":[],"mappings":"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"}
|