extensions-api-client-internal.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*! firebase-admin v12.1.1 */
  2. "use strict";
  3. /*!
  4. * @license
  5. * Copyright 2022 Google Inc.
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. Object.defineProperty(exports, "__esModule", { value: true });
  20. exports.FirebaseExtensionsError = exports.ExtensionsApiClient = void 0;
  21. const api_request_1 = require("../utils/api-request");
  22. const error_1 = require("../utils/error");
  23. const validator = require("../utils/validator");
  24. const utils = require("../utils");
  25. const FIREBASE_FUNCTIONS_CONFIG_HEADERS = {
  26. 'X-Firebase-Client': `fire-admin-node/${utils.getSdkVersion()}`
  27. };
  28. const EXTENSIONS_API_VERSION = 'v1beta';
  29. // Note - use getExtensionsApiUri() instead so that changing environments is consistent.
  30. const EXTENSIONS_URL = 'https://firebaseextensions.googleapis.com';
  31. /**
  32. * Class that facilitates sending requests to the Firebase Extensions backend API.
  33. *
  34. * @internal
  35. */
  36. class ExtensionsApiClient {
  37. constructor(app) {
  38. this.app = app;
  39. if (!validator.isNonNullObject(app) || !('options' in app)) {
  40. throw new error_1.FirebaseAppError('invalid-argument', 'First argument passed to getExtensions() must be a valid Firebase app instance.');
  41. }
  42. this.httpClient = new api_request_1.AuthorizedHttpClient(this.app);
  43. }
  44. async updateRuntimeData(projectId, instanceId, runtimeData) {
  45. const url = this.getRuntimeDataUri(projectId, instanceId);
  46. const request = {
  47. method: 'PATCH',
  48. url,
  49. headers: FIREBASE_FUNCTIONS_CONFIG_HEADERS,
  50. data: runtimeData,
  51. };
  52. try {
  53. const res = await this.httpClient.send(request);
  54. return res.data;
  55. }
  56. catch (err) {
  57. throw this.toFirebaseError(err);
  58. }
  59. }
  60. getExtensionsApiUri() {
  61. return process.env['FIREBASE_EXT_URL'] ?? EXTENSIONS_URL;
  62. }
  63. getRuntimeDataUri(projectId, instanceId) {
  64. return `${this.getExtensionsApiUri()}/${EXTENSIONS_API_VERSION}/projects/${projectId}/instances/${instanceId}/runtimeData`;
  65. }
  66. toFirebaseError(err) {
  67. if (err instanceof error_1.PrefixedFirebaseError) {
  68. return err;
  69. }
  70. const response = err.response;
  71. if (!response?.isJson()) {
  72. return new FirebaseExtensionsError('unknown-error', `Unexpected response with status: ${response.status} and body: ${response.text}`);
  73. }
  74. const error = response.data?.error;
  75. const message = error?.message || `Unknown server error: ${response.text}`;
  76. switch (error.code) {
  77. case 403:
  78. return new FirebaseExtensionsError('forbidden', message);
  79. case 404:
  80. return new FirebaseExtensionsError('not-found', message);
  81. case 500:
  82. return new FirebaseExtensionsError('internal-error', message);
  83. }
  84. return new FirebaseExtensionsError('unknown-error', message);
  85. }
  86. }
  87. exports.ExtensionsApiClient = ExtensionsApiClient;
  88. /**
  89. * Firebase Extensions error code structure. This extends PrefixedFirebaseError.
  90. *
  91. * @param code - The error code.
  92. * @param message - The error message.
  93. * @constructor
  94. */
  95. class FirebaseExtensionsError extends error_1.PrefixedFirebaseError {
  96. constructor(code, message) {
  97. super('Extensions', code, message);
  98. /* tslint:disable:max-line-length */
  99. // Set the prototype explicitly. See the following link for more details:
  100. // https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work
  101. /* tslint:enable:max-line-length */
  102. this.__proto__ = FirebaseExtensionsError.prototype;
  103. }
  104. }
  105. exports.FirebaseExtensionsError = FirebaseExtensionsError;