summaryrefslogtreecommitdiff
path: root/frontend-old/node_modules/@firebase/app/dist/index.cjs.js
diff options
context:
space:
mode:
authoraltaf-creator <dev@altafcreator.com>2025-11-16 19:08:29 +0800
committeraltaf-creator <dev@altafcreator.com>2025-11-16 19:08:29 +0800
commit434aa8343fdcbb4d5002f934979913c099489bee (patch)
tree55bab4ec5a6151be57797d34f61faf5ea744471b /frontend-old/node_modules/@firebase/app/dist/index.cjs.js
parent893c388d4e99442a36005e5971a87730623f946e (diff)
sdk, del
Diffstat (limited to 'frontend-old/node_modules/@firebase/app/dist/index.cjs.js')
-rw-r--r--frontend-old/node_modules/@firebase/app/dist/index.cjs.js1265
1 files changed, 0 insertions, 1265 deletions
diff --git a/frontend-old/node_modules/@firebase/app/dist/index.cjs.js b/frontend-old/node_modules/@firebase/app/dist/index.cjs.js
deleted file mode 100644
index 0c3b977..0000000
--- a/frontend-old/node_modules/@firebase/app/dist/index.cjs.js
+++ /dev/null
@@ -1,1265 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-var component = require('@firebase/component');
-var logger$1 = require('@firebase/logger');
-var util = require('@firebase/util');
-var idb = require('idb');
-
-/**
- * @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.
- */
-class PlatformLoggerServiceImpl {
- constructor(container) {
- this.container = container;
- }
- // In initial implementation, this will be called by installations on
- // auth token refresh, and installations will send this string.
- getPlatformInfoString() {
- const providers = this.container.getProviders();
- // Loop through providers and get library/version pairs from any that are
- // version components.
- return providers
- .map(provider => {
- if (isVersionServiceProvider(provider)) {
- const service = provider.getImmediate();
- return `${service.library}/${service.version}`;
- }
- else {
- return null;
- }
- })
- .filter(logString => logString)
- .join(' ');
- }
-}
-/**
- *
- * @param provider check if this provider provides a VersionService
- *
- * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider
- * provides VersionService. The provider is not necessarily a 'app-version'
- * provider.
- */
-function isVersionServiceProvider(provider) {
- const component = provider.getComponent();
- return component?.type === "VERSION" /* ComponentType.VERSION */;
-}
-
-const name$q = "@firebase/app";
-const version$1 = "0.14.5";
-
-/**
- * @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 logger = new logger$1.Logger('@firebase/app');
-
-const name$p = "@firebase/app-compat";
-
-const name$o = "@firebase/analytics-compat";
-
-const name$n = "@firebase/analytics";
-
-const name$m = "@firebase/app-check-compat";
-
-const name$l = "@firebase/app-check";
-
-const name$k = "@firebase/auth";
-
-const name$j = "@firebase/auth-compat";
-
-const name$i = "@firebase/database";
-
-const name$h = "@firebase/data-connect";
-
-const name$g = "@firebase/database-compat";
-
-const name$f = "@firebase/functions";
-
-const name$e = "@firebase/functions-compat";
-
-const name$d = "@firebase/installations";
-
-const name$c = "@firebase/installations-compat";
-
-const name$b = "@firebase/messaging";
-
-const name$a = "@firebase/messaging-compat";
-
-const name$9 = "@firebase/performance";
-
-const name$8 = "@firebase/performance-compat";
-
-const name$7 = "@firebase/remote-config";
-
-const name$6 = "@firebase/remote-config-compat";
-
-const name$5 = "@firebase/storage";
-
-const name$4 = "@firebase/storage-compat";
-
-const name$3 = "@firebase/firestore";
-
-const name$2 = "@firebase/ai";
-
-const name$1 = "@firebase/firestore-compat";
-
-const name = "firebase";
-const version = "12.5.0";
-
-/**
- * @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.
- */
-/**
- * The default app name
- *
- * @internal
- */
-const DEFAULT_ENTRY_NAME = '[DEFAULT]';
-const PLATFORM_LOG_STRING = {
- [name$q]: 'fire-core',
- [name$p]: 'fire-core-compat',
- [name$n]: 'fire-analytics',
- [name$o]: 'fire-analytics-compat',
- [name$l]: 'fire-app-check',
- [name$m]: 'fire-app-check-compat',
- [name$k]: 'fire-auth',
- [name$j]: 'fire-auth-compat',
- [name$i]: 'fire-rtdb',
- [name$h]: 'fire-data-connect',
- [name$g]: 'fire-rtdb-compat',
- [name$f]: 'fire-fn',
- [name$e]: 'fire-fn-compat',
- [name$d]: 'fire-iid',
- [name$c]: 'fire-iid-compat',
- [name$b]: 'fire-fcm',
- [name$a]: 'fire-fcm-compat',
- [name$9]: 'fire-perf',
- [name$8]: 'fire-perf-compat',
- [name$7]: 'fire-rc',
- [name$6]: 'fire-rc-compat',
- [name$5]: 'fire-gcs',
- [name$4]: 'fire-gcs-compat',
- [name$3]: 'fire-fst',
- [name$1]: 'fire-fst-compat',
- [name$2]: 'fire-vertex',
- 'fire-js': 'fire-js', // Platform identifier for JS SDK.
- [name]: 'fire-js-all'
-};
-
-/**
- * @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.
- */
-/**
- * @internal
- */
-const _apps = new Map();
-/**
- * @internal
- */
-const _serverApps = new Map();
-/**
- * Registered components.
- *
- * @internal
- */
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-const _components = new Map();
-/**
- * @param component - the component being added to this app's container
- *
- * @internal
- */
-function _addComponent(app, component) {
- try {
- app.container.addComponent(component);
- }
- catch (e) {
- logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);
- }
-}
-/**
- *
- * @internal
- */
-function _addOrOverwriteComponent(app, component) {
- app.container.addOrOverwriteComponent(component);
-}
-/**
- *
- * @param component - the component to register
- * @returns whether or not the component is registered successfully
- *
- * @internal
- */
-function _registerComponent(component) {
- const componentName = component.name;
- if (_components.has(componentName)) {
- logger.debug(`There were multiple attempts to register component ${componentName}.`);
- return false;
- }
- _components.set(componentName, component);
- // add the component to existing app instances
- for (const app of _apps.values()) {
- _addComponent(app, component);
- }
- for (const serverApp of _serverApps.values()) {
- _addComponent(serverApp, component);
- }
- return true;
-}
-/**
- *
- * @param app - FirebaseApp instance
- * @param name - service name
- *
- * @returns the provider for the service with the matching name
- *
- * @internal
- */
-function _getProvider(app, name) {
- const heartbeatController = app.container
- .getProvider('heartbeat')
- .getImmediate({ optional: true });
- if (heartbeatController) {
- void heartbeatController.triggerHeartbeat();
- }
- return app.container.getProvider(name);
-}
-/**
- *
- * @param app - FirebaseApp instance
- * @param name - service name
- * @param instanceIdentifier - service instance identifier in case the service supports multiple instances
- *
- * @internal
- */
-function _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {
- _getProvider(app, name).clearInstance(instanceIdentifier);
-}
-/**
- *
- * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.
- *
- * @returns true if the provide object is of type FirebaseApp.
- *
- * @internal
- */
-function _isFirebaseApp(obj) {
- return obj.options !== undefined;
-}
-/**
- *
- * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.
- *
- * @returns true if the provided object is of type FirebaseServerAppImpl.
- *
- * @internal
- */
-function _isFirebaseServerAppSettings(obj) {
- if (_isFirebaseApp(obj)) {
- return false;
- }
- return ('authIdToken' in obj ||
- 'appCheckToken' in obj ||
- 'releaseOnDeref' in obj ||
- 'automaticDataCollectionEnabled' in obj);
-}
-/**
- *
- * @param obj - an object of type FirebaseApp.
- *
- * @returns true if the provided object is of type FirebaseServerAppImpl.
- *
- * @internal
- */
-function _isFirebaseServerApp(obj) {
- if (obj === null || obj === undefined) {
- return false;
- }
- return obj.settings !== undefined;
-}
-/**
- * Test only
- *
- * @internal
- */
-function _clearComponents() {
- _components.clear();
-}
-
-/**
- * @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 ERRORS = {
- ["no-app" /* AppError.NO_APP */]: "No Firebase App '{$appName}' has been created - " +
- 'call initializeApp() first',
- ["bad-app-name" /* AppError.BAD_APP_NAME */]: "Illegal App name: '{$appName}'",
- ["duplicate-app" /* AppError.DUPLICATE_APP */]: "Firebase App named '{$appName}' already exists with different options or config",
- ["app-deleted" /* AppError.APP_DELETED */]: "Firebase App named '{$appName}' already deleted",
- ["server-app-deleted" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',
- ["no-options" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',
- ["invalid-app-argument" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +
- 'Firebase App instance.',
- ["invalid-log-argument" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',
- ["idb-open" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',
- ["idb-get" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',
- ["idb-set" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',
- ["idb-delete" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',
- ["finalization-registry-not-supported" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',
- ["invalid-server-app-environment" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'
-};
-const ERROR_FACTORY = new util.ErrorFactory('app', 'Firebase', ERRORS);
-
-/**
- * @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.
- */
-class FirebaseAppImpl {
- constructor(options, config, container) {
- this._isDeleted = false;
- this._options = { ...options };
- this._config = { ...config };
- this._name = config.name;
- this._automaticDataCollectionEnabled =
- config.automaticDataCollectionEnabled;
- this._container = container;
- this.container.addComponent(new component.Component('app', () => this, "PUBLIC" /* ComponentType.PUBLIC */));
- }
- get automaticDataCollectionEnabled() {
- this.checkDestroyed();
- return this._automaticDataCollectionEnabled;
- }
- set automaticDataCollectionEnabled(val) {
- this.checkDestroyed();
- this._automaticDataCollectionEnabled = val;
- }
- get name() {
- this.checkDestroyed();
- return this._name;
- }
- get options() {
- this.checkDestroyed();
- return this._options;
- }
- get config() {
- this.checkDestroyed();
- return this._config;
- }
- get container() {
- return this._container;
- }
- get isDeleted() {
- return this._isDeleted;
- }
- set isDeleted(val) {
- this._isDeleted = val;
- }
- /**
- * This function will throw an Error if the App has already been deleted -
- * use before performing API actions on the App.
- */
- checkDestroyed() {
- if (this.isDeleted) {
- throw ERROR_FACTORY.create("app-deleted" /* AppError.APP_DELETED */, { appName: this._name });
- }
- }
-}
-
-/**
- * @license
- * Copyright 2023 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.
- */
-// Parse the token and check to see if the `exp` claim is in the future.
-// Reports an error to the console if the token or claim could not be parsed, or if `exp` is in
-// the past.
-function validateTokenTTL(base64Token, tokenName) {
- const secondPart = util.base64Decode(base64Token.split('.')[1]);
- if (secondPart === null) {
- console.error(`FirebaseServerApp ${tokenName} is invalid: second part could not be parsed.`);
- return;
- }
- const expClaim = JSON.parse(secondPart).exp;
- if (expClaim === undefined) {
- console.error(`FirebaseServerApp ${tokenName} is invalid: expiration claim could not be parsed`);
- return;
- }
- const exp = JSON.parse(secondPart).exp * 1000;
- const now = new Date().getTime();
- const diff = exp - now;
- if (diff <= 0) {
- console.error(`FirebaseServerApp ${tokenName} is invalid: the token has expired.`);
- }
-}
-class FirebaseServerAppImpl extends FirebaseAppImpl {
- constructor(options, serverConfig, name, container) {
- // Build configuration parameters for the FirebaseAppImpl base class.
- const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined
- ? serverConfig.automaticDataCollectionEnabled
- : true;
- // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.
- const config = {
- name,
- automaticDataCollectionEnabled
- };
- if (options.apiKey !== undefined) {
- // Construct the parent FirebaseAppImp object.
- super(options, config, container);
- }
- else {
- const appImpl = options;
- super(appImpl.options, config, container);
- }
- // Now construct the data for the FirebaseServerAppImpl.
- this._serverConfig = {
- automaticDataCollectionEnabled,
- ...serverConfig
- };
- // Ensure that the current time is within the `authIdtoken` window of validity.
- if (this._serverConfig.authIdToken) {
- validateTokenTTL(this._serverConfig.authIdToken, 'authIdToken');
- }
- // Ensure that the current time is within the `appCheckToken` window of validity.
- if (this._serverConfig.appCheckToken) {
- validateTokenTTL(this._serverConfig.appCheckToken, 'appCheckToken');
- }
- this._finalizationRegistry = null;
- if (typeof FinalizationRegistry !== 'undefined') {
- this._finalizationRegistry = new FinalizationRegistry(() => {
- this.automaticCleanup();
- });
- }
- this._refCount = 0;
- this.incRefCount(this._serverConfig.releaseOnDeref);
- // Do not retain a hard reference to the dref object, otherwise the FinalizationRegistry
- // will never trigger.
- this._serverConfig.releaseOnDeref = undefined;
- serverConfig.releaseOnDeref = undefined;
- registerVersion(name$q, version$1, 'serverapp');
- }
- toJSON() {
- return undefined;
- }
- get refCount() {
- return this._refCount;
- }
- // Increment the reference count of this server app. If an object is provided, register it
- // with the finalization registry.
- incRefCount(obj) {
- if (this.isDeleted) {
- return;
- }
- this._refCount++;
- if (obj !== undefined && this._finalizationRegistry !== null) {
- this._finalizationRegistry.register(obj, this);
- }
- }
- // Decrement the reference count.
- decRefCount() {
- if (this.isDeleted) {
- return 0;
- }
- return --this._refCount;
- }
- // Invoked by the FinalizationRegistry callback to note that this app should go through its
- // reference counts and delete itself if no reference count remain. The coordinating logic that
- // handles this is in deleteApp(...).
- automaticCleanup() {
- void deleteApp(this);
- }
- get settings() {
- this.checkDestroyed();
- return this._serverConfig;
- }
- /**
- * This function will throw an Error if the App has already been deleted -
- * use before performing API actions on the App.
- */
- checkDestroyed() {
- if (this.isDeleted) {
- throw ERROR_FACTORY.create("server-app-deleted" /* AppError.SERVER_APP_DELETED */);
- }
- }
-}
-
-/**
- * @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.
- */
-/**
- * The current SDK version.
- *
- * @public
- */
-const SDK_VERSION = version;
-function initializeApp(_options, rawConfig = {}) {
- let options = _options;
- if (typeof rawConfig !== 'object') {
- const name = rawConfig;
- rawConfig = { name };
- }
- const config = {
- name: DEFAULT_ENTRY_NAME,
- automaticDataCollectionEnabled: true,
- ...rawConfig
- };
- const name = config.name;
- if (typeof name !== 'string' || !name) {
- throw ERROR_FACTORY.create("bad-app-name" /* AppError.BAD_APP_NAME */, {
- appName: String(name)
- });
- }
- options || (options = util.getDefaultAppConfig());
- if (!options) {
- throw ERROR_FACTORY.create("no-options" /* AppError.NO_OPTIONS */);
- }
- const existingApp = _apps.get(name);
- if (existingApp) {
- // return the existing app if options and config deep equal the ones in the existing app.
- if (util.deepEqual(options, existingApp.options) &&
- util.deepEqual(config, existingApp.config)) {
- return existingApp;
- }
- else {
- throw ERROR_FACTORY.create("duplicate-app" /* AppError.DUPLICATE_APP */, { appName: name });
- }
- }
- const container = new component.ComponentContainer(name);
- for (const component of _components.values()) {
- container.addComponent(component);
- }
- const newApp = new FirebaseAppImpl(options, config, container);
- _apps.set(name, newApp);
- return newApp;
-}
-function initializeServerApp(_options, _serverAppConfig = {}) {
- if (util.isBrowser() && !util.isWebWorker()) {
- // FirebaseServerApp isn't designed to be run in browsers.
- throw ERROR_FACTORY.create("invalid-server-app-environment" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);
- }
- let firebaseOptions;
- let serverAppSettings = _serverAppConfig || {};
- if (_options) {
- if (_isFirebaseApp(_options)) {
- firebaseOptions = _options.options;
- }
- else if (_isFirebaseServerAppSettings(_options)) {
- serverAppSettings = _options;
- }
- else {
- firebaseOptions = _options;
- }
- }
- if (serverAppSettings.automaticDataCollectionEnabled === undefined) {
- serverAppSettings.automaticDataCollectionEnabled = true;
- }
- firebaseOptions || (firebaseOptions = util.getDefaultAppConfig());
- if (!firebaseOptions) {
- throw ERROR_FACTORY.create("no-options" /* AppError.NO_OPTIONS */);
- }
- // Build an app name based on a hash of the configuration options.
- const nameObj = {
- ...serverAppSettings,
- ...firebaseOptions
- };
- // However, Do not mangle the name based on releaseOnDeref, since it will vary between the
- // construction of FirebaseServerApp instances. For example, if the object is the request headers.
- if (nameObj.releaseOnDeref !== undefined) {
- delete nameObj.releaseOnDeref;
- }
- const hashCode = (s) => {
- return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);
- };
- if (serverAppSettings.releaseOnDeref !== undefined) {
- if (typeof FinalizationRegistry === 'undefined') {
- throw ERROR_FACTORY.create("finalization-registry-not-supported" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});
- }
- }
- const nameString = '' + hashCode(JSON.stringify(nameObj));
- const existingApp = _serverApps.get(nameString);
- if (existingApp) {
- existingApp.incRefCount(serverAppSettings.releaseOnDeref);
- return existingApp;
- }
- const container = new component.ComponentContainer(nameString);
- for (const component of _components.values()) {
- container.addComponent(component);
- }
- const newApp = new FirebaseServerAppImpl(firebaseOptions, serverAppSettings, nameString, container);
- _serverApps.set(nameString, newApp);
- return newApp;
-}
-/**
- * Retrieves a {@link @firebase/app#FirebaseApp} instance.
- *
- * When called with no arguments, the default app is returned. When an app name
- * is provided, the app corresponding to that name is returned.
- *
- * An exception is thrown if the app being retrieved has not yet been
- * initialized.
- *
- * @example
- * ```javascript
- * // Return the default app
- * const app = getApp();
- * ```
- *
- * @example
- * ```javascript
- * // Return a named app
- * const otherApp = getApp("otherApp");
- * ```
- *
- * @param name - Optional name of the app to return. If no name is
- * provided, the default is `"[DEFAULT]"`.
- *
- * @returns The app corresponding to the provided app name.
- * If no app name is provided, the default app is returned.
- *
- * @public
- */
-function getApp(name = DEFAULT_ENTRY_NAME) {
- const app = _apps.get(name);
- if (!app && name === DEFAULT_ENTRY_NAME && util.getDefaultAppConfig()) {
- return initializeApp();
- }
- if (!app) {
- throw ERROR_FACTORY.create("no-app" /* AppError.NO_APP */, { appName: name });
- }
- return app;
-}
-/**
- * A (read-only) array of all initialized apps.
- * @public
- */
-function getApps() {
- return Array.from(_apps.values());
-}
-/**
- * Renders this app unusable and frees the resources of all associated
- * services.
- *
- * @example
- * ```javascript
- * deleteApp(app)
- * .then(function() {
- * console.log("App deleted successfully");
- * })
- * .catch(function(error) {
- * console.log("Error deleting app:", error);
- * });
- * ```
- *
- * @public
- */
-async function deleteApp(app) {
- let cleanupProviders = false;
- const name = app.name;
- if (_apps.has(name)) {
- cleanupProviders = true;
- _apps.delete(name);
- }
- else if (_serverApps.has(name)) {
- const firebaseServerApp = app;
- if (firebaseServerApp.decRefCount() <= 0) {
- _serverApps.delete(name);
- cleanupProviders = true;
- }
- }
- if (cleanupProviders) {
- await Promise.all(app.container
- .getProviders()
- .map(provider => provider.delete()));
- app.isDeleted = true;
- }
-}
-/**
- * Registers a library's name and version for platform logging purposes.
- * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)
- * @param version - Current version of that library.
- * @param variant - Bundle variant, e.g., node, rn, etc.
- *
- * @public
- */
-function registerVersion(libraryKeyOrName, version, variant) {
- // TODO: We can use this check to whitelist strings when/if we set up
- // a good whitelist system.
- let library = PLATFORM_LOG_STRING[libraryKeyOrName] ?? libraryKeyOrName;
- if (variant) {
- library += `-${variant}`;
- }
- const libraryMismatch = library.match(/\s|\//);
- const versionMismatch = version.match(/\s|\//);
- if (libraryMismatch || versionMismatch) {
- const warning = [
- `Unable to register library "${library}" with version "${version}":`
- ];
- if (libraryMismatch) {
- warning.push(`library name "${library}" contains illegal characters (whitespace or "/")`);
- }
- if (libraryMismatch && versionMismatch) {
- warning.push('and');
- }
- if (versionMismatch) {
- warning.push(`version name "${version}" contains illegal characters (whitespace or "/")`);
- }
- logger.warn(warning.join(' '));
- return;
- }
- _registerComponent(new component.Component(`${library}-version`, () => ({ library, version }), "VERSION" /* ComponentType.VERSION */));
-}
-/**
- * Sets log handler for all Firebase SDKs.
- * @param logCallback - An optional custom log handler that executes user code whenever
- * the Firebase SDK makes a logging call.
- *
- * @public
- */
-function onLog(logCallback, options) {
- if (logCallback !== null && typeof logCallback !== 'function') {
- throw ERROR_FACTORY.create("invalid-log-argument" /* AppError.INVALID_LOG_ARGUMENT */);
- }
- logger$1.setUserLogHandler(logCallback, options);
-}
-/**
- * Sets log level for all Firebase SDKs.
- *
- * All of the log types above the current log level are captured (i.e. if
- * you set the log level to `info`, errors are logged, but `debug` and
- * `verbose` logs are not).
- *
- * @public
- */
-function setLogLevel(logLevel) {
- logger$1.setLogLevel(logLevel);
-}
-
-/**
- * @license
- * Copyright 2021 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 DB_NAME = 'firebase-heartbeat-database';
-const DB_VERSION = 1;
-const STORE_NAME = 'firebase-heartbeat-store';
-let dbPromise = null;
-function getDbPromise() {
- if (!dbPromise) {
- dbPromise = idb.openDB(DB_NAME, DB_VERSION, {
- upgrade: (db, oldVersion) => {
- // We don't use 'break' in this switch statement, the fall-through
- // behavior is what we want, because if there are multiple versions between
- // the old version and the current version, we want ALL the migrations
- // that correspond to those versions to run, not only the last one.
- // eslint-disable-next-line default-case
- switch (oldVersion) {
- case 0:
- try {
- db.createObjectStore(STORE_NAME);
- }
- catch (e) {
- // Safari/iOS browsers throw occasional exceptions on
- // db.createObjectStore() that may be a bug. Avoid blocking
- // the rest of the app functionality.
- console.warn(e);
- }
- }
- }
- }).catch(e => {
- throw ERROR_FACTORY.create("idb-open" /* AppError.IDB_OPEN */, {
- originalErrorMessage: e.message
- });
- });
- }
- return dbPromise;
-}
-async function readHeartbeatsFromIndexedDB(app) {
- try {
- const db = await getDbPromise();
- const tx = db.transaction(STORE_NAME);
- const result = await tx.objectStore(STORE_NAME).get(computeKey(app));
- // We already have the value but tx.done can throw,
- // so we need to await it here to catch errors
- await tx.done;
- return result;
- }
- catch (e) {
- if (e instanceof util.FirebaseError) {
- logger.warn(e.message);
- }
- else {
- const idbGetError = ERROR_FACTORY.create("idb-get" /* AppError.IDB_GET */, {
- originalErrorMessage: e?.message
- });
- logger.warn(idbGetError.message);
- }
- }
-}
-async function writeHeartbeatsToIndexedDB(app, heartbeatObject) {
- try {
- const db = await getDbPromise();
- const tx = db.transaction(STORE_NAME, 'readwrite');
- const objectStore = tx.objectStore(STORE_NAME);
- await objectStore.put(heartbeatObject, computeKey(app));
- await tx.done;
- }
- catch (e) {
- if (e instanceof util.FirebaseError) {
- logger.warn(e.message);
- }
- else {
- const idbGetError = ERROR_FACTORY.create("idb-set" /* AppError.IDB_WRITE */, {
- originalErrorMessage: e?.message
- });
- logger.warn(idbGetError.message);
- }
- }
-}
-function computeKey(app) {
- return `${app.name}!${app.options.appId}`;
-}
-
-/**
- * @license
- * Copyright 2021 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 MAX_HEADER_BYTES = 1024;
-const MAX_NUM_STORED_HEARTBEATS = 30;
-class HeartbeatServiceImpl {
- constructor(container) {
- this.container = container;
- /**
- * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate
- * the header string.
- * Stores one record per date. This will be consolidated into the standard
- * format of one record per user agent string before being sent as a header.
- * Populated from indexedDB when the controller is instantiated and should
- * be kept in sync with indexedDB.
- * Leave public for easier testing.
- */
- this._heartbeatsCache = null;
- const app = this.container.getProvider('app').getImmediate();
- this._storage = new HeartbeatStorageImpl(app);
- this._heartbeatsCachePromise = this._storage.read().then(result => {
- this._heartbeatsCache = result;
- return result;
- });
- }
- /**
- * Called to report a heartbeat. The function will generate
- * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it
- * to IndexedDB.
- * Note that we only store one heartbeat per day. So if a heartbeat for today is
- * already logged, subsequent calls to this function in the same day will be ignored.
- */
- async triggerHeartbeat() {
- try {
- const platformLogger = this.container
- .getProvider('platform-logger')
- .getImmediate();
- // This is the "Firebase user agent" string from the platform logger
- // service, not the browser user agent.
- const agent = platformLogger.getPlatformInfoString();
- const date = getUTCDateString();
- if (this._heartbeatsCache?.heartbeats == null) {
- this._heartbeatsCache = await this._heartbeatsCachePromise;
- // If we failed to construct a heartbeats cache, then return immediately.
- if (this._heartbeatsCache?.heartbeats == null) {
- return;
- }
- }
- // Do not store a heartbeat if one is already stored for this day
- // or if a header has already been sent today.
- if (this._heartbeatsCache.lastSentHeartbeatDate === date ||
- this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {
- return;
- }
- else {
- // There is no entry for this date. Create one.
- this._heartbeatsCache.heartbeats.push({ date, agent });
- // If the number of stored heartbeats exceeds the maximum number of stored heartbeats, remove the heartbeat with the earliest date.
- // Since this is executed each time a heartbeat is pushed, the limit can only be exceeded by one, so only one needs to be removed.
- if (this._heartbeatsCache.heartbeats.length > MAX_NUM_STORED_HEARTBEATS) {
- const earliestHeartbeatIdx = getEarliestHeartbeatIdx(this._heartbeatsCache.heartbeats);
- this._heartbeatsCache.heartbeats.splice(earliestHeartbeatIdx, 1);
- }
- }
- return this._storage.overwrite(this._heartbeatsCache);
- }
- catch (e) {
- logger.warn(e);
- }
- }
- /**
- * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.
- * It also clears all heartbeats from memory as well as in IndexedDB.
- *
- * NOTE: Consuming product SDKs should not send the header if this method
- * returns an empty string.
- */
- async getHeartbeatsHeader() {
- try {
- if (this._heartbeatsCache === null) {
- await this._heartbeatsCachePromise;
- }
- // If it's still null or the array is empty, there is no data to send.
- if (this._heartbeatsCache?.heartbeats == null ||
- this._heartbeatsCache.heartbeats.length === 0) {
- return '';
- }
- const date = getUTCDateString();
- // Extract as many heartbeats from the cache as will fit under the size limit.
- const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);
- const headerString = util.base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));
- // Store last sent date to prevent another being logged/sent for the same day.
- this._heartbeatsCache.lastSentHeartbeatDate = date;
- if (unsentEntries.length > 0) {
- // Store any unsent entries if they exist.
- this._heartbeatsCache.heartbeats = unsentEntries;
- // This seems more likely than emptying the array (below) to lead to some odd state
- // since the cache isn't empty and this will be called again on the next request,
- // and is probably safest if we await it.
- await this._storage.overwrite(this._heartbeatsCache);
- }
- else {
- this._heartbeatsCache.heartbeats = [];
- // Do not wait for this, to reduce latency.
- void this._storage.overwrite(this._heartbeatsCache);
- }
- return headerString;
- }
- catch (e) {
- logger.warn(e);
- return '';
- }
- }
-}
-function getUTCDateString() {
- const today = new Date();
- // Returns date format 'YYYY-MM-DD'
- return today.toISOString().substring(0, 10);
-}
-function extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {
- // Heartbeats grouped by user agent in the standard format to be sent in
- // the header.
- const heartbeatsToSend = [];
- // Single date format heartbeats that are not sent.
- let unsentEntries = heartbeatsCache.slice();
- for (const singleDateHeartbeat of heartbeatsCache) {
- // Look for an existing entry with the same user agent.
- const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);
- if (!heartbeatEntry) {
- // If no entry for this user agent exists, create one.
- heartbeatsToSend.push({
- agent: singleDateHeartbeat.agent,
- dates: [singleDateHeartbeat.date]
- });
- if (countBytes(heartbeatsToSend) > maxSize) {
- // If the header would exceed max size, remove the added heartbeat
- // entry and stop adding to the header.
- heartbeatsToSend.pop();
- break;
- }
- }
- else {
- heartbeatEntry.dates.push(singleDateHeartbeat.date);
- // If the header would exceed max size, remove the added date
- // and stop adding to the header.
- if (countBytes(heartbeatsToSend) > maxSize) {
- heartbeatEntry.dates.pop();
- break;
- }
- }
- // Pop unsent entry from queue. (Skipped if adding the entry exceeded
- // quota and the loop breaks early.)
- unsentEntries = unsentEntries.slice(1);
- }
- return {
- heartbeatsToSend,
- unsentEntries
- };
-}
-class HeartbeatStorageImpl {
- constructor(app) {
- this.app = app;
- this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();
- }
- async runIndexedDBEnvironmentCheck() {
- if (!util.isIndexedDBAvailable()) {
- return false;
- }
- else {
- return util.validateIndexedDBOpenable()
- .then(() => true)
- .catch(() => false);
- }
- }
- /**
- * Read all heartbeats.
- */
- async read() {
- const canUseIndexedDB = await this._canUseIndexedDBPromise;
- if (!canUseIndexedDB) {
- return { heartbeats: [] };
- }
- else {
- const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);
- if (idbHeartbeatObject?.heartbeats) {
- return idbHeartbeatObject;
- }
- else {
- return { heartbeats: [] };
- }
- }
- }
- // overwrite the storage with the provided heartbeats
- async overwrite(heartbeatsObject) {
- const canUseIndexedDB = await this._canUseIndexedDBPromise;
- if (!canUseIndexedDB) {
- return;
- }
- else {
- const existingHeartbeatsObject = await this.read();
- return writeHeartbeatsToIndexedDB(this.app, {
- lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??
- existingHeartbeatsObject.lastSentHeartbeatDate,
- heartbeats: heartbeatsObject.heartbeats
- });
- }
- }
- // add heartbeats
- async add(heartbeatsObject) {
- const canUseIndexedDB = await this._canUseIndexedDBPromise;
- if (!canUseIndexedDB) {
- return;
- }
- else {
- const existingHeartbeatsObject = await this.read();
- return writeHeartbeatsToIndexedDB(this.app, {
- lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??
- existingHeartbeatsObject.lastSentHeartbeatDate,
- heartbeats: [
- ...existingHeartbeatsObject.heartbeats,
- ...heartbeatsObject.heartbeats
- ]
- });
- }
- }
-}
-/**
- * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped
- * in a platform logging header JSON object, stringified, and converted
- * to base 64.
- */
-function countBytes(heartbeatsCache) {
- // base64 has a restricted set of characters, all of which should be 1 byte.
- return util.base64urlEncodeWithoutPadding(
- // heartbeatsCache wrapper properties
- JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;
-}
-/**
- * Returns the index of the heartbeat with the earliest date.
- * If the heartbeats array is empty, -1 is returned.
- */
-function getEarliestHeartbeatIdx(heartbeats) {
- if (heartbeats.length === 0) {
- return -1;
- }
- let earliestHeartbeatIdx = 0;
- let earliestHeartbeatDate = heartbeats[0].date;
- for (let i = 1; i < heartbeats.length; i++) {
- if (heartbeats[i].date < earliestHeartbeatDate) {
- earliestHeartbeatDate = heartbeats[i].date;
- earliestHeartbeatIdx = i;
- }
- }
- return earliestHeartbeatIdx;
-}
-
-/**
- * @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.
- */
-function registerCoreComponents(variant) {
- _registerComponent(new component.Component('platform-logger', container => new PlatformLoggerServiceImpl(container), "PRIVATE" /* ComponentType.PRIVATE */));
- _registerComponent(new component.Component('heartbeat', container => new HeartbeatServiceImpl(container), "PRIVATE" /* ComponentType.PRIVATE */));
- // Register `app` package.
- registerVersion(name$q, version$1, variant);
- // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation
- registerVersion(name$q, version$1, 'cjs2020');
- // Register platform SDK identifier (no version).
- registerVersion('fire-js', '');
-}
-
-/**
- * Firebase App
- *
- * @remarks This package coordinates the communication between the different Firebase components
- * @packageDocumentation
- */
-registerCoreComponents('node');
-
-Object.defineProperty(exports, 'FirebaseError', {
- enumerable: true,
- get: function () { return util.FirebaseError; }
-});
-exports.SDK_VERSION = SDK_VERSION;
-exports._DEFAULT_ENTRY_NAME = DEFAULT_ENTRY_NAME;
-exports._addComponent = _addComponent;
-exports._addOrOverwriteComponent = _addOrOverwriteComponent;
-exports._apps = _apps;
-exports._clearComponents = _clearComponents;
-exports._components = _components;
-exports._getProvider = _getProvider;
-exports._isFirebaseApp = _isFirebaseApp;
-exports._isFirebaseServerApp = _isFirebaseServerApp;
-exports._isFirebaseServerAppSettings = _isFirebaseServerAppSettings;
-exports._registerComponent = _registerComponent;
-exports._removeServiceInstance = _removeServiceInstance;
-exports._serverApps = _serverApps;
-exports.deleteApp = deleteApp;
-exports.getApp = getApp;
-exports.getApps = getApps;
-exports.initializeApp = initializeApp;
-exports.initializeServerApp = initializeServerApp;
-exports.onLog = onLog;
-exports.registerVersion = registerVersion;
-exports.setLogLevel = setLogLevel;
-//# sourceMappingURL=index.cjs.js.map