diff options
Diffstat (limited to 'packages/browser')
4 files changed, 11 insertions, 4 deletions
diff --git a/packages/browser/src/helpers/identifyAuthenticationError.ts b/packages/browser/src/helpers/identifyAuthenticationError.ts index e617a7d..d8d6960 100644 --- a/packages/browser/src/helpers/identifyAuthenticationError.ts +++ b/packages/browser/src/helpers/identifyAuthenticationError.ts @@ -18,7 +18,7 @@ export function identifyAuthenticationError({ } if (error.name === 'AbortError') { - if (options.signal === new AbortController().signal) { + if (options.signal instanceof AbortSignal) { // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16) return new WebAuthnError({ message: 'Authentication ceremony was sent an abort signal', diff --git a/packages/browser/src/helpers/identifyRegistrationError.ts b/packages/browser/src/helpers/identifyRegistrationError.ts index 4649fb9..02c9dac 100644 --- a/packages/browser/src/helpers/identifyRegistrationError.ts +++ b/packages/browser/src/helpers/identifyRegistrationError.ts @@ -18,7 +18,7 @@ export function identifyRegistrationError({ } if (error.name === 'AbortError') { - if (options.signal === new AbortController().signal) { + if (options.signal instanceof AbortSignal) { // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16) return new WebAuthnError({ message: 'Registration ceremony was sent an abort signal', diff --git a/packages/browser/src/helpers/webAuthnAbortService.test.ts b/packages/browser/src/helpers/webAuthnAbortService.test.ts index b3ec518..98c1ccd 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.test.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.test.ts @@ -7,7 +7,7 @@ test('should create a new abort signal every time', () => { expect(signal2).not.toBe(signal1); }); -test('should call abort() on existing controller when creating a new signal', () => { +test('should call abort() with AbortError on existing controller when creating a new signal', () => { // Populate `.controller` webauthnAbortService.createNewAbortSignal(); @@ -19,4 +19,9 @@ test('should call abort() on existing controller when creating a new signal', () // Generate a new signal, which should call `abort()` on the existing controller webauthnAbortService.createNewAbortSignal(); expect(abortSpy).toHaveBeenCalledTimes(1); + + // Make sure we raise an AbortError so it can be detected correctly + const abortReason = abortSpy.mock.calls[0][0]; + expect(abortReason).toBeInstanceOf(Error); + expect(abortReason.name).toEqual('AbortError'); }); diff --git a/packages/browser/src/helpers/webAuthnAbortService.ts b/packages/browser/src/helpers/webAuthnAbortService.ts index 8955526..f90b263 100644 --- a/packages/browser/src/helpers/webAuthnAbortService.ts +++ b/packages/browser/src/helpers/webAuthnAbortService.ts @@ -12,7 +12,9 @@ class WebAuthnAbortService { createNewAbortSignal() { // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get() if (this.controller) { - this.controller.abort('Cancelling existing WebAuthn API call for new one'); + const abortError = new Error('Cancelling existing WebAuthn API call for new one'); + abortError.name = 'AbortError'; + this.controller.abort(abortError); } const newController = new AbortController(); |