summaryrefslogtreecommitdiff
path: root/frontend-old/node_modules/@firebase/functions/dist/index.cjs.js
diff options
context:
space:
mode:
authoraltaf-creator <dev@altafcreator.com>2025-11-09 11:15:19 +0800
committeraltaf-creator <dev@altafcreator.com>2025-11-09 11:15:19 +0800
commit8eff962cab608341a6f2fedc640a0e32d96f26e2 (patch)
tree05534d1a720ddc3691d346c69b4972555820a061 /frontend-old/node_modules/@firebase/functions/dist/index.cjs.js
pain
Diffstat (limited to 'frontend-old/node_modules/@firebase/functions/dist/index.cjs.js')
-rw-r--r--frontend-old/node_modules/@firebase/functions/dist/index.cjs.js978
1 files changed, 978 insertions, 0 deletions
diff --git a/frontend-old/node_modules/@firebase/functions/dist/index.cjs.js b/frontend-old/node_modules/@firebase/functions/dist/index.cjs.js
new file mode 100644
index 0000000..fafce2e
--- /dev/null
+++ b/frontend-old/node_modules/@firebase/functions/dist/index.cjs.js
@@ -0,0 +1,978 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var app = require('@firebase/app');
+var util = require('@firebase/util');
+var component = require('@firebase/component');
+
+/**
+ * @license
+ * Copyright 2017 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.
+ */
+const LONG_TYPE = 'type.googleapis.com/google.protobuf.Int64Value';
+const UNSIGNED_LONG_TYPE = 'type.googleapis.com/google.protobuf.UInt64Value';
+function mapValues(
+// { [k: string]: unknown } is no longer a wildcard assignment target after typescript 3.5
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+o, f) {
+ const result = {};
+ for (const key in o) {
+ if (o.hasOwnProperty(key)) {
+ result[key] = f(o[key]);
+ }
+ }
+ return result;
+}
+/**
+ * Takes data and encodes it in a JSON-friendly way, such that types such as
+ * Date are preserved.
+ * @internal
+ * @param data - Data to encode.
+ */
+function encode(data) {
+ if (data == null) {
+ return null;
+ }
+ if (data instanceof Number) {
+ data = data.valueOf();
+ }
+ if (typeof data === 'number' && isFinite(data)) {
+ // Any number in JS is safe to put directly in JSON and parse as a double
+ // without any loss of precision.
+ return data;
+ }
+ if (data === true || data === false) {
+ return data;
+ }
+ if (Object.prototype.toString.call(data) === '[object String]') {
+ return data;
+ }
+ if (data instanceof Date) {
+ return data.toISOString();
+ }
+ if (Array.isArray(data)) {
+ return data.map(x => encode(x));
+ }
+ if (typeof data === 'function' || typeof data === 'object') {
+ return mapValues(data, x => encode(x));
+ }
+ // If we got this far, the data is not encodable.
+ throw new Error('Data cannot be encoded in JSON: ' + data);
+}
+/**
+ * Takes data that's been encoded in a JSON-friendly form and returns a form
+ * with richer datatypes, such as Dates, etc.
+ * @internal
+ * @param json - JSON to convert.
+ */
+function decode(json) {
+ if (json == null) {
+ return json;
+ }
+ if (json['@type']) {
+ switch (json['@type']) {
+ case LONG_TYPE:
+ // Fall through and handle this the same as unsigned.
+ case UNSIGNED_LONG_TYPE: {
+ // Technically, this could work return a valid number for malformed
+ // data if there was a number followed by garbage. But it's just not
+ // worth all the extra code to detect that case.
+ const value = Number(json['value']);
+ if (isNaN(value)) {
+ throw new Error('Data cannot be decoded from JSON: ' + json);
+ }
+ return value;
+ }
+ default: {
+ throw new Error('Data cannot be decoded from JSON: ' + json);
+ }
+ }
+ }
+ if (Array.isArray(json)) {
+ return json.map(x => decode(x));
+ }
+ if (typeof json === 'function' || typeof json === 'object') {
+ return mapValues(json, x => decode(x));
+ }
+ // Anything else is safe to return.
+ return json;
+}
+
+/**
+ * @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.
+ */
+/**
+ * Type constant for Firebase Functions.
+ */
+const FUNCTIONS_TYPE = 'functions';
+
+/**
+ * @license
+ * Copyright 2017 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.
+ */
+/**
+ * Standard error codes for different ways a request can fail, as defined by:
+ * https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
+ *
+ * This map is used primarily to convert from a backend error code string to
+ * a client SDK error code string, and make sure it's in the supported set.
+ */
+const errorCodeMap = {
+ OK: 'ok',
+ CANCELLED: 'cancelled',
+ UNKNOWN: 'unknown',
+ INVALID_ARGUMENT: 'invalid-argument',
+ DEADLINE_EXCEEDED: 'deadline-exceeded',
+ NOT_FOUND: 'not-found',
+ ALREADY_EXISTS: 'already-exists',
+ PERMISSION_DENIED: 'permission-denied',
+ UNAUTHENTICATED: 'unauthenticated',
+ RESOURCE_EXHAUSTED: 'resource-exhausted',
+ FAILED_PRECONDITION: 'failed-precondition',
+ ABORTED: 'aborted',
+ OUT_OF_RANGE: 'out-of-range',
+ UNIMPLEMENTED: 'unimplemented',
+ INTERNAL: 'internal',
+ UNAVAILABLE: 'unavailable',
+ DATA_LOSS: 'data-loss'
+};
+/**
+ * An error returned by the Firebase Functions client SDK.
+ *
+ * See {@link FunctionsErrorCode} for full documentation of codes.
+ *
+ * @public
+ */
+class FunctionsError extends util.FirebaseError {
+ /**
+ * Constructs a new instance of the `FunctionsError` class.
+ */
+ constructor(
+ /**
+ * A standard error code that will be returned to the client. This also
+ * determines the HTTP status code of the response, as defined in code.proto.
+ */
+ code, message,
+ /**
+ * Additional details to be converted to JSON and included in the error response.
+ */
+ details) {
+ super(`${FUNCTIONS_TYPE}/${code}`, message || '');
+ this.details = details;
+ // Since the FirebaseError constructor sets the prototype of `this` to FirebaseError.prototype,
+ // we also have to do it in all subclasses to allow for correct `instanceof` checks.
+ Object.setPrototypeOf(this, FunctionsError.prototype);
+ }
+}
+/**
+ * Takes an HTTP status code and returns the corresponding ErrorCode.
+ * This is the standard HTTP status code -> error mapping defined in:
+ * https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
+ *
+ * @param status An HTTP status code.
+ * @return The corresponding ErrorCode, or ErrorCode.UNKNOWN if none.
+ */
+function codeForHTTPStatus(status) {
+ // Make sure any successful status is OK.
+ if (status >= 200 && status < 300) {
+ return 'ok';
+ }
+ switch (status) {
+ case 0:
+ // This can happen if the server returns 500.
+ return 'internal';
+ case 400:
+ return 'invalid-argument';
+ case 401:
+ return 'unauthenticated';
+ case 403:
+ return 'permission-denied';
+ case 404:
+ return 'not-found';
+ case 409:
+ return 'aborted';
+ case 429:
+ return 'resource-exhausted';
+ case 499:
+ return 'cancelled';
+ case 500:
+ return 'internal';
+ case 501:
+ return 'unimplemented';
+ case 503:
+ return 'unavailable';
+ case 504:
+ return 'deadline-exceeded';
+ }
+ return 'unknown';
+}
+/**
+ * Takes an HTTP response and returns the corresponding Error, if any.
+ */
+function _errorForResponse(status, bodyJSON) {
+ let code = codeForHTTPStatus(status);
+ // Start with reasonable defaults from the status code.
+ let description = code;
+ let details = undefined;
+ // Then look through the body for explicit details.
+ try {
+ const errorJSON = bodyJSON && bodyJSON.error;
+ if (errorJSON) {
+ const status = errorJSON.status;
+ if (typeof status === 'string') {
+ if (!errorCodeMap[status]) {
+ // They must've included an unknown error code in the body.
+ return new FunctionsError('internal', 'internal');
+ }
+ code = errorCodeMap[status];
+ // TODO(klimt): Add better default descriptions for error enums.
+ // The default description needs to be updated for the new code.
+ description = status;
+ }
+ const message = errorJSON.message;
+ if (typeof message === 'string') {
+ description = message;
+ }
+ details = errorJSON.details;
+ if (details !== undefined) {
+ details = decode(details);
+ }
+ }
+ }
+ catch (e) {
+ // If we couldn't parse explicit error data, that's fine.
+ }
+ if (code === 'ok') {
+ // Technically, there's an edge case where a developer could explicitly
+ // return an error code of OK, and we will treat it as success, but that
+ // seems reasonable.
+ return null;
+ }
+ return new FunctionsError(code, description, details);
+}
+
+/**
+ * @license
+ * Copyright 2017 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.
+ */
+/**
+ * Helper class to get metadata that should be included with a function call.
+ * @internal
+ */
+class ContextProvider {
+ constructor(app$1, authProvider, messagingProvider, appCheckProvider) {
+ this.app = app$1;
+ this.auth = null;
+ this.messaging = null;
+ this.appCheck = null;
+ this.serverAppAppCheckToken = null;
+ if (app._isFirebaseServerApp(app$1) && app$1.settings.appCheckToken) {
+ this.serverAppAppCheckToken = app$1.settings.appCheckToken;
+ }
+ this.auth = authProvider.getImmediate({ optional: true });
+ this.messaging = messagingProvider.getImmediate({
+ optional: true
+ });
+ if (!this.auth) {
+ authProvider.get().then(auth => (this.auth = auth), () => {
+ /* get() never rejects */
+ });
+ }
+ if (!this.messaging) {
+ messagingProvider.get().then(messaging => (this.messaging = messaging), () => {
+ /* get() never rejects */
+ });
+ }
+ if (!this.appCheck) {
+ appCheckProvider?.get().then(appCheck => (this.appCheck = appCheck), () => {
+ /* get() never rejects */
+ });
+ }
+ }
+ async getAuthToken() {
+ if (!this.auth) {
+ return undefined;
+ }
+ try {
+ const token = await this.auth.getToken();
+ return token?.accessToken;
+ }
+ catch (e) {
+ // If there's any error when trying to get the auth token, leave it off.
+ return undefined;
+ }
+ }
+ async getMessagingToken() {
+ if (!this.messaging ||
+ !('Notification' in self) ||
+ Notification.permission !== 'granted') {
+ return undefined;
+ }
+ try {
+ return await this.messaging.getToken();
+ }
+ catch (e) {
+ // We don't warn on this, because it usually means messaging isn't set up.
+ // console.warn('Failed to retrieve instance id token.', e);
+ // If there's any error when trying to get the token, leave it off.
+ return undefined;
+ }
+ }
+ async getAppCheckToken(limitedUseAppCheckTokens) {
+ if (this.serverAppAppCheckToken) {
+ return this.serverAppAppCheckToken;
+ }
+ if (this.appCheck) {
+ const result = limitedUseAppCheckTokens
+ ? await this.appCheck.getLimitedUseToken()
+ : await this.appCheck.getToken();
+ if (result.error) {
+ // Do not send the App Check header to the functions endpoint if
+ // there was an error from the App Check exchange endpoint. The App
+ // Check SDK will already have logged the error to console.
+ return null;
+ }
+ return result.token;
+ }
+ return null;
+ }
+ async getContext(limitedUseAppCheckTokens) {
+ const authToken = await this.getAuthToken();
+ const messagingToken = await this.getMessagingToken();
+ const appCheckToken = await this.getAppCheckToken(limitedUseAppCheckTokens);
+ return { authToken, messagingToken, appCheckToken };
+ }
+}
+
+/**
+ * @license
+ * Copyright 2017 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.
+ */
+const DEFAULT_REGION = 'us-central1';
+const responseLineRE = /^data: (.*?)(?:\n|$)/;
+/**
+ * Returns a Promise that will be rejected after the given duration.
+ * The error will be of type FunctionsError.
+ *
+ * @param millis Number of milliseconds to wait before rejecting.
+ */
+function failAfter(millis) {
+ // Node timers and browser timers are fundamentally incompatible, but we
+ // don't care about the value here
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ let timer = null;
+ return {
+ promise: new Promise((_, reject) => {
+ timer = setTimeout(() => {
+ reject(new FunctionsError('deadline-exceeded', 'deadline-exceeded'));
+ }, millis);
+ }),
+ cancel: () => {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ }
+ };
+}
+/**
+ * The main class for the Firebase Functions SDK.
+ * @internal
+ */
+class FunctionsService {
+ /**
+ * Creates a new Functions service for the given app.
+ * @param app - The FirebaseApp to use.
+ */
+ constructor(app, authProvider, messagingProvider, appCheckProvider, regionOrCustomDomain = DEFAULT_REGION, fetchImpl = (...args) => fetch(...args)) {
+ this.app = app;
+ this.fetchImpl = fetchImpl;
+ this.emulatorOrigin = null;
+ this.contextProvider = new ContextProvider(app, authProvider, messagingProvider, appCheckProvider);
+ // Cancels all ongoing requests when resolved.
+ this.cancelAllRequests = new Promise(resolve => {
+ this.deleteService = () => {
+ return Promise.resolve(resolve());
+ };
+ });
+ // Resolve the region or custom domain overload by attempting to parse it.
+ try {
+ const url = new URL(regionOrCustomDomain);
+ this.customDomain =
+ url.origin + (url.pathname === '/' ? '' : url.pathname);
+ this.region = DEFAULT_REGION;
+ }
+ catch (e) {
+ this.customDomain = null;
+ this.region = regionOrCustomDomain;
+ }
+ }
+ _delete() {
+ return this.deleteService();
+ }
+ /**
+ * Returns the URL for a callable with the given name.
+ * @param name - The name of the callable.
+ * @internal
+ */
+ _url(name) {
+ const projectId = this.app.options.projectId;
+ if (this.emulatorOrigin !== null) {
+ const origin = this.emulatorOrigin;
+ return `${origin}/${projectId}/${this.region}/${name}`;
+ }
+ if (this.customDomain !== null) {
+ return `${this.customDomain}/${name}`;
+ }
+ return `https://${this.region}-${projectId}.cloudfunctions.net/${name}`;
+ }
+}
+/**
+ * Modify this instance to communicate with the Cloud Functions emulator.
+ *
+ * Note: this must be called before this instance has been used to do any operations.
+ *
+ * @param host The emulator host (ex: localhost)
+ * @param port The emulator port (ex: 5001)
+ * @public
+ */
+function connectFunctionsEmulator$1(functionsInstance, host, port) {
+ const useSsl = util.isCloudWorkstation(host);
+ functionsInstance.emulatorOrigin = `http${useSsl ? 's' : ''}://${host}:${port}`;
+ // Workaround to get cookies in Firebase Studio
+ if (useSsl) {
+ void util.pingServer(functionsInstance.emulatorOrigin + '/backends');
+ util.updateEmulatorBanner('Functions', true);
+ }
+}
+/**
+ * Returns a reference to the callable https trigger with the given name.
+ * @param name - The name of the trigger.
+ * @public
+ */
+function httpsCallable$1(functionsInstance, name, options) {
+ const callable = (data) => {
+ return call(functionsInstance, name, data, options || {});
+ };
+ callable.stream = (data, options) => {
+ return stream(functionsInstance, name, data, options);
+ };
+ return callable;
+}
+/**
+ * Returns a reference to the callable https trigger with the given url.
+ * @param url - The url of the trigger.
+ * @public
+ */
+function httpsCallableFromURL$1(functionsInstance, url, options) {
+ const callable = (data) => {
+ return callAtURL(functionsInstance, url, data, options || {});
+ };
+ callable.stream = (data, options) => {
+ return streamAtURL(functionsInstance, url, data, options || {});
+ };
+ return callable;
+}
+function getCredentials(functionsInstance) {
+ return functionsInstance.emulatorOrigin &&
+ util.isCloudWorkstation(functionsInstance.emulatorOrigin)
+ ? 'include'
+ : undefined;
+}
+/**
+ * Does an HTTP POST and returns the completed response.
+ * @param url The url to post to.
+ * @param body The JSON body of the post.
+ * @param headers The HTTP headers to include in the request.
+ * @param functionsInstance functions instance that is calling postJSON
+ * @return A Promise that will succeed when the request finishes.
+ */
+async function postJSON(url, body, headers, fetchImpl, functionsInstance) {
+ headers['Content-Type'] = 'application/json';
+ let response;
+ try {
+ response = await fetchImpl(url, {
+ method: 'POST',
+ body: JSON.stringify(body),
+ headers,
+ credentials: getCredentials(functionsInstance)
+ });
+ }
+ catch (e) {
+ // This could be an unhandled error on the backend, or it could be a
+ // network error. There's no way to know, since an unhandled error on the
+ // backend will fail to set the proper CORS header, and thus will be
+ // treated as a network error by fetch.
+ return {
+ status: 0,
+ json: null
+ };
+ }
+ let json = null;
+ try {
+ json = await response.json();
+ }
+ catch (e) {
+ // If we fail to parse JSON, it will fail the same as an empty body.
+ }
+ return {
+ status: response.status,
+ json
+ };
+}
+/**
+ * Creates authorization headers for Firebase Functions requests.
+ * @param functionsInstance The Firebase Functions service instance.
+ * @param options Options for the callable function, including AppCheck token settings.
+ * @return A Promise that resolves a headers map to include in outgoing fetch request.
+ */
+async function makeAuthHeaders(functionsInstance, options) {
+ const headers = {};
+ const context = await functionsInstance.contextProvider.getContext(options.limitedUseAppCheckTokens);
+ if (context.authToken) {
+ headers['Authorization'] = 'Bearer ' + context.authToken;
+ }
+ if (context.messagingToken) {
+ headers['Firebase-Instance-ID-Token'] = context.messagingToken;
+ }
+ if (context.appCheckToken !== null) {
+ headers['X-Firebase-AppCheck'] = context.appCheckToken;
+ }
+ return headers;
+}
+/**
+ * Calls a callable function asynchronously and returns the result.
+ * @param name The name of the callable trigger.
+ * @param data The data to pass as params to the function.
+ */
+function call(functionsInstance, name, data, options) {
+ const url = functionsInstance._url(name);
+ return callAtURL(functionsInstance, url, data, options);
+}
+/**
+ * Calls a callable function asynchronously and returns the result.
+ * @param url The url of the callable trigger.
+ * @param data The data to pass as params to the function.
+ */
+async function callAtURL(functionsInstance, url, data, options) {
+ // Encode any special types, such as dates, in the input data.
+ data = encode(data);
+ const body = { data };
+ // Add a header for the authToken.
+ const headers = await makeAuthHeaders(functionsInstance, options);
+ // Default timeout to 70s, but let the options override it.
+ const timeout = options.timeout || 70000;
+ const failAfterHandle = failAfter(timeout);
+ const response = await Promise.race([
+ postJSON(url, body, headers, functionsInstance.fetchImpl, functionsInstance),
+ failAfterHandle.promise,
+ functionsInstance.cancelAllRequests
+ ]);
+ // Always clear the failAfter timeout
+ failAfterHandle.cancel();
+ // If service was deleted, interrupted response throws an error.
+ if (!response) {
+ throw new FunctionsError('cancelled', 'Firebase Functions instance was deleted.');
+ }
+ // Check for an error status, regardless of http status.
+ const error = _errorForResponse(response.status, response.json);
+ if (error) {
+ throw error;
+ }
+ if (!response.json) {
+ throw new FunctionsError('internal', 'Response is not valid JSON object.');
+ }
+ let responseData = response.json.data;
+ // TODO(klimt): For right now, allow "result" instead of "data", for
+ // backwards compatibility.
+ if (typeof responseData === 'undefined') {
+ responseData = response.json.result;
+ }
+ if (typeof responseData === 'undefined') {
+ // Consider the response malformed.
+ throw new FunctionsError('internal', 'Response is missing data field.');
+ }
+ // Decode any special types, such as dates, in the returned data.
+ const decodedData = decode(responseData);
+ return { data: decodedData };
+}
+/**
+ * Calls a callable function asynchronously and returns a streaming result.
+ * @param name The name of the callable trigger.
+ * @param data The data to pass as params to the function.
+ * @param options Streaming request options.
+ */
+function stream(functionsInstance, name, data, options) {
+ const url = functionsInstance._url(name);
+ return streamAtURL(functionsInstance, url, data, options || {});
+}
+/**
+ * Calls a callable function asynchronously and return a streaming result.
+ * @param url The url of the callable trigger.
+ * @param data The data to pass as params to the function.
+ * @param options Streaming request options.
+ */
+async function streamAtURL(functionsInstance, url, data, options) {
+ // Encode any special types, such as dates, in the input data.
+ data = encode(data);
+ const body = { data };
+ //
+ // Add a header for the authToken.
+ const headers = await makeAuthHeaders(functionsInstance, options);
+ headers['Content-Type'] = 'application/json';
+ headers['Accept'] = 'text/event-stream';
+ let response;
+ try {
+ response = await functionsInstance.fetchImpl(url, {
+ method: 'POST',
+ body: JSON.stringify(body),
+ headers,
+ signal: options?.signal,
+ credentials: getCredentials(functionsInstance)
+ });
+ }
+ catch (e) {
+ if (e instanceof Error && e.name === 'AbortError') {
+ const error = new FunctionsError('cancelled', 'Request was cancelled.');
+ return {
+ data: Promise.reject(error),
+ stream: {
+ [Symbol.asyncIterator]() {
+ return {
+ next() {
+ return Promise.reject(error);
+ }
+ };
+ }
+ }
+ };
+ }
+ // This could be an unhandled error on the backend, or it could be a
+ // network error. There's no way to know, since an unhandled error on the
+ // backend will fail to set the proper CORS header, and thus will be
+ // treated as a network error by fetch.
+ const error = _errorForResponse(0, null);
+ return {
+ data: Promise.reject(error),
+ // Return an empty async iterator
+ stream: {
+ [Symbol.asyncIterator]() {
+ return {
+ next() {
+ return Promise.reject(error);
+ }
+ };
+ }
+ }
+ };
+ }
+ let resultResolver;
+ let resultRejecter;
+ const resultPromise = new Promise((resolve, reject) => {
+ resultResolver = resolve;
+ resultRejecter = reject;
+ });
+ options?.signal?.addEventListener('abort', () => {
+ const error = new FunctionsError('cancelled', 'Request was cancelled.');
+ resultRejecter(error);
+ });
+ const reader = response.body.getReader();
+ const rstream = createResponseStream(reader, resultResolver, resultRejecter, options?.signal);
+ return {
+ stream: {
+ [Symbol.asyncIterator]() {
+ const rreader = rstream.getReader();
+ return {
+ async next() {
+ const { value, done } = await rreader.read();
+ return { value: value, done };
+ },
+ async return() {
+ await rreader.cancel();
+ return { done: true, value: undefined };
+ }
+ };
+ }
+ },
+ data: resultPromise
+ };
+}
+/**
+ * Creates a ReadableStream that processes a streaming response from a streaming
+ * callable function that returns data in server-sent event format.
+ *
+ * @param reader The underlying reader providing raw response data
+ * @param resultResolver Callback to resolve the final result when received
+ * @param resultRejecter Callback to reject with an error if encountered
+ * @param signal Optional AbortSignal to cancel the stream processing
+ * @returns A ReadableStream that emits decoded messages from the response
+ *
+ * The returned ReadableStream:
+ * 1. Emits individual messages when "message" data is received
+ * 2. Resolves with the final result when a "result" message is received
+ * 3. Rejects with an error if an "error" message is received
+ */
+function createResponseStream(reader, resultResolver, resultRejecter, signal) {
+ const processLine = (line, controller) => {
+ const match = line.match(responseLineRE);
+ // ignore all other lines (newline, comments, etc.)
+ if (!match) {
+ return;
+ }
+ const data = match[1];
+ try {
+ const jsonData = JSON.parse(data);
+ if ('result' in jsonData) {
+ resultResolver(decode(jsonData.result));
+ return;
+ }
+ if ('message' in jsonData) {
+ controller.enqueue(decode(jsonData.message));
+ return;
+ }
+ if ('error' in jsonData) {
+ const error = _errorForResponse(0, jsonData);
+ controller.error(error);
+ resultRejecter(error);
+ return;
+ }
+ }
+ catch (error) {
+ if (error instanceof FunctionsError) {
+ controller.error(error);
+ resultRejecter(error);
+ return;
+ }
+ // ignore other parsing errors
+ }
+ };
+ const decoder = new TextDecoder();
+ return new ReadableStream({
+ start(controller) {
+ let currentText = '';
+ return pump();
+ async function pump() {
+ if (signal?.aborted) {
+ const error = new FunctionsError('cancelled', 'Request was cancelled');
+ controller.error(error);
+ resultRejecter(error);
+ return Promise.resolve();
+ }
+ try {
+ const { value, done } = await reader.read();
+ if (done) {
+ if (currentText.trim()) {
+ processLine(currentText.trim(), controller);
+ }
+ controller.close();
+ return;
+ }
+ if (signal?.aborted) {
+ const error = new FunctionsError('cancelled', 'Request was cancelled');
+ controller.error(error);
+ resultRejecter(error);
+ await reader.cancel();
+ return;
+ }
+ currentText += decoder.decode(value, { stream: true });
+ const lines = currentText.split('\n');
+ currentText = lines.pop() || '';
+ for (const line of lines) {
+ if (line.trim()) {
+ processLine(line.trim(), controller);
+ }
+ }
+ return pump();
+ }
+ catch (error) {
+ const functionsError = error instanceof FunctionsError
+ ? error
+ : _errorForResponse(0, null);
+ controller.error(functionsError);
+ resultRejecter(functionsError);
+ }
+ }
+ },
+ cancel() {
+ return reader.cancel();
+ }
+ });
+}
+
+const name = "@firebase/functions";
+const version = "0.13.1";
+
+/**
+ * @license
+ * Copyright 2019 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.
+ */
+const AUTH_INTERNAL_NAME = 'auth-internal';
+const APP_CHECK_INTERNAL_NAME = 'app-check-internal';
+const MESSAGING_INTERNAL_NAME = 'messaging-internal';
+function registerFunctions(variant) {
+ const factory = (container, { instanceIdentifier: regionOrCustomDomain }) => {
+ // Dependencies
+ const app = container.getProvider('app').getImmediate();
+ const authProvider = container.getProvider(AUTH_INTERNAL_NAME);
+ const messagingProvider = container.getProvider(MESSAGING_INTERNAL_NAME);
+ const appCheckProvider = container.getProvider(APP_CHECK_INTERNAL_NAME);
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ return new FunctionsService(app, authProvider, messagingProvider, appCheckProvider, regionOrCustomDomain);
+ };
+ app._registerComponent(new component.Component(FUNCTIONS_TYPE, factory, "PUBLIC" /* ComponentType.PUBLIC */).setMultipleInstances(true));
+ app.registerVersion(name, version, variant);
+ // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation
+ app.registerVersion(name, version, 'cjs2020');
+}
+
+/**
+ * @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.
+ */
+/**
+ * Returns a {@link Functions} instance for the given app.
+ * @param app - The {@link @firebase/app#FirebaseApp} to use.
+ * @param regionOrCustomDomain - one of:
+ * a) The region the callable functions are located in (ex: us-central1)
+ * b) A custom domain hosting the callable functions (ex: https://mydomain.com)
+ * @public
+ */
+function getFunctions(app$1 = app.getApp(), regionOrCustomDomain = DEFAULT_REGION) {
+ // Dependencies
+ const functionsProvider = app._getProvider(util.getModularInstance(app$1), FUNCTIONS_TYPE);
+ const functionsInstance = functionsProvider.getImmediate({
+ identifier: regionOrCustomDomain
+ });
+ const emulator = util.getDefaultEmulatorHostnameAndPort('functions');
+ if (emulator) {
+ connectFunctionsEmulator(functionsInstance, ...emulator);
+ }
+ return functionsInstance;
+}
+/**
+ * Modify this instance to communicate with the Cloud Functions emulator.
+ *
+ * Note: this must be called before this instance has been used to do any operations.
+ *
+ * @param host - The emulator host (ex: localhost)
+ * @param port - The emulator port (ex: 5001)
+ * @public
+ */
+function connectFunctionsEmulator(functionsInstance, host, port) {
+ connectFunctionsEmulator$1(util.getModularInstance(functionsInstance), host, port);
+}
+/**
+ * Returns a reference to the callable HTTPS trigger with the given name.
+ * @param name - The name of the trigger.
+ * @public
+ */
+function httpsCallable(functionsInstance, name, options) {
+ return httpsCallable$1(util.getModularInstance(functionsInstance), name, options);
+}
+/**
+ * Returns a reference to the callable HTTPS trigger with the specified url.
+ * @param url - The url of the trigger.
+ * @public
+ */
+function httpsCallableFromURL(functionsInstance, url, options) {
+ return httpsCallableFromURL$1(util.getModularInstance(functionsInstance), url, options);
+}
+
+/**
+ * Cloud Functions for Firebase
+ *
+ * @packageDocumentation
+ */
+registerFunctions();
+
+exports.FunctionsError = FunctionsError;
+exports.connectFunctionsEmulator = connectFunctionsEmulator;
+exports.getFunctions = getFunctions;
+exports.httpsCallable = httpsCallable;
+exports.httpsCallableFromURL = httpsCallableFromURL;
+//# sourceMappingURL=index.cjs.js.map