diff --git a/android/build.gradle b/android/build.gradle index f1bd22a..32b4929 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -129,7 +129,7 @@ dependencies { implementation "androidx.browser:browser:1.2.0" - implementation("com.authsignal:authsignal-android:1.0.12") + implementation("com.authsignal:authsignal-android:1.0.13") } if (isNewArchitectureEnabled()) { diff --git a/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.java b/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.java index f329529..8fbb391 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.java @@ -63,10 +63,12 @@ public void enroll(String email, Promise promise) { authsignalEmail .enrollAsync(email) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("enrollError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("enrollError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "enroll_error"; + + promise.reject(errorCode, response.getError()); } else { EnrollResponse enrollResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -87,10 +89,12 @@ public void challenge(Promise promise) { authsignalEmail .challengeAsync() .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("challengeError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("challengeError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "challenge_error"; + + promise.reject(errorCode, response.getError()); } else { ChallengeResponse challengeResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -111,10 +115,12 @@ public void verify(String code, Promise promise) { authsignalEmail .verifyAsync(code) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("verifyError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("verifyError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "verify_error"; + + promise.reject(errorCode, response.getError()); } else { VerifyResponse verifyResponse = response.getData(); WritableMap map = Arguments.createMap(); diff --git a/android/src/main/java/com/authsignal/react/AuthsignalModule.java b/android/src/main/java/com/authsignal/react/AuthsignalModule.java index 139bf28..2f5f99a 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalModule.java @@ -10,6 +10,7 @@ import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; @@ -45,10 +46,10 @@ public String getName() { } @ReactMethod - public void setToken(String token, Callback callback) { + public void setToken(String token, Promise promise) { TokenCache.Companion.getShared().setToken(token); - callback.invoke(null, "token_set"); + promise.resolve("token_set"); } @ReactMethod diff --git a/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.java b/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.java index 4ec3e64..0a5697c 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.java @@ -65,10 +65,12 @@ public void signUp(String token, String username, String displayName, Promise pr authsignalPasskey .signUpAsync(token, username, displayName) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("signUpError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("signUpError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "sign_up_error"; + + promise.reject(errorCode, response.getError()); } else { SignUpResponse signUpResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -89,10 +91,12 @@ public void signIn(String action, String token, Promise promise) { authsignalPasskey .signInAsync(action, token) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("signInError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("signInError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "sign_in_error"; + + promise.reject(errorCode, response.getError()); } else { SignInResponse signInResponse = response.getData(); WritableMap map = Arguments.createMap(); diff --git a/android/src/main/java/com/authsignal/react/AuthsignalPushModule.java b/android/src/main/java/com/authsignal/react/AuthsignalPushModule.java index 2620d3b..6bb3203 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalPushModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalPushModule.java @@ -57,7 +57,7 @@ public void getCredential(Promise promise) { .getCredentialAsync() .thenAcceptAsync((response) -> { if (response.getError() != null) { - promise.reject("getCredentialError", response.getError()); + promise.reject("get_credential_error", response.getError()); } else { PushCredential credential = response.getData(); WritableMap map = Arguments.createMap(); @@ -82,10 +82,12 @@ public void addCredential( authsignalPush .addCredentialAsync(token, null) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("addCredentialError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("addCredentialError", response.getError()); + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "add_credential_error"; + + if (response.getError() != null) { + promise.reject(errorCode, response.getError()); } else { promise.resolve(response.getData()); } @@ -103,10 +105,12 @@ public void removeCredential(Promise promise) { authsignalPush .removeCredentialAsync() .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("removeCredentialError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("removeCredentialError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "remove_credential_error"; + + promise.reject(errorCode, response.getError()); } else { promise.resolve(response.getData()); } @@ -124,10 +128,12 @@ public void getChallenge(Promise promise) { authsignalPush .getChallengeAsync() .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("getChallengeError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("getChallengeError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "get_challenge_error"; + + promise.reject(errorCode, response.getError()); } else { PushChallenge challenge = response.getData(); @@ -163,10 +169,12 @@ public void updateChallenge( authsignalPush .updateChallengeAsync(challengeId, approved, verificationCode) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("updateChallengeError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("updateChallengeError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "update_challenge_error"; + + promise.reject(errorCode, response.getError()); } else { promise.resolve(response.getData()); } diff --git a/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.java b/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.java index e6e3795..e9fda1f 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.java @@ -63,10 +63,12 @@ public void enroll(String phoneNumber, Promise promise) { authsignalSMS .enrollAsync(phoneNumber) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("enrollError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("enrollError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "enroll_error"; + + promise.reject(errorCode, response.getError()); } else { EnrollResponse enrollResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -87,10 +89,12 @@ public void challenge(Promise promise) { authsignalSMS .challengeAsync() .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("challengeError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("challengeError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "challenge_error"; + + promise.reject(errorCode, response.getError()); } else { ChallengeResponse challengeResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -111,10 +115,12 @@ public void verify(String code, Promise promise) { authsignalSMS .verifyAsync(code) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("verifyError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("verifyError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "verify_error"; + + promise.reject(errorCode, response.getError()); } else { VerifyResponse verifyResponse = response.getData(); WritableMap map = Arguments.createMap(); diff --git a/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.java b/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.java index 608a2fa..f5b2b44 100644 --- a/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.java +++ b/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.java @@ -64,10 +64,12 @@ public void enroll(Promise promise) { authsignalTOTP .enrollAsync() .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("enrollError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("enrollError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "enroll_error"; + + promise.reject(errorCode, response.getError()); } else { EnrollTOTPResponse enrollResponse = response.getData(); WritableMap map = Arguments.createMap(); @@ -90,10 +92,12 @@ public void verify(String code, Promise promise) { authsignalTOTP .verifyAsync(code) .thenAcceptAsync(response -> { - if (response.getErrorType() != null) { - promise.reject("verifyError", response.getErrorType()); - } else if (response.getError() != null) { - promise.reject("verifyError", response.getError()); + if (response.getError() != null) { + String errorCode = response.getErrorType() != null ? + response.getErrorType() : + "verify_error"; + + promise.reject(errorCode, response.getError()); } else { VerifyResponse verifyResponse = response.getData(); WritableMap map = Arguments.createMap(); diff --git a/ios/AuthsignalEmailModule.swift b/ios/AuthsignalEmailModule.swift index 48865a1..33d9390 100644 --- a/ios/AuthsignalEmailModule.swift +++ b/ios/AuthsignalEmailModule.swift @@ -36,10 +36,8 @@ class AuthsignalEmailModule: NSObject { Task.init { let response = await authsignal!.enroll(email: emailStr) - if (response.errorCode != nil) { - reject("enrollError", response.errorCode, nil) - } else if (response.error != nil) { - reject("enrollError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "enroll_error", response.error, nil) } else { let enrollResponse: [String: String?] = [ "userAuthenticatorId": response.data!.userAuthenticatorId, @@ -62,10 +60,8 @@ class AuthsignalEmailModule: NSObject { Task.init { let response = await authsignal!.challenge() - if (response.errorCode != nil) { - reject("challengeError", response.errorCode, nil) - } else if (response.error != nil) { - reject("challengeError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "challenge_error", response.error, nil) } else { let challengeResponse: [String: String?] = [ "challengeId": response.data!.challengeId, @@ -91,10 +87,8 @@ class AuthsignalEmailModule: NSObject { Task.init { let response = await authsignal!.verify(code: codeStr) - if (response.errorCode != nil) { - reject("verifyError", response.errorCode, nil) - } else if (response.error != nil) { - reject("verifyError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "verify_error", response.error, nil) } else { let verifyResponse: [String: Any?] = [ "isVerified": response.data!.isVerified, diff --git a/ios/AuthsignalPasskeyModule.swift b/ios/AuthsignalPasskeyModule.swift index 3aef18b..72d0223 100644 --- a/ios/AuthsignalPasskeyModule.swift +++ b/ios/AuthsignalPasskeyModule.swift @@ -40,10 +40,8 @@ class AuthsignalPasskeyModule: NSObject { Task.init { let response = await authsignal!.signUp(token: tokenStr, username: usernameStr, displayName: displayNameStr) - if (response.errorCode != nil) { - reject("signUpError", response.errorCode, nil) - } else if (response.error != nil) { - reject("signUpError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "sign_up_error", response.error, nil) } else { let signUpResponse: [String: String?] = [ "token": response.data!.token, @@ -78,10 +76,8 @@ class AuthsignalPasskeyModule: NSObject { preferImmediatelyAvailableCredentials: preferImmediatelyAvailableCredentials ) - if (response.errorCode != nil) { - reject("signInError", response.errorCode, nil) - } else if (response.error != nil) { - reject("signInError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "sign_in_error", response.error, nil) } else { let signInResponse: [String: Any?] = [ "isVerified": response.data!.isVerified, diff --git a/ios/AuthsignalPushModule.swift b/ios/AuthsignalPushModule.swift index dc9c6ca..84860f0 100644 --- a/ios/AuthsignalPushModule.swift +++ b/ios/AuthsignalPushModule.swift @@ -65,10 +65,8 @@ class AuthsignalPushModule: NSObject { Task.init { let response = await authsignal.addCredential(token: tokenStr, keychainAccess: keychainAccess) - if let errorCode = response.errorCode { - reject("addCredentialError", errorCode, nil) - } else if let error = response.error { - reject("addCredentialError", error, nil) + if let error = response.error { + reject(response.errorCode ?? "add_credential_error", error, nil) } else { resolve(response.data) } @@ -87,10 +85,8 @@ class AuthsignalPushModule: NSObject { Task.init { let response = await authsignal.removeCredential() - if let errorCode = response.errorCode { - reject("removeCredentialError", errorCode, nil) - } else if let error = response.error { - reject("removeCredentialError", error, nil) + if let error = response.error { + reject(response.errorCode ?? "remove_credential_error", error, nil) } else { resolve(response.data) } @@ -109,10 +105,8 @@ class AuthsignalPushModule: NSObject { Task.init { let response = await authsignal.getChallenge() - if let errorCode = response.errorCode { - reject("getChallengeError", errorCode, nil) - } else if let error = response.error { - reject("getChallengeError", error, nil) + if let error = response.error { + reject(response.errorCode ?? "get_challenge_error", error, nil) } else if let data = response.data as? PushChallenge { let challenge: [String: String?] = [ "challengeId": data.challengeId, @@ -153,10 +147,8 @@ class AuthsignalPushModule: NSObject { verificationCode: code ) - if let errorCode = response.errorCode { - reject("updateChallengeError", errorCode, nil) - } else if let error = response.error { - reject("updateChallengeError", error, nil) + if let error = response.error { + reject(response.errorCode ?? "update_challenge_error", error, nil) } else { resolve(response.data) } diff --git a/ios/AuthsignalSMSModule.swift b/ios/AuthsignalSMSModule.swift index d8762cf..0720d63 100644 --- a/ios/AuthsignalSMSModule.swift +++ b/ios/AuthsignalSMSModule.swift @@ -36,10 +36,8 @@ class AuthsignalSMSModule: NSObject { Task.init { let response = await authsignal!.enroll(phoneNumber: phoneNumberStr) - if (response.errorCode != nil) { - reject("enrollError", response.errorCode, nil) - } else if (response.error != nil) { - reject("enrollError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "enroll_error", response.error, nil) } else { let enrollResponse: [String: String?] = [ "userAuthenticatorId": response.data!.userAuthenticatorId, @@ -62,10 +60,8 @@ class AuthsignalSMSModule: NSObject { Task.init { let response = await authsignal!.challenge() - if (response.errorCode != nil) { - reject("challengeError", response.errorCode, nil) - } else if (response.error != nil) { - reject("challengeError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "challenge_error", response.error, nil) } else { let challengeResponse: [String: String?] = [ "challengeId": response.data!.challengeId, @@ -91,10 +87,8 @@ class AuthsignalSMSModule: NSObject { Task.init { let response = await authsignal!.verify(code: codeStr) - if (response.errorCode != nil) { - reject("verifyError", response.errorCode, nil) - } else if (response.error != nil) { - reject("verifyError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "verify_error", response.error, nil) } else { let verifyResponse: [String: Any?] = [ "isVerified": response.data!.isVerified, diff --git a/ios/AuthsignalTOTPModule.swift b/ios/AuthsignalTOTPModule.swift index 12686f1..4b725d1 100644 --- a/ios/AuthsignalTOTPModule.swift +++ b/ios/AuthsignalTOTPModule.swift @@ -33,10 +33,8 @@ class AuthsignalTOTPModule: NSObject { Task.init { let response = await authsignal!.enroll() - if (response.errorCode != nil) { - reject("enrollError", response.errorCode, nil) - } else if (response.error != nil) { - reject("enrollError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "enroll_error", response.error, nil) } else { let enrollResponse: [String: String?] = [ "userAuthenticatorId": response.data!.userAuthenticatorId, @@ -64,10 +62,8 @@ class AuthsignalTOTPModule: NSObject { Task.init { let response = await authsignal!.verify(code: codeStr) - if (response.errorCode != nil) { - reject("verifyError", response.errorCode, nil) - } else if (response.error != nil) { - reject("verifyError", response.error, nil) + if (response.error != nil) { + reject(response.errorCode ?? "verify_error", response.error, nil) } else { let verifyResponse: [String: Any?] = [ "isVerified": response.data!.isVerified, diff --git a/package.json b/package.json index 9966d0e..3e78a63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-authsignal", - "version": "1.0.10", + "version": "1.0.11", "description": "The official Authsignal React Native library.", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/react-native-authsignal.podspec b/react-native-authsignal.podspec index 5b565cd..2fd563e 100644 --- a/react-native-authsignal.podspec +++ b/react-native-authsignal.podspec @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.source_files = "ios/**/*.{h,m,mm,swift}" s.dependency "React-Core" - s.dependency 'Authsignal', '1.0.8' + s.dependency 'Authsignal', '1.0.9' # Don't install the dependencies when we run `pod install` in the old architecture. if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then diff --git a/src/error.ts b/src/error.ts index ca325e2..c03cafe 100644 --- a/src/error.ts +++ b/src/error.ts @@ -7,24 +7,21 @@ export const LINKING_ERROR = '- You are not using Expo Go\n'; export enum ErrorCode { - tokenRequired = 'tokenRequired', - passkeySignInCanceled = 'passkeySignInCanceled', - noPasskeyCredentialAvailable = 'noPasskeyCredentialAvailable', + user_canceled = 'user_canceled', + no_credential = 'no_credential', + token_not_set = 'token_not_set', + token_required = 'token_required', + token_invalid = 'token_invalid', } -export function handleErrorCodes(ex: unknown) { - if (ex instanceof Error) { - if (ex.message === 'token_not_set') { - return { - error: 'Token is required. Call `setToken` first.', - errorCode: ErrorCode.tokenRequired, - }; - } else { - return { - error: ex.message, - }; - } - } +export function handleErrorCodes(ex: any) { + return { + error: ex.message, + errorCode: ex.code, + } as ErrorResponse; +} - throw ex; +interface ErrorResponse { + error: string; + errorCode: string; } diff --git a/src/passkey.ts b/src/passkey.ts index 0ae8e60..4210e68 100644 --- a/src/passkey.ts +++ b/src/passkey.ts @@ -1,5 +1,5 @@ import { NativeModules, Platform } from 'react-native'; -import { LINKING_ERROR, ErrorCode } from './error'; +import { LINKING_ERROR, handleErrorCodes } from './error'; import type { AuthsignalResponse, SignInResponse, @@ -70,11 +70,7 @@ export class AuthsignalPasskey { console.log(ex); } - if (ex instanceof Error) { - return { error: ex.message }; - } - - throw ex; + return handleErrorCodes(ex); } } @@ -120,24 +116,7 @@ export class AuthsignalPasskey { autofillRequestPending = false; - if (ex instanceof Error) { - switch (ex.message) { - case 'user_canceled': - return { - errorCode: ErrorCode.passkeySignInCanceled, - error: 'Passkey sign-in canceled', - }; - case 'no_credential': - return { - errorCode: ErrorCode.noPasskeyCredentialAvailable, - error: 'No passkey credential available', - }; - default: - return { error: ex.message }; - } - } - - throw ex; + return handleErrorCodes(ex); } } diff --git a/src/types.ts b/src/types.ts index 8859a13..fd2ddf2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,7 +3,7 @@ import type { ErrorCode } from './error'; export interface AuthsignalResponse { data?: T; error?: string; - errorCode?: ErrorCode; + errorCode?: ErrorCode | string; } export interface TokenPayload {