UNPKG

voluptasmollitia

Version:
90 lines (81 loc) 2.81 kB
/** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { MultiFactorError as MultiFactorErrorPublic, OperationType } from '../model/public_types'; import { FirebaseError } from '@firebase/util'; import { AuthInternal } from '../model/auth'; import { IdTokenResponse } from '../model/id_token'; import { AuthErrorCode } from '../core/errors'; import { UserInternal } from '../model/user'; import { AuthCredential } from '../core/credentials'; import { IdTokenMfaResponse } from '../api/authentication/mfa'; export class MultiFactorError extends FirebaseError implements MultiFactorErrorPublic { readonly name = 'FirebaseError'; readonly code: string; readonly appName: string; readonly serverResponse: IdTokenMfaResponse; readonly tenantId?: string; private constructor( auth: AuthInternal, error: FirebaseError, readonly operationType: OperationType, readonly user?: UserInternal ) { super(error.code, error.message); // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work Object.setPrototypeOf(this, MultiFactorError.prototype); this.appName = auth.name; this.code = error.code; this.tenantId = auth.tenantId ?? undefined; this.serverResponse = error.customData! .serverResponse as IdTokenMfaResponse; } static _fromErrorAndOperation( auth: AuthInternal, error: FirebaseError, operationType: OperationType, user?: UserInternal ): MultiFactorError { return new MultiFactorError(auth, error, operationType, user); } } export function _processCredentialSavingMfaContextIfNecessary( auth: AuthInternal, operationType: OperationType, credential: AuthCredential, user?: UserInternal ): Promise<IdTokenResponse> { const idTokenProvider = operationType === OperationType.REAUTHENTICATE ? credential._getReauthenticationResolver(auth) : credential._getIdTokenResponse(auth); return idTokenProvider.catch(error => { if (error.code === `auth/${AuthErrorCode.MFA_REQUIRED}`) { throw MultiFactorError._fromErrorAndOperation( auth, error, operationType, user ); } throw error; }); }