@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,217 @@
1
+ import { ExtensionLoader, buildClientMetaData, buildUpdateState, createManagerLifecycle, createSpentSessionGuard, encryptBehavioralDataForSubmit, getDefaultEvents, getProcaptchaRandomActiveProvider, getSimdReadingsForSubmit, pickIpMode, providerRetry } from "@prosopo/procaptcha-common";
2
+ import { ApiParams, CaptchaType, ProcaptchaConfigSchema, encodeProcaptchaOutput } from "@prosopo/types";
3
+ import { stringToHex } from "@polkadot/util/string";
4
+ import { ProviderApi } from "@prosopo/api";
5
+ import { ProsopoEnvError } from "@prosopo/common";
6
+ import { embedData, sleep } from "@prosopo/util";
7
+ import { randomAsHex } from "@prosopo/util-crypto";
8
+ //#region src/services/Manager.ts
9
+ var Manager = (configInput, state, onStateUpdate, callbacks, frictionlessState, getHoneypotValue, onReloadRequest) => {
10
+ const events = getDefaultEvents(callbacks);
11
+ let storedChallengeResponse;
12
+ let storedProviderApi;
13
+ let storedProviderUrl;
14
+ let storedUser;
15
+ let storedClickX;
16
+ let storedClickY;
17
+ let previousProviderUrl;
18
+ const spentSession = createSpentSessionGuard();
19
+ const defaultState = () => {
20
+ return {
21
+ showModal: false,
22
+ loading: false,
23
+ index: 0,
24
+ challenge: void 0,
25
+ solutions: void 0,
26
+ isHuman: false,
27
+ captchaApi: void 0,
28
+ account: void 0
29
+ };
30
+ };
31
+ const onFailed = () => {
32
+ updateState({
33
+ isHuman: false,
34
+ loading: false
35
+ });
36
+ events.onFailed();
37
+ resetState(frictionlessState?.restart);
38
+ };
39
+ const getConfig = () => {
40
+ const config = {
41
+ userAccountAddress: configInput.userAccountAddress || "",
42
+ ...configInput
43
+ };
44
+ if (state.account) config.userAccountAddress = state.account.account.address;
45
+ return ProcaptchaConfigSchema.parse(config);
46
+ };
47
+ const getAccount = () => {
48
+ if (!state.account) throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", { context: { error: "Account not loaded" } });
49
+ return { account: state.account };
50
+ };
51
+ const getDappAccount = () => {
52
+ if (!state.dappAccount) throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
53
+ return state.dappAccount;
54
+ };
55
+ const updateState = buildUpdateState(state, onStateUpdate);
56
+ const lifecycle = createManagerLifecycle(state, updateState);
57
+ const resetState = (frictionlessRestart) => {
58
+ lifecycle.clearTimers();
59
+ updateState(defaultState());
60
+ events.onReset();
61
+ if (frictionlessRestart) frictionlessRestart();
62
+ storedChallengeResponse = void 0;
63
+ storedProviderApi = void 0;
64
+ storedProviderUrl = void 0;
65
+ storedUser = void 0;
66
+ storedClickX = void 0;
67
+ storedClickY = void 0;
68
+ };
69
+ const setValidChallengeTimeout = () => {
70
+ lifecycle.expireSolutionAfter(getConfig().captchas.audio.solutionTimeout, () => {
71
+ updateState({ isHuman: false });
72
+ events.onExpired();
73
+ resetState(frictionlessState?.restart);
74
+ });
75
+ };
76
+ const start = async (x = 0, y = 0) => {
77
+ await providerRetry(async () => {
78
+ if (state.loading) return;
79
+ if (state.isHuman) return;
80
+ resetState();
81
+ storedClickX = x;
82
+ storedClickY = y;
83
+ updateState({ loading: true });
84
+ updateState({ attemptCount: state.attemptCount + 1 });
85
+ const config = getConfig();
86
+ const selectAccount = async () => {
87
+ if (frictionlessState) return frictionlessState.userAccount;
88
+ return new (await (ExtensionLoader(config.web2)))().getAccount(config);
89
+ };
90
+ const user = await selectAccount();
91
+ const userAccount = user.account.address;
92
+ updateState({ account: { account: { address: userAccount } } });
93
+ updateState({ dappAccount: config.account.address });
94
+ await sleep(100);
95
+ if (!config.web2 && !config.userAccountAddress) throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", { context: { error: "Account address has not been set for web3 mode" } });
96
+ let getRandomProviderResponse = void 0;
97
+ if (frictionlessState?.provider) getRandomProviderResponse = frictionlessState.provider;
98
+ else {
99
+ const currentConfig = getConfig();
100
+ getRandomProviderResponse = await getProcaptchaRandomActiveProvider(currentConfig.defaultEnvironment, pickIpMode(currentConfig), {
101
+ attempt: state.attemptCount,
102
+ excludeUrl: previousProviderUrl
103
+ });
104
+ }
105
+ const providerUrl = getRandomProviderResponse.provider.url;
106
+ previousProviderUrl = providerUrl;
107
+ const providerApi = new ProviderApi(providerUrl, getDappAccount());
108
+ const challengeSessionId = frictionlessState?.sessionId;
109
+ if (spentSession.isSpent(challengeSessionId)) {
110
+ updateState({
111
+ loading: false,
112
+ error: {
113
+ message: "No session found",
114
+ key: "CAPTCHA.NO_SESSION_FOUND"
115
+ }
116
+ });
117
+ events.onError(/* @__PURE__ */ new Error("No session found"));
118
+ return;
119
+ }
120
+ const simdReadingsOnChallenge = frictionlessState?.getSimdReadings ? await frictionlessState.getSimdReadings(0) : void 0;
121
+ const challenge = await providerApi.getAudioCaptchaChallenge(userAccount, getDappAccount(), challengeSessionId, simdReadingsOnChallenge);
122
+ spentSession.markSpent(challengeSessionId);
123
+ if (challenge.error) {
124
+ updateState({
125
+ loading: false,
126
+ error: {
127
+ message: challenge.error.message,
128
+ key: challenge.error.key || "API.UNKNOWN_ERROR"
129
+ }
130
+ });
131
+ return;
132
+ }
133
+ storedChallengeResponse = challenge;
134
+ storedProviderApi = providerApi;
135
+ storedProviderUrl = providerUrl;
136
+ storedUser = user;
137
+ updateState({ loading: false });
138
+ }, async () => {
139
+ await start(x, y);
140
+ }, () => {
141
+ resetState();
142
+ }, state.attemptCount, 3);
143
+ return storedChallengeResponse;
144
+ };
145
+ const submitSolution = async (answer, replays, audioEvents) => {
146
+ if (!storedChallengeResponse || !storedProviderApi || !storedProviderUrl || !storedUser) throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", { context: { error: "No challenge data available. Call start() first." } });
147
+ updateState({ loading: true });
148
+ try {
149
+ const challenge = storedChallengeResponse;
150
+ const providerApi = storedProviderApi;
151
+ const providerUrl = storedProviderUrl;
152
+ const user = storedUser;
153
+ const signer = user.extension?.signer;
154
+ if (!signer || !signer.signRaw) throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", { context: { error: "Signer is not defined, cannot sign message to prove account ownership" } });
155
+ const userTimestampSignature = await signer.signRaw({
156
+ address: user.account.address,
157
+ data: stringToHex(challenge[ApiParams.timestamp].toString()),
158
+ type: "bytes"
159
+ });
160
+ const encryptedBehavioralData = await encryptBehavioralDataForSubmit(frictionlessState);
161
+ let salt;
162
+ if (storedClickX !== void 0 && storedClickY !== void 0) {
163
+ const coords = [storedClickX, storedClickY];
164
+ salt = embedData(randomAsHex(coords.map((coord) => coord.toString(16).length + 4).reduce((acc, curr) => acc + curr, 0)), coords);
165
+ }
166
+ const simdReadings = await getSimdReadingsForSubmit(frictionlessState);
167
+ const clientMetaData = buildClientMetaData(getHoneypotValue?.(), getConfig().clientSessionId);
168
+ const verifiedSolution = await providerApi.submitAudioCaptchaSolution(challenge, getAccount().account.account.address, getDappAccount(), answer, replays, audioEvents, userTimestampSignature.signature.toString(), encryptedBehavioralData, salt, simdReadings, clientMetaData);
169
+ if (lifecycle.isDisposed()) return false;
170
+ if (verifiedSolution[ApiParams.verified]) {
171
+ updateState({
172
+ isHuman: true,
173
+ loading: false
174
+ });
175
+ events.onHuman(encodeProcaptchaOutput({
176
+ [ApiParams.providerUrl]: providerUrl,
177
+ [ApiParams.user]: getAccount().account.account.address,
178
+ [ApiParams.dapp]: getDappAccount(),
179
+ [ApiParams.challenge]: challenge.challenge,
180
+ [ApiParams.timestamp]: challenge.timestamp,
181
+ [ApiParams.signature]: {
182
+ [ApiParams.provider]: challenge.signature.provider,
183
+ [ApiParams.user]: { [ApiParams.timestamp]: userTimestampSignature.signature.toString() }
184
+ },
185
+ [ApiParams.captchaType]: CaptchaType.audio
186
+ }));
187
+ setValidChallengeTimeout();
188
+ return true;
189
+ }
190
+ if (onReloadRequest) {
191
+ updateState({
192
+ isHuman: false,
193
+ loading: false
194
+ });
195
+ events.onFailed();
196
+ const retryX = storedClickX;
197
+ const retryY = storedClickY;
198
+ resetState();
199
+ onReloadRequest(retryX, retryY);
200
+ return false;
201
+ }
202
+ onFailed();
203
+ return false;
204
+ } catch (error) {
205
+ updateState({ loading: false });
206
+ throw error;
207
+ }
208
+ };
209
+ return {
210
+ start,
211
+ submitSolution,
212
+ resetState,
213
+ dispose: lifecycle.dispose
214
+ };
215
+ };
216
+ //#endregion
217
+ export { Manager };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audioPlayer.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioPlayer.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/audioPlayer.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,341 @@
1
+ import { lightTheme } from "@prosopo/widget-skeleton";
2
+ import { afterEach, beforeEach, describe, expect, test, vi, } from "vitest";
3
+ import { mountAudioPlayer, } from "../components/audioPlayer.js";
4
+ import { settle } from "./domHarness.js";
5
+ import { CLIP_URI } from "./managerHarness.js";
6
+ const OTHER_CLIP_URI = "data:audio/wav;base64,UklGRiQAAABXQVZFZm10";
7
+ let player;
8
+ let onComplete;
9
+ const translator = () => ({
10
+ t: (key) => key,
11
+ isReady: () => true,
12
+ subscribe: () => () => undefined,
13
+ i18n: {},
14
+ });
15
+ const props = (overrides = {}) => ({
16
+ clip: CLIP_URI,
17
+ characterCount: 5,
18
+ onComplete,
19
+ showRetry: false,
20
+ submitting: false,
21
+ theme: lightTheme,
22
+ translator: translator(),
23
+ ...overrides,
24
+ });
25
+ const render = (playerProps) => {
26
+ if (player) {
27
+ player.update(playerProps);
28
+ }
29
+ else {
30
+ player = mountAudioPlayer(playerProps);
31
+ }
32
+ };
33
+ const overlay = () => document.body;
34
+ const find = (selector) => {
35
+ const element = overlay().querySelector(selector);
36
+ if (!element)
37
+ throw new Error(`expected ${selector} to be rendered`);
38
+ return element;
39
+ };
40
+ const clip = () => find('[data-cy="prosopo-audio-clip"]');
41
+ const playButton = () => find('[data-cy="prosopo-audio-play"]');
42
+ const submitButton = () => find('[data-cy="prosopo-audio-submit"]');
43
+ const answerInput = () => find('[data-cy="prosopo-audio-answer"]');
44
+ const liveRegion = () => find('[aria-live="polite"]');
45
+ const click = (element) => {
46
+ element.dispatchEvent(new MouseEvent("click", { bubbles: true }));
47
+ };
48
+ const type = (value) => {
49
+ const input = answerInput();
50
+ input.value = value;
51
+ input.dispatchEvent(new Event("input", { bubbles: true }));
52
+ };
53
+ const pressEnter = () => {
54
+ answerInput().dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
55
+ };
56
+ let play;
57
+ beforeEach(() => {
58
+ vi.clearAllMocks();
59
+ onComplete =
60
+ vi.fn();
61
+ play = vi.fn();
62
+ play.mockResolvedValue(undefined);
63
+ Object.defineProperty(HTMLMediaElement.prototype, "play", {
64
+ configurable: true,
65
+ writable: true,
66
+ value: play,
67
+ });
68
+ vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
69
+ callback(0);
70
+ return 0;
71
+ });
72
+ player = undefined;
73
+ });
74
+ afterEach(() => {
75
+ player?.destroy();
76
+ player = undefined;
77
+ vi.useRealTimers();
78
+ vi.restoreAllMocks();
79
+ });
80
+ describe("what it renders", () => {
81
+ test("asks for the number of characters the challenge carries", () => {
82
+ render(props({ characterCount: 6 }));
83
+ expect(overlay().textContent).toContain("WIDGET.AUDIO_INSTRUCTIONS");
84
+ });
85
+ test("loads the clip it was handed", () => {
86
+ render(props());
87
+ expect(clip().getAttribute("src")).toBe(CLIP_URI);
88
+ });
89
+ test("suppresses the browser's own controls, which can offer a download", () => {
90
+ render(props());
91
+ expect(clip().hasAttribute("controls")).toBe(false);
92
+ });
93
+ test("labels the input so a screen reader says what to type", () => {
94
+ render(props());
95
+ expect(answerInput().getAttribute("aria-label")).toBe("WIDGET.AUDIO_INPUT_LABEL");
96
+ });
97
+ test("names the dialog region so it is announced as its own thing", () => {
98
+ render(props());
99
+ expect(overlay().querySelector('[role="dialog"][aria-label="WIDGET.AUDIO_CHALLENGE_LABEL"]')).not.toBeNull();
100
+ });
101
+ test("carries a polite live region rather than an interrupting one", () => {
102
+ render(props());
103
+ expect(liveRegion().getAttribute("aria-live")).toBe("polite");
104
+ });
105
+ test("keeps the field free of autofill, which would offer the last answer", () => {
106
+ render(props());
107
+ expect(answerInput().getAttribute("autocomplete")).toBe("off");
108
+ });
109
+ test("takes the numeric keypad without the number-input behaviour", () => {
110
+ render(props());
111
+ expect(answerInput().getAttribute("type")).toBe("text");
112
+ expect(answerInput().getAttribute("inputmode")).toBe("numeric");
113
+ });
114
+ test("allows slack for separators without letting the field run away", () => {
115
+ render(props({ characterCount: 5 }));
116
+ expect(answerInput().maxLength).toBe(10);
117
+ });
118
+ test("focuses the input, so a keyboard user lands on the work", () => {
119
+ render(props());
120
+ expect(document.activeElement).toBe(answerInput());
121
+ });
122
+ });
123
+ describe("playback", () => {
124
+ test("never autoplays — the user presses play", () => {
125
+ render(props());
126
+ expect(play).not.toHaveBeenCalled();
127
+ });
128
+ test("plays the clip when asked", async () => {
129
+ render(props());
130
+ click(playButton());
131
+ await settle();
132
+ expect(play).toHaveBeenCalledTimes(1);
133
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_PLAYING");
134
+ });
135
+ test("restarts from the beginning on a replay", async () => {
136
+ render(props());
137
+ click(playButton());
138
+ await settle();
139
+ clip().currentTime = 2;
140
+ click(playButton());
141
+ await settle();
142
+ expect(clip().currentTime).toBe(0);
143
+ });
144
+ test("says so when the browser refuses to play", async () => {
145
+ play.mockRejectedValue(new Error("blocked"));
146
+ render(props());
147
+ click(playButton());
148
+ await settle();
149
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_PLAYBACK_FAILED");
150
+ });
151
+ test("announces the clip finishing", async () => {
152
+ render(props());
153
+ click(playButton());
154
+ await settle();
155
+ clip().dispatchEvent(new Event("ended"));
156
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_FINISHED");
157
+ });
158
+ });
159
+ describe("answering", () => {
160
+ test("will not submit an empty answer", () => {
161
+ render(props());
162
+ expect(submitButton().disabled).toBe(true);
163
+ click(submitButton());
164
+ expect(onComplete).not.toHaveBeenCalled();
165
+ });
166
+ test("submits what the user typed", () => {
167
+ render(props());
168
+ type("96475");
169
+ click(submitButton());
170
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
171
+ });
172
+ test("submits on Enter, so the answer can be finished from the keyboard", () => {
173
+ render(props());
174
+ type("96475");
175
+ pressEnter();
176
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
177
+ });
178
+ test("passes separators through for the provider to normalise", () => {
179
+ render(props());
180
+ type("9 6 4 7 5");
181
+ click(submitButton());
182
+ expect(onComplete).toHaveBeenCalledWith("9 6 4 7 5", 0, expect.any(Array));
183
+ });
184
+ test("reports the replays, not the plays", async () => {
185
+ render(props());
186
+ click(playButton());
187
+ await settle();
188
+ click(playButton());
189
+ await settle();
190
+ click(playButton());
191
+ await settle();
192
+ type("96475");
193
+ click(submitButton());
194
+ expect(onComplete).toHaveBeenCalledWith("96475", 2, expect.any(Array));
195
+ });
196
+ test("reports the playback and keystroke trail", async () => {
197
+ render(props());
198
+ click(playButton());
199
+ await settle();
200
+ type("9");
201
+ type("96");
202
+ click(submitButton());
203
+ const events = onComplete.mock.calls[0]?.[2];
204
+ if (!events)
205
+ throw new Error("expected an event trail");
206
+ expect(events.map((event) => event.kind)).toEqual([
207
+ "play",
208
+ "key",
209
+ "key",
210
+ ]);
211
+ expect(events.every((event) => event.t >= 0)).toBe(true);
212
+ });
213
+ test("does not resubmit while a submission is in flight", () => {
214
+ render(props());
215
+ type("96475");
216
+ render(props({ submitting: true }));
217
+ click(submitButton());
218
+ expect(onComplete).not.toHaveBeenCalled();
219
+ expect(answerInput().disabled).toBe(true);
220
+ });
221
+ });
222
+ describe("a wrong answer", () => {
223
+ test("says so, where a screen reader will hear it", () => {
224
+ render(props());
225
+ render(props({ showRetry: true }));
226
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_INCORRECT");
227
+ });
228
+ test("clears the typed answer when a fresh clip arrives", () => {
229
+ render(props());
230
+ type("11111");
231
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
232
+ expect(answerInput().value).toBe("");
233
+ });
234
+ test("starts the replay count over, so telemetry is per challenge", async () => {
235
+ render(props());
236
+ click(playButton());
237
+ await settle();
238
+ click(playButton());
239
+ await settle();
240
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
241
+ click(playButton());
242
+ await settle();
243
+ type("96475");
244
+ click(submitButton());
245
+ expect(onComplete).toHaveBeenCalledWith("96475", 0, expect.any(Array));
246
+ });
247
+ test("stops the outgoing clip rather than letting it play over the new one", () => {
248
+ const pause = vi.fn();
249
+ Object.defineProperty(HTMLMediaElement.prototype, "pause", {
250
+ configurable: true,
251
+ writable: true,
252
+ value: pause,
253
+ });
254
+ render(props());
255
+ render(props({ clip: OTHER_CLIP_URI, showRetry: true }));
256
+ expect(pause).toHaveBeenCalled();
257
+ });
258
+ });
259
+ describe("the play button's label", () => {
260
+ test("offers to play before anything has been heard", () => {
261
+ render(props());
262
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_PLAY");
263
+ });
264
+ test("says the clip is playing once the browser has started it", async () => {
265
+ render(props());
266
+ click(playButton());
267
+ await settle();
268
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_PLAYING");
269
+ });
270
+ test("offers a replay once the clip has finished", async () => {
271
+ render(props());
272
+ click(playButton());
273
+ await settle();
274
+ clip().dispatchEvent(new Event("ended"));
275
+ expect(playButton().textContent).toBe("WIDGET.AUDIO_REPLAY");
276
+ });
277
+ });
278
+ describe("arriving as a retry", () => {
279
+ test("announces the miss on a player mounted straight into a retry", () => {
280
+ render(props({ showRetry: true }));
281
+ expect(liveRegion().textContent).toBe("WIDGET.AUDIO_INCORRECT");
282
+ expect(overlay().textContent).toContain("WIDGET.AUDIO_INCORRECT");
283
+ });
284
+ test("the shake stops on its own and leaves the player usable", () => {
285
+ vi.useFakeTimers();
286
+ render(props({ showRetry: true }));
287
+ vi.advanceTimersByTime(600);
288
+ type("96475");
289
+ click(submitButton());
290
+ expect(onComplete).toHaveBeenCalledTimes(1);
291
+ });
292
+ });
293
+ describe("closing it", () => {
294
+ test("Escape asks the widget to dismiss the challenge", () => {
295
+ const onDismiss = vi.fn();
296
+ render(props({ onDismiss }));
297
+ document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
298
+ expect(onDismiss).toHaveBeenCalledTimes(1);
299
+ });
300
+ test("tearing it down removes the dialog and silences the clip", () => {
301
+ const pause = vi.fn();
302
+ Object.defineProperty(HTMLMediaElement.prototype, "pause", {
303
+ configurable: true,
304
+ writable: true,
305
+ value: pause,
306
+ });
307
+ render(props());
308
+ player?.destroy();
309
+ player = undefined;
310
+ expect(pause).toHaveBeenCalled();
311
+ expect(overlay().querySelector('[data-cy="prosopo-audio-clip"]')).toBeNull();
312
+ });
313
+ test("a torn-down player no longer submits", () => {
314
+ render(props());
315
+ type("96475");
316
+ const submit = submitButton();
317
+ player?.destroy();
318
+ player = undefined;
319
+ click(submit);
320
+ expect(onComplete).not.toHaveBeenCalled();
321
+ });
322
+ });
323
+ describe("test hooks", () => {
324
+ test("are withheld from a production build", () => {
325
+ const originalNodeEnv = process.env.NODE_ENV;
326
+ process.env.NODE_ENV = "production";
327
+ try {
328
+ render(props());
329
+ expect(overlay().querySelector('[data-cy^="prosopo-audio"]')).toBeNull();
330
+ }
331
+ finally {
332
+ if (undefined === originalNodeEnv) {
333
+ Reflect.deleteProperty(process.env, "NODE_ENV");
334
+ }
335
+ else {
336
+ process.env.NODE_ENV = originalNodeEnv;
337
+ }
338
+ }
339
+ });
340
+ });
341
+ //# sourceMappingURL=audioPlayer.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioPlayer.unit.test.js","sourceRoot":"","sources":["../../src/tests/audioPlayer.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface Mounted {
2
+ container: HTMLDivElement;
3
+ unmount: () => void;
4
+ }
5
+ export declare const mount: () => Mounted;
6
+ interface FireOptions {
7
+ trusted?: boolean;
8
+ clientX?: number;
9
+ clientY?: number;
10
+ touches?: {
11
+ clientX: number;
12
+ clientY: number;
13
+ }[];
14
+ key?: string;
15
+ }
16
+ export declare const fire: (element: Element, type: string, options?: FireOptions) => void;
17
+ export declare const fireAndReturn: (element: Element, type: string, options?: FireOptions) => Event;
18
+ export declare const settle: () => Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=domHarness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domHarness.d.ts","sourceRoot":"","sources":["../../src/tests/domHarness.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,OAAO;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,QAAO,OASxB,CAAC;AAEF,UAAU,WAAW;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AA0CD,eAAO,MAAM,IAAI,YACP,OAAO,QACV,MAAM,YACH,WAAW,KAClB,IAEF,CAAC;AAGF,eAAO,MAAM,aAAa,YAChB,OAAO,QACV,MAAM,YACH,WAAW,KAClB,KAQF,CAAC;AAGF,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAG3C,CAAC"}