/*! firebase-admin v5.2.1 */
"use strict";
/*!
 * Copyright 2017 Google Inc.
 *
 * 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.
 */
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
var deep_copy_1 = require("../utils/deep-copy");
/**
 * Firebase error code structure. This extends Error.
 *
 * @param {ErrorInfo} errorInfo The error information (code and message).
 * @constructor
 */
var FirebaseError = (function (_super) {
    __extends(FirebaseError, _super);
    function FirebaseError(errorInfo) {
        var _this = _super.call(this, errorInfo.message) || this;
        _this.errorInfo = errorInfo;
        /* tslint:disable:max-line-length */
        // Set the prototype explicitly. See the following link for more details:
        // https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work
        /* tslint:enable:max-line-length */
        _this.__proto__ = FirebaseError.prototype;
        return _this;
    }
    Object.defineProperty(FirebaseError.prototype, "code", {
        /** @return {string} The error code. */
        get: function () {
            return this.errorInfo.code;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(FirebaseError.prototype, "message", {
        /** @return {string} The error message. */
        get: function () {
            return this.errorInfo.message;
        },
        enumerable: true,
        configurable: true
    });
    /** @return {Object} The object representation of the error. */
    FirebaseError.prototype.toJSON = function () {
        return {
            code: this.code,
            message: this.message,
        };
    };
    return FirebaseError;
}(Error));
exports.FirebaseError = FirebaseError;
/**
 * Firebase App error code structure. This extends FirebaseError.
 *
 * @param {string} code The error code.
 * @param {string} message The error message.
 * @constructor
 */
var FirebaseAppError = (function (_super) {
    __extends(FirebaseAppError, _super);
    function FirebaseAppError(code, message) {
        return _super.call(this, {
            code: 'app/' + code,
            message: message,
        }) || this;
    }
    return FirebaseAppError;
}(FirebaseError));
exports.FirebaseAppError = FirebaseAppError;
/**
 * Firebase Auth error code structure. This extends FirebaseError.
 *
 * @param {ErrorInfo} info The error code info.
 * @param {string} [message] The error message. This will override the default
 *     message if provided.
 * @constructor
 */
var FirebaseAuthError = (function (_super) {
    __extends(FirebaseAuthError, _super);
    function FirebaseAuthError(info, message) {
        // Override default message if custom message provided.
        return _super.call(this, { code: 'auth/' + info.code, message: message || info.message }) || this;
    }
    /**
     * Creates the developer-facing error corresponding to the backend error code.
     *
     * @param {string} serverErrorCode The server error code.
     * @param {string} [message] The error message. The default message is used
     *     if not provided.
     * @param {Object} [rawServerResponse] The error's raw server response.
     * @return {FirebaseAuthError} The corresponding developer-facing error.
     */
    FirebaseAuthError.fromServerError = function (serverErrorCode, message, rawServerResponse) {
        // If not found, default to internal error.
        var clientCodeKey = AUTH_SERVER_TO_CLIENT_CODE[serverErrorCode] || 'INTERNAL_ERROR';
        var error = deep_copy_1.deepCopy(AuthClientErrorCode[clientCodeKey]);
        error.message = message || error.message;
        if (clientCodeKey === 'INTERNAL_ERROR' && typeof rawServerResponse !== 'undefined') {
            try {
                error.message += " Raw server response: \"" + JSON.stringify(rawServerResponse) + "\"";
            }
            catch (e) {
                // Ignore JSON parsing error.
            }
        }
        return new FirebaseAuthError(error);
    };
    return FirebaseAuthError;
}(FirebaseError));
exports.FirebaseAuthError = FirebaseAuthError;
/**
 * Firebase Messaging error code structure. This extends FirebaseError.
 *
 * @param {ErrorInfo} info The error code info.
 * @param {string} [message] The error message. This will override the default message if provided.
 * @constructor
 */
var FirebaseMessagingError = (function (_super) {
    __extends(FirebaseMessagingError, _super);
    function FirebaseMessagingError(info, message) {
        // Override default message if custom message provided.
        return _super.call(this, { code: 'messaging/' + info.code, message: message || info.message }) || this;
    }
    /**
     * Creates the developer-facing error corresponding to the backend error code.
     *
     * @param {string} serverErrorCode The server error code.
     * @param {string} [message] The error message. The default message is used
     *     if not provided.
     * @param {Object} [rawServerResponse] The error's raw server response.
     * @return {FirebaseMessagingError} The corresponding developer-facing error.
     */
    FirebaseMessagingError.fromServerError = function (serverErrorCode, message, rawServerResponse) {
        // If not found, default to unknown error.
        var clientCodeKey = MESSAGING_SERVER_TO_CLIENT_CODE[serverErrorCode] || 'UNKNOWN_ERROR';
        var error = deep_copy_1.deepCopy(MessagingClientErrorCode[clientCodeKey]);
        error.message = message || error.message;
        if (clientCodeKey === 'UNKNOWN_ERROR' && typeof rawServerResponse !== 'undefined') {
            try {
                error.message += " Raw server response: \"" + JSON.stringify(rawServerResponse) + "\"";
            }
            catch (e) {
                // Ignore JSON parsing error.
            }
        }
        return new FirebaseMessagingError(error);
    };
    return FirebaseMessagingError;
}(FirebaseError));
exports.FirebaseMessagingError = FirebaseMessagingError;
/**
 * App client error codes and their default messages.
 */
var AppErrorCodes = (function () {
    function AppErrorCodes() {
    }
    AppErrorCodes.APP_DELETED = 'app-deleted';
    AppErrorCodes.DUPLICATE_APP = 'duplicate-app';
    AppErrorCodes.INTERNAL_ERROR = 'internal-error';
    AppErrorCodes.INVALID_APP_NAME = 'invalid-app-name';
    AppErrorCodes.INVALID_APP_OPTIONS = 'invalid-app-options';
    AppErrorCodes.INVALID_CREDENTIAL = 'invalid-credential';
    AppErrorCodes.NETWORK_ERROR = 'network-error';
    AppErrorCodes.NETWORK_TIMEOUT = 'network-timeout';
    AppErrorCodes.NO_APP = 'no-app';
    AppErrorCodes.UNABLE_TO_PARSE_RESPONSE = 'unable-to-parse-response';
    return AppErrorCodes;
}());
exports.AppErrorCodes = AppErrorCodes;
;
/**
 * Auth client error codes and their default messages.
 */
var AuthClientErrorCode = (function () {
    function AuthClientErrorCode() {
    }
    AuthClientErrorCode.INVALID_ARGUMENT = {
        code: 'argument-error',
        message: 'Invalid argument provided.',
    };
    AuthClientErrorCode.EMAIL_ALREADY_EXISTS = {
        code: 'email-already-exists',
        message: 'The email address is already in use by another account.',
    };
    AuthClientErrorCode.INTERNAL_ERROR = {
        code: 'internal-error',
        message: 'An internal error has occurred.',
    };
    AuthClientErrorCode.INVALID_CREDENTIAL = {
        code: 'invalid-credential',
        message: 'Invalid credential object provided.',
    };
    AuthClientErrorCode.INVALID_DISABLED_FIELD = {
        code: 'invalid-disabled-field',
        message: 'The disabled field must be a boolean.',
    };
    AuthClientErrorCode.INVALID_DISPLAY_NAME = {
        code: 'invalid-display-name',
        message: 'The displayName field must be a valid string.',
    };
    AuthClientErrorCode.INVALID_EMAIL_VERIFIED = {
        code: 'invalid-email-verified',
        message: 'The emailVerified field must be a boolean.',
    };
    AuthClientErrorCode.INVALID_EMAIL = {
        code: 'invalid-email',
        message: 'The email address is improperly formatted.',
    };
    AuthClientErrorCode.INVALID_PASSWORD = {
        code: 'invalid-password',
        message: 'The password must be a string with at least 6 characters.',
    };
    AuthClientErrorCode.INVALID_PHONE_NUMBER = {
        code: 'invalid-phone-number',
        message: 'The phone number must be a non-empty E.164 standard compliant identifier ' +
            'string.',
    };
    AuthClientErrorCode.INVALID_PHOTO_URL = {
        code: 'invalid-photo-url',
        message: 'The photoURL field must be a valid URL.',
    };
    AuthClientErrorCode.INVALID_UID = {
        code: 'invalid-uid',
        message: 'The uid must be a non-empty string with at most 128 characters.',
    };
    AuthClientErrorCode.MISSING_UID = {
        code: 'missing-uid',
        message: 'A uid identifier is required for the current operation.',
    };
    AuthClientErrorCode.OPERATION_NOT_ALLOWED = {
        code: 'operation-not-allowed',
        message: 'The given sign-in provider is disabled for this Firebase project. ' +
            'Enable it in the Firebase console, under the sign-in method tab of the ' +
            'Auth section.',
    };
    AuthClientErrorCode.PHONE_NUMBER_ALREADY_EXISTS = {
        code: 'phone-number-already-exists',
        message: 'The user with the provided phone number already exists.',
    };
    AuthClientErrorCode.PROJECT_NOT_FOUND = {
        code: 'project-not-found',
        message: 'No Firebase project was found for the provided credential.',
    };
    AuthClientErrorCode.INSUFFICIENT_PERMISSION = {
        code: 'insufficient-permission',
        message: 'Credential implementation provided to initializeApp() via the "credential" property ' +
            'has insufficient permission to access the requested resource. See ' +
            'https://firebase.google.com/docs/admin/setup for details on how to authenticate this SDK ' +
            'with appropriate permissions.',
    };
    AuthClientErrorCode.UID_ALREADY_EXISTS = {
        code: 'uid-already-exists',
        message: 'The user with the provided uid already exists.',
    };
    AuthClientErrorCode.USER_NOT_FOUND = {
        code: 'user-not-found',
        message: 'There is no user record corresponding to the provided identifier.',
    };
    return AuthClientErrorCode;
}());
exports.AuthClientErrorCode = AuthClientErrorCode;
;
/**
 * Messaging client error codes and their default messages.
 */
var MessagingClientErrorCode = (function () {
    function MessagingClientErrorCode() {
    }
    MessagingClientErrorCode.INVALID_ARGUMENT = {
        code: 'invalid-argument',
        message: 'Invalid argument provided.',
    };
    MessagingClientErrorCode.INVALID_RECIPIENT = {
        code: 'invalid-recipient',
        message: 'Invalid message recipient provided.',
    };
    MessagingClientErrorCode.INVALID_PAYLOAD = {
        code: 'invalid-payload',
        message: 'Invalid message payload provided.',
    };
    MessagingClientErrorCode.INVALID_DATA_PAYLOAD_KEY = {
        code: 'invalid-data-payload-key',
        message: 'The data message payload contains an invalid key. See the reference documentation ' +
            'for the DataMessagePayload type for restricted keys.',
    };
    MessagingClientErrorCode.PAYLOAD_SIZE_LIMIT_EXCEEDED = {
        code: 'payload-size-limit-exceeded',
        message: 'The provided message payload exceeds the FCM size limits. See the error documentation ' +
            'for more details.',
    };
    MessagingClientErrorCode.INVALID_OPTIONS = {
        code: 'invalid-options',
        message: 'Invalid message options provided.',
    };
    MessagingClientErrorCode.INVALID_REGISTRATION_TOKEN = {
        code: 'invalid-registration-token',
        message: 'Invalid registration token provided. Make sure it matches the registration token ' +
            'the client app receives from registering with FCM.',
    };
    MessagingClientErrorCode.REGISTRATION_TOKEN_NOT_REGISTERED = {
        code: 'registration-token-not-registered',
        message: 'The provided registration token is not registered. A previously valid registration ' +
            'token can be unregistered for a variety of reasons. See the error documentation for more ' +
            'details. Remove this registration token and stop using it to send messages.',
    };
    MessagingClientErrorCode.MISMATCHED_CREDENTIAL = {
        code: 'mismatched-credential',
        message: 'The credential used to authenticate this SDK does not have permission to send ' +
            'messages to the device corresponding to the provided registration token. Make sure the ' +
            'credential and registration token both belong to the same Firebase project.',
    };
    MessagingClientErrorCode.INVALID_PACKAGE_NAME = {
        code: 'invalid-package-name',
        message: 'The message was addressed to a registration token whose package name does not match ' +
            'the provided "restrictedPackageName" option.',
    };
    MessagingClientErrorCode.DEVICE_MESSAGE_RATE_EXCEEDED = {
        code: 'device-message-rate-exceeded',
        message: 'The rate of messages to a particular device is too high. Reduce the number of ' +
            'messages sent to this device and do not immediately retry sending to this device.',
    };
    MessagingClientErrorCode.TOPICS_MESSAGE_RATE_EXCEEDED = {
        code: 'topics-message-rate-exceeded',
        message: 'The rate of messages to subscribers to a particular topic is too high. Reduce the ' +
            'number of messages sent for this topic, and do not immediately retry sending to this topic.',
    };
    MessagingClientErrorCode.INVALID_APNS_CREDENTIALS = {
        code: 'invalid-apns-credentials',
        message: 'A message targeted to an iOS device could not be sent because the required APNs ' +
            'SSL certificate was not uploaded or has expired. Check the validity of your development ' +
            'and production certificates.',
    };
    MessagingClientErrorCode.TOO_MANY_TOPICS = {
        code: 'too-many-topics',
        message: 'The maximum number of topics the provided registration token can be subscribed to ' +
            'has been exceeded.',
    };
    MessagingClientErrorCode.AUTHENTICATION_ERROR = {
        code: 'authentication-error',
        message: 'An error occurred when trying to authenticate to the FCM servers. Make sure the ' +
            'credential used to authenticate this SDK has the proper permissions. See ' +
            'https://firebase.google.com/docs/admin/setup for setup instructions.',
    };
    MessagingClientErrorCode.SERVER_UNAVAILABLE = {
        code: 'server-unavailable',
        message: 'The FCM server could not process the request in time. See the error documentation ' +
            'for more details.',
    };
    MessagingClientErrorCode.INTERNAL_ERROR = {
        code: 'internal-error',
        message: 'An internal error has occurred. Please retry the request.',
    };
    MessagingClientErrorCode.UNKNOWN_ERROR = {
        code: 'unknown-error',
        message: 'An unknown server error was returned.',
    };
    return MessagingClientErrorCode;
}());
exports.MessagingClientErrorCode = MessagingClientErrorCode;
;
/** @const {ServerToClientCode} Auth server to client enum error codes. */
var AUTH_SERVER_TO_CLIENT_CODE = {
    // Project not found.
    CONFIGURATION_NOT_FOUND: 'PROJECT_NOT_FOUND',
    // Provided credential has insufficient permissions.
    INSUFFICIENT_PERMISSION: 'INSUFFICIENT_PERMISSION',
    // uploadAccount provides an email that already exists.
    DUPLICATE_EMAIL: 'EMAIL_EXISTS',
    // uploadAccount provides a localId that already exists.
    DUPLICATE_LOCAL_ID: 'UID_ALREADY_EXISTS',
    // setAccountInfo email already exists.
    EMAIL_EXISTS: 'EMAIL_ALREADY_EXISTS',
    // Invalid email provided.
    INVALID_EMAIL: 'INVALID_EMAIL',
    // Invalid phone number.
    INVALID_PHONE_NUMBER: 'INVALID_PHONE_NUMBER',
    // Invalid service account.
    INVALID_SERVICE_ACCOUNT: 'INVALID_SERVICE_ACCOUNT',
    // No localId provided (deleteAccount missing localId).
    MISSING_LOCAL_ID: 'MISSING_UID',
    // Empty user list in uploadAccount.
    MISSING_USER_ACCOUNT: 'MISSING_UID',
    // Password auth disabled in console.
    OPERATION_NOT_ALLOWED: 'OPERATION_NOT_ALLOWED',
    // Phone number already exists.
    PHONE_NUMBER_EXISTS: 'PHONE_NUMBER_ALREADY_EXISTS',
    // Project not found.
    PROJECT_NOT_FOUND: 'PROJECT_NOT_FOUND',
    // User on which action is to be performed is not found.
    USER_NOT_FOUND: 'USER_NOT_FOUND',
    // Password provided is too weak.
    WEAK_PASSWORD: 'INVALID_PASSWORD',
};
/** @const {ServerToClientCode} Messaging server to client enum error codes. */
var MESSAGING_SERVER_TO_CLIENT_CODE = {
    /* GENERIC ERRORS */
    // Generic invalid message parameter provided.
    InvalidParameters: 'INVALID_ARGUMENT',
    // Mismatched sender ID.
    MismatchSenderId: 'MISMATCHED_CREDENTIAL',
    // FCM server unavailable.
    Unavailable: 'SERVER_UNAVAILABLE',
    // FCM server internal error.
    InternalServerError: 'INTERNAL_ERROR',
    /* SEND ERRORS */
    // Invalid registration token format.
    InvalidRegistration: 'INVALID_REGISTRATION_TOKEN',
    // Registration token is not registered.
    NotRegistered: 'REGISTRATION_TOKEN_NOT_REGISTERED',
    // Registration token does not match restricted package name.
    InvalidPackageName: 'INVALID_PACKAGE_NAME',
    // Message payload size limit exceeded.
    MessageTooBig: 'PAYLOAD_SIZE_LIMIT_EXCEEDED',
    // Invalid key in the data message payload.
    InvalidDataKey: 'INVALID_DATA_PAYLOAD_KEY',
    // Invalid time to live option.
    InvalidTtl: 'INVALID_OPTIONS',
    // Device message rate exceeded.
    DeviceMessageRateExceeded: 'DEVICE_MESSAGE_RATE_EXCEEDED',
    // Topics message rate exceeded.
    TopicsMessageRateExceeded: 'TOPICS_MESSAGE_RATE_EXCEEDED',
    // Invalid APNs credentials.
    InvalidApnsCredential: 'INVALID_APNS_CREDENTIALS',
    /* TOPIC SUBSCRIPTION MANAGEMENT ERRORS */
    NOT_FOUND: 'REGISTRATION_TOKEN_NOT_REGISTERED',
    INVALID_ARGUMENT: 'INVALID_REGISTRATION_TOKEN',
    TOO_MANY_TOPICS: 'TOO_MANY_TOPICS',
    RESOURCE_EXHAUSTED: 'TOO_MANY_TOPICS',
    PERMISSION_DENIED: 'AUTHENTICATION_ERROR',
    DEADLINE_EXCEEDED: 'SERVER_UNAVAILABLE',
    INTERNAL: 'INTERNAL_ERROR',
    UNKNOWN: 'UNKNOWN_ERROR',
};
