UNPKG

firebase-admin

Version:
106 lines (105 loc) 4.26 kB
/*! firebase-admin v13.2.0 */ "use strict"; /*! * @license * Copyright 2022 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. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.FirebaseExtensionsError = exports.ExtensionsApiClient = void 0; const api_request_1 = require("../utils/api-request"); const error_1 = require("../utils/error"); const validator = require("../utils/validator"); const utils = require("../utils"); const FIREBASE_FUNCTIONS_CONFIG_HEADERS = { 'X-Firebase-Client': `fire-admin-node/${utils.getSdkVersion()}` }; const EXTENSIONS_API_VERSION = 'v1beta'; // Note - use getExtensionsApiUri() instead so that changing environments is consistent. const EXTENSIONS_URL = 'https://firebaseextensions.googleapis.com'; /** * Class that facilitates sending requests to the Firebase Extensions backend API. * * @internal */ class ExtensionsApiClient { constructor(app) { this.app = app; if (!validator.isNonNullObject(app) || !('options' in app)) { throw new error_1.FirebaseAppError('invalid-argument', 'First argument passed to getExtensions() must be a valid Firebase app instance.'); } this.httpClient = new api_request_1.AuthorizedHttpClient(this.app); } async updateRuntimeData(projectId, instanceId, runtimeData) { const url = this.getRuntimeDataUri(projectId, instanceId); const request = { method: 'PATCH', url, headers: FIREBASE_FUNCTIONS_CONFIG_HEADERS, data: runtimeData, }; try { const res = await this.httpClient.send(request); return res.data; } catch (err) { throw this.toFirebaseError(err); } } getExtensionsApiUri() { return process.env['FIREBASE_EXT_URL'] ?? EXTENSIONS_URL; } getRuntimeDataUri(projectId, instanceId) { return `${this.getExtensionsApiUri()}/${EXTENSIONS_API_VERSION}/projects/${projectId}/instances/${instanceId}/runtimeData`; } toFirebaseError(err) { if (err instanceof error_1.PrefixedFirebaseError) { return err; } const response = err.response; if (!response?.isJson()) { return new FirebaseExtensionsError('unknown-error', `Unexpected response with status: ${response.status} and body: ${response.text}`); } const error = response.data?.error; const message = error?.message || `Unknown server error: ${response.text}`; switch (error.code) { case 403: return new FirebaseExtensionsError('forbidden', message); case 404: return new FirebaseExtensionsError('not-found', message); case 500: return new FirebaseExtensionsError('internal-error', message); } return new FirebaseExtensionsError('unknown-error', message); } } exports.ExtensionsApiClient = ExtensionsApiClient; /** * Firebase Extensions error code structure. This extends PrefixedFirebaseError. * * @param code - The error code. * @param message - The error message. * @constructor */ class FirebaseExtensionsError extends error_1.PrefixedFirebaseError { constructor(code, message) { super('Extensions', code, message); /* 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__ = FirebaseExtensionsError.prototype; } } exports.FirebaseExtensionsError = FirebaseExtensionsError;