@prosopo/procaptcha-audio 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +52 -0
  2. package/.turbo/turbo-build$colon$tsc.log +53 -0
  3. package/.turbo/turbo-build.log +54 -0
  4. package/CHANGELOG.md +25 -0
  5. package/LICENSE +201 -0
  6. package/dist/_virtual/_rolldown/runtime.js +3 -0
  7. package/dist/cjs/components/audioPlayer.cjs +275 -0
  8. package/dist/cjs/components/procaptchaAudio.cjs +7 -0
  9. package/dist/cjs/components/procaptchaWidget.cjs +195 -0
  10. package/dist/cjs/index.cjs +8 -0
  11. package/dist/cjs/services/Manager.cjs +218 -0
  12. package/dist/components/audioPlayer.d.ts +18 -0
  13. package/dist/components/audioPlayer.d.ts.map +1 -0
  14. package/dist/components/audioPlayer.js +275 -0
  15. package/dist/components/audioPlayer.js.map +1 -0
  16. package/dist/components/procaptchaAudio.d.ts +7 -0
  17. package/dist/components/procaptchaAudio.d.ts.map +1 -0
  18. package/dist/components/procaptchaAudio.js +6 -0
  19. package/dist/components/procaptchaAudio.js.map +1 -0
  20. package/dist/components/procaptchaWidget.d.ts +7 -0
  21. package/dist/components/procaptchaWidget.d.ts.map +1 -0
  22. package/dist/components/procaptchaWidget.js +195 -0
  23. package/dist/components/procaptchaWidget.js.map +1 -0
  24. package/dist/index.d.ts +4 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +5 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/services/Manager.d.ts +10 -0
  29. package/dist/services/Manager.d.ts.map +1 -0
  30. package/dist/services/Manager.js +217 -0
  31. package/dist/services/Manager.js.map +1 -0
  32. package/dist/tests/audioPlayer.unit.test.d.ts +2 -0
  33. package/dist/tests/audioPlayer.unit.test.d.ts.map +1 -0
  34. package/dist/tests/audioPlayer.unit.test.js +341 -0
  35. package/dist/tests/audioPlayer.unit.test.js.map +1 -0
  36. package/dist/tests/domHarness.d.ts +20 -0
  37. package/dist/tests/domHarness.d.ts.map +1 -0
  38. package/dist/tests/domHarness.js +56 -0
  39. package/dist/tests/domHarness.js.map +1 -0
  40. package/dist/tests/manager.unit.test.d.ts +2 -0
  41. package/dist/tests/manager.unit.test.d.ts.map +1 -0
  42. package/dist/tests/manager.unit.test.js +627 -0
  43. package/dist/tests/manager.unit.test.js.map +1 -0
  44. package/dist/tests/managerHarness.d.ts +21 -0
  45. package/dist/tests/managerHarness.d.ts.map +1 -0
  46. package/dist/tests/managerHarness.js +67 -0
  47. package/dist/tests/managerHarness.js.map +1 -0
  48. package/dist/tests/procaptchaAudio.test-d.d.ts +2 -0
  49. package/dist/tests/procaptchaAudio.test-d.d.ts.map +1 -0
  50. package/dist/tests/procaptchaAudio.test-d.js +103 -0
  51. package/dist/tests/procaptchaAudio.test-d.js.map +1 -0
  52. package/dist/tests/procaptchaAudio.unit.test.d.ts +2 -0
  53. package/dist/tests/procaptchaAudio.unit.test.d.ts.map +1 -0
  54. package/dist/tests/procaptchaAudio.unit.test.js +93 -0
  55. package/dist/tests/procaptchaAudio.unit.test.js.map +1 -0
  56. package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
  57. package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
  58. package/dist/tests/procaptchaWidget.unit.test.js +597 -0
  59. package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
  60. package/dist/tests/setup.d.ts +2 -0
  61. package/dist/tests/setup.d.ts.map +1 -0
  62. package/dist/tests/setup.js +12 -0
  63. package/dist/tests/setup.js.map +1 -0
  64. package/package.json +70 -3
  65. package/vite.cjs.config.ts +22 -0
  66. package/vite.esm.config.ts +20 -0
  67. package/vite.test.config.ts +26 -0
  68. package/README.md +0 -3
@@ -0,0 +1,275 @@
1
+ import { Teardown, applyAttributes, applyStyles, createElement, mountChallengeSurface } from "@prosopo/procaptcha-common";
2
+ //#region src/components/audioPlayer.ts
3
+ var CONTAINER_WIDTH = 320;
4
+ var SHAKE_MS = 500;
5
+ var SHAKE_KEYFRAMES = `
6
+ @keyframes prosopo-audio-shake {
7
+ 0%, 100% { transform: translateX(0); }
8
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
9
+ 20%, 40%, 60%, 80% { transform: translateX(4px); }
10
+ }
11
+ `;
12
+ var VISUALLY_HIDDEN = {
13
+ position: "absolute",
14
+ width: "1px",
15
+ height: "1px",
16
+ overflow: "hidden",
17
+ clip: "rect(0 0 0 0)",
18
+ clipPath: "inset(50%)",
19
+ whiteSpace: "nowrap"
20
+ };
21
+ /**
22
+ * The audio challenge. Accessibility is its purpose, so:
23
+ * - every control is a native `<button>` or `<input>`, not a role on a div;
24
+ * - the `<audio>` element is hidden and driven by our buttons, because several
25
+ * browsers' native controls offer the clip as a download;
26
+ * - status changes go to a polite live region, since a screen-reader user
27
+ * cannot see the shake that marks a wrong answer;
28
+ * - nothing autoplays: browsers block audio without a gesture, and a blocked
29
+ * play() looks like a broken widget.
30
+ */
31
+ var mountAudioPlayer = (initialProps) => {
32
+ const teardown = new Teardown();
33
+ let props = initialProps;
34
+ let answer = "";
35
+ let playing = false;
36
+ let visible = false;
37
+ let shaking = false;
38
+ let shakeTimer;
39
+ let replays = 0;
40
+ let hasPlayed = false;
41
+ let events = [];
42
+ let startedAt = Date.now();
43
+ const t = (key, options) => props.translator.t(key, options);
44
+ const record = (kind) => {
45
+ events.push({
46
+ kind,
47
+ t: Date.now() - startedAt
48
+ });
49
+ };
50
+ const style = createElement("style", { text: SHAKE_KEYFRAMES });
51
+ const instruction = createElement("p", { style: {
52
+ margin: 0,
53
+ fontSize: "14px"
54
+ } });
55
+ const audio = createElement("audio", {
56
+ attributes: { preload: "auto" },
57
+ style: { display: "none" }
58
+ });
59
+ const playButton = createElement("button", { attributes: { type: "button" } });
60
+ const playRow = createElement("div", {
61
+ style: {
62
+ display: "flex",
63
+ gap: "8px"
64
+ },
65
+ children: [playButton]
66
+ });
67
+ const input = createElement("input", { attributes: {
68
+ type: "text",
69
+ inputmode: "numeric",
70
+ autocomplete: "off",
71
+ autocorrect: "off",
72
+ autocapitalize: "off",
73
+ spellcheck: "false"
74
+ } });
75
+ const submitButton = createElement("button", { attributes: { type: "button" } });
76
+ const announcer = createElement("div", {
77
+ attributes: {
78
+ "aria-live": "polite",
79
+ "aria-atomic": "true"
80
+ },
81
+ style: VISUALLY_HIDDEN
82
+ });
83
+ if ("production" !== process.env.NODE_ENV) {
84
+ applyAttributes(audio, { "data-cy": "prosopo-audio-clip" });
85
+ applyAttributes(playButton, { "data-cy": "prosopo-audio-play" });
86
+ applyAttributes(input, { "data-cy": "prosopo-audio-answer" });
87
+ applyAttributes(submitButton, { "data-cy": "prosopo-audio-submit" });
88
+ }
89
+ const panel = createElement("div", {
90
+ style: {
91
+ position: "relative",
92
+ display: "flex",
93
+ flexDirection: "column",
94
+ gap: "14px",
95
+ width: `${CONTAINER_WIDTH}px`,
96
+ boxSizing: "border-box",
97
+ padding: "20px",
98
+ borderRadius: "20px",
99
+ transition: "opacity 0.3s ease, transform 0.3s ease"
100
+ },
101
+ children: [
102
+ instruction,
103
+ audio,
104
+ playRow,
105
+ input,
106
+ submitButton,
107
+ announcer
108
+ ]
109
+ });
110
+ const surfaceProps = () => ({
111
+ show: true,
112
+ placement: props.placement,
113
+ anchor: props.anchor,
114
+ onDismiss: props.onDismiss,
115
+ scrim: visible ? "dim" : "none",
116
+ dialogLabel: t("WIDGET.AUDIO_CHALLENGE_LABEL")
117
+ });
118
+ const surface = mountChallengeSurface(surfaceProps());
119
+ surface.content.append(style, panel);
120
+ const announce = (message) => {
121
+ announcer.textContent = message;
122
+ };
123
+ const playLabel = () => {
124
+ if (playing) return t("WIDGET.AUDIO_PLAYING");
125
+ return hasPlayed || answer.length > 0 ? t("WIDGET.AUDIO_REPLAY") : t("WIDGET.AUDIO_PLAY");
126
+ };
127
+ const render = () => {
128
+ const { theme, showRetry, submitting, characterCount } = props;
129
+ const accent = showRetry ? theme.palette.error.main : theme.palette.primary.main;
130
+ const blocked = submitting || 0 === answer.length;
131
+ const buttonStyle = {
132
+ fontFamily: theme.font.fontFamily,
133
+ fontSize: "14px",
134
+ padding: "10px 16px",
135
+ borderRadius: "8px",
136
+ border: `1px solid ${accent}`,
137
+ backgroundColor: "transparent",
138
+ color: accent,
139
+ cursor: "pointer"
140
+ };
141
+ applyStyles(panel, {
142
+ backgroundColor: theme.palette.surface,
143
+ color: theme.palette.onSurface,
144
+ fontFamily: theme.font.fontFamily,
145
+ opacity: visible ? 1 : 0,
146
+ transform: visible ? "scale(1)" : "scale(0.9)",
147
+ animation: shaking ? `prosopo-audio-shake ${SHAKE_MS}ms ease` : "none"
148
+ });
149
+ instruction.textContent = showRetry ? t("WIDGET.AUDIO_INCORRECT") : t("WIDGET.AUDIO_INSTRUCTIONS", { count: characterCount });
150
+ applyStyles(instruction, { color: showRetry ? theme.palette.error.main : theme.palette.onSurface });
151
+ if (audio.getAttribute("src") !== props.clip) audio.setAttribute("src", props.clip);
152
+ playButton.textContent = playLabel();
153
+ applyStyles(playButton, {
154
+ ...buttonStyle,
155
+ flex: 1
156
+ });
157
+ input.maxLength = characterCount * 2;
158
+ input.disabled = submitting;
159
+ if (input.value !== answer) input.value = answer;
160
+ applyAttributes(input, { "aria-label": t("WIDGET.AUDIO_INPUT_LABEL", { count: characterCount }) });
161
+ applyStyles(input, {
162
+ fontFamily: theme.font.fontFamily,
163
+ fontSize: "18px",
164
+ letterSpacing: "0.3em",
165
+ textAlign: "center",
166
+ padding: "10px",
167
+ borderRadius: "8px",
168
+ border: `1px solid ${accent}`,
169
+ backgroundColor: "transparent",
170
+ color: theme.palette.onSurface
171
+ });
172
+ submitButton.textContent = submitting ? t("WIDGET.AUDIO_CHECKING") : t("WIDGET.AUDIO_SUBMIT");
173
+ submitButton.disabled = blocked;
174
+ applyStyles(submitButton, {
175
+ ...buttonStyle,
176
+ backgroundColor: theme.palette.primary.main,
177
+ borderColor: theme.palette.primary.main,
178
+ color: theme.palette.primary.contrastText,
179
+ opacity: blocked ? .5 : 1,
180
+ cursor: blocked ? "not-allowed" : "pointer"
181
+ });
182
+ surface.update(surfaceProps());
183
+ };
184
+ const play = () => {
185
+ const isReplay = hasPlayed;
186
+ audio.currentTime = 0;
187
+ record(isReplay ? "replay" : "play");
188
+ if (isReplay) replays += 1;
189
+ hasPlayed = true;
190
+ const clipAtPlay = props.clip;
191
+ audio.play().then(() => {
192
+ if (clipAtPlay !== props.clip) return;
193
+ playing = true;
194
+ announce(t("WIDGET.AUDIO_PLAYING"));
195
+ render();
196
+ }, () => {
197
+ playing = false;
198
+ announce(t("WIDGET.AUDIO_PLAYBACK_FAILED"));
199
+ render();
200
+ });
201
+ render();
202
+ };
203
+ const submit = () => {
204
+ if (props.submitting || 0 === answer.length) return;
205
+ props.onComplete(answer, replays, [...events]);
206
+ };
207
+ teardown.addEventListener(playButton, "click", play);
208
+ teardown.addEventListener(submitButton, "click", submit);
209
+ teardown.addEventListener(input, "input", () => {
210
+ record("key");
211
+ answer = input.value;
212
+ render();
213
+ });
214
+ teardown.addEventListener(input, "keydown", (event) => {
215
+ if (!(event instanceof KeyboardEvent) || "Enter" !== event.key) return;
216
+ event.preventDefault();
217
+ submit();
218
+ });
219
+ teardown.addEventListener(audio, "ended", () => {
220
+ playing = false;
221
+ announce(t("WIDGET.AUDIO_FINISHED"));
222
+ render();
223
+ });
224
+ teardown.addEventListener(audio, "pause", () => {
225
+ playing = false;
226
+ render();
227
+ });
228
+ const resetForNewClip = () => {
229
+ audio.pause();
230
+ audio.currentTime = 0;
231
+ answer = "";
232
+ playing = false;
233
+ replays = 0;
234
+ hasPlayed = false;
235
+ events = [];
236
+ startedAt = Date.now();
237
+ };
238
+ const startShake = () => {
239
+ shaking = true;
240
+ announce(t("WIDGET.AUDIO_INCORRECT"));
241
+ if (void 0 !== shakeTimer) clearTimeout(shakeTimer);
242
+ shakeTimer = setTimeout(() => {
243
+ shakeTimer = void 0;
244
+ shaking = false;
245
+ render();
246
+ }, SHAKE_MS);
247
+ };
248
+ teardown.add(() => {
249
+ if (void 0 !== shakeTimer) clearTimeout(shakeTimer);
250
+ });
251
+ if (props.showRetry) startShake();
252
+ render();
253
+ input.focus();
254
+ const frameRequest = requestAnimationFrame(() => {
255
+ visible = true;
256
+ render();
257
+ });
258
+ teardown.add(() => cancelAnimationFrame(frameRequest));
259
+ return {
260
+ update: (nextProps) => {
261
+ const previous = props;
262
+ props = nextProps;
263
+ if (nextProps.clip !== previous.clip) resetForNewClip();
264
+ if (nextProps.showRetry && !previous.showRetry) startShake();
265
+ render();
266
+ },
267
+ destroy: () => {
268
+ teardown.run();
269
+ audio.pause();
270
+ surface.destroy();
271
+ }
272
+ };
273
+ };
274
+ //#endregion
275
+ export { mountAudioPlayer };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioPlayer.js","sourceRoot":"","sources":["../../src/components/audioPlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type WidgetMountFn } from "@prosopo/procaptcha-common";
2
+ import type { ProcaptchaAudioHandle } from "./procaptchaWidget.js";
3
+ export type { ProcaptchaAudioHandle };
4
+ export type ProcaptchaAudioMountFn = WidgetMountFn<ProcaptchaAudioHandle>;
5
+ export declare const loadProcaptchaAudio: () => Promise<ProcaptchaAudioMountFn>;
6
+ export declare const mountProcaptchaAudio: ProcaptchaAudioMountFn;
7
+ //# sourceMappingURL=procaptchaAudio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaAudio.d.ts","sourceRoot":"","sources":["../../src/components/procaptchaAudio.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;AAE1E,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,sBAAsB,CACR,CAAC;AAEpE,eAAO,MAAM,oBAAoB,EAAE,sBACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { lazyMount } from "@prosopo/procaptcha-common";
2
+ //#region src/components/procaptchaAudio.ts
3
+ var loadProcaptchaAudio = async () => (await import("./procaptchaWidget.js")).mountProcaptchaAudioWidget;
4
+ var mountProcaptchaAudio = lazyMount(loadProcaptchaAudio);
5
+ //#endregion
6
+ export { loadProcaptchaAudio, mountProcaptchaAudio };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaAudio.js","sourceRoot":"","sources":["../../src/components/procaptchaAudio.ts"],"names":[],"mappings":"AAcA,OAAO,EAAsB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAO3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAqC,EAAE,CAC9E,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,0BAA0B,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAChC,SAAS,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type ProcaptchaProps } from "@prosopo/types";
2
+ export interface ProcaptchaAudioHandle {
3
+ destroy(): void;
4
+ }
5
+ export declare const mountProcaptchaAudioWidget: (container: HTMLElement, props: ProcaptchaProps) => ProcaptchaAudioHandle;
6
+ export default mountProcaptchaAudioWidget;
7
+ //# sourceMappingURL=procaptchaWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaWidget.d.ts","sourceRoot":"","sources":["../../src/components/procaptchaWidget.ts"],"names":[],"mappings":"AAmCA,OAAO,EAIN,KAAK,eAAe,EAEpB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,qBAAqB;IACrC,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,eAAO,MAAM,0BAA0B,cAC3B,WAAW,SACf,eAAe,KACpB,qBAoTF,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -0,0 +1,195 @@
1
+ import "../_virtual/_rolldown/runtime.js";
2
+ import { Manager } from "../services/Manager.js";
3
+ import { mountAudioPlayer } from "./audioPlayer.js";
4
+ import { createTranslator, loadI18next, localiseErrorMessage } from "@prosopo/locale";
5
+ import { PROCAPTCHA_EXECUTE_EVENT, Teardown, buildUpdateState, createElement, createProcaptchaState, createRenderScheduler, mountCheckbox, mountHoneypot, trustedClickCoords } from "@prosopo/procaptcha-common";
6
+ import { ModeEnum } from "@prosopo/types";
7
+ import { darkTheme, lightTheme } from "@prosopo/widget-skeleton";
8
+ //#region src/components/procaptchaWidget.ts
9
+ var mountProcaptchaAudioWidget = (container, props) => {
10
+ const teardown = new Teardown();
11
+ const config = props.config;
12
+ const i18n = props.i18n;
13
+ const frictionlessState = props.frictionlessState;
14
+ const callbacks = props.callbacks || {};
15
+ const translator = createTranslator(i18n);
16
+ const isInvisible = ModeEnum.invisible === config.mode;
17
+ const theme = "light" === config.theme ? lightTheme : darkTheme;
18
+ const store = createProcaptchaState();
19
+ let loading = false;
20
+ let audioPhase = "checkbox";
21
+ let challengeData = null;
22
+ let showRetry = true === props.startShowRetry;
23
+ let lastError = store.state.error;
24
+ let lastCoords = null;
25
+ let sessionInvalidatedFired = false;
26
+ let honeypot;
27
+ let checkbox;
28
+ let player;
29
+ const onReload = props.onReload;
30
+ const updateState = buildUpdateState(store.state, store.update);
31
+ const manager = Manager(config, store.state, updateState, callbacks, frictionlessState, () => honeypot?.getValue(), onReload ? (x, y) => onReload(x, y, { showRetry: true }) : void 0);
32
+ const root = createElement("div");
33
+ container.appendChild(root);
34
+ if (frictionlessState?.hp) honeypot = mountHoneypot(root, { encodedQuestion: frictionlessState.hp });
35
+ const reportError = (error) => {
36
+ callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));
37
+ };
38
+ const returnToCheckbox = () => {
39
+ audioPhase = "checkbox";
40
+ challengeData = null;
41
+ showRetry = false;
42
+ };
43
+ const showChallenge = (challenge) => {
44
+ if (challenge) {
45
+ challengeData = challenge;
46
+ audioPhase = "answering";
47
+ }
48
+ };
49
+ const handleAudioComplete = async (answer, replays, audioEvents) => {
50
+ audioPhase = "submitting";
51
+ scheduler.schedule();
52
+ let verified = false;
53
+ try {
54
+ verified = await manager.submitSolution(answer, replays, audioEvents);
55
+ } catch (error) {
56
+ reportError(error);
57
+ }
58
+ if (verified) {
59
+ returnToCheckbox();
60
+ loading = false;
61
+ scheduler.schedule();
62
+ return;
63
+ }
64
+ showRetry = true;
65
+ if (onReload) {
66
+ scheduler.schedule();
67
+ return;
68
+ }
69
+ audioPhase = "answering";
70
+ scheduler.schedule();
71
+ try {
72
+ const newChallenge = await manager.start();
73
+ if (newChallenge) challengeData = newChallenge;
74
+ else returnToCheckbox();
75
+ } catch {
76
+ returnToCheckbox();
77
+ }
78
+ loading = false;
79
+ scheduler.schedule();
80
+ };
81
+ const handleDismiss = () => {
82
+ returnToCheckbox();
83
+ loading = false;
84
+ scheduler.schedule();
85
+ };
86
+ const playerProps = (challenge) => ({
87
+ clip: challenge.clip,
88
+ characterCount: challenge.characterCount,
89
+ onComplete: (answer, replays, events) => {
90
+ handleAudioComplete(answer, replays, events);
91
+ },
92
+ showRetry,
93
+ submitting: "submitting" === audioPhase,
94
+ theme,
95
+ translator,
96
+ placement: config.placement,
97
+ anchor: props.container,
98
+ onDismiss: handleDismiss
99
+ });
100
+ const runErrorEffect = () => {
101
+ if (store.state.error === lastError) return;
102
+ lastError = store.state.error;
103
+ if (!store.state.error) return;
104
+ loading = false;
105
+ returnToCheckbox();
106
+ if ("CAPTCHA.NO_SESSION_FOUND" !== store.state.error.key) return;
107
+ if (props.onSessionInvalidated && !sessionInvalidatedFired || void 0 !== frictionlessState) {
108
+ loading = true;
109
+ store.update({ error: void 0 });
110
+ }
111
+ if (props.onSessionInvalidated && !sessionInvalidatedFired) {
112
+ sessionInvalidatedFired = true;
113
+ props.onSessionInvalidated(lastCoords?.x, lastCoords?.y);
114
+ return;
115
+ }
116
+ if (frictionlessState) {
117
+ const timer = setTimeout(() => {
118
+ frictionlessState.restart();
119
+ }, 100);
120
+ teardown.add(() => clearTimeout(timer));
121
+ }
122
+ };
123
+ const render = () => {
124
+ runErrorEffect();
125
+ if (("answering" === audioPhase || "submitting" === audioPhase) && null !== challengeData) if (void 0 === player) player = mountAudioPlayer(playerProps(challengeData));
126
+ else player.update(playerProps(challengeData));
127
+ else {
128
+ player?.destroy();
129
+ player = void 0;
130
+ }
131
+ checkbox?.update(checkboxProps());
132
+ };
133
+ const scheduler = createRenderScheduler(render);
134
+ const beginChallenge = async (coords) => {
135
+ if (loading) return;
136
+ loading = true;
137
+ showRetry = false;
138
+ scheduler.schedule();
139
+ if (coords) lastCoords = coords;
140
+ try {
141
+ showChallenge(await manager.start(coords?.x, coords?.y));
142
+ } catch (error) {
143
+ reportError(error);
144
+ } finally {
145
+ loading = false;
146
+ scheduler.schedule();
147
+ }
148
+ };
149
+ const checkboxProps = () => ({
150
+ checked: store.state.isHuman,
151
+ theme,
152
+ labelText: translator.isReady() ? translator.t("WIDGET.I_AM_HUMAN") : "",
153
+ error: store.state.error ? localiseErrorMessage(translator.i18n, store.state.error) : void 0,
154
+ loadingText: translator.t("WIDGET.CHECKING", { defaultValue: "Checking that you are human" }),
155
+ loading: loading || "submitting" === audioPhase,
156
+ onChange: (event) => beginChallenge(trustedClickCoords(event))
157
+ });
158
+ if (!isInvisible) checkbox = mountCheckbox(root, checkboxProps());
159
+ teardown.add(scheduler.cancel);
160
+ teardown.add(store.subscribe(scheduler.schedule));
161
+ teardown.add(translator.subscribe(scheduler.schedule));
162
+ const handleExecute = () => {
163
+ beginChallenge();
164
+ };
165
+ if (props.container) teardown.addEventListener(props.container, PROCAPTCHA_EXECUTE_EVENT, handleExecute);
166
+ if (isInvisible) teardown.addEventListener(document, PROCAPTCHA_EXECUTE_EVENT, handleExecute);
167
+ if (config.language) if (i18n) {
168
+ if (i18n.language !== config.language) i18n.changeLanguage(config.language);
169
+ } else loadI18next(false, config.language);
170
+ if (props.autoStart) {
171
+ loading = true;
172
+ const coords = props.startCoords;
173
+ lastCoords = coords ?? null;
174
+ scheduler.schedule();
175
+ manager.start(coords?.x ?? 0, coords?.y ?? 0).then((challenge) => {
176
+ showChallenge(challenge);
177
+ loading = false;
178
+ scheduler.schedule();
179
+ }, () => {
180
+ loading = false;
181
+ scheduler.schedule();
182
+ });
183
+ }
184
+ render();
185
+ return { destroy: () => {
186
+ manager.dispose();
187
+ teardown.run();
188
+ player?.destroy();
189
+ checkbox?.destroy();
190
+ honeypot?.destroy();
191
+ root.parentNode?.removeChild(root);
192
+ } };
193
+ };
194
+ //#endregion
195
+ export { mountProcaptchaAudioWidget as default, mountProcaptchaAudioWidget };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procaptchaWidget.js","sourceRoot":"","sources":["../../src/components/procaptchaWidget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./components/procaptchaWidget.js";
2
+ export * from "./components/procaptchaAudio.js";
3
+ export * from "./components/audioPlayer.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import "./_virtual/_rolldown/runtime.js";
2
+ import { mountAudioPlayer } from "./components/audioPlayer.js";
3
+ import mountProcaptchaAudioWidget from "./components/procaptchaWidget.js";
4
+ import { loadProcaptchaAudio, mountProcaptchaAudio } from "./components/procaptchaAudio.js";
5
+ export { loadProcaptchaAudio, mountAudioPlayer, mountProcaptchaAudio, mountProcaptchaAudioWidget };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type AudioEvent, type FrictionlessState, type GetAudioCaptchaResponse, type ProcaptchaCallbacks, type ProcaptchaClientConfigInput, type ProcaptchaState, type ProcaptchaStateUpdateFn } from "@prosopo/types";
2
+ interface AudioManagerHandle {
3
+ start: (x?: number, y?: number) => Promise<GetAudioCaptchaResponse | undefined>;
4
+ submitSolution: (answer: string, replays: number, audioEvents: AudioEvent[]) => Promise<boolean>;
5
+ resetState: (frictionlessRestart?: () => void) => void;
6
+ dispose: () => void;
7
+ }
8
+ export declare const Manager: (configInput: ProcaptchaClientConfigInput, state: ProcaptchaState, onStateUpdate: ProcaptchaStateUpdateFn, callbacks: ProcaptchaCallbacks, frictionlessState?: FrictionlessState, getHoneypotValue?: () => string | undefined, onReloadRequest?: (x?: number, y?: number) => void) => AudioManagerHandle;
9
+ export {};
10
+ //# sourceMappingURL=Manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"AA8BA,OAAO,EAGN,KAAK,UAAU,EAEf,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAEhC,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,UAAU,kBAAkB;IAC3B,KAAK,EAAE,CACN,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,KACN,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;IAClD,cAAc,EAAE,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,UAAU,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,gBACN,2BAA2B,SACjC,eAAe,iBACP,uBAAuB,aAC3B,mBAAmB,sBACV,iBAAiB,qBAClB,MAAM,MAAM,GAAG,SAAS,oBAEzB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,KAChD,kBA4WF,CAAC"}