@firebase/remote-config 0.7.0 → 0.8.0-20260114192924

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/client/remote_config_fetch_client.ts","../../src/constants.ts","../../src/errors.ts","../../src/value.ts","../../src/api.ts","../../src/client/caching_client.ts","../../src/language.ts","../../src/client/rest_client.ts","../../src/client/retrying_client.ts","../../src/remote_config.ts","../../src/storage/storage.ts","../../src/storage/storage_cache.ts","../../src/client/eventEmitter.ts","../../src/client/visibility_monitor.ts","../../src/client/realtime_handler.ts","../../src/register.ts","../../src/api2.ts","../../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CustomSignals, FetchResponse, FetchType } from '../public_types';\n\n/**\n * Defines a client, as in https://en.wikipedia.org/wiki/Client%E2%80%93server_model, for the\n * Remote Config server (https://firebase.google.com/docs/reference/remote-config/rest).\n *\n * <p>Abstracts throttle, response cache and network implementation details.\n *\n * <p>Modeled after the native {@link GlobalFetch} interface, which is relatively modern and\n * convenient, but simplified for Remote Config's use case.\n *\n * Disambiguation: {@link GlobalFetch} interface and the Remote Config service define \"fetch\"\n * methods. The RestClient uses the former to make HTTP calls. This interface abstracts the latter.\n */\nexport interface RemoteConfigFetchClient {\n /**\n * @throws if response status is not 200 or 304.\n */\n fetch(request: FetchRequest): Promise<FetchResponse>;\n}\n\n/**\n * Shims a minimal AbortSignal.\n *\n * <p>AbortController's AbortSignal conveniently decouples fetch timeout logic from other aspects\n * of networking, such as retries. Firebase doesn't use AbortController enough to justify a\n * polyfill recommendation, like we do with the Fetch API, but this minimal shim can easily be\n * swapped out if/when we do.\n */\nexport class RemoteConfigAbortSignal {\n listeners: Array<() => void> = [];\n addEventListener(listener: () => void): void {\n this.listeners.push(listener);\n }\n abort(): void {\n this.listeners.forEach(listener => listener());\n }\n}\n\n/**\n * Defines per-request inputs for the Remote Config fetch request.\n *\n * <p>Modeled after the native {@link Request} interface, but simplified for Remote Config's\n * use case.\n */\nexport interface FetchRequest {\n /**\n * Uses cached config if it is younger than this age.\n *\n * <p>Required because it's defined by settings, which always have a value.\n *\n * <p>Comparable to passing `headers = { 'Cache-Control': max-age <maxAge> }` to the native\n * Fetch API.\n */\n cacheMaxAgeMillis: number;\n\n /**\n * An event bus for the signal to abort a request.\n *\n * <p>Required because all requests should be abortable.\n *\n * <p>Comparable to the native\n * Fetch API's \"signal\" field on its request configuration object\n * https://fetch.spec.whatwg.org/#dom-requestinit-signal.\n *\n * <p>Disambiguation: Remote Config commonly refers to API inputs as\n * \"signals\". See the private ConfigFetchRequestBody interface for those:\n * http://google3/firebase/remote_config/web/src/core/rest_client.ts?l=14&rcl=255515243.\n */\n signal: RemoteConfigAbortSignal;\n\n /**\n * The ETag header value from the last response.\n *\n * <p>Optional in case this is the first request.\n *\n * <p>Comparable to passing `headers = { 'If-None-Match': <eTag> }` to the native Fetch API.\n */\n eTag?: string;\n\n /** The custom signals stored for the app instance.\n *\n * <p>Optional in case no custom signals are set for the instance.\n */\n customSignals?: CustomSignals;\n\n /**\n * The type of fetch to perform, such as a regular fetch or a real-time fetch.\n *\n * Optional as not all fetch requests need to be distinguished.\n */\n fetchType?: FetchType;\n\n /**\n * The number of fetch attempts made so far for this request.\n *\n * Optional as not all fetch requests are part of a retry series.\n */\n fetchAttempt?: number;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const RC_COMPONENT_NAME = 'remote-config';\nexport const RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS = 100;\nexport const RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH = 250;\nexport const RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH = 500;\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\n\nexport const enum ErrorCode {\n ALREADY_INITIALIZED = 'already-initialized',\n REGISTRATION_WINDOW = 'registration-window',\n REGISTRATION_PROJECT_ID = 'registration-project-id',\n REGISTRATION_API_KEY = 'registration-api-key',\n REGISTRATION_APP_ID = 'registration-app-id',\n STORAGE_OPEN = 'storage-open',\n STORAGE_GET = 'storage-get',\n STORAGE_SET = 'storage-set',\n STORAGE_DELETE = 'storage-delete',\n FETCH_NETWORK = 'fetch-client-network',\n FETCH_TIMEOUT = 'fetch-timeout',\n FETCH_THROTTLE = 'fetch-throttle',\n FETCH_PARSE = 'fetch-client-parse',\n FETCH_STATUS = 'fetch-status',\n INDEXED_DB_UNAVAILABLE = 'indexed-db-unavailable',\n CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS = 'custom-signal-max-allowed-signals',\n CONFIG_UPDATE_STREAM_ERROR = 'stream-error',\n CONFIG_UPDATE_UNAVAILABLE = 'realtime-unavailable',\n CONFIG_UPDATE_MESSAGE_INVALID = 'update-message-invalid',\n CONFIG_UPDATE_NOT_FETCHED = 'update-not-fetched'\n}\n\nconst ERROR_DESCRIPTION_MAP: { readonly [key in ErrorCode]: string } = {\n [ErrorCode.ALREADY_INITIALIZED]: 'Remote Config already initialized',\n [ErrorCode.REGISTRATION_WINDOW]:\n 'Undefined window object. This SDK only supports usage in a browser environment.',\n [ErrorCode.REGISTRATION_PROJECT_ID]:\n 'Undefined project identifier. Check Firebase app initialization.',\n [ErrorCode.REGISTRATION_API_KEY]:\n 'Undefined API key. Check Firebase app initialization.',\n [ErrorCode.REGISTRATION_APP_ID]:\n 'Undefined app identifier. Check Firebase app initialization.',\n [ErrorCode.STORAGE_OPEN]:\n 'Error thrown when opening storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_GET]:\n 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_SET]:\n 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_DELETE]:\n 'Error thrown when deleting from storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_NETWORK]:\n 'Fetch client failed to connect to a network. Check Internet connection.' +\n ' Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_TIMEOUT]:\n 'The config fetch request timed out. ' +\n ' Configure timeout using \"fetchTimeoutMillis\" SDK setting.',\n [ErrorCode.FETCH_THROTTLE]:\n 'The config fetch request timed out while in an exponential backoff state.' +\n ' Configure timeout using \"fetchTimeoutMillis\" SDK setting.' +\n ' Unix timestamp in milliseconds when fetch request throttling ends: {$throttleEndTimeMillis}.',\n [ErrorCode.FETCH_PARSE]:\n 'Fetch client could not parse response.' +\n ' Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_STATUS]:\n 'Fetch server returned an HTTP error status. HTTP status: {$httpStatus}.',\n [ErrorCode.INDEXED_DB_UNAVAILABLE]:\n 'Indexed DB is not supported by current browser',\n [ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS]:\n 'Setting more than {$maxSignals} custom signals is not supported.',\n [ErrorCode.CONFIG_UPDATE_STREAM_ERROR]:\n 'The stream was not able to connect to the backend: {$originalErrorMessage}.',\n [ErrorCode.CONFIG_UPDATE_UNAVAILABLE]:\n 'The Realtime service is unavailable: {$originalErrorMessage}',\n [ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID]:\n 'The stream invalidation message was unparsable: {$originalErrorMessage}',\n [ErrorCode.CONFIG_UPDATE_NOT_FETCHED]:\n 'Unable to fetch the latest config: {$originalErrorMessage}'\n};\n\n// Note this is effectively a type system binding a code to params. This approach overlaps with the\n// role of TS interfaces, but works well for a few reasons:\n// 1) JS is unaware of TS interfaces, eg we can't test for interface implementation in JS\n// 2) callers should have access to a human-readable summary of the error and this interpolates\n// params into an error message;\n// 3) callers should be able to programmatically access data associated with an error, which\n// ErrorData provides.\ninterface ErrorParams {\n [ErrorCode.STORAGE_OPEN]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_GET]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_SET]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_DELETE]: { originalErrorMessage: string | undefined };\n [ErrorCode.FETCH_NETWORK]: { originalErrorMessage: string };\n [ErrorCode.FETCH_THROTTLE]: { throttleEndTimeMillis: number };\n [ErrorCode.FETCH_PARSE]: { originalErrorMessage: string };\n [ErrorCode.FETCH_STATUS]: { httpStatus: number };\n [ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS]: { maxSignals: number };\n [ErrorCode.CONFIG_UPDATE_STREAM_ERROR]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_UNAVAILABLE]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_NOT_FETCHED]: { originalErrorMessage: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory<ErrorCode, ErrorParams>(\n 'remoteconfig' /* service */,\n 'Remote Config' /* service name */,\n ERROR_DESCRIPTION_MAP\n);\n\n// Note how this is like typeof/instanceof, but for ErrorCode.\nexport function hasErrorCode(e: Error, errorCode: ErrorCode): boolean {\n return e instanceof FirebaseError && e.code.indexOf(errorCode) !== -1;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Value as ValueType, ValueSource } from '@firebase/remote-config-types';\n\nconst DEFAULT_VALUE_FOR_BOOLEAN = false;\nconst DEFAULT_VALUE_FOR_STRING = '';\nconst DEFAULT_VALUE_FOR_NUMBER = 0;\n\nconst BOOLEAN_TRUTHY_VALUES = ['1', 'true', 't', 'yes', 'y', 'on'];\n\nexport class Value implements ValueType {\n constructor(\n private readonly _source: ValueSource,\n private readonly _value: string = DEFAULT_VALUE_FOR_STRING\n ) {}\n\n asString(): string {\n return this._value;\n }\n\n asBoolean(): boolean {\n if (this._source === 'static') {\n return DEFAULT_VALUE_FOR_BOOLEAN;\n }\n return BOOLEAN_TRUTHY_VALUES.indexOf(this._value.toLowerCase()) >= 0;\n }\n\n asNumber(): number {\n if (this._source === 'static') {\n return DEFAULT_VALUE_FOR_NUMBER;\n }\n let num = Number(this._value);\n if (isNaN(num)) {\n num = DEFAULT_VALUE_FOR_NUMBER;\n }\n return num;\n }\n\n getSource(): ValueSource {\n return this._source;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getProvider, FirebaseApp, getApp } from '@firebase/app';\nimport { deepEqual, getModularInstance } from '@firebase/util';\nimport {\n CustomSignals,\n LogLevel as RemoteConfigLogLevel,\n RemoteConfig,\n Value,\n RemoteConfigOptions,\n ConfigUpdateObserver,\n Unsubscribe\n} from './public_types';\nimport { RemoteConfigAbortSignal } from './client/remote_config_fetch_client';\nimport {\n RC_COMPONENT_NAME,\n RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH,\n RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH\n} from './constants';\nimport { ERROR_FACTORY, ErrorCode, hasErrorCode } from './errors';\nimport { RemoteConfig as RemoteConfigImpl } from './remote_config';\nimport { Value as ValueImpl } from './value';\nimport { LogLevel as FirebaseLogLevel } from '@firebase/logger';\n\n/**\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\n * @param options - Optional. The {@link RemoteConfigOptions} with which to instantiate the\n * Remote Config instance.\n * @returns A {@link RemoteConfig} instance.\n *\n * @public\n */\nexport function getRemoteConfig(\n app: FirebaseApp = getApp(),\n options: RemoteConfigOptions = {}\n): RemoteConfig {\n app = getModularInstance(app);\n const rcProvider = _getProvider(app, RC_COMPONENT_NAME);\n if (rcProvider.isInitialized()) {\n const initialOptions = rcProvider.getOptions() as RemoteConfigOptions;\n if (deepEqual(initialOptions, options)) {\n return rcProvider.getImmediate();\n }\n throw ERROR_FACTORY.create(ErrorCode.ALREADY_INITIALIZED);\n }\n rcProvider.initialize({ options });\n const rc = rcProvider.getImmediate() as RemoteConfigImpl;\n\n if (options.initialFetchResponse) {\n // We use these initial writes as the initialization promise since they will hydrate the same\n // fields that `storageCache.loadFromStorage` would set.\n rc._initializePromise = Promise.all([\n rc._storage.setLastSuccessfulFetchResponse(options.initialFetchResponse),\n rc._storage.setActiveConfigEtag(options.initialFetchResponse?.eTag || ''),\n rc._storage.setActiveConfigTemplateVersion(\n options.initialFetchResponse.templateVersion || 0\n ),\n rc._storageCache.setLastSuccessfulFetchTimestampMillis(Date.now()),\n rc._storageCache.setLastFetchStatus('success'),\n rc._storageCache.setActiveConfig(\n options.initialFetchResponse?.config || {}\n )\n ]).then();\n // The `storageCache` methods above set their in-memory fields synchronously, so it's\n // safe to declare our initialization complete at this point.\n rc._isInitializationComplete = true;\n }\n\n return rc;\n}\n\n/**\n * Makes the last fetched config available to the getters.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @returns A `Promise` which resolves to true if the current call activated the fetched configs.\n * If the fetched configs were already activated, the `Promise` will resolve to false.\n *\n * @public\n */\nexport async function activate(remoteConfig: RemoteConfig): Promise<boolean> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n const [lastSuccessfulFetchResponse, activeConfigEtag] = await Promise.all([\n rc._storage.getLastSuccessfulFetchResponse(),\n rc._storage.getActiveConfigEtag()\n ]);\n if (\n !lastSuccessfulFetchResponse ||\n !lastSuccessfulFetchResponse.config ||\n !lastSuccessfulFetchResponse.eTag ||\n !lastSuccessfulFetchResponse.templateVersion ||\n lastSuccessfulFetchResponse.eTag === activeConfigEtag\n ) {\n // Either there is no successful fetched config, or is the same as current active\n // config.\n return false;\n }\n await Promise.all([\n rc._storageCache.setActiveConfig(lastSuccessfulFetchResponse.config),\n rc._storage.setActiveConfigEtag(lastSuccessfulFetchResponse.eTag),\n rc._storage.setActiveConfigTemplateVersion(\n lastSuccessfulFetchResponse.templateVersion\n )\n ]);\n return true;\n}\n\n/**\n * Ensures the last activated config are available to the getters.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n *\n * @returns A `Promise` that resolves when the last activated config is available to the getters.\n * @public\n */\nexport function ensureInitialized(remoteConfig: RemoteConfig): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (!rc._initializePromise) {\n rc._initializePromise = rc._storageCache.loadFromStorage().then(() => {\n rc._isInitializationComplete = true;\n });\n }\n return rc._initializePromise;\n}\n\n/**\n * Fetches and caches configuration from the Remote Config service.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @public\n */\nexport async function fetchConfig(remoteConfig: RemoteConfig): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n // Aborts the request after the given timeout, causing the fetch call to\n // reject with an `AbortError`.\n //\n // <p>Aborting after the request completes is a no-op, so we don't need a\n // corresponding `clearTimeout`.\n //\n // Locating abort logic here because:\n // * it uses a developer setting (timeout)\n // * it applies to all retries (like curl's max-time arg)\n // * it is consistent with the Fetch API's signal input\n const abortSignal = new RemoteConfigAbortSignal();\n\n setTimeout(async () => {\n // Note a very low delay, eg < 10ms, can elapse before listeners are initialized.\n abortSignal.abort();\n }, rc.settings.fetchTimeoutMillis);\n\n const customSignals = rc._storageCache.getCustomSignals();\n if (customSignals) {\n rc._logger.debug(\n `Fetching config with custom signals: ${JSON.stringify(customSignals)}`\n );\n }\n // Catches *all* errors thrown by client so status can be set consistently.\n try {\n await rc._client.fetch({\n cacheMaxAgeMillis: rc.settings.minimumFetchIntervalMillis,\n signal: abortSignal,\n customSignals\n });\n\n await rc._storageCache.setLastFetchStatus('success');\n } catch (e) {\n const lastFetchStatus = hasErrorCode(e as Error, ErrorCode.FETCH_THROTTLE)\n ? 'throttle'\n : 'failure';\n await rc._storageCache.setLastFetchStatus(lastFetchStatus);\n throw e;\n }\n}\n\n/**\n * Gets all config.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @returns All config.\n *\n * @public\n */\nexport function getAll(remoteConfig: RemoteConfig): Record<string, Value> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n return getAllKeys(\n rc._storageCache.getActiveConfig(),\n rc.defaultConfig\n ).reduce((allConfigs, key) => {\n allConfigs[key] = getValue(remoteConfig, key);\n return allConfigs;\n }, {} as Record<string, Value>);\n}\n\n/**\n * Gets the value for the given key as a boolean.\n *\n * Convenience method for calling <code>remoteConfig.getValue(key).asBoolean()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a boolean.\n * @public\n */\nexport function getBoolean(remoteConfig: RemoteConfig, key: string): boolean {\n return getValue(getModularInstance(remoteConfig), key).asBoolean();\n}\n\n/**\n * Gets the value for the given key as a number.\n *\n * Convenience method for calling <code>remoteConfig.getValue(key).asNumber()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a number.\n *\n * @public\n */\nexport function getNumber(remoteConfig: RemoteConfig, key: string): number {\n return getValue(getModularInstance(remoteConfig), key).asNumber();\n}\n\n/**\n * Gets the value for the given key as a string.\n * Convenience method for calling <code>remoteConfig.getValue(key).asString()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a string.\n *\n * @public\n */\nexport function getString(remoteConfig: RemoteConfig, key: string): string {\n return getValue(getModularInstance(remoteConfig), key).asString();\n}\n\n/**\n * Gets the {@link Value} for the given key.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key.\n *\n * @public\n */\nexport function getValue(remoteConfig: RemoteConfig, key: string): Value {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (!rc._isInitializationComplete) {\n rc._logger.debug(\n `A value was requested for key \"${key}\" before SDK initialization completed.` +\n ' Await on ensureInitialized if the intent was to get a previously activated value.'\n );\n }\n const activeConfig = rc._storageCache.getActiveConfig();\n if (activeConfig && activeConfig[key] !== undefined) {\n return new ValueImpl('remote', activeConfig[key]);\n } else if (rc.defaultConfig && rc.defaultConfig[key] !== undefined) {\n return new ValueImpl('default', String(rc.defaultConfig[key]));\n }\n rc._logger.debug(\n `Returning static value for key \"${key}\".` +\n ' Define a default or remote value if this is unintentional.'\n );\n return new ValueImpl('static');\n}\n\n/**\n * Defines the log level to use.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param logLevel - The log level to set.\n *\n * @public\n */\nexport function setLogLevel(\n remoteConfig: RemoteConfig,\n logLevel: RemoteConfigLogLevel\n): void {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n switch (logLevel) {\n case 'debug':\n rc._logger.logLevel = FirebaseLogLevel.DEBUG;\n break;\n case 'silent':\n rc._logger.logLevel = FirebaseLogLevel.SILENT;\n break;\n default:\n rc._logger.logLevel = FirebaseLogLevel.ERROR;\n }\n}\n\n/**\n * Dedupes and returns an array of all the keys of the received objects.\n */\nfunction getAllKeys(obj1: {} = {}, obj2: {} = {}): string[] {\n return Object.keys({ ...obj1, ...obj2 });\n}\n\n/**\n * Sets the custom signals for the app instance.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param customSignals - Map (key, value) of the custom signals to be set for the app instance. If\n * a key already exists, the value is overwritten. Setting the value of a custom signal to null\n * unsets the signal. The signals will be persisted locally on the client.\n *\n * @public\n */\nexport async function setCustomSignals(\n remoteConfig: RemoteConfig,\n customSignals: CustomSignals\n): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (Object.keys(customSignals).length === 0) {\n return;\n }\n\n // eslint-disable-next-line guard-for-in\n for (const key in customSignals) {\n if (key.length > RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH) {\n rc._logger.error(\n `Custom signal key ${key} is too long, max allowed length is ${RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH}.`\n );\n return;\n }\n const value = customSignals[key];\n if (\n typeof value === 'string' &&\n value.length > RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH\n ) {\n rc._logger.error(\n `Value supplied for custom signal ${key} is too long, max allowed length is ${RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH}.`\n );\n return;\n }\n }\n\n try {\n await rc._storageCache.setCustomSignals(customSignals);\n } catch (error) {\n rc._logger.error(\n `Error encountered while setting custom signals: ${error}`\n );\n }\n}\n\n// TODO: Add public document for the Remote Config Realtime API guide on the Web Platform.\n/**\n * Starts listening for real-time config updates from the Remote Config backend and automatically\n * fetches updates from the Remote Config backend when they are available.\n *\n * @remarks\n * If a connection to the Remote Config backend is not already open, calling this method will\n * open it. Multiple listeners can be added by calling this method again, but subsequent calls\n * re-use the same connection to the backend.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param observer - The {@link ConfigUpdateObserver} to be notified of config updates.\n * @returns An {@link Unsubscribe} function to remove the listener.\n *\n * @public\n */\nexport function onConfigUpdate(\n remoteConfig: RemoteConfig,\n observer: ConfigUpdateObserver\n): Unsubscribe {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n rc._realtimeHandler.addObserver(observer);\n return () => {\n rc._realtimeHandler.removeObserver(observer);\n };\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { StorageCache } from '../storage/storage_cache';\nimport { FetchResponse } from '../public_types';\nimport {\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { Storage } from '../storage/storage';\nimport { Logger } from '@firebase/logger';\n\n/**\n * Implements the {@link RemoteConfigClient} abstraction with success response caching.\n *\n * <p>Comparable to the browser's Cache API for responses, but the Cache API requires a Service\n * Worker, which requires HTTPS, which would significantly complicate SDK installation. Also, the\n * Cache API doesn't support matching entries by time.\n */\nexport class CachingClient implements RemoteConfigFetchClient {\n constructor(\n private readonly client: RemoteConfigFetchClient,\n private readonly storage: Storage,\n private readonly storageCache: StorageCache,\n private readonly logger: Logger\n ) {}\n\n /**\n * Returns true if the age of the cached fetched configs is less than or equal to\n * {@link Settings#minimumFetchIntervalInSeconds}.\n *\n * <p>This is comparable to passing `headers = { 'Cache-Control': max-age <maxAge> }` to the\n * native Fetch API.\n *\n * <p>Visible for testing.\n */\n isCachedDataFresh(\n cacheMaxAgeMillis: number,\n lastSuccessfulFetchTimestampMillis: number | undefined\n ): boolean {\n // Cache can only be fresh if it's populated.\n if (!lastSuccessfulFetchTimestampMillis) {\n this.logger.debug('Config fetch cache check. Cache unpopulated.');\n return false;\n }\n\n // Calculates age of cache entry.\n const cacheAgeMillis = Date.now() - lastSuccessfulFetchTimestampMillis;\n\n const isCachedDataFresh = cacheAgeMillis <= cacheMaxAgeMillis;\n\n this.logger.debug(\n 'Config fetch cache check.' +\n ` Cache age millis: ${cacheAgeMillis}.` +\n ` Cache max age millis (minimumFetchIntervalMillis setting): ${cacheMaxAgeMillis}.` +\n ` Is cache hit: ${isCachedDataFresh}.`\n );\n\n return isCachedDataFresh;\n }\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n // Reads from persisted storage to avoid cache miss if callers don't wait on initialization.\n const [lastSuccessfulFetchTimestampMillis, lastSuccessfulFetchResponse] =\n await Promise.all([\n this.storage.getLastSuccessfulFetchTimestampMillis(),\n this.storage.getLastSuccessfulFetchResponse()\n ]);\n\n // Exits early on cache hit.\n if (\n lastSuccessfulFetchResponse &&\n this.isCachedDataFresh(\n request.cacheMaxAgeMillis,\n lastSuccessfulFetchTimestampMillis\n )\n ) {\n return lastSuccessfulFetchResponse;\n }\n\n // Deviates from pure decorator by not honoring a passed ETag since we don't have a public API\n // that allows the caller to pass an ETag.\n request.eTag =\n lastSuccessfulFetchResponse && lastSuccessfulFetchResponse.eTag;\n\n // Falls back to service on cache miss.\n const response = await this.client.fetch(request);\n\n // Fetch throws for non-success responses, so success is guaranteed here.\n\n const storageOperations = [\n // Uses write-through cache for consistency with synchronous public API.\n this.storageCache.setLastSuccessfulFetchTimestampMillis(Date.now())\n ];\n\n if (response.status === 200) {\n // Caches response only if it has changed, ie non-304 responses.\n storageOperations.push(\n this.storage.setLastSuccessfulFetchResponse(response)\n );\n }\n\n await Promise.all(storageOperations);\n\n return response;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Attempts to get the most accurate browser language setting.\n *\n * <p>Adapted from getUserLanguage in packages/auth/src/utils.js for TypeScript.\n *\n * <p>Defers default language specification to server logic for consistency.\n *\n * @param navigatorLanguage Enables tests to override read-only {@link NavigatorLanguage}.\n */\nexport function getUserLanguage(\n navigatorLanguage: NavigatorLanguage = navigator\n): string {\n return (\n // Most reliable, but only supported in Chrome/Firefox.\n (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\n // Supported in most browsers, but returns the language of the browser\n // UI, not the language set in browser settings.\n navigatorLanguage.language\n // Polyfill otherwise.\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CustomSignals,\n FetchResponse,\n FirebaseRemoteConfigObject\n} from '../public_types';\nimport {\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { getUserLanguage } from '../language';\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\n\n/**\n * Defines request body parameters required to call the fetch API:\n * https://firebase.google.com/docs/reference/remote-config/rest\n *\n * <p>Not exported because this file encapsulates REST API specifics.\n *\n * <p>Not passing User Properties because Analytics' source of truth on Web is server-side.\n */\ninterface FetchRequestBody {\n // Disables camelcase linting for request body params.\n /* eslint-disable camelcase*/\n sdk_version: string;\n app_instance_id: string;\n app_instance_id_token: string;\n app_id: string;\n language_code: string;\n custom_signals?: CustomSignals;\n /* eslint-enable camelcase */\n}\n\n/**\n * Implements the Client abstraction for the Remote Config REST API.\n */\nexport class RestClient implements RemoteConfigFetchClient {\n constructor(\n private readonly firebaseInstallations: _FirebaseInstallationsInternal,\n private readonly sdkVersion: string,\n private readonly namespace: string,\n private readonly projectId: string,\n private readonly apiKey: string,\n private readonly appId: string\n ) {}\n\n /**\n * Fetches from the Remote Config REST API.\n *\n * @throws a {@link ErrorCode.FETCH_NETWORK} error if {@link GlobalFetch#fetch} can't\n * connect to the network.\n * @throws a {@link ErrorCode.FETCH_PARSE} error if {@link Response#json} can't parse the\n * fetch response.\n * @throws a {@link ErrorCode.FETCH_STATUS} error if the service returns an HTTP error status.\n */\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const [installationId, installationToken] = await Promise.all([\n this.firebaseInstallations.getId(),\n this.firebaseInstallations.getToken()\n ]);\n\n const urlBase =\n window.FIREBASE_REMOTE_CONFIG_URL_BASE ||\n 'https://firebaseremoteconfig.googleapis.com';\n\n const url = `${urlBase}/v1/projects/${this.projectId}/namespaces/${this.namespace}:fetch?key=${this.apiKey}`;\n\n const headers = {\n 'Content-Type': 'application/json',\n 'Content-Encoding': 'gzip',\n // Deviates from pure decorator by not passing max-age header since we don't currently have\n // service behavior using that header.\n 'If-None-Match': request.eTag || '*'\n // TODO: Add this header once CORS error is fixed internally.\n //'X-Firebase-RC-Fetch-Type': `${fetchType}/${fetchAttempt}`\n };\n\n const requestBody: FetchRequestBody = {\n /* eslint-disable camelcase */\n sdk_version: this.sdkVersion,\n app_instance_id: installationId,\n app_instance_id_token: installationToken,\n app_id: this.appId,\n language_code: getUserLanguage(),\n custom_signals: request.customSignals\n /* eslint-enable camelcase */\n };\n\n const options = {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody)\n };\n\n // This logic isn't REST-specific, but shimming abort logic isn't worth another decorator.\n const fetchPromise = fetch(url, options);\n const timeoutPromise = new Promise((_resolve, reject) => {\n // Maps async event listener to Promise API.\n request.signal.addEventListener(() => {\n // Emulates https://heycam.github.io/webidl/#aborterror\n const error = new Error('The operation was aborted.');\n error.name = 'AbortError';\n reject(error);\n });\n });\n\n let response;\n try {\n await Promise.race([fetchPromise, timeoutPromise]);\n response = await fetchPromise;\n } catch (originalError) {\n let errorCode = ErrorCode.FETCH_NETWORK;\n if ((originalError as Error)?.name === 'AbortError') {\n errorCode = ErrorCode.FETCH_TIMEOUT;\n }\n throw ERROR_FACTORY.create(errorCode, {\n originalErrorMessage: (originalError as Error)?.message\n });\n }\n\n let status = response.status;\n\n // Normalizes nullable header to optional.\n const responseEtag = response.headers.get('ETag') || undefined;\n\n let config: FirebaseRemoteConfigObject | undefined;\n let state: string | undefined;\n let templateVersion: number | undefined;\n\n // JSON parsing throws SyntaxError if the response body isn't a JSON string.\n // Requesting application/json and checking for a 200 ensures there's JSON data.\n if (response.status === 200) {\n let responseBody;\n try {\n responseBody = await response.json();\n } catch (originalError) {\n throw ERROR_FACTORY.create(ErrorCode.FETCH_PARSE, {\n originalErrorMessage: (originalError as Error)?.message\n });\n }\n config = responseBody['entries'];\n state = responseBody['state'];\n templateVersion = responseBody['templateVersion'];\n }\n\n // Normalizes based on legacy state.\n if (state === 'INSTANCE_STATE_UNSPECIFIED') {\n status = 500;\n } else if (state === 'NO_CHANGE') {\n status = 304;\n } else if (state === 'NO_TEMPLATE' || state === 'EMPTY_CONFIG') {\n // These cases can be fixed remotely, so normalize to safe value.\n config = {};\n }\n\n // Normalize to exception-based control flow for non-success cases.\n // Encapsulates HTTP specifics in this class as much as possible. Status is still the best for\n // differentiating success states (200 from 304; the state body param is undefined in a\n // standard 304).\n if (status !== 304 && status !== 200) {\n throw ERROR_FACTORY.create(ErrorCode.FETCH_STATUS, {\n httpStatus: status\n });\n }\n\n return { status, eTag: responseEtag, config, templateVersion };\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchResponse } from '../public_types';\nimport {\n RemoteConfigAbortSignal,\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { ThrottleMetadata, Storage } from '../storage/storage';\nimport { ErrorCode, ERROR_FACTORY } from '../errors';\nimport { FirebaseError, calculateBackoffMillis } from '@firebase/util';\n\n/**\n * Supports waiting on a backoff by:\n *\n * <ul>\n * <li>Promisifying setTimeout, so we can set a timeout in our Promise chain</li>\n * <li>Listening on a signal bus for abort events, just like the Fetch API</li>\n * <li>Failing in the same way the Fetch API fails, so timing out a live request and a throttled\n * request appear the same.</li>\n * </ul>\n *\n * <p>Visible for testing.\n */\nexport function setAbortableTimeout(\n signal: RemoteConfigAbortSignal,\n throttleEndTimeMillis: number\n): Promise<void> {\n return new Promise((resolve, reject) => {\n // Derives backoff from given end time, normalizing negative numbers to zero.\n const backoffMillis = Math.max(throttleEndTimeMillis - Date.now(), 0);\n\n const timeout = setTimeout(resolve, backoffMillis);\n\n // Adds listener, rather than sets onabort, because signal is a shared object.\n signal.addEventListener(() => {\n clearTimeout(timeout);\n\n // If the request completes before this timeout, the rejection has no effect.\n reject(\n ERROR_FACTORY.create(ErrorCode.FETCH_THROTTLE, {\n throttleEndTimeMillis\n })\n );\n });\n });\n}\n\ntype RetriableError = FirebaseError & { customData: { httpStatus: string } };\n/**\n * Returns true if the {@link Error} indicates a fetch request may succeed later.\n */\nfunction isRetriableError(e: Error): e is RetriableError {\n if (!(e instanceof FirebaseError) || !e.customData) {\n return false;\n }\n\n // Uses string index defined by ErrorData, which FirebaseError implements.\n const httpStatus = Number(e.customData['httpStatus']);\n\n return (\n httpStatus === 429 ||\n httpStatus === 500 ||\n httpStatus === 503 ||\n httpStatus === 504\n );\n}\n\n/**\n * Decorates a Client with retry logic.\n *\n * <p>Comparable to CachingClient, but uses backoff logic instead of cache max age and doesn't cache\n * responses (because the SDK has no use for error responses).\n */\nexport class RetryingClient implements RemoteConfigFetchClient {\n constructor(\n private readonly client: RemoteConfigFetchClient,\n private readonly storage: Storage\n ) {}\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const throttleMetadata = (await this.storage.getThrottleMetadata()) || {\n backoffCount: 0,\n throttleEndTimeMillis: Date.now()\n };\n\n return this.attemptFetch(request, throttleMetadata);\n }\n\n /**\n * A recursive helper for attempting a fetch request repeatedly.\n *\n * @throws any non-retriable errors.\n */\n async attemptFetch(\n request: FetchRequest,\n { throttleEndTimeMillis, backoffCount }: ThrottleMetadata\n ): Promise<FetchResponse> {\n // Starts with a (potentially zero) timeout to support resumption from stored state.\n // Ensures the throttle end time is honored if the last attempt timed out.\n // Note the SDK will never make a request if the fetch timeout expires at this point.\n await setAbortableTimeout(request.signal, throttleEndTimeMillis);\n\n try {\n const response = await this.client.fetch(request);\n\n // Note the SDK only clears throttle state if response is success or non-retriable.\n await this.storage.deleteThrottleMetadata();\n\n return response;\n } catch (e) {\n if (!isRetriableError(e as Error)) {\n throw e;\n }\n\n // Increments backoff state.\n const throttleMetadata = {\n throttleEndTimeMillis:\n Date.now() + calculateBackoffMillis(backoffCount),\n backoffCount: backoffCount + 1\n };\n\n // Persists state.\n await this.storage.setThrottleMetadata(throttleMetadata);\n\n return this.attemptFetch(request, throttleMetadata);\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp } from '@firebase/app';\nimport {\n RemoteConfig as RemoteConfigType,\n FetchStatus,\n RemoteConfigSettings\n} from './public_types';\nimport { StorageCache } from './storage/storage_cache';\nimport { RemoteConfigFetchClient } from './client/remote_config_fetch_client';\nimport { Storage } from './storage/storage';\nimport { Logger } from '@firebase/logger';\nimport { RealtimeHandler } from './client/realtime_handler';\n\nconst DEFAULT_FETCH_TIMEOUT_MILLIS = 60 * 1000; // One minute\nconst DEFAULT_CACHE_MAX_AGE_MILLIS = 12 * 60 * 60 * 1000; // Twelve hours.\n\n/**\n * Encapsulates business logic mapping network and storage dependencies to the public SDK API.\n *\n * See {@link https://github.com/firebase/firebase-js-sdk/blob/main/packages/firebase/compat/index.d.ts|interface documentation} for method descriptions.\n */\nexport class RemoteConfig implements RemoteConfigType {\n /**\n * Tracks completion of initialization promise.\n * @internal\n */\n _isInitializationComplete = false;\n\n /**\n * De-duplicates initialization calls.\n * @internal\n */\n _initializePromise?: Promise<void>;\n\n settings: RemoteConfigSettings = {\n fetchTimeoutMillis: DEFAULT_FETCH_TIMEOUT_MILLIS,\n minimumFetchIntervalMillis: DEFAULT_CACHE_MAX_AGE_MILLIS\n };\n\n defaultConfig: { [key: string]: string | number | boolean } = {};\n\n get fetchTimeMillis(): number {\n return this._storageCache.getLastSuccessfulFetchTimestampMillis() || -1;\n }\n\n get lastFetchStatus(): FetchStatus {\n return this._storageCache.getLastFetchStatus() || 'no-fetch-yet';\n }\n\n constructor(\n // Required by FirebaseServiceFactory interface.\n readonly app: FirebaseApp,\n // JS doesn't support private yet\n // (https://github.com/tc39/proposal-class-fields#private-fields), so we hint using an\n // underscore prefix.\n /**\n * @internal\n */\n readonly _client: RemoteConfigFetchClient,\n /**\n * @internal\n */\n readonly _storageCache: StorageCache,\n /**\n * @internal\n */\n readonly _storage: Storage,\n /**\n * @internal\n */\n readonly _logger: Logger,\n /**\n * @internal\n */\n readonly _realtimeHandler: RealtimeHandler\n ) {}\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchStatus, CustomSignals } from '@firebase/remote-config-types';\nimport { FetchResponse, FirebaseRemoteConfigObject } from '../public_types';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS } from '../constants';\nimport { FirebaseError } from '@firebase/util';\n\n/**\n * Converts an error event associated with a {@link IDBRequest} to a {@link FirebaseError}.\n */\nfunction toFirebaseError(event: Event, errorCode: ErrorCode): FirebaseError {\n const originalError = (event.target as IDBRequest).error || undefined;\n return ERROR_FACTORY.create(errorCode, {\n originalErrorMessage: originalError && (originalError as Error)?.message\n });\n}\n\n/**\n * A general-purpose store keyed by app + namespace + {@link\n * ProjectNamespaceKeyFieldValue}.\n *\n * <p>The Remote Config SDK can be used with multiple app installations, and each app can interact\n * with multiple namespaces, so this store uses app (ID + name) and namespace as common parent keys\n * for a set of key-value pairs. See {@link Storage#createCompositeKey}.\n *\n * <p>Visible for testing.\n */\nexport const APP_NAMESPACE_STORE = 'app_namespace_store';\n\nconst DB_NAME = 'firebase_remote_config';\nconst DB_VERSION = 1;\n\n/**\n * Encapsulates metadata concerning throttled fetch requests.\n */\nexport interface ThrottleMetadata {\n // The number of times fetch has backed off. Used for resuming backoff after a timeout.\n backoffCount: number;\n // The Unix timestamp in milliseconds when callers can retry a request.\n throttleEndTimeMillis: number;\n}\n\nexport interface RealtimeBackoffMetadata {\n // The number of consecutive connection streams that have failed.\n numFailedStreams: number;\n // The Date until which the client should wait before attempting any new real-time connections.\n backoffEndTimeMillis: Date;\n}\n\n/**\n * Provides type-safety for the \"key\" field used by {@link APP_NAMESPACE_STORE}.\n *\n * <p>This seems like a small price to avoid potentially subtle bugs caused by a typo.\n */\ntype ProjectNamespaceKeyFieldValue =\n | 'active_config'\n | 'active_config_etag'\n | 'last_fetch_status'\n | 'last_successful_fetch_timestamp_millis'\n | 'last_successful_fetch_response'\n | 'settings'\n | 'throttle_metadata'\n | 'custom_signals'\n | 'realtime_backoff_metadata'\n | 'last_known_template_version';\n\n// Visible for testing.\nexport function openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = event => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_OPEN));\n };\n request.onsuccess = event => {\n resolve((event.target as IDBOpenDBRequest).result);\n };\n request.onupgradeneeded = event => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (event.oldVersion) {\n case 0:\n db.createObjectStore(APP_NAMESPACE_STORE, {\n keyPath: 'compositeKey'\n });\n }\n };\n } catch (error) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_OPEN, {\n originalErrorMessage: (error as Error)?.message\n })\n );\n }\n });\n}\n\n/**\n * Abstracts data persistence.\n */\nexport abstract class Storage {\n getLastFetchStatus(): Promise<FetchStatus | undefined> {\n return this.get<FetchStatus>('last_fetch_status');\n }\n\n setLastFetchStatus(status: FetchStatus): Promise<void> {\n return this.set<FetchStatus>('last_fetch_status', status);\n }\n\n // This is comparable to a cache entry timestamp. If we need to expire other data, we could\n // consider adding timestamp to all storage records and an optional max age arg to getters.\n getLastSuccessfulFetchTimestampMillis(): Promise<number | undefined> {\n return this.get<number>('last_successful_fetch_timestamp_millis');\n }\n\n setLastSuccessfulFetchTimestampMillis(timestamp: number): Promise<void> {\n return this.set<number>(\n 'last_successful_fetch_timestamp_millis',\n timestamp\n );\n }\n\n getLastSuccessfulFetchResponse(): Promise<FetchResponse | undefined> {\n return this.get<FetchResponse>('last_successful_fetch_response');\n }\n\n setLastSuccessfulFetchResponse(response: FetchResponse): Promise<void> {\n return this.set<FetchResponse>('last_successful_fetch_response', response);\n }\n\n getActiveConfig(): Promise<FirebaseRemoteConfigObject | undefined> {\n return this.get<FirebaseRemoteConfigObject>('active_config');\n }\n\n setActiveConfig(config: FirebaseRemoteConfigObject): Promise<void> {\n return this.set<FirebaseRemoteConfigObject>('active_config', config);\n }\n\n getActiveConfigEtag(): Promise<string | undefined> {\n return this.get<string>('active_config_etag');\n }\n\n setActiveConfigEtag(etag: string): Promise<void> {\n return this.set<string>('active_config_etag', etag);\n }\n\n getThrottleMetadata(): Promise<ThrottleMetadata | undefined> {\n return this.get<ThrottleMetadata>('throttle_metadata');\n }\n\n setThrottleMetadata(metadata: ThrottleMetadata): Promise<void> {\n return this.set<ThrottleMetadata>('throttle_metadata', metadata);\n }\n\n deleteThrottleMetadata(): Promise<void> {\n return this.delete('throttle_metadata');\n }\n\n getCustomSignals(): Promise<CustomSignals | undefined> {\n return this.get<CustomSignals>('custom_signals');\n }\n\n abstract setCustomSignals(\n customSignals: CustomSignals\n ): Promise<CustomSignals>;\n abstract get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T | undefined>;\n abstract set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void>;\n abstract delete(key: ProjectNamespaceKeyFieldValue): Promise<void>;\n\n getRealtimeBackoffMetadata(): Promise<RealtimeBackoffMetadata | undefined> {\n return this.get<RealtimeBackoffMetadata>('realtime_backoff_metadata');\n }\n\n setRealtimeBackoffMetadata(\n realtimeMetadata: RealtimeBackoffMetadata\n ): Promise<void> {\n return this.set<RealtimeBackoffMetadata>(\n 'realtime_backoff_metadata',\n realtimeMetadata\n );\n }\n\n getActiveConfigTemplateVersion(): Promise<number | undefined> {\n return this.get<number>('last_known_template_version');\n }\n\n setActiveConfigTemplateVersion(version: number): Promise<void> {\n return this.set<number>('last_known_template_version', version);\n }\n}\n\nexport class IndexedDbStorage extends Storage {\n /**\n * @param appId enables storage segmentation by app (ID + name).\n * @param appName enables storage segmentation by app (ID + name).\n * @param namespace enables storage segmentation by namespace.\n */\n constructor(\n private readonly appId: string,\n private readonly appName: string,\n private readonly namespace: string,\n private readonly openDbPromise = openDatabase()\n ) {\n super();\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<CustomSignals> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n const storedSignals = await this.getWithTransaction<CustomSignals>(\n 'custom_signals',\n transaction\n );\n const updatedSignals = mergeCustomSignals(\n customSignals,\n storedSignals || {}\n );\n await this.setWithTransaction<CustomSignals>(\n 'custom_signals',\n updatedSignals,\n transaction\n );\n return updatedSignals;\n }\n\n /**\n * Gets a value from the database using the provided transaction.\n *\n * @param key The key of the value to get.\n * @param transaction The transaction to use for the operation.\n * @returns The value associated with the key, or undefined if no such value exists.\n */\n async getWithTransaction<T>(\n key: ProjectNamespaceKeyFieldValue,\n transaction: IDBTransaction\n ): Promise<T | undefined> {\n return new Promise((resolve, reject) => {\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.get(compositeKey);\n request.onerror = event => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_GET));\n };\n request.onsuccess = event => {\n const result = (event.target as IDBRequest).result;\n if (result) {\n resolve(result.value);\n } else {\n resolve(undefined);\n }\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_GET, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n /**\n * Sets a value in the database using the provided transaction.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param transaction The transaction to use for the operation.\n * @returns A promise that resolves when the operation is complete.\n */\n async setWithTransaction<T>(\n key: ProjectNamespaceKeyFieldValue,\n value: T,\n transaction: IDBTransaction\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.put({\n compositeKey,\n value\n });\n request.onerror = (event: Event) => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_SET));\n };\n request.onsuccess = () => {\n resolve();\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_SET, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n async get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T | undefined> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readonly');\n return this.getWithTransaction<T>(key, transaction);\n }\n\n async set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n return this.setWithTransaction<T>(key, value, transaction);\n }\n\n async delete(key: ProjectNamespaceKeyFieldValue): Promise<void> {\n const db = await this.openDbPromise;\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.delete(compositeKey);\n request.onerror = (event: Event) => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_DELETE));\n };\n request.onsuccess = () => {\n resolve();\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_DELETE, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n // Facilitates composite key functionality (which is unsupported in IE).\n createCompositeKey(key: ProjectNamespaceKeyFieldValue): string {\n return [this.appId, this.appName, this.namespace, key].join();\n }\n}\n\nexport class InMemoryStorage extends Storage {\n private storage: { [key: string]: unknown } = {};\n\n async get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T> {\n return Promise.resolve(this.storage[key] as T);\n }\n\n async set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void> {\n this.storage[key] = value;\n return Promise.resolve(undefined);\n }\n\n async delete(key: ProjectNamespaceKeyFieldValue): Promise<void> {\n this.storage[key] = undefined;\n return Promise.resolve();\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<CustomSignals> {\n const storedSignals = (this.storage['custom_signals'] ||\n {}) as CustomSignals;\n this.storage['custom_signals'] = mergeCustomSignals(\n customSignals,\n storedSignals\n );\n return Promise.resolve(this.storage['custom_signals'] as CustomSignals);\n }\n}\n\nfunction mergeCustomSignals(\n customSignals: CustomSignals,\n storedSignals: CustomSignals\n): CustomSignals {\n const combinedSignals = {\n ...storedSignals,\n ...customSignals\n };\n\n // Filter out key-value assignments with null values since they are signals being unset\n const updatedSignals = Object.fromEntries(\n Object.entries(combinedSignals)\n .filter(([_, v]) => v !== null)\n .map(([k, v]) => {\n // Stringify numbers to store a map of string keys and values which can be sent\n // as-is in a fetch call.\n if (typeof v === 'number') {\n return [k, v.toString()];\n }\n return [k, v];\n })\n );\n\n // Throw an error if the number of custom signals to be stored exceeds the limit\n if (\n Object.keys(updatedSignals).length > RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS\n ) {\n throw ERROR_FACTORY.create(ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS, {\n maxSignals: RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS\n });\n }\n return updatedSignals;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchStatus, CustomSignals } from '@firebase/remote-config-types';\nimport { FirebaseRemoteConfigObject } from '../public_types';\nimport { Storage } from './storage';\n\n/**\n * A memory cache layer over storage to support the SDK's synchronous read requirements.\n */\nexport class StorageCache {\n constructor(private readonly storage: Storage) {}\n\n /**\n * Memory caches.\n */\n private lastFetchStatus?: FetchStatus;\n private lastSuccessfulFetchTimestampMillis?: number;\n private activeConfig?: FirebaseRemoteConfigObject;\n private customSignals?: CustomSignals;\n\n /**\n * Memory-only getters\n */\n getLastFetchStatus(): FetchStatus | undefined {\n return this.lastFetchStatus;\n }\n\n getLastSuccessfulFetchTimestampMillis(): number | undefined {\n return this.lastSuccessfulFetchTimestampMillis;\n }\n\n getActiveConfig(): FirebaseRemoteConfigObject | undefined {\n return this.activeConfig;\n }\n\n getCustomSignals(): CustomSignals | undefined {\n return this.customSignals;\n }\n\n /**\n * Read-ahead getter\n */\n async loadFromStorage(): Promise<void> {\n const lastFetchStatusPromise = this.storage.getLastFetchStatus();\n const lastSuccessfulFetchTimestampMillisPromise =\n this.storage.getLastSuccessfulFetchTimestampMillis();\n const activeConfigPromise = this.storage.getActiveConfig();\n const customSignalsPromise = this.storage.getCustomSignals();\n\n // Note:\n // 1. we consistently check for undefined to avoid clobbering defined values\n // in memory\n // 2. we defer awaiting to improve readability, as opposed to destructuring\n // a Promise.all result, for example\n\n const lastFetchStatus = await lastFetchStatusPromise;\n if (lastFetchStatus) {\n this.lastFetchStatus = lastFetchStatus;\n }\n\n const lastSuccessfulFetchTimestampMillis =\n await lastSuccessfulFetchTimestampMillisPromise;\n if (lastSuccessfulFetchTimestampMillis) {\n this.lastSuccessfulFetchTimestampMillis =\n lastSuccessfulFetchTimestampMillis;\n }\n\n const activeConfig = await activeConfigPromise;\n if (activeConfig) {\n this.activeConfig = activeConfig;\n }\n\n const customSignals = await customSignalsPromise;\n if (customSignals) {\n this.customSignals = customSignals;\n }\n }\n\n /**\n * Write-through setters\n */\n setLastFetchStatus(status: FetchStatus): Promise<void> {\n this.lastFetchStatus = status;\n return this.storage.setLastFetchStatus(status);\n }\n\n setLastSuccessfulFetchTimestampMillis(\n timestampMillis: number\n ): Promise<void> {\n this.lastSuccessfulFetchTimestampMillis = timestampMillis;\n return this.storage.setLastSuccessfulFetchTimestampMillis(timestampMillis);\n }\n\n setActiveConfig(activeConfig: FirebaseRemoteConfigObject): Promise<void> {\n this.activeConfig = activeConfig;\n return this.storage.setActiveConfig(activeConfig);\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<void> {\n this.customSignals = await this.storage.setCustomSignals(customSignals);\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\n// TODO: Consolidate the Visibility monitoring API code into a shared utility function in firebase/util to be used by both packages/database and packages/remote-config.\n/**\n * Base class to be used if you want to emit events. Call the constructor with\n * the set of allowed event names.\n */\nexport abstract class EventEmitter {\n private listeners_: {\n [eventType: string]: Array<{\n callback(...args: unknown[]): void;\n context: unknown;\n }>;\n } = {};\n\n constructor(private allowedEvents_: string[]) {\n assert(\n Array.isArray(allowedEvents_) && allowedEvents_.length > 0,\n 'Requires a non-empty array'\n );\n }\n\n /**\n * To be overridden by derived classes in order to fire an initial event when\n * somebody subscribes for data.\n *\n * @returns {Array.<*>} Array of parameters to trigger initial event with.\n */\n abstract getInitialEvent(eventType: string): unknown[];\n\n /**\n * To be called by derived classes to trigger events.\n */\n protected trigger(eventType: string, ...varArgs: unknown[]): void {\n if (Array.isArray(this.listeners_[eventType])) {\n // Clone the list, since callbacks could add/remove listeners.\n const listeners = [...this.listeners_[eventType]];\n\n for (let i = 0; i < listeners.length; i++) {\n listeners[i].callback.apply(listeners[i].context, varArgs);\n }\n }\n }\n\n on(\n eventType: string,\n callback: (a: unknown) => void,\n context: unknown\n ): void {\n this.validateEventType_(eventType);\n this.listeners_[eventType] = this.listeners_[eventType] || [];\n this.listeners_[eventType].push({ callback, context });\n\n const eventData = this.getInitialEvent(eventType);\n if (eventData) {\n //@ts-ignore\n callback.apply(context, eventData);\n }\n }\n\n off(\n eventType: string,\n callback: (a: unknown) => void,\n context: unknown\n ): void {\n this.validateEventType_(eventType);\n const listeners = this.listeners_[eventType] || [];\n for (let i = 0; i < listeners.length; i++) {\n if (\n listeners[i].callback === callback &&\n (!context || context === listeners[i].context)\n ) {\n listeners.splice(i, 1);\n return;\n }\n }\n }\n\n private validateEventType_(eventType: string): void {\n assert(\n this.allowedEvents_.find(et => {\n return et === eventType;\n }),\n 'Unknown event: ' + eventType\n );\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { EventEmitter } from './eventEmitter';\n\ndeclare const document: Document;\n\n// TODO: Consolidate the Visibility monitoring API code into a shared utility function in firebase/util to be used by both packages/database and packages/remote-config.\nexport class VisibilityMonitor extends EventEmitter {\n private visible_: boolean;\n\n static getInstance(): VisibilityMonitor {\n return new VisibilityMonitor();\n }\n\n constructor() {\n super(['visible']);\n let hidden: string;\n let visibilityChange: string;\n if (\n typeof document !== 'undefined' &&\n typeof document.addEventListener !== 'undefined'\n ) {\n if (typeof document['hidden'] !== 'undefined') {\n // Opera 12.10 and Firefox 18 and later support\n visibilityChange = 'visibilitychange';\n hidden = 'hidden';\n } // @ts-ignore\n else if (typeof document['mozHidden'] !== 'undefined') {\n visibilityChange = 'mozvisibilitychange';\n hidden = 'mozHidden';\n } // @ts-ignore\n else if (typeof document['msHidden'] !== 'undefined') {\n visibilityChange = 'msvisibilitychange';\n hidden = 'msHidden';\n } // @ts-ignore\n else if (typeof document['webkitHidden'] !== 'undefined') {\n visibilityChange = 'webkitvisibilitychange';\n hidden = 'webkitHidden';\n }\n }\n\n // Initially, we always assume we are visible. This ensures that in browsers\n // without page visibility support or in cases where we are never visible\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\n // reconnects\n this.visible_ = true;\n\n // @ts-ignore\n if (visibilityChange) {\n document.addEventListener(\n visibilityChange,\n () => {\n // @ts-ignore\n const visible = !document[hidden];\n if (visible !== this.visible_) {\n this.visible_ = visible;\n this.trigger('visible', visible);\n }\n },\n false\n );\n }\n }\n\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\n return [this.visible_];\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\nimport { Logger } from '@firebase/logger';\nimport {\n ConfigUpdate,\n ConfigUpdateObserver,\n FetchResponse,\n FirebaseRemoteConfigObject\n} from '../public_types';\nimport { calculateBackoffMillis, FirebaseError } from '@firebase/util';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { Storage } from '../storage/storage';\nimport { VisibilityMonitor } from './visibility_monitor';\nimport { StorageCache } from '../storage/storage_cache';\nimport {\n FetchRequest,\n RemoteConfigAbortSignal\n} from './remote_config_fetch_client';\nimport { CachingClient } from './caching_client';\n\nconst API_KEY_HEADER = 'X-Goog-Api-Key';\nconst INSTALLATIONS_AUTH_TOKEN_HEADER = 'X-Goog-Firebase-Installations-Auth';\nconst ORIGINAL_RETRIES = 8;\nconst MAXIMUM_FETCH_ATTEMPTS = 3;\nconst NO_BACKOFF_TIME_IN_MILLIS = -1;\nconst NO_FAILED_REALTIME_STREAMS = 0;\nconst REALTIME_DISABLED_KEY = 'featureDisabled';\nconst REALTIME_RETRY_INTERVAL = 'retryIntervalSeconds';\nconst TEMPLATE_VERSION_KEY = 'latestTemplateVersionNumber';\n\nexport class RealtimeHandler {\n constructor(\n private readonly firebaseInstallations: _FirebaseInstallationsInternal,\n private readonly storage: Storage,\n private readonly sdkVersion: string,\n private readonly namespace: string,\n private readonly projectId: string,\n private readonly apiKey: string,\n private readonly appId: string,\n private readonly logger: Logger,\n private readonly storageCache: StorageCache,\n private readonly cachingClient: CachingClient\n ) {\n void this.setRetriesRemaining();\n void VisibilityMonitor.getInstance().on(\n 'visible',\n this.onVisibilityChange,\n this\n );\n }\n\n private observers: Set<ConfigUpdateObserver> =\n new Set<ConfigUpdateObserver>();\n private isConnectionActive: boolean = false;\n private isRealtimeDisabled: boolean = false;\n private controller?: AbortController;\n private reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n private httpRetriesRemaining: number = ORIGINAL_RETRIES;\n private isInBackground: boolean = false;\n private readonly decoder = new TextDecoder('utf-8');\n private isClosingConnection: boolean = false;\n\n private async setRetriesRemaining(): Promise<void> {\n // Retrieve number of remaining retries from last session. The minimum retry count being one.\n const metadata = await this.storage.getRealtimeBackoffMetadata();\n const numFailedStreams = metadata?.numFailedStreams || 0;\n this.httpRetriesRemaining = Math.max(\n ORIGINAL_RETRIES - numFailedStreams,\n 1\n );\n }\n\n private propagateError = (e: FirebaseError): void =>\n this.observers.forEach(o => o.error?.(e));\n\n /**\n * Increment the number of failed stream attempts, increase the backoff duration, set the backoff\n * end time to \"backoff duration\" after `lastFailedStreamTime` and persist the new\n * values to storage metadata.\n */\n private async updateBackoffMetadataWithLastFailedStreamConnectionTime(\n lastFailedStreamTime: Date\n ): Promise<void> {\n const numFailedStreams =\n ((await this.storage.getRealtimeBackoffMetadata())?.numFailedStreams ||\n 0) + 1;\n const backoffMillis = calculateBackoffMillis(numFailedStreams, 60000, 2);\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: new Date(\n lastFailedStreamTime.getTime() + backoffMillis\n ),\n numFailedStreams\n });\n }\n\n /**\n * Increase the backoff duration with a new end time based on Retry Interval.\n */\n private async updateBackoffMetadataWithRetryInterval(\n retryIntervalSeconds: number\n ): Promise<void> {\n const currentTime = Date.now();\n const backoffDurationInMillis = retryIntervalSeconds * 1000;\n const backoffEndTime = new Date(currentTime + backoffDurationInMillis);\n const numFailedStreams = 0;\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: backoffEndTime,\n numFailedStreams\n });\n await this.retryHttpConnectionWhenBackoffEnds();\n }\n\n /**\n * HTTP status code that the Realtime client should retry on.\n */\n private isStatusCodeRetryable = (statusCode?: number): boolean => {\n const retryableStatusCodes = [\n 408, // Request Timeout\n 429, // Too Many Requests\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504 // Gateway Timeout\n ];\n return !statusCode || retryableStatusCodes.includes(statusCode);\n };\n\n /**\n * Closes the realtime HTTP connection.\n * Note: This method is designed to be called only once at a time.\n * If a call is already in progress, subsequent calls will be ignored.\n */\n private async closeRealtimeHttpConnection(): Promise<void> {\n if (this.isClosingConnection) {\n return;\n }\n this.isClosingConnection = true;\n\n try {\n if (this.reader) {\n await this.reader.cancel();\n }\n } catch (e) {\n // The network connection was lost, so cancel() failed.\n // This is expected in a disconnected state, so we can safely ignore the error.\n this.logger.debug('Failed to cancel the reader, connection was lost.');\n } finally {\n this.reader = undefined;\n }\n\n if (this.controller) {\n await this.controller.abort();\n this.controller = undefined;\n }\n\n this.isClosingConnection = false;\n }\n\n private async resetRealtimeBackoff(): Promise<void> {\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: new Date(-1),\n numFailedStreams: 0\n });\n }\n\n private resetRetryCount(): void {\n this.httpRetriesRemaining = ORIGINAL_RETRIES;\n }\n\n /**\n * Assembles the request headers and body and executes the fetch request to\n * establish the real-time streaming connection. This is the \"worker\" method\n * that performs the actual network communication.\n */\n private async establishRealtimeConnection(\n url: URL,\n installationId: string,\n installationTokenResult: string,\n signal: AbortSignal\n ): Promise<Response> {\n const eTagValue = await this.storage.getActiveConfigEtag();\n const lastKnownVersionNumber =\n await this.storage.getActiveConfigTemplateVersion();\n\n const headers = {\n [API_KEY_HEADER]: this.apiKey,\n [INSTALLATIONS_AUTH_TOKEN_HEADER]: installationTokenResult,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'If-None-Match': eTagValue || '*',\n 'Content-Encoding': 'gzip'\n };\n\n const requestBody = {\n project: this.projectId,\n namespace: this.namespace,\n lastKnownVersionNumber,\n appId: this.appId,\n sdkVersion: this.sdkVersion,\n appInstanceId: installationId\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal\n });\n return response;\n }\n\n private getRealtimeUrl(): URL {\n const urlBase =\n window.FIREBASE_REMOTE_CONFIG_URL_BASE ||\n 'https://firebaseremoteconfigrealtime.googleapis.com';\n\n const urlString = `${urlBase}/v1/projects/${this.projectId}/namespaces/${this.namespace}:streamFetchInvalidations?key=${this.apiKey}`;\n return new URL(urlString);\n }\n\n private async createRealtimeConnection(): Promise<Response> {\n const [installationId, installationTokenResult] = await Promise.all([\n this.firebaseInstallations.getId(),\n this.firebaseInstallations.getToken(false)\n ]);\n this.controller = new AbortController();\n const url = this.getRealtimeUrl();\n const realtimeConnection = await this.establishRealtimeConnection(\n url,\n installationId,\n installationTokenResult,\n this.controller.signal\n );\n return realtimeConnection;\n }\n\n /**\n * Retries HTTP stream connection asyncly in random time intervals.\n */\n private async retryHttpConnectionWhenBackoffEnds(): Promise<void> {\n let backoffMetadata = await this.storage.getRealtimeBackoffMetadata();\n if (!backoffMetadata) {\n backoffMetadata = {\n backoffEndTimeMillis: new Date(NO_BACKOFF_TIME_IN_MILLIS),\n numFailedStreams: NO_FAILED_REALTIME_STREAMS\n };\n }\n const backoffEndTime = new Date(\n backoffMetadata.backoffEndTimeMillis\n ).getTime();\n const currentTime = Date.now();\n const retryMillis = Math.max(0, backoffEndTime - currentTime);\n await this.makeRealtimeHttpConnection(retryMillis);\n }\n\n private setIsHttpConnectionRunning(connectionRunning: boolean): void {\n this.isConnectionActive = connectionRunning;\n }\n\n /**\n * Combines the check and set operations to prevent multiple asynchronous\n * calls from redundantly starting an HTTP connection. This ensures that\n * only one attempt is made at a time.\n */\n private checkAndSetHttpConnectionFlagIfNotRunning(): boolean {\n const canMakeConnection = this.canEstablishStreamConnection();\n if (canMakeConnection) {\n this.setIsHttpConnectionRunning(true);\n }\n return canMakeConnection;\n }\n\n private fetchResponseIsUpToDate(\n fetchResponse: FetchResponse,\n lastKnownVersion: number\n ): boolean {\n // If there is a config, make sure its version is >= the last known version.\n if (fetchResponse.config != null && fetchResponse.templateVersion) {\n return fetchResponse.templateVersion >= lastKnownVersion;\n }\n // If there isn't a config, return true if the fetch was successful and backend had no update.\n // Else, it returned an out of date config.\n return this.storageCache.getLastFetchStatus() === 'success';\n }\n\n private parseAndValidateConfigUpdateMessage(message: string): string {\n const left = message.indexOf('{');\n const right = message.indexOf('}', left);\n\n if (left < 0 || right < 0) {\n return '';\n }\n return left >= right ? '' : message.substring(left, right + 1);\n }\n\n private isEventListenersEmpty(): boolean {\n return this.observers.size === 0;\n }\n\n private getRandomInt(max: number): number {\n return Math.floor(Math.random() * max);\n }\n\n private executeAllListenerCallbacks(configUpdate: ConfigUpdate): void {\n this.observers.forEach(observer => observer.next(configUpdate));\n }\n\n /**\n * Compares two configuration objects and returns a set of keys that have changed.\n * A key is considered changed if it's new, removed, or has a different value.\n */\n private getChangedParams(\n newConfig: FirebaseRemoteConfigObject,\n oldConfig: FirebaseRemoteConfigObject\n ): Set<string> {\n const changedKeys = new Set<string>();\n const newKeys = new Set(Object.keys(newConfig || {}));\n const oldKeys = new Set(Object.keys(oldConfig || {}));\n\n for (const key of newKeys) {\n if (!oldKeys.has(key) || newConfig[key] !== oldConfig[key]) {\n changedKeys.add(key);\n }\n }\n\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n changedKeys.add(key);\n }\n }\n\n return changedKeys;\n }\n\n private async fetchLatestConfig(\n remainingAttempts: number,\n targetVersion: number\n ): Promise<void> {\n const remainingAttemptsAfterFetch = remainingAttempts - 1;\n const currentAttempt = MAXIMUM_FETCH_ATTEMPTS - remainingAttemptsAfterFetch;\n const customSignals = this.storageCache.getCustomSignals();\n if (customSignals) {\n this.logger.debug(\n `Fetching config with custom signals: ${JSON.stringify(customSignals)}`\n );\n }\n const abortSignal = new RemoteConfigAbortSignal();\n try {\n const fetchRequest: FetchRequest = {\n cacheMaxAgeMillis: 0,\n signal: abortSignal,\n customSignals,\n fetchType: 'REALTIME',\n fetchAttempt: currentAttempt\n };\n\n const fetchResponse: FetchResponse = await this.cachingClient.fetch(\n fetchRequest\n );\n let activatedConfigs = await this.storage.getActiveConfig();\n\n if (!this.fetchResponseIsUpToDate(fetchResponse, targetVersion)) {\n this.logger.debug(\n \"Fetched template version is the same as SDK's current version.\" +\n ' Retrying fetch.'\n );\n // Continue fetching until template version number is greater than current.\n await this.autoFetch(remainingAttemptsAfterFetch, targetVersion);\n return;\n }\n\n if (fetchResponse.config == null) {\n this.logger.debug(\n 'The fetch succeeded, but the backend had no updates.'\n );\n return;\n }\n\n if (activatedConfigs == null) {\n activatedConfigs = {};\n }\n\n const updatedKeys = this.getChangedParams(\n fetchResponse.config,\n activatedConfigs\n );\n\n if (updatedKeys.size === 0) {\n this.logger.debug('Config was fetched, but no params changed.');\n return;\n }\n\n const configUpdate: ConfigUpdate = {\n getUpdatedKeys(): Set<string> {\n return new Set(updatedKeys);\n }\n };\n this.executeAllListenerCallbacks(configUpdate);\n } catch (e: unknown) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_NOT_FETCHED, {\n originalErrorMessage: `Failed to auto-fetch config update: ${errorMessage}`\n });\n this.propagateError(error);\n }\n }\n\n private async autoFetch(\n remainingAttempts: number,\n targetVersion: number\n ): Promise<void> {\n if (remainingAttempts === 0) {\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_NOT_FETCHED, {\n originalErrorMessage:\n 'Unable to fetch the latest version of the template.'\n });\n this.propagateError(error);\n return;\n }\n\n const timeTillFetchSeconds = this.getRandomInt(4);\n const timeTillFetchInMiliseconds = timeTillFetchSeconds * 1000;\n\n await new Promise(resolve =>\n setTimeout(resolve, timeTillFetchInMiliseconds)\n );\n await this.fetchLatestConfig(remainingAttempts, targetVersion);\n }\n\n /**\n * Processes a stream of real-time messages for configuration updates.\n * This method reassembles fragmented messages, validates and parses the JSON,\n * and automatically fetches a new config if a newer template version is available.\n * It also handles server-specified retry intervals and propagates errors for\n * invalid messages or when real-time updates are disabled.\n */\n private async handleNotifications(\n reader: ReadableStreamDefaultReader<Uint8Array>\n ): Promise<void> {\n let partialConfigUpdateMessage: string;\n let currentConfigUpdateMessage = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n partialConfigUpdateMessage = this.decoder.decode(value, { stream: true });\n currentConfigUpdateMessage += partialConfigUpdateMessage;\n\n if (partialConfigUpdateMessage.includes('}')) {\n currentConfigUpdateMessage = this.parseAndValidateConfigUpdateMessage(\n currentConfigUpdateMessage\n );\n\n if (currentConfigUpdateMessage.length === 0) {\n continue;\n }\n\n try {\n const jsonObject = JSON.parse(currentConfigUpdateMessage);\n\n if (this.isEventListenersEmpty()) {\n break;\n }\n\n if (\n REALTIME_DISABLED_KEY in jsonObject &&\n jsonObject[REALTIME_DISABLED_KEY] === true\n ) {\n const error = ERROR_FACTORY.create(\n ErrorCode.CONFIG_UPDATE_UNAVAILABLE,\n {\n originalErrorMessage:\n 'The server is temporarily unavailable. Try again in a few minutes.'\n }\n );\n this.propagateError(error);\n break;\n }\n\n if (TEMPLATE_VERSION_KEY in jsonObject) {\n const oldTemplateVersion =\n await this.storage.getActiveConfigTemplateVersion();\n const targetTemplateVersion = Number(\n jsonObject[TEMPLATE_VERSION_KEY]\n );\n if (\n oldTemplateVersion &&\n targetTemplateVersion > oldTemplateVersion\n ) {\n await this.autoFetch(\n MAXIMUM_FETCH_ATTEMPTS,\n targetTemplateVersion\n );\n }\n }\n\n // This field in the response indicates that the realtime request should retry after the\n // specified interval to establish a long-lived connection. This interval extends the\n // backoff duration without affecting the number of retries, so it will not enter an\n // exponential backoff state.\n if (REALTIME_RETRY_INTERVAL in jsonObject) {\n const retryIntervalSeconds = Number(\n jsonObject[REALTIME_RETRY_INTERVAL]\n );\n await this.updateBackoffMetadataWithRetryInterval(\n retryIntervalSeconds\n );\n }\n } catch (e: unknown) {\n this.logger.debug('Unable to parse latest config update message.', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n this.propagateError(\n ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID, {\n originalErrorMessage: errorMessage\n })\n );\n }\n currentConfigUpdateMessage = '';\n }\n }\n }\n\n private async listenForNotifications(\n reader: ReadableStreamDefaultReader\n ): Promise<void> {\n try {\n await this.handleNotifications(reader);\n } catch (e) {\n // If the real-time connection is at an unexpected lifecycle state when the app is\n // backgrounded, it's expected closing the connection will throw an exception.\n if (!this.isInBackground) {\n // Otherwise, the real-time server connection was closed due to a transient issue.\n this.logger.debug(\n 'Real-time connection was closed due to an exception.'\n );\n }\n }\n }\n\n /**\n * Open the real-time connection, begin listening for updates, and auto-fetch when an update is\n * received.\n *\n * If the connection is successful, this method will block on its thread while it reads the\n * chunk-encoded HTTP body. When the connection closes, it attempts to reestablish the stream.\n */\n private async prepareAndBeginRealtimeHttpStream(): Promise<void> {\n if (!this.checkAndSetHttpConnectionFlagIfNotRunning()) {\n return;\n }\n\n let backoffMetadata = await this.storage.getRealtimeBackoffMetadata();\n if (!backoffMetadata) {\n backoffMetadata = {\n backoffEndTimeMillis: new Date(NO_BACKOFF_TIME_IN_MILLIS),\n numFailedStreams: NO_FAILED_REALTIME_STREAMS\n };\n }\n const backoffEndTime = backoffMetadata.backoffEndTimeMillis.getTime();\n if (Date.now() < backoffEndTime) {\n await this.retryHttpConnectionWhenBackoffEnds();\n return;\n }\n\n let response: Response | undefined;\n let responseCode: number | undefined;\n try {\n response = await this.createRealtimeConnection();\n responseCode = response.status;\n if (response.ok && response.body) {\n this.resetRetryCount();\n await this.resetRealtimeBackoff();\n const reader = response.body.getReader();\n this.reader = reader;\n // Start listening for realtime notifications.\n await this.listenForNotifications(reader);\n }\n } catch (error) {\n if (this.isInBackground) {\n // It's possible the app was backgrounded while the connection was open, which\n // threw an exception trying to read the response. No real error here, so treat\n // this as a success, even if we haven't read a 200 response code yet.\n this.resetRetryCount();\n } else {\n //there might have been a transient error so the client will retry the connection.\n this.logger.debug(\n 'Exception connecting to real-time RC backend. Retrying the connection...:',\n error\n );\n }\n } finally {\n // Close HTTP connection and associated streams.\n await this.closeRealtimeHttpConnection();\n this.setIsHttpConnectionRunning(false);\n\n // Update backoff metadata if the connection failed in the foreground.\n const connectionFailed =\n !this.isInBackground &&\n (responseCode === undefined ||\n this.isStatusCodeRetryable(responseCode));\n\n if (connectionFailed) {\n await this.updateBackoffMetadataWithLastFailedStreamConnectionTime(\n new Date()\n );\n }\n // If responseCode is null then no connection was made to server and the SDK should still retry.\n if (connectionFailed || response?.ok) {\n await this.retryHttpConnectionWhenBackoffEnds();\n } else {\n const errorMessage = `Unable to connect to the server. HTTP status code: ${responseCode}`;\n const firebaseError = ERROR_FACTORY.create(\n ErrorCode.CONFIG_UPDATE_STREAM_ERROR,\n {\n originalErrorMessage: errorMessage\n }\n );\n this.propagateError(firebaseError);\n }\n }\n }\n\n /**\n * Checks whether connection can be made or not based on some conditions\n * @returns booelean\n */\n private canEstablishStreamConnection(): boolean {\n const hasActiveListeners = this.observers.size > 0;\n const isNotDisabled = !this.isRealtimeDisabled;\n const isNoConnectionActive = !this.isConnectionActive;\n const inForeground = !this.isInBackground;\n return (\n hasActiveListeners &&\n isNotDisabled &&\n isNoConnectionActive &&\n inForeground\n );\n }\n\n private async makeRealtimeHttpConnection(delayMillis: number): Promise<void> {\n if (!this.canEstablishStreamConnection()) {\n return;\n }\n if (this.httpRetriesRemaining > 0) {\n this.httpRetriesRemaining--;\n await new Promise(resolve => setTimeout(resolve, delayMillis));\n void this.prepareAndBeginRealtimeHttpStream();\n } else if (!this.isInBackground) {\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_STREAM_ERROR, {\n originalErrorMessage:\n 'Unable to connect to the server. Check your connection and try again.'\n });\n this.propagateError(error);\n }\n }\n\n private async beginRealtime(): Promise<void> {\n if (this.observers.size > 0) {\n await this.makeRealtimeHttpConnection(0);\n }\n }\n\n /**\n * Adds an observer to the realtime updates.\n * @param observer The observer to add.\n */\n addObserver(observer: ConfigUpdateObserver): void {\n this.observers.add(observer);\n void this.beginRealtime();\n }\n\n /**\n * Removes an observer from the realtime updates.\n * @param observer The observer to remove.\n */\n removeObserver(observer: ConfigUpdateObserver): void {\n if (this.observers.has(observer)) {\n this.observers.delete(observer);\n }\n }\n\n /**\n * Handles changes to the application's visibility state, managing the real-time connection.\n *\n * When the application is moved to the background, this method closes the existing\n * real-time connection to save resources. When the application returns to the\n * foreground, it attempts to re-establish the connection.\n */\n private async onVisibilityChange(visible: unknown): Promise<void> {\n this.isInBackground = !visible;\n if (!visible) {\n await this.closeRealtimeHttpConnection();\n } else if (visible) {\n await this.beginRealtime();\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\nimport { isIndexedDBAvailable } from '@firebase/util';\nimport {\n Component,\n ComponentType,\n ComponentContainer\n} from '@firebase/component';\nimport { Logger, LogLevel as FirebaseLogLevel } from '@firebase/logger';\nimport { RemoteConfig, RemoteConfigOptions } from './public_types';\nimport { name as packageName, version } from '../package.json';\nimport { ensureInitialized } from './api';\nimport { CachingClient } from './client/caching_client';\nimport { RestClient } from './client/rest_client';\nimport { RetryingClient } from './client/retrying_client';\nimport { RC_COMPONENT_NAME } from './constants';\nimport { ErrorCode, ERROR_FACTORY } from './errors';\nimport { RemoteConfig as RemoteConfigImpl } from './remote_config';\nimport { IndexedDbStorage, InMemoryStorage } from './storage/storage';\nimport { StorageCache } from './storage/storage_cache';\nimport { RealtimeHandler } from './client/realtime_handler';\n// This needs to be in the same file that calls `getProvider()` on the component\n// or it will get tree-shaken out.\nimport '@firebase/installations';\n\nexport function registerRemoteConfig(): void {\n _registerComponent(\n new Component(\n RC_COMPONENT_NAME,\n remoteConfigFactory,\n ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n\n registerVersion(packageName, version);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(packageName, version, '__BUILD_TARGET__');\n\n function remoteConfigFactory(\n container: ComponentContainer,\n { options }: { options?: RemoteConfigOptions }\n ): RemoteConfig {\n /* Dependencies */\n // getImmediate for FirebaseApp will always succeed\n const app = container.getProvider('app').getImmediate();\n // The following call will always succeed because rc has `import '@firebase/installations'`\n const installations = container\n .getProvider('installations-internal')\n .getImmediate();\n\n // Normalizes optional inputs.\n const { projectId, apiKey, appId } = app.options;\n if (!projectId) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_PROJECT_ID);\n }\n if (!apiKey) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_API_KEY);\n }\n if (!appId) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_APP_ID);\n }\n const namespace = options?.templateId || 'firebase';\n\n const storage = isIndexedDBAvailable()\n ? new IndexedDbStorage(appId, app.name, namespace)\n : new InMemoryStorage();\n const storageCache = new StorageCache(storage);\n\n const logger = new Logger(packageName);\n\n // Sets ERROR as the default log level.\n // See RemoteConfig#setLogLevel for corresponding normalization to ERROR log level.\n logger.logLevel = FirebaseLogLevel.ERROR;\n\n const restClient = new RestClient(\n installations,\n // Uses the JS SDK version, by which the RC package version can be deduced, if necessary.\n SDK_VERSION,\n namespace,\n projectId,\n apiKey,\n appId\n );\n const retryingClient = new RetryingClient(restClient, storage);\n const cachingClient = new CachingClient(\n retryingClient,\n storage,\n storageCache,\n logger\n );\n\n const realtimeHandler = new RealtimeHandler(\n installations,\n storage,\n SDK_VERSION,\n namespace,\n projectId,\n apiKey,\n appId,\n logger,\n storageCache,\n cachingClient\n );\n\n const remoteConfigInstance = new RemoteConfigImpl(\n app,\n cachingClient,\n storageCache,\n storage,\n logger,\n realtimeHandler\n );\n\n // Starts warming cache.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ensureInitialized(remoteConfigInstance);\n\n return remoteConfigInstance;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RemoteConfig } from './public_types';\nimport { activate, fetchConfig } from './api';\nimport {\n getModularInstance,\n isIndexedDBAvailable,\n validateIndexedDBOpenable\n} from '@firebase/util';\n\n// This API is put in a separate file, so we can stub fetchConfig and activate in tests.\n// It's not possible to stub standalone functions from the same module.\n/**\n *\n * Performs fetch and activate operations, as a convenience.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n *\n * @returns A `Promise` which resolves to true if the current call activated the fetched configs.\n * If the fetched configs were already activated, the `Promise` will resolve to false.\n *\n * @public\n */\nexport async function fetchAndActivate(\n remoteConfig: RemoteConfig\n): Promise<boolean> {\n remoteConfig = getModularInstance(remoteConfig);\n await fetchConfig(remoteConfig);\n return activate(remoteConfig);\n}\n\n/**\n * This method provides two different checks:\n *\n * 1. Check if IndexedDB exists in the browser environment.\n * 2. Check if the current browser context allows IndexedDB `open()` calls.\n *\n * @returns A `Promise` which resolves to true if a {@link RemoteConfig} instance\n * can be initialized in this environment, or false if it cannot.\n * @public\n */\nexport async function isSupported(): Promise<boolean> {\n if (!isIndexedDBAvailable()) {\n return false;\n }\n\n try {\n const isDBOpenable: boolean = await validateIndexedDBOpenable();\n return isDBOpenable;\n } catch (error) {\n return false;\n }\n}\n","/**\n * The Firebase Remote Config Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { registerRemoteConfig } from './register';\n\n// Facilitates debugging by enabling settings changes without rebuilding asset.\n// Note these debug options are not part of a documented, supported API and can change at any time.\n// Consolidates debug options for easier discovery.\n// Uses transient variables on window to avoid lingering state causing panic.\ndeclare global {\n interface Window {\n FIREBASE_REMOTE_CONFIG_URL_BASE: string;\n }\n}\n\nexport * from './api';\nexport * from './api2';\nexport * from './public_types';\n\n/** register component and version */\nregisterRemoteConfig();\n"],"names":["ValueImpl","FirebaseLogLevel","packageName","RemoteConfigImpl"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/client/remote_config_fetch_client.ts","../../src/constants.ts","../../src/errors.ts","../../src/value.ts","../../src/abt/experiment.ts","../../src/api.ts","../../src/client/caching_client.ts","../../src/language.ts","../../src/client/rest_client.ts","../../src/client/retrying_client.ts","../../src/remote_config.ts","../../src/storage/storage.ts","../../src/storage/storage_cache.ts","../../src/client/eventEmitter.ts","../../src/client/visibility_monitor.ts","../../src/client/realtime_handler.ts","../../src/register.ts","../../src/api2.ts","../../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CustomSignals, FetchResponse, FetchType } from '../public_types';\n\n/**\n * Defines a client, as in https://en.wikipedia.org/wiki/Client%E2%80%93server_model, for the\n * Remote Config server (https://firebase.google.com/docs/reference/remote-config/rest).\n *\n * <p>Abstracts throttle, response cache and network implementation details.\n *\n * <p>Modeled after the native {@link GlobalFetch} interface, which is relatively modern and\n * convenient, but simplified for Remote Config's use case.\n *\n * Disambiguation: {@link GlobalFetch} interface and the Remote Config service define \"fetch\"\n * methods. The RestClient uses the former to make HTTP calls. This interface abstracts the latter.\n */\nexport interface RemoteConfigFetchClient {\n /**\n * @throws if response status is not 200 or 304.\n */\n fetch(request: FetchRequest): Promise<FetchResponse>;\n}\n\n/**\n * Shims a minimal AbortSignal.\n *\n * <p>AbortController's AbortSignal conveniently decouples fetch timeout logic from other aspects\n * of networking, such as retries. Firebase doesn't use AbortController enough to justify a\n * polyfill recommendation, like we do with the Fetch API, but this minimal shim can easily be\n * swapped out if/when we do.\n */\nexport class RemoteConfigAbortSignal {\n listeners: Array<() => void> = [];\n addEventListener(listener: () => void): void {\n this.listeners.push(listener);\n }\n abort(): void {\n this.listeners.forEach(listener => listener());\n }\n}\n\n/**\n * Defines per-request inputs for the Remote Config fetch request.\n *\n * <p>Modeled after the native {@link Request} interface, but simplified for Remote Config's\n * use case.\n */\nexport interface FetchRequest {\n /**\n * Uses cached config if it is younger than this age.\n *\n * <p>Required because it's defined by settings, which always have a value.\n *\n * <p>Comparable to passing `headers = { 'Cache-Control': max-age <maxAge> }` to the native\n * Fetch API.\n */\n cacheMaxAgeMillis: number;\n\n /**\n * An event bus for the signal to abort a request.\n *\n * <p>Required because all requests should be abortable.\n *\n * <p>Comparable to the native\n * Fetch API's \"signal\" field on its request configuration object\n * https://fetch.spec.whatwg.org/#dom-requestinit-signal.\n *\n * <p>Disambiguation: Remote Config commonly refers to API inputs as\n * \"signals\". See the private ConfigFetchRequestBody interface for those:\n * http://google3/firebase/remote_config/web/src/core/rest_client.ts?l=14&rcl=255515243.\n */\n signal: RemoteConfigAbortSignal;\n\n /**\n * The ETag header value from the last response.\n *\n * <p>Optional in case this is the first request.\n *\n * <p>Comparable to passing `headers = { 'If-None-Match': <eTag> }` to the native Fetch API.\n */\n eTag?: string;\n\n /** The custom signals stored for the app instance.\n *\n * <p>Optional in case no custom signals are set for the instance.\n */\n customSignals?: CustomSignals;\n\n /**\n * The type of fetch to perform, such as a regular fetch or a real-time fetch.\n *\n * Optional as not all fetch requests need to be distinguished.\n */\n fetchType?: FetchType;\n\n /**\n * The number of fetch attempts made so far for this request.\n *\n * Optional as not all fetch requests are part of a retry series.\n */\n fetchAttempt?: number;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const RC_COMPONENT_NAME = 'remote-config';\nexport const RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS = 100;\nexport const RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH = 250;\nexport const RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH = 500;\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\n\nexport const enum ErrorCode {\n ALREADY_INITIALIZED = 'already-initialized',\n REGISTRATION_WINDOW = 'registration-window',\n REGISTRATION_PROJECT_ID = 'registration-project-id',\n REGISTRATION_API_KEY = 'registration-api-key',\n REGISTRATION_APP_ID = 'registration-app-id',\n STORAGE_OPEN = 'storage-open',\n STORAGE_GET = 'storage-get',\n STORAGE_SET = 'storage-set',\n STORAGE_DELETE = 'storage-delete',\n FETCH_NETWORK = 'fetch-client-network',\n FETCH_TIMEOUT = 'fetch-timeout',\n FETCH_THROTTLE = 'fetch-throttle',\n FETCH_PARSE = 'fetch-client-parse',\n FETCH_STATUS = 'fetch-status',\n INDEXED_DB_UNAVAILABLE = 'indexed-db-unavailable',\n CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS = 'custom-signal-max-allowed-signals',\n CONFIG_UPDATE_STREAM_ERROR = 'stream-error',\n CONFIG_UPDATE_UNAVAILABLE = 'realtime-unavailable',\n CONFIG_UPDATE_MESSAGE_INVALID = 'update-message-invalid',\n CONFIG_UPDATE_NOT_FETCHED = 'update-not-fetched',\n ANALYTICS_UNAVAILABLE = 'analytics-unavailable'\n}\n\nconst ERROR_DESCRIPTION_MAP: { readonly [key in ErrorCode]: string } = {\n [ErrorCode.ALREADY_INITIALIZED]: 'Remote Config already initialized',\n [ErrorCode.REGISTRATION_WINDOW]:\n 'Undefined window object. This SDK only supports usage in a browser environment.',\n [ErrorCode.REGISTRATION_PROJECT_ID]:\n 'Undefined project identifier. Check Firebase app initialization.',\n [ErrorCode.REGISTRATION_API_KEY]:\n 'Undefined API key. Check Firebase app initialization.',\n [ErrorCode.REGISTRATION_APP_ID]:\n 'Undefined app identifier. Check Firebase app initialization.',\n [ErrorCode.STORAGE_OPEN]:\n 'Error thrown when opening storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_GET]:\n 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_SET]:\n 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.STORAGE_DELETE]:\n 'Error thrown when deleting from storage. Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_NETWORK]:\n 'Fetch client failed to connect to a network. Check Internet connection.' +\n ' Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_TIMEOUT]:\n 'The config fetch request timed out. ' +\n ' Configure timeout using \"fetchTimeoutMillis\" SDK setting.',\n [ErrorCode.FETCH_THROTTLE]:\n 'The config fetch request timed out while in an exponential backoff state.' +\n ' Configure timeout using \"fetchTimeoutMillis\" SDK setting.' +\n ' Unix timestamp in milliseconds when fetch request throttling ends: {$throttleEndTimeMillis}.',\n [ErrorCode.FETCH_PARSE]:\n 'Fetch client could not parse response.' +\n ' Original error: {$originalErrorMessage}.',\n [ErrorCode.FETCH_STATUS]:\n 'Fetch server returned an HTTP error status. HTTP status: {$httpStatus}.',\n [ErrorCode.INDEXED_DB_UNAVAILABLE]:\n 'Indexed DB is not supported by current browser',\n [ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS]:\n 'Setting more than {$maxSignals} custom signals is not supported.',\n [ErrorCode.CONFIG_UPDATE_STREAM_ERROR]:\n 'The stream was not able to connect to the backend: {$originalErrorMessage}.',\n [ErrorCode.CONFIG_UPDATE_UNAVAILABLE]:\n 'The Realtime service is unavailable: {$originalErrorMessage}',\n [ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID]:\n 'The stream invalidation message was unparsable: {$originalErrorMessage}',\n [ErrorCode.CONFIG_UPDATE_NOT_FETCHED]:\n 'Unable to fetch the latest config: {$originalErrorMessage}',\n [ErrorCode.ANALYTICS_UNAVAILABLE]:\n 'Connection to Firebase Analytics failed: {$originalErrorMessage}'\n};\n\n// Note this is effectively a type system binding a code to params. This approach overlaps with the\n// role of TS interfaces, but works well for a few reasons:\n// 1) JS is unaware of TS interfaces, eg we can't test for interface implementation in JS\n// 2) callers should have access to a human-readable summary of the error and this interpolates\n// params into an error message;\n// 3) callers should be able to programmatically access data associated with an error, which\n// ErrorData provides.\ninterface ErrorParams {\n [ErrorCode.STORAGE_OPEN]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_GET]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_SET]: { originalErrorMessage: string | undefined };\n [ErrorCode.STORAGE_DELETE]: { originalErrorMessage: string | undefined };\n [ErrorCode.FETCH_NETWORK]: { originalErrorMessage: string };\n [ErrorCode.FETCH_THROTTLE]: { throttleEndTimeMillis: number };\n [ErrorCode.FETCH_PARSE]: { originalErrorMessage: string };\n [ErrorCode.FETCH_STATUS]: { httpStatus: number };\n [ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS]: { maxSignals: number };\n [ErrorCode.CONFIG_UPDATE_STREAM_ERROR]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_UNAVAILABLE]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID]: { originalErrorMessage: string };\n [ErrorCode.CONFIG_UPDATE_NOT_FETCHED]: { originalErrorMessage: string };\n [ErrorCode.ANALYTICS_UNAVAILABLE]: { originalErrorMessage: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory<ErrorCode, ErrorParams>(\n 'remoteconfig' /* service */,\n 'Remote Config' /* service name */,\n ERROR_DESCRIPTION_MAP\n);\n\n// Note how this is like typeof/instanceof, but for ErrorCode.\nexport function hasErrorCode(e: Error, errorCode: ErrorCode): boolean {\n return e instanceof FirebaseError && e.code.indexOf(errorCode) !== -1;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Value as ValueType, ValueSource } from '@firebase/remote-config-types';\n\nconst DEFAULT_VALUE_FOR_BOOLEAN = false;\nconst DEFAULT_VALUE_FOR_STRING = '';\nconst DEFAULT_VALUE_FOR_NUMBER = 0;\n\nconst BOOLEAN_TRUTHY_VALUES = ['1', 'true', 't', 'yes', 'y', 'on'];\n\nexport class Value implements ValueType {\n constructor(\n private readonly _source: ValueSource,\n private readonly _value: string = DEFAULT_VALUE_FOR_STRING\n ) {}\n\n asString(): string {\n return this._value;\n }\n\n asBoolean(): boolean {\n if (this._source === 'static') {\n return DEFAULT_VALUE_FOR_BOOLEAN;\n }\n return BOOLEAN_TRUTHY_VALUES.indexOf(this._value.toLowerCase()) >= 0;\n }\n\n asNumber(): number {\n if (this._source === 'static') {\n return DEFAULT_VALUE_FOR_NUMBER;\n }\n let num = Number(this._value);\n if (isNaN(num)) {\n num = DEFAULT_VALUE_FOR_NUMBER;\n }\n return num;\n }\n\n getSource(): ValueSource {\n return this._source;\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Storage } from '../storage/storage';\nimport { FirebaseExperimentDescription } from '../public_types';\nimport { Provider } from '@firebase/component';\nimport { FirebaseAnalyticsInternalName } from '@firebase/analytics-interop-types';\nimport { Logger } from '@firebase/logger';\nimport { RemoteConfig } from '../remote_config';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\n\nexport class Experiment {\n private storage: Storage;\n private logger: Logger;\n private analyticsProvider: Provider<FirebaseAnalyticsInternalName>;\n\n constructor(rc: RemoteConfig) {\n this.storage = rc._storage;\n this.logger = rc._logger;\n this.analyticsProvider = rc._analyticsProvider;\n }\n\n async updateActiveExperiments(\n latestExperiments: FirebaseExperimentDescription[]\n ): Promise<void> {\n const currentActiveExperiments =\n (await this.storage.getActiveExperiments()) || new Set<string>();\n const experimentInfoMap = this.createExperimentInfoMap(latestExperiments);\n this.addActiveExperiments(experimentInfoMap);\n this.removeInactiveExperiments(currentActiveExperiments, experimentInfoMap);\n return this.storage.setActiveExperiments(new Set(experimentInfoMap.keys()));\n }\n\n private createExperimentInfoMap(\n latestExperiments: FirebaseExperimentDescription[]\n ): Map<string, FirebaseExperimentDescription> {\n const experimentInfoMap = new Map<string, FirebaseExperimentDescription>();\n for (const experiment of latestExperiments) {\n experimentInfoMap.set(experiment.experimentId, experiment);\n }\n return experimentInfoMap;\n }\n\n private addActiveExperiments(\n experimentInfoMap: Map<string, FirebaseExperimentDescription>\n ): void {\n const customProperty: Record<string, string | null> = {};\n for (const [experimentId, experimentInfo] of experimentInfoMap.entries()) {\n customProperty[`firebase${experimentId}`] = experimentInfo.variantId;\n }\n this.addExperimentToAnalytics(customProperty);\n }\n\n private removeInactiveExperiments(\n currentActiveExperiments: Set<string>,\n experimentInfoMap: Map<string, FirebaseExperimentDescription>\n ): void {\n const customProperty: Record<string, string | null> = {};\n for (const experimentId of currentActiveExperiments) {\n if (!experimentInfoMap.has(experimentId)) {\n customProperty[`firebase${experimentId}`] = null;\n }\n }\n this.addExperimentToAnalytics(customProperty);\n }\n\n private addExperimentToAnalytics(\n customProperty: Record<string, string | null>\n ): void {\n if (Object.keys(customProperty).length === 0) {\n return;\n }\n try {\n const analytics = this.analyticsProvider.getImmediate({ optional: true });\n if (analytics) {\n analytics.setUserProperties(customProperty);\n analytics.logEvent(`set_firebase_experiment_state`);\n } else {\n this.logger.warn(\n `Analytics import failed. Verify if you have imported Firebase Analytics in your app code.`\n );\n }\n } catch (error) {\n throw ERROR_FACTORY.create(ErrorCode.ANALYTICS_UNAVAILABLE, {\n originalErrorMessage: (error as Error)?.message\n });\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _getProvider, FirebaseApp, getApp } from '@firebase/app';\nimport { deepEqual, getModularInstance } from '@firebase/util';\nimport {\n CustomSignals,\n LogLevel as RemoteConfigLogLevel,\n RemoteConfig,\n Value,\n RemoteConfigOptions,\n ConfigUpdateObserver,\n Unsubscribe\n} from './public_types';\nimport { RemoteConfigAbortSignal } from './client/remote_config_fetch_client';\nimport {\n RC_COMPONENT_NAME,\n RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH,\n RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH\n} from './constants';\nimport { ERROR_FACTORY, ErrorCode, hasErrorCode } from './errors';\nimport { RemoteConfig as RemoteConfigImpl } from './remote_config';\nimport { Value as ValueImpl } from './value';\nimport { LogLevel as FirebaseLogLevel } from '@firebase/logger';\nimport { Experiment } from './abt/experiment';\n\n/**\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\n * @param options - Optional. The {@link RemoteConfigOptions} with which to instantiate the\n * Remote Config instance.\n * @returns A {@link RemoteConfig} instance.\n *\n * @public\n */\nexport function getRemoteConfig(\n app: FirebaseApp = getApp(),\n options: RemoteConfigOptions = {}\n): RemoteConfig {\n app = getModularInstance(app);\n const rcProvider = _getProvider(app, RC_COMPONENT_NAME);\n if (rcProvider.isInitialized()) {\n const initialOptions = rcProvider.getOptions() as RemoteConfigOptions;\n if (deepEqual(initialOptions, options)) {\n return rcProvider.getImmediate();\n }\n throw ERROR_FACTORY.create(ErrorCode.ALREADY_INITIALIZED);\n }\n rcProvider.initialize({ options });\n const rc = rcProvider.getImmediate() as RemoteConfigImpl;\n\n if (options.initialFetchResponse) {\n // We use these initial writes as the initialization promise since they will hydrate the same\n // fields that `storageCache.loadFromStorage` would set.\n rc._initializePromise = Promise.all([\n rc._storage.setLastSuccessfulFetchResponse(options.initialFetchResponse),\n rc._storage.setActiveConfigEtag(options.initialFetchResponse?.eTag || ''),\n rc._storage.setActiveConfigTemplateVersion(\n options.initialFetchResponse.templateVersion || 0\n ),\n rc._storageCache.setLastSuccessfulFetchTimestampMillis(Date.now()),\n rc._storageCache.setLastFetchStatus('success'),\n rc._storageCache.setActiveConfig(\n options.initialFetchResponse?.config || {}\n )\n ]).then();\n // The `storageCache` methods above set their in-memory fields synchronously, so it's\n // safe to declare our initialization complete at this point.\n rc._isInitializationComplete = true;\n }\n\n return rc;\n}\n\n/**\n * Makes the last fetched config available to the getters.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @returns A `Promise` which resolves to true if the current call activated the fetched configs.\n * If the fetched configs were already activated, the `Promise` will resolve to false.\n *\n * @public\n */\nexport async function activate(remoteConfig: RemoteConfig): Promise<boolean> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n const [lastSuccessfulFetchResponse, activeConfigEtag] = await Promise.all([\n rc._storage.getLastSuccessfulFetchResponse(),\n rc._storage.getActiveConfigEtag()\n ]);\n if (\n !lastSuccessfulFetchResponse ||\n !lastSuccessfulFetchResponse.config ||\n !lastSuccessfulFetchResponse.eTag ||\n !lastSuccessfulFetchResponse.templateVersion ||\n lastSuccessfulFetchResponse.eTag === activeConfigEtag\n ) {\n // Either there is no successful fetched config, or is the same as current active\n // config.\n return false;\n }\n const experiment = new Experiment(rc);\n const updateActiveExperiments = lastSuccessfulFetchResponse.experiments\n ? experiment.updateActiveExperiments(\n lastSuccessfulFetchResponse.experiments\n )\n : Promise.resolve();\n await Promise.all([\n rc._storageCache.setActiveConfig(lastSuccessfulFetchResponse.config),\n rc._storage.setActiveConfigEtag(lastSuccessfulFetchResponse.eTag),\n rc._storage.setActiveConfigTemplateVersion(\n lastSuccessfulFetchResponse.templateVersion\n ),\n updateActiveExperiments\n ]);\n return true;\n}\n\n/**\n * Ensures the last activated config are available to the getters.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n *\n * @returns A `Promise` that resolves when the last activated config is available to the getters.\n * @public\n */\nexport function ensureInitialized(remoteConfig: RemoteConfig): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (!rc._initializePromise) {\n rc._initializePromise = rc._storageCache.loadFromStorage().then(() => {\n rc._isInitializationComplete = true;\n });\n }\n return rc._initializePromise;\n}\n\n/**\n * Fetches and caches configuration from the Remote Config service.\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @public\n */\nexport async function fetchConfig(remoteConfig: RemoteConfig): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n // Aborts the request after the given timeout, causing the fetch call to\n // reject with an `AbortError`.\n //\n // <p>Aborting after the request completes is a no-op, so we don't need a\n // corresponding `clearTimeout`.\n //\n // Locating abort logic here because:\n // * it uses a developer setting (timeout)\n // * it applies to all retries (like curl's max-time arg)\n // * it is consistent with the Fetch API's signal input\n const abortSignal = new RemoteConfigAbortSignal();\n\n setTimeout(async () => {\n // Note a very low delay, eg < 10ms, can elapse before listeners are initialized.\n abortSignal.abort();\n }, rc.settings.fetchTimeoutMillis);\n\n const customSignals = rc._storageCache.getCustomSignals();\n if (customSignals) {\n rc._logger.debug(\n `Fetching config with custom signals: ${JSON.stringify(customSignals)}`\n );\n }\n // Catches *all* errors thrown by client so status can be set consistently.\n try {\n await rc._client.fetch({\n cacheMaxAgeMillis: rc.settings.minimumFetchIntervalMillis,\n signal: abortSignal,\n customSignals\n });\n\n await rc._storageCache.setLastFetchStatus('success');\n } catch (e) {\n const lastFetchStatus = hasErrorCode(e as Error, ErrorCode.FETCH_THROTTLE)\n ? 'throttle'\n : 'failure';\n await rc._storageCache.setLastFetchStatus(lastFetchStatus);\n throw e;\n }\n}\n\n/**\n * Gets all config.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @returns All config.\n *\n * @public\n */\nexport function getAll(remoteConfig: RemoteConfig): Record<string, Value> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n return getAllKeys(\n rc._storageCache.getActiveConfig(),\n rc.defaultConfig\n ).reduce((allConfigs, key) => {\n allConfigs[key] = getValue(remoteConfig, key);\n return allConfigs;\n }, {} as Record<string, Value>);\n}\n\n/**\n * Gets the value for the given key as a boolean.\n *\n * Convenience method for calling <code>remoteConfig.getValue(key).asBoolean()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a boolean.\n * @public\n */\nexport function getBoolean(remoteConfig: RemoteConfig, key: string): boolean {\n return getValue(getModularInstance(remoteConfig), key).asBoolean();\n}\n\n/**\n * Gets the value for the given key as a number.\n *\n * Convenience method for calling <code>remoteConfig.getValue(key).asNumber()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a number.\n *\n * @public\n */\nexport function getNumber(remoteConfig: RemoteConfig, key: string): number {\n return getValue(getModularInstance(remoteConfig), key).asNumber();\n}\n\n/**\n * Gets the value for the given key as a string.\n * Convenience method for calling <code>remoteConfig.getValue(key).asString()</code>.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key as a string.\n *\n * @public\n */\nexport function getString(remoteConfig: RemoteConfig, key: string): string {\n return getValue(getModularInstance(remoteConfig), key).asString();\n}\n\n/**\n * Gets the {@link Value} for the given key.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param key - The name of the parameter.\n *\n * @returns The value for the given key.\n *\n * @public\n */\nexport function getValue(remoteConfig: RemoteConfig, key: string): Value {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (!rc._isInitializationComplete) {\n rc._logger.debug(\n `A value was requested for key \"${key}\" before SDK initialization completed.` +\n ' Await on ensureInitialized if the intent was to get a previously activated value.'\n );\n }\n const activeConfig = rc._storageCache.getActiveConfig();\n if (activeConfig && activeConfig[key] !== undefined) {\n return new ValueImpl('remote', activeConfig[key]);\n } else if (rc.defaultConfig && rc.defaultConfig[key] !== undefined) {\n return new ValueImpl('default', String(rc.defaultConfig[key]));\n }\n rc._logger.debug(\n `Returning static value for key \"${key}\".` +\n ' Define a default or remote value if this is unintentional.'\n );\n return new ValueImpl('static');\n}\n\n/**\n * Defines the log level to use.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param logLevel - The log level to set.\n *\n * @public\n */\nexport function setLogLevel(\n remoteConfig: RemoteConfig,\n logLevel: RemoteConfigLogLevel\n): void {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n switch (logLevel) {\n case 'debug':\n rc._logger.logLevel = FirebaseLogLevel.DEBUG;\n break;\n case 'silent':\n rc._logger.logLevel = FirebaseLogLevel.SILENT;\n break;\n default:\n rc._logger.logLevel = FirebaseLogLevel.ERROR;\n }\n}\n\n/**\n * Dedupes and returns an array of all the keys of the received objects.\n */\nfunction getAllKeys(obj1: {} = {}, obj2: {} = {}): string[] {\n return Object.keys({ ...obj1, ...obj2 });\n}\n\n/**\n * Sets the custom signals for the app instance.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param customSignals - Map (key, value) of the custom signals to be set for the app instance. If\n * a key already exists, the value is overwritten. Setting the value of a custom signal to null\n * unsets the signal. The signals will be persisted locally on the client.\n *\n * @public\n */\nexport async function setCustomSignals(\n remoteConfig: RemoteConfig,\n customSignals: CustomSignals\n): Promise<void> {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n if (Object.keys(customSignals).length === 0) {\n return;\n }\n\n // eslint-disable-next-line guard-for-in\n for (const key in customSignals) {\n if (key.length > RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH) {\n rc._logger.error(\n `Custom signal key ${key} is too long, max allowed length is ${RC_CUSTOM_SIGNAL_KEY_MAX_LENGTH}.`\n );\n return;\n }\n const value = customSignals[key];\n if (\n typeof value === 'string' &&\n value.length > RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH\n ) {\n rc._logger.error(\n `Value supplied for custom signal ${key} is too long, max allowed length is ${RC_CUSTOM_SIGNAL_VALUE_MAX_LENGTH}.`\n );\n return;\n }\n }\n\n try {\n await rc._storageCache.setCustomSignals(customSignals);\n } catch (error) {\n rc._logger.error(\n `Error encountered while setting custom signals: ${error}`\n );\n }\n}\n\n// TODO: Add public document for the Remote Config Realtime API guide on the Web Platform.\n/**\n * Starts listening for real-time config updates from the Remote Config backend and automatically\n * fetches updates from the Remote Config backend when they are available.\n *\n * @remarks\n * If a connection to the Remote Config backend is not already open, calling this method will\n * open it. Multiple listeners can be added by calling this method again, but subsequent calls\n * re-use the same connection to the backend.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n * @param observer - The {@link ConfigUpdateObserver} to be notified of config updates.\n * @returns An {@link Unsubscribe} function to remove the listener.\n *\n * @public\n */\nexport function onConfigUpdate(\n remoteConfig: RemoteConfig,\n observer: ConfigUpdateObserver\n): Unsubscribe {\n const rc = getModularInstance(remoteConfig) as RemoteConfigImpl;\n rc._realtimeHandler.addObserver(observer);\n return () => {\n rc._realtimeHandler.removeObserver(observer);\n };\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { StorageCache } from '../storage/storage_cache';\nimport { FetchResponse } from '../public_types';\nimport {\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { Storage } from '../storage/storage';\nimport { Logger } from '@firebase/logger';\n\n/**\n * Implements the {@link RemoteConfigClient} abstraction with success response caching.\n *\n * <p>Comparable to the browser's Cache API for responses, but the Cache API requires a Service\n * Worker, which requires HTTPS, which would significantly complicate SDK installation. Also, the\n * Cache API doesn't support matching entries by time.\n */\nexport class CachingClient implements RemoteConfigFetchClient {\n constructor(\n private readonly client: RemoteConfigFetchClient,\n private readonly storage: Storage,\n private readonly storageCache: StorageCache,\n private readonly logger: Logger\n ) {}\n\n /**\n * Returns true if the age of the cached fetched configs is less than or equal to\n * {@link Settings#minimumFetchIntervalInSeconds}.\n *\n * <p>This is comparable to passing `headers = { 'Cache-Control': max-age <maxAge> }` to the\n * native Fetch API.\n *\n * <p>Visible for testing.\n */\n isCachedDataFresh(\n cacheMaxAgeMillis: number,\n lastSuccessfulFetchTimestampMillis: number | undefined\n ): boolean {\n // Cache can only be fresh if it's populated.\n if (!lastSuccessfulFetchTimestampMillis) {\n this.logger.debug('Config fetch cache check. Cache unpopulated.');\n return false;\n }\n\n // Calculates age of cache entry.\n const cacheAgeMillis = Date.now() - lastSuccessfulFetchTimestampMillis;\n\n const isCachedDataFresh = cacheAgeMillis <= cacheMaxAgeMillis;\n\n this.logger.debug(\n 'Config fetch cache check.' +\n ` Cache age millis: ${cacheAgeMillis}.` +\n ` Cache max age millis (minimumFetchIntervalMillis setting): ${cacheMaxAgeMillis}.` +\n ` Is cache hit: ${isCachedDataFresh}.`\n );\n\n return isCachedDataFresh;\n }\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n // Reads from persisted storage to avoid cache miss if callers don't wait on initialization.\n const [lastSuccessfulFetchTimestampMillis, lastSuccessfulFetchResponse] =\n await Promise.all([\n this.storage.getLastSuccessfulFetchTimestampMillis(),\n this.storage.getLastSuccessfulFetchResponse()\n ]);\n\n // Exits early on cache hit.\n if (\n lastSuccessfulFetchResponse &&\n this.isCachedDataFresh(\n request.cacheMaxAgeMillis,\n lastSuccessfulFetchTimestampMillis\n )\n ) {\n return lastSuccessfulFetchResponse;\n }\n\n // Deviates from pure decorator by not honoring a passed ETag since we don't have a public API\n // that allows the caller to pass an ETag.\n request.eTag =\n lastSuccessfulFetchResponse && lastSuccessfulFetchResponse.eTag;\n\n // Falls back to service on cache miss.\n const response = await this.client.fetch(request);\n\n // Fetch throws for non-success responses, so success is guaranteed here.\n\n const storageOperations = [\n // Uses write-through cache for consistency with synchronous public API.\n this.storageCache.setLastSuccessfulFetchTimestampMillis(Date.now())\n ];\n\n if (response.status === 200) {\n // Caches response only if it has changed, ie non-304 responses.\n storageOperations.push(\n this.storage.setLastSuccessfulFetchResponse(response)\n );\n }\n\n await Promise.all(storageOperations);\n\n return response;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Attempts to get the most accurate browser language setting.\n *\n * <p>Adapted from getUserLanguage in packages/auth/src/utils.js for TypeScript.\n *\n * <p>Defers default language specification to server logic for consistency.\n *\n * @param navigatorLanguage Enables tests to override read-only {@link NavigatorLanguage}.\n */\nexport function getUserLanguage(\n navigatorLanguage: NavigatorLanguage = navigator\n): string {\n return (\n // Most reliable, but only supported in Chrome/Firefox.\n (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\n // Supported in most browsers, but returns the language of the browser\n // UI, not the language set in browser settings.\n navigatorLanguage.language\n // Polyfill otherwise.\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CustomSignals,\n FetchResponse,\n FirebaseRemoteConfigObject,\n FirebaseExperimentDescription\n} from '../public_types';\nimport {\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { getUserLanguage } from '../language';\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\n\n/**\n * Defines request body parameters required to call the fetch API:\n * https://firebase.google.com/docs/reference/remote-config/rest\n *\n * <p>Not exported because this file encapsulates REST API specifics.\n *\n * <p>Not passing User Properties because Analytics' source of truth on Web is server-side.\n */\ninterface FetchRequestBody {\n // Disables camelcase linting for request body params.\n /* eslint-disable camelcase*/\n sdk_version: string;\n app_instance_id: string;\n app_instance_id_token: string;\n app_id: string;\n language_code: string;\n custom_signals?: CustomSignals;\n /* eslint-enable camelcase */\n}\n\n/**\n * Implements the Client abstraction for the Remote Config REST API.\n */\nexport class RestClient implements RemoteConfigFetchClient {\n constructor(\n private readonly firebaseInstallations: _FirebaseInstallationsInternal,\n private readonly sdkVersion: string,\n private readonly namespace: string,\n private readonly projectId: string,\n private readonly apiKey: string,\n private readonly appId: string\n ) {}\n\n /**\n * Fetches from the Remote Config REST API.\n *\n * @throws a {@link ErrorCode.FETCH_NETWORK} error if {@link GlobalFetch#fetch} can't\n * connect to the network.\n * @throws a {@link ErrorCode.FETCH_PARSE} error if {@link Response#json} can't parse the\n * fetch response.\n * @throws a {@link ErrorCode.FETCH_STATUS} error if the service returns an HTTP error status.\n */\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const [installationId, installationToken] = await Promise.all([\n this.firebaseInstallations.getId(),\n this.firebaseInstallations.getToken()\n ]);\n\n const urlBase =\n window.FIREBASE_REMOTE_CONFIG_URL_BASE ||\n 'https://firebaseremoteconfig.googleapis.com';\n\n const url = `${urlBase}/v1/projects/${this.projectId}/namespaces/${this.namespace}:fetch?key=${this.apiKey}`;\n\n const headers = {\n 'Content-Type': 'application/json',\n 'Content-Encoding': 'gzip',\n // Deviates from pure decorator by not passing max-age header since we don't currently have\n // service behavior using that header.\n 'If-None-Match': request.eTag || '*'\n // TODO: Add this header once CORS error is fixed internally.\n //'X-Firebase-RC-Fetch-Type': `${fetchType}/${fetchAttempt}`\n };\n\n const requestBody: FetchRequestBody = {\n /* eslint-disable camelcase */\n sdk_version: this.sdkVersion,\n app_instance_id: installationId,\n app_instance_id_token: installationToken,\n app_id: this.appId,\n language_code: getUserLanguage(),\n custom_signals: request.customSignals\n /* eslint-enable camelcase */\n };\n\n const options = {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody)\n };\n\n // This logic isn't REST-specific, but shimming abort logic isn't worth another decorator.\n const fetchPromise = fetch(url, options);\n const timeoutPromise = new Promise((_resolve, reject) => {\n // Maps async event listener to Promise API.\n request.signal.addEventListener(() => {\n // Emulates https://heycam.github.io/webidl/#aborterror\n const error = new Error('The operation was aborted.');\n error.name = 'AbortError';\n reject(error);\n });\n });\n\n let response;\n try {\n await Promise.race([fetchPromise, timeoutPromise]);\n response = await fetchPromise;\n } catch (originalError) {\n let errorCode = ErrorCode.FETCH_NETWORK;\n if ((originalError as Error)?.name === 'AbortError') {\n errorCode = ErrorCode.FETCH_TIMEOUT;\n }\n throw ERROR_FACTORY.create(errorCode, {\n originalErrorMessage: (originalError as Error)?.message\n });\n }\n\n let status = response.status;\n\n // Normalizes nullable header to optional.\n const responseEtag = response.headers.get('ETag') || undefined;\n\n let config: FirebaseRemoteConfigObject | undefined;\n let state: string | undefined;\n let templateVersion: number | undefined;\n let experiments: FirebaseExperimentDescription[] | undefined;\n\n // JSON parsing throws SyntaxError if the response body isn't a JSON string.\n // Requesting application/json and checking for a 200 ensures there's JSON data.\n if (response.status === 200) {\n let responseBody;\n try {\n responseBody = await response.json();\n } catch (originalError) {\n throw ERROR_FACTORY.create(ErrorCode.FETCH_PARSE, {\n originalErrorMessage: (originalError as Error)?.message\n });\n }\n config = responseBody['entries'];\n state = responseBody['state'];\n templateVersion = responseBody['templateVersion'];\n experiments = responseBody['experimentDescriptions'];\n }\n\n // Normalizes based on legacy state.\n if (state === 'INSTANCE_STATE_UNSPECIFIED') {\n status = 500;\n } else if (state === 'NO_CHANGE') {\n status = 304;\n } else if (state === 'NO_TEMPLATE' || state === 'EMPTY_CONFIG') {\n // These cases can be fixed remotely, so normalize to safe value.\n config = {};\n experiments = [];\n }\n\n // Normalize to exception-based control flow for non-success cases.\n // Encapsulates HTTP specifics in this class as much as possible. Status is still the best for\n // differentiating success states (200 from 304; the state body param is undefined in a\n // standard 304).\n if (status !== 304 && status !== 200) {\n throw ERROR_FACTORY.create(ErrorCode.FETCH_STATUS, {\n httpStatus: status\n });\n }\n\n return { status, eTag: responseEtag, config, templateVersion, experiments };\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchResponse } from '../public_types';\nimport {\n RemoteConfigAbortSignal,\n RemoteConfigFetchClient,\n FetchRequest\n} from './remote_config_fetch_client';\nimport { ThrottleMetadata, Storage } from '../storage/storage';\nimport { ErrorCode, ERROR_FACTORY } from '../errors';\nimport { FirebaseError, calculateBackoffMillis } from '@firebase/util';\n\n/**\n * Supports waiting on a backoff by:\n *\n * <ul>\n * <li>Promisifying setTimeout, so we can set a timeout in our Promise chain</li>\n * <li>Listening on a signal bus for abort events, just like the Fetch API</li>\n * <li>Failing in the same way the Fetch API fails, so timing out a live request and a throttled\n * request appear the same.</li>\n * </ul>\n *\n * <p>Visible for testing.\n */\nexport function setAbortableTimeout(\n signal: RemoteConfigAbortSignal,\n throttleEndTimeMillis: number\n): Promise<void> {\n return new Promise((resolve, reject) => {\n // Derives backoff from given end time, normalizing negative numbers to zero.\n const backoffMillis = Math.max(throttleEndTimeMillis - Date.now(), 0);\n\n const timeout = setTimeout(resolve, backoffMillis);\n\n // Adds listener, rather than sets onabort, because signal is a shared object.\n signal.addEventListener(() => {\n clearTimeout(timeout);\n\n // If the request completes before this timeout, the rejection has no effect.\n reject(\n ERROR_FACTORY.create(ErrorCode.FETCH_THROTTLE, {\n throttleEndTimeMillis\n })\n );\n });\n });\n}\n\ntype RetriableError = FirebaseError & { customData: { httpStatus: string } };\n/**\n * Returns true if the {@link Error} indicates a fetch request may succeed later.\n */\nfunction isRetriableError(e: Error): e is RetriableError {\n if (!(e instanceof FirebaseError) || !e.customData) {\n return false;\n }\n\n // Uses string index defined by ErrorData, which FirebaseError implements.\n const httpStatus = Number(e.customData['httpStatus']);\n\n return (\n httpStatus === 429 ||\n httpStatus === 500 ||\n httpStatus === 503 ||\n httpStatus === 504\n );\n}\n\n/**\n * Decorates a Client with retry logic.\n *\n * <p>Comparable to CachingClient, but uses backoff logic instead of cache max age and doesn't cache\n * responses (because the SDK has no use for error responses).\n */\nexport class RetryingClient implements RemoteConfigFetchClient {\n constructor(\n private readonly client: RemoteConfigFetchClient,\n private readonly storage: Storage\n ) {}\n\n async fetch(request: FetchRequest): Promise<FetchResponse> {\n const throttleMetadata = (await this.storage.getThrottleMetadata()) || {\n backoffCount: 0,\n throttleEndTimeMillis: Date.now()\n };\n\n return this.attemptFetch(request, throttleMetadata);\n }\n\n /**\n * A recursive helper for attempting a fetch request repeatedly.\n *\n * @throws any non-retriable errors.\n */\n async attemptFetch(\n request: FetchRequest,\n { throttleEndTimeMillis, backoffCount }: ThrottleMetadata\n ): Promise<FetchResponse> {\n // Starts with a (potentially zero) timeout to support resumption from stored state.\n // Ensures the throttle end time is honored if the last attempt timed out.\n // Note the SDK will never make a request if the fetch timeout expires at this point.\n await setAbortableTimeout(request.signal, throttleEndTimeMillis);\n\n try {\n const response = await this.client.fetch(request);\n\n // Note the SDK only clears throttle state if response is success or non-retriable.\n await this.storage.deleteThrottleMetadata();\n\n return response;\n } catch (e) {\n if (!isRetriableError(e as Error)) {\n throw e;\n }\n\n // Increments backoff state.\n const throttleMetadata = {\n throttleEndTimeMillis:\n Date.now() + calculateBackoffMillis(backoffCount),\n backoffCount: backoffCount + 1\n };\n\n // Persists state.\n await this.storage.setThrottleMetadata(throttleMetadata);\n\n return this.attemptFetch(request, throttleMetadata);\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp } from '@firebase/app';\nimport {\n RemoteConfig as RemoteConfigType,\n FetchStatus,\n RemoteConfigSettings\n} from './public_types';\nimport { StorageCache } from './storage/storage_cache';\nimport { RemoteConfigFetchClient } from './client/remote_config_fetch_client';\nimport { Storage } from './storage/storage';\nimport { Logger } from '@firebase/logger';\nimport { FirebaseAnalyticsInternalName } from '@firebase/analytics-interop-types';\nimport { Provider } from '@firebase/component';\nimport { RealtimeHandler } from './client/realtime_handler';\n\nconst DEFAULT_FETCH_TIMEOUT_MILLIS = 60 * 1000; // One minute\nconst DEFAULT_CACHE_MAX_AGE_MILLIS = 12 * 60 * 60 * 1000; // Twelve hours.\n\n/**\n * Encapsulates business logic mapping network and storage dependencies to the public SDK API.\n *\n * See {@link https://github.com/firebase/firebase-js-sdk/blob/main/packages/firebase/compat/index.d.ts|interface documentation} for method descriptions.\n */\nexport class RemoteConfig implements RemoteConfigType {\n /**\n * Tracks completion of initialization promise.\n * @internal\n */\n _isInitializationComplete = false;\n\n /**\n * De-duplicates initialization calls.\n * @internal\n */\n _initializePromise?: Promise<void>;\n\n settings: RemoteConfigSettings = {\n fetchTimeoutMillis: DEFAULT_FETCH_TIMEOUT_MILLIS,\n minimumFetchIntervalMillis: DEFAULT_CACHE_MAX_AGE_MILLIS\n };\n\n defaultConfig: { [key: string]: string | number | boolean } = {};\n\n get fetchTimeMillis(): number {\n return this._storageCache.getLastSuccessfulFetchTimestampMillis() || -1;\n }\n\n get lastFetchStatus(): FetchStatus {\n return this._storageCache.getLastFetchStatus() || 'no-fetch-yet';\n }\n\n constructor(\n // Required by FirebaseServiceFactory interface.\n readonly app: FirebaseApp,\n // JS doesn't support private yet\n // (https://github.com/tc39/proposal-class-fields#private-fields), so we hint using an\n // underscore prefix.\n /**\n * @internal\n */\n readonly _client: RemoteConfigFetchClient,\n /**\n * @internal\n */\n readonly _storageCache: StorageCache,\n /**\n * @internal\n */\n readonly _storage: Storage,\n /**\n * @internal\n */\n readonly _logger: Logger,\n /**\n * @internal\n */\n readonly _realtimeHandler: RealtimeHandler,\n /**\n * @internal\n */\n readonly _analyticsProvider: Provider<FirebaseAnalyticsInternalName>\n ) {}\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchStatus, CustomSignals } from '@firebase/remote-config-types';\nimport { FetchResponse, FirebaseRemoteConfigObject } from '../public_types';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS } from '../constants';\nimport { FirebaseError } from '@firebase/util';\n\n/**\n * Converts an error event associated with a {@link IDBRequest} to a {@link FirebaseError}.\n */\nfunction toFirebaseError(event: Event, errorCode: ErrorCode): FirebaseError {\n const originalError = (event.target as IDBRequest).error || undefined;\n return ERROR_FACTORY.create(errorCode, {\n originalErrorMessage: originalError && (originalError as Error)?.message\n });\n}\n\n/**\n * A general-purpose store keyed by app + namespace + {@link\n * ProjectNamespaceKeyFieldValue}.\n *\n * <p>The Remote Config SDK can be used with multiple app installations, and each app can interact\n * with multiple namespaces, so this store uses app (ID + name) and namespace as common parent keys\n * for a set of key-value pairs. See {@link Storage#createCompositeKey}.\n *\n * <p>Visible for testing.\n */\nexport const APP_NAMESPACE_STORE = 'app_namespace_store';\n\nconst DB_NAME = 'firebase_remote_config';\nconst DB_VERSION = 1;\n\n/**\n * Encapsulates metadata concerning throttled fetch requests.\n */\nexport interface ThrottleMetadata {\n // The number of times fetch has backed off. Used for resuming backoff after a timeout.\n backoffCount: number;\n // The Unix timestamp in milliseconds when callers can retry a request.\n throttleEndTimeMillis: number;\n}\n\nexport interface RealtimeBackoffMetadata {\n // The number of consecutive connection streams that have failed.\n numFailedStreams: number;\n // The Date until which the client should wait before attempting any new real-time connections.\n backoffEndTimeMillis: Date;\n}\n\n/**\n * Provides type-safety for the \"key\" field used by {@link APP_NAMESPACE_STORE}.\n *\n * <p>This seems like a small price to avoid potentially subtle bugs caused by a typo.\n */\ntype ProjectNamespaceKeyFieldValue =\n | 'active_config'\n | 'active_config_etag'\n | 'active_experiments'\n | 'last_fetch_status'\n | 'last_successful_fetch_timestamp_millis'\n | 'last_successful_fetch_response'\n | 'settings'\n | 'throttle_metadata'\n | 'custom_signals'\n | 'realtime_backoff_metadata'\n | 'last_known_template_version';\n\n// Visible for testing.\nexport function openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = event => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_OPEN));\n };\n request.onsuccess = event => {\n resolve((event.target as IDBOpenDBRequest).result);\n };\n request.onupgradeneeded = event => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (event.oldVersion) {\n case 0:\n db.createObjectStore(APP_NAMESPACE_STORE, {\n keyPath: 'compositeKey'\n });\n }\n };\n } catch (error) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_OPEN, {\n originalErrorMessage: (error as Error)?.message\n })\n );\n }\n });\n}\n\n/**\n * Abstracts data persistence.\n */\nexport abstract class Storage {\n getLastFetchStatus(): Promise<FetchStatus | undefined> {\n return this.get<FetchStatus>('last_fetch_status');\n }\n\n setLastFetchStatus(status: FetchStatus): Promise<void> {\n return this.set<FetchStatus>('last_fetch_status', status);\n }\n\n // This is comparable to a cache entry timestamp. If we need to expire other data, we could\n // consider adding timestamp to all storage records and an optional max age arg to getters.\n getLastSuccessfulFetchTimestampMillis(): Promise<number | undefined> {\n return this.get<number>('last_successful_fetch_timestamp_millis');\n }\n\n setLastSuccessfulFetchTimestampMillis(timestamp: number): Promise<void> {\n return this.set<number>(\n 'last_successful_fetch_timestamp_millis',\n timestamp\n );\n }\n\n getLastSuccessfulFetchResponse(): Promise<FetchResponse | undefined> {\n return this.get<FetchResponse>('last_successful_fetch_response');\n }\n\n setLastSuccessfulFetchResponse(response: FetchResponse): Promise<void> {\n return this.set<FetchResponse>('last_successful_fetch_response', response);\n }\n\n getActiveConfig(): Promise<FirebaseRemoteConfigObject | undefined> {\n return this.get<FirebaseRemoteConfigObject>('active_config');\n }\n\n setActiveConfig(config: FirebaseRemoteConfigObject): Promise<void> {\n return this.set<FirebaseRemoteConfigObject>('active_config', config);\n }\n\n getActiveConfigEtag(): Promise<string | undefined> {\n return this.get<string>('active_config_etag');\n }\n\n setActiveConfigEtag(etag: string): Promise<void> {\n return this.set<string>('active_config_etag', etag);\n }\n\n getActiveExperiments(): Promise<Set<string> | undefined> {\n return this.get<Set<string>>('active_experiments');\n }\n\n setActiveExperiments(experiments: Set<string>): Promise<void> {\n return this.set<Set<string>>('active_experiments', experiments);\n }\n\n getThrottleMetadata(): Promise<ThrottleMetadata | undefined> {\n return this.get<ThrottleMetadata>('throttle_metadata');\n }\n\n setThrottleMetadata(metadata: ThrottleMetadata): Promise<void> {\n return this.set<ThrottleMetadata>('throttle_metadata', metadata);\n }\n\n deleteThrottleMetadata(): Promise<void> {\n return this.delete('throttle_metadata');\n }\n\n getCustomSignals(): Promise<CustomSignals | undefined> {\n return this.get<CustomSignals>('custom_signals');\n }\n\n abstract setCustomSignals(\n customSignals: CustomSignals\n ): Promise<CustomSignals>;\n abstract get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T | undefined>;\n abstract set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void>;\n abstract delete(key: ProjectNamespaceKeyFieldValue): Promise<void>;\n\n getRealtimeBackoffMetadata(): Promise<RealtimeBackoffMetadata | undefined> {\n return this.get<RealtimeBackoffMetadata>('realtime_backoff_metadata');\n }\n\n setRealtimeBackoffMetadata(\n realtimeMetadata: RealtimeBackoffMetadata\n ): Promise<void> {\n return this.set<RealtimeBackoffMetadata>(\n 'realtime_backoff_metadata',\n realtimeMetadata\n );\n }\n\n getActiveConfigTemplateVersion(): Promise<number | undefined> {\n return this.get<number>('last_known_template_version');\n }\n\n setActiveConfigTemplateVersion(version: number): Promise<void> {\n return this.set<number>('last_known_template_version', version);\n }\n}\n\nexport class IndexedDbStorage extends Storage {\n /**\n * @param appId enables storage segmentation by app (ID + name).\n * @param appName enables storage segmentation by app (ID + name).\n * @param namespace enables storage segmentation by namespace.\n */\n constructor(\n private readonly appId: string,\n private readonly appName: string,\n private readonly namespace: string,\n private readonly openDbPromise = openDatabase()\n ) {\n super();\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<CustomSignals> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n const storedSignals = await this.getWithTransaction<CustomSignals>(\n 'custom_signals',\n transaction\n );\n const updatedSignals = mergeCustomSignals(\n customSignals,\n storedSignals || {}\n );\n await this.setWithTransaction<CustomSignals>(\n 'custom_signals',\n updatedSignals,\n transaction\n );\n return updatedSignals;\n }\n\n /**\n * Gets a value from the database using the provided transaction.\n *\n * @param key The key of the value to get.\n * @param transaction The transaction to use for the operation.\n * @returns The value associated with the key, or undefined if no such value exists.\n */\n async getWithTransaction<T>(\n key: ProjectNamespaceKeyFieldValue,\n transaction: IDBTransaction\n ): Promise<T | undefined> {\n return new Promise((resolve, reject) => {\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.get(compositeKey);\n request.onerror = event => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_GET));\n };\n request.onsuccess = event => {\n const result = (event.target as IDBRequest).result;\n if (result) {\n resolve(result.value);\n } else {\n resolve(undefined);\n }\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_GET, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n /**\n * Sets a value in the database using the provided transaction.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param transaction The transaction to use for the operation.\n * @returns A promise that resolves when the operation is complete.\n */\n async setWithTransaction<T>(\n key: ProjectNamespaceKeyFieldValue,\n value: T,\n transaction: IDBTransaction\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.put({\n compositeKey,\n value\n });\n request.onerror = (event: Event) => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_SET));\n };\n request.onsuccess = () => {\n resolve();\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_SET, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n async get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T | undefined> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readonly');\n return this.getWithTransaction<T>(key, transaction);\n }\n\n async set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void> {\n const db = await this.openDbPromise;\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n return this.setWithTransaction<T>(key, value, transaction);\n }\n\n async delete(key: ProjectNamespaceKeyFieldValue): Promise<void> {\n const db = await this.openDbPromise;\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([APP_NAMESPACE_STORE], 'readwrite');\n const objectStore = transaction.objectStore(APP_NAMESPACE_STORE);\n const compositeKey = this.createCompositeKey(key);\n try {\n const request = objectStore.delete(compositeKey);\n request.onerror = (event: Event) => {\n reject(toFirebaseError(event, ErrorCode.STORAGE_DELETE));\n };\n request.onsuccess = () => {\n resolve();\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(ErrorCode.STORAGE_DELETE, {\n originalErrorMessage: (e as Error)?.message\n })\n );\n }\n });\n }\n\n // Facilitates composite key functionality (which is unsupported in IE).\n createCompositeKey(key: ProjectNamespaceKeyFieldValue): string {\n return [this.appId, this.appName, this.namespace, key].join();\n }\n}\n\nexport class InMemoryStorage extends Storage {\n private storage: { [key: string]: unknown } = {};\n\n async get<T>(key: ProjectNamespaceKeyFieldValue): Promise<T> {\n return Promise.resolve(this.storage[key] as T);\n }\n\n async set<T>(key: ProjectNamespaceKeyFieldValue, value: T): Promise<void> {\n this.storage[key] = value;\n return Promise.resolve(undefined);\n }\n\n async delete(key: ProjectNamespaceKeyFieldValue): Promise<void> {\n this.storage[key] = undefined;\n return Promise.resolve();\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<CustomSignals> {\n const storedSignals = (this.storage['custom_signals'] ||\n {}) as CustomSignals;\n this.storage['custom_signals'] = mergeCustomSignals(\n customSignals,\n storedSignals\n );\n return Promise.resolve(this.storage['custom_signals'] as CustomSignals);\n }\n}\n\nfunction mergeCustomSignals(\n customSignals: CustomSignals,\n storedSignals: CustomSignals\n): CustomSignals {\n const combinedSignals = {\n ...storedSignals,\n ...customSignals\n };\n\n // Filter out key-value assignments with null values since they are signals being unset\n const updatedSignals = Object.fromEntries(\n Object.entries(combinedSignals)\n .filter(([_, v]) => v !== null)\n .map(([k, v]) => {\n // Stringify numbers to store a map of string keys and values which can be sent\n // as-is in a fetch call.\n if (typeof v === 'number') {\n return [k, v.toString()];\n }\n return [k, v];\n })\n );\n\n // Throw an error if the number of custom signals to be stored exceeds the limit\n if (\n Object.keys(updatedSignals).length > RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS\n ) {\n throw ERROR_FACTORY.create(ErrorCode.CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS, {\n maxSignals: RC_CUSTOM_SIGNAL_MAX_ALLOWED_SIGNALS\n });\n }\n return updatedSignals;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FetchStatus, CustomSignals } from '@firebase/remote-config-types';\nimport { FirebaseRemoteConfigObject } from '../public_types';\nimport { Storage } from './storage';\n\n/**\n * A memory cache layer over storage to support the SDK's synchronous read requirements.\n */\nexport class StorageCache {\n constructor(private readonly storage: Storage) {}\n\n /**\n * Memory caches.\n */\n private lastFetchStatus?: FetchStatus;\n private lastSuccessfulFetchTimestampMillis?: number;\n private activeConfig?: FirebaseRemoteConfigObject;\n private customSignals?: CustomSignals;\n\n /**\n * Memory-only getters\n */\n getLastFetchStatus(): FetchStatus | undefined {\n return this.lastFetchStatus;\n }\n\n getLastSuccessfulFetchTimestampMillis(): number | undefined {\n return this.lastSuccessfulFetchTimestampMillis;\n }\n\n getActiveConfig(): FirebaseRemoteConfigObject | undefined {\n return this.activeConfig;\n }\n\n getCustomSignals(): CustomSignals | undefined {\n return this.customSignals;\n }\n\n /**\n * Read-ahead getter\n */\n async loadFromStorage(): Promise<void> {\n const lastFetchStatusPromise = this.storage.getLastFetchStatus();\n const lastSuccessfulFetchTimestampMillisPromise =\n this.storage.getLastSuccessfulFetchTimestampMillis();\n const activeConfigPromise = this.storage.getActiveConfig();\n const customSignalsPromise = this.storage.getCustomSignals();\n\n // Note:\n // 1. we consistently check for undefined to avoid clobbering defined values\n // in memory\n // 2. we defer awaiting to improve readability, as opposed to destructuring\n // a Promise.all result, for example\n\n const lastFetchStatus = await lastFetchStatusPromise;\n if (lastFetchStatus) {\n this.lastFetchStatus = lastFetchStatus;\n }\n\n const lastSuccessfulFetchTimestampMillis =\n await lastSuccessfulFetchTimestampMillisPromise;\n if (lastSuccessfulFetchTimestampMillis) {\n this.lastSuccessfulFetchTimestampMillis =\n lastSuccessfulFetchTimestampMillis;\n }\n\n const activeConfig = await activeConfigPromise;\n if (activeConfig) {\n this.activeConfig = activeConfig;\n }\n\n const customSignals = await customSignalsPromise;\n if (customSignals) {\n this.customSignals = customSignals;\n }\n }\n\n /**\n * Write-through setters\n */\n setLastFetchStatus(status: FetchStatus): Promise<void> {\n this.lastFetchStatus = status;\n return this.storage.setLastFetchStatus(status);\n }\n\n setLastSuccessfulFetchTimestampMillis(\n timestampMillis: number\n ): Promise<void> {\n this.lastSuccessfulFetchTimestampMillis = timestampMillis;\n return this.storage.setLastSuccessfulFetchTimestampMillis(timestampMillis);\n }\n\n setActiveConfig(activeConfig: FirebaseRemoteConfigObject): Promise<void> {\n this.activeConfig = activeConfig;\n return this.storage.setActiveConfig(activeConfig);\n }\n\n async setCustomSignals(customSignals: CustomSignals): Promise<void> {\n this.customSignals = await this.storage.setCustomSignals(customSignals);\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\n// TODO: Consolidate the Visibility monitoring API code into a shared utility function in firebase/util to be used by both packages/database and packages/remote-config.\n/**\n * Base class to be used if you want to emit events. Call the constructor with\n * the set of allowed event names.\n */\nexport abstract class EventEmitter {\n private listeners_: {\n [eventType: string]: Array<{\n callback(...args: unknown[]): void;\n context: unknown;\n }>;\n } = {};\n\n constructor(private allowedEvents_: string[]) {\n assert(\n Array.isArray(allowedEvents_) && allowedEvents_.length > 0,\n 'Requires a non-empty array'\n );\n }\n\n /**\n * To be overridden by derived classes in order to fire an initial event when\n * somebody subscribes for data.\n *\n * @returns {Array.<*>} Array of parameters to trigger initial event with.\n */\n abstract getInitialEvent(eventType: string): unknown[];\n\n /**\n * To be called by derived classes to trigger events.\n */\n protected trigger(eventType: string, ...varArgs: unknown[]): void {\n if (Array.isArray(this.listeners_[eventType])) {\n // Clone the list, since callbacks could add/remove listeners.\n const listeners = [...this.listeners_[eventType]];\n\n for (let i = 0; i < listeners.length; i++) {\n listeners[i].callback.apply(listeners[i].context, varArgs);\n }\n }\n }\n\n on(\n eventType: string,\n callback: (a: unknown) => void,\n context: unknown\n ): void {\n this.validateEventType_(eventType);\n this.listeners_[eventType] = this.listeners_[eventType] || [];\n this.listeners_[eventType].push({ callback, context });\n\n const eventData = this.getInitialEvent(eventType);\n if (eventData) {\n //@ts-ignore\n callback.apply(context, eventData);\n }\n }\n\n off(\n eventType: string,\n callback: (a: unknown) => void,\n context: unknown\n ): void {\n this.validateEventType_(eventType);\n const listeners = this.listeners_[eventType] || [];\n for (let i = 0; i < listeners.length; i++) {\n if (\n listeners[i].callback === callback &&\n (!context || context === listeners[i].context)\n ) {\n listeners.splice(i, 1);\n return;\n }\n }\n }\n\n private validateEventType_(eventType: string): void {\n assert(\n this.allowedEvents_.find(et => {\n return et === eventType;\n }),\n 'Unknown event: ' + eventType\n );\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { EventEmitter } from './eventEmitter';\n\ndeclare const document: Document;\n\n// TODO: Consolidate the Visibility monitoring API code into a shared utility function in firebase/util to be used by both packages/database and packages/remote-config.\nexport class VisibilityMonitor extends EventEmitter {\n private visible_: boolean;\n\n static getInstance(): VisibilityMonitor {\n return new VisibilityMonitor();\n }\n\n constructor() {\n super(['visible']);\n let hidden: string;\n let visibilityChange: string;\n if (\n typeof document !== 'undefined' &&\n typeof document.addEventListener !== 'undefined'\n ) {\n if (typeof document['hidden'] !== 'undefined') {\n // Opera 12.10 and Firefox 18 and later support\n visibilityChange = 'visibilitychange';\n hidden = 'hidden';\n } // @ts-ignore\n else if (typeof document['mozHidden'] !== 'undefined') {\n visibilityChange = 'mozvisibilitychange';\n hidden = 'mozHidden';\n } // @ts-ignore\n else if (typeof document['msHidden'] !== 'undefined') {\n visibilityChange = 'msvisibilitychange';\n hidden = 'msHidden';\n } // @ts-ignore\n else if (typeof document['webkitHidden'] !== 'undefined') {\n visibilityChange = 'webkitvisibilitychange';\n hidden = 'webkitHidden';\n }\n }\n\n // Initially, we always assume we are visible. This ensures that in browsers\n // without page visibility support or in cases where we are never visible\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\n // reconnects\n this.visible_ = true;\n\n // @ts-ignore\n if (visibilityChange) {\n document.addEventListener(\n visibilityChange,\n () => {\n // @ts-ignore\n const visible = !document[hidden];\n if (visible !== this.visible_) {\n this.visible_ = visible;\n this.trigger('visible', visible);\n }\n },\n false\n );\n }\n }\n\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\n return [this.visible_];\n }\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\nimport { Logger } from '@firebase/logger';\nimport {\n ConfigUpdate,\n ConfigUpdateObserver,\n FetchResponse,\n FirebaseRemoteConfigObject\n} from '../public_types';\nimport { calculateBackoffMillis, FirebaseError } from '@firebase/util';\nimport { ERROR_FACTORY, ErrorCode } from '../errors';\nimport { Storage } from '../storage/storage';\nimport { VisibilityMonitor } from './visibility_monitor';\nimport { StorageCache } from '../storage/storage_cache';\nimport {\n FetchRequest,\n RemoteConfigAbortSignal\n} from './remote_config_fetch_client';\nimport { CachingClient } from './caching_client';\n\nconst API_KEY_HEADER = 'X-Goog-Api-Key';\nconst INSTALLATIONS_AUTH_TOKEN_HEADER = 'X-Goog-Firebase-Installations-Auth';\nconst ORIGINAL_RETRIES = 8;\nconst MAXIMUM_FETCH_ATTEMPTS = 3;\nconst NO_BACKOFF_TIME_IN_MILLIS = -1;\nconst NO_FAILED_REALTIME_STREAMS = 0;\nconst REALTIME_DISABLED_KEY = 'featureDisabled';\nconst REALTIME_RETRY_INTERVAL = 'retryIntervalSeconds';\nconst TEMPLATE_VERSION_KEY = 'latestTemplateVersionNumber';\n\nexport class RealtimeHandler {\n constructor(\n private readonly firebaseInstallations: _FirebaseInstallationsInternal,\n private readonly storage: Storage,\n private readonly sdkVersion: string,\n private readonly namespace: string,\n private readonly projectId: string,\n private readonly apiKey: string,\n private readonly appId: string,\n private readonly logger: Logger,\n private readonly storageCache: StorageCache,\n private readonly cachingClient: CachingClient\n ) {\n void this.setRetriesRemaining();\n void VisibilityMonitor.getInstance().on(\n 'visible',\n this.onVisibilityChange,\n this\n );\n }\n\n private observers: Set<ConfigUpdateObserver> =\n new Set<ConfigUpdateObserver>();\n private isConnectionActive: boolean = false;\n private isRealtimeDisabled: boolean = false;\n private controller?: AbortController;\n private reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n private httpRetriesRemaining: number = ORIGINAL_RETRIES;\n private isInBackground: boolean = false;\n private readonly decoder = new TextDecoder('utf-8');\n private isClosingConnection: boolean = false;\n\n private async setRetriesRemaining(): Promise<void> {\n // Retrieve number of remaining retries from last session. The minimum retry count being one.\n const metadata = await this.storage.getRealtimeBackoffMetadata();\n const numFailedStreams = metadata?.numFailedStreams || 0;\n this.httpRetriesRemaining = Math.max(\n ORIGINAL_RETRIES - numFailedStreams,\n 1\n );\n }\n\n private propagateError = (e: FirebaseError): void =>\n this.observers.forEach(o => o.error?.(e));\n\n /**\n * Increment the number of failed stream attempts, increase the backoff duration, set the backoff\n * end time to \"backoff duration\" after `lastFailedStreamTime` and persist the new\n * values to storage metadata.\n */\n private async updateBackoffMetadataWithLastFailedStreamConnectionTime(\n lastFailedStreamTime: Date\n ): Promise<void> {\n const numFailedStreams =\n ((await this.storage.getRealtimeBackoffMetadata())?.numFailedStreams ||\n 0) + 1;\n const backoffMillis = calculateBackoffMillis(numFailedStreams, 60000, 2);\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: new Date(\n lastFailedStreamTime.getTime() + backoffMillis\n ),\n numFailedStreams\n });\n }\n\n /**\n * Increase the backoff duration with a new end time based on Retry Interval.\n */\n private async updateBackoffMetadataWithRetryInterval(\n retryIntervalSeconds: number\n ): Promise<void> {\n const currentTime = Date.now();\n const backoffDurationInMillis = retryIntervalSeconds * 1000;\n const backoffEndTime = new Date(currentTime + backoffDurationInMillis);\n const numFailedStreams = 0;\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: backoffEndTime,\n numFailedStreams\n });\n await this.retryHttpConnectionWhenBackoffEnds();\n }\n\n /**\n * HTTP status code that the Realtime client should retry on.\n */\n private isStatusCodeRetryable = (statusCode?: number): boolean => {\n const retryableStatusCodes = [\n 408, // Request Timeout\n 429, // Too Many Requests\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504 // Gateway Timeout\n ];\n return !statusCode || retryableStatusCodes.includes(statusCode);\n };\n\n /**\n * Closes the realtime HTTP connection.\n * Note: This method is designed to be called only once at a time.\n * If a call is already in progress, subsequent calls will be ignored.\n */\n private async closeRealtimeHttpConnection(): Promise<void> {\n if (this.isClosingConnection) {\n return;\n }\n this.isClosingConnection = true;\n\n try {\n if (this.reader) {\n await this.reader.cancel();\n }\n } catch (e) {\n // The network connection was lost, so cancel() failed.\n // This is expected in a disconnected state, so we can safely ignore the error.\n this.logger.debug('Failed to cancel the reader, connection was lost.');\n } finally {\n this.reader = undefined;\n }\n\n if (this.controller) {\n await this.controller.abort();\n this.controller = undefined;\n }\n\n this.isClosingConnection = false;\n }\n\n private async resetRealtimeBackoff(): Promise<void> {\n await this.storage.setRealtimeBackoffMetadata({\n backoffEndTimeMillis: new Date(-1),\n numFailedStreams: 0\n });\n }\n\n private resetRetryCount(): void {\n this.httpRetriesRemaining = ORIGINAL_RETRIES;\n }\n\n /**\n * Assembles the request headers and body and executes the fetch request to\n * establish the real-time streaming connection. This is the \"worker\" method\n * that performs the actual network communication.\n */\n private async establishRealtimeConnection(\n url: URL,\n installationId: string,\n installationTokenResult: string,\n signal: AbortSignal\n ): Promise<Response> {\n const eTagValue = await this.storage.getActiveConfigEtag();\n const lastKnownVersionNumber =\n await this.storage.getActiveConfigTemplateVersion();\n\n const headers = {\n [API_KEY_HEADER]: this.apiKey,\n [INSTALLATIONS_AUTH_TOKEN_HEADER]: installationTokenResult,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'If-None-Match': eTagValue || '*',\n 'Content-Encoding': 'gzip'\n };\n\n const requestBody = {\n project: this.projectId,\n namespace: this.namespace,\n lastKnownVersionNumber,\n appId: this.appId,\n sdkVersion: this.sdkVersion,\n appInstanceId: installationId\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal\n });\n return response;\n }\n\n private getRealtimeUrl(): URL {\n const urlBase =\n window.FIREBASE_REMOTE_CONFIG_URL_BASE ||\n 'https://firebaseremoteconfigrealtime.googleapis.com';\n\n const urlString = `${urlBase}/v1/projects/${this.projectId}/namespaces/${this.namespace}:streamFetchInvalidations?key=${this.apiKey}`;\n return new URL(urlString);\n }\n\n private async createRealtimeConnection(): Promise<Response> {\n const [installationId, installationTokenResult] = await Promise.all([\n this.firebaseInstallations.getId(),\n this.firebaseInstallations.getToken(false)\n ]);\n this.controller = new AbortController();\n const url = this.getRealtimeUrl();\n const realtimeConnection = await this.establishRealtimeConnection(\n url,\n installationId,\n installationTokenResult,\n this.controller.signal\n );\n return realtimeConnection;\n }\n\n /**\n * Retries HTTP stream connection asyncly in random time intervals.\n */\n private async retryHttpConnectionWhenBackoffEnds(): Promise<void> {\n let backoffMetadata = await this.storage.getRealtimeBackoffMetadata();\n if (!backoffMetadata) {\n backoffMetadata = {\n backoffEndTimeMillis: new Date(NO_BACKOFF_TIME_IN_MILLIS),\n numFailedStreams: NO_FAILED_REALTIME_STREAMS\n };\n }\n const backoffEndTime = new Date(\n backoffMetadata.backoffEndTimeMillis\n ).getTime();\n const currentTime = Date.now();\n const retryMillis = Math.max(0, backoffEndTime - currentTime);\n await this.makeRealtimeHttpConnection(retryMillis);\n }\n\n private setIsHttpConnectionRunning(connectionRunning: boolean): void {\n this.isConnectionActive = connectionRunning;\n }\n\n /**\n * Combines the check and set operations to prevent multiple asynchronous\n * calls from redundantly starting an HTTP connection. This ensures that\n * only one attempt is made at a time.\n */\n private checkAndSetHttpConnectionFlagIfNotRunning(): boolean {\n const canMakeConnection = this.canEstablishStreamConnection();\n if (canMakeConnection) {\n this.setIsHttpConnectionRunning(true);\n }\n return canMakeConnection;\n }\n\n private fetchResponseIsUpToDate(\n fetchResponse: FetchResponse,\n lastKnownVersion: number\n ): boolean {\n // If there is a config, make sure its version is >= the last known version.\n if (fetchResponse.config != null && fetchResponse.templateVersion) {\n return fetchResponse.templateVersion >= lastKnownVersion;\n }\n // If there isn't a config, return true if the fetch was successful and backend had no update.\n // Else, it returned an out of date config.\n return this.storageCache.getLastFetchStatus() === 'success';\n }\n\n private parseAndValidateConfigUpdateMessage(message: string): string {\n const left = message.indexOf('{');\n const right = message.indexOf('}', left);\n\n if (left < 0 || right < 0) {\n return '';\n }\n return left >= right ? '' : message.substring(left, right + 1);\n }\n\n private isEventListenersEmpty(): boolean {\n return this.observers.size === 0;\n }\n\n private getRandomInt(max: number): number {\n return Math.floor(Math.random() * max);\n }\n\n private executeAllListenerCallbacks(configUpdate: ConfigUpdate): void {\n this.observers.forEach(observer => observer.next(configUpdate));\n }\n\n /**\n * Compares two configuration objects and returns a set of keys that have changed.\n * A key is considered changed if it's new, removed, or has a different value.\n */\n private getChangedParams(\n newConfig: FirebaseRemoteConfigObject,\n oldConfig: FirebaseRemoteConfigObject\n ): Set<string> {\n const changedKeys = new Set<string>();\n const newKeys = new Set(Object.keys(newConfig || {}));\n const oldKeys = new Set(Object.keys(oldConfig || {}));\n\n for (const key of newKeys) {\n if (!oldKeys.has(key) || newConfig[key] !== oldConfig[key]) {\n changedKeys.add(key);\n }\n }\n\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n changedKeys.add(key);\n }\n }\n\n return changedKeys;\n }\n\n private async fetchLatestConfig(\n remainingAttempts: number,\n targetVersion: number\n ): Promise<void> {\n const remainingAttemptsAfterFetch = remainingAttempts - 1;\n const currentAttempt = MAXIMUM_FETCH_ATTEMPTS - remainingAttemptsAfterFetch;\n const customSignals = this.storageCache.getCustomSignals();\n if (customSignals) {\n this.logger.debug(\n `Fetching config with custom signals: ${JSON.stringify(customSignals)}`\n );\n }\n const abortSignal = new RemoteConfigAbortSignal();\n try {\n const fetchRequest: FetchRequest = {\n cacheMaxAgeMillis: 0,\n signal: abortSignal,\n customSignals,\n fetchType: 'REALTIME',\n fetchAttempt: currentAttempt\n };\n\n const fetchResponse: FetchResponse = await this.cachingClient.fetch(\n fetchRequest\n );\n let activatedConfigs = await this.storage.getActiveConfig();\n\n if (!this.fetchResponseIsUpToDate(fetchResponse, targetVersion)) {\n this.logger.debug(\n \"Fetched template version is the same as SDK's current version.\" +\n ' Retrying fetch.'\n );\n // Continue fetching until template version number is greater than current.\n await this.autoFetch(remainingAttemptsAfterFetch, targetVersion);\n return;\n }\n\n if (fetchResponse.config == null) {\n this.logger.debug(\n 'The fetch succeeded, but the backend had no updates.'\n );\n return;\n }\n\n if (activatedConfigs == null) {\n activatedConfigs = {};\n }\n\n const updatedKeys = this.getChangedParams(\n fetchResponse.config,\n activatedConfigs\n );\n\n if (updatedKeys.size === 0) {\n this.logger.debug('Config was fetched, but no params changed.');\n return;\n }\n\n const configUpdate: ConfigUpdate = {\n getUpdatedKeys(): Set<string> {\n return new Set(updatedKeys);\n }\n };\n this.executeAllListenerCallbacks(configUpdate);\n } catch (e: unknown) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_NOT_FETCHED, {\n originalErrorMessage: `Failed to auto-fetch config update: ${errorMessage}`\n });\n this.propagateError(error);\n }\n }\n\n private async autoFetch(\n remainingAttempts: number,\n targetVersion: number\n ): Promise<void> {\n if (remainingAttempts === 0) {\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_NOT_FETCHED, {\n originalErrorMessage:\n 'Unable to fetch the latest version of the template.'\n });\n this.propagateError(error);\n return;\n }\n\n const timeTillFetchSeconds = this.getRandomInt(4);\n const timeTillFetchInMiliseconds = timeTillFetchSeconds * 1000;\n\n await new Promise(resolve =>\n setTimeout(resolve, timeTillFetchInMiliseconds)\n );\n await this.fetchLatestConfig(remainingAttempts, targetVersion);\n }\n\n /**\n * Processes a stream of real-time messages for configuration updates.\n * This method reassembles fragmented messages, validates and parses the JSON,\n * and automatically fetches a new config if a newer template version is available.\n * It also handles server-specified retry intervals and propagates errors for\n * invalid messages or when real-time updates are disabled.\n */\n private async handleNotifications(\n reader: ReadableStreamDefaultReader<Uint8Array>\n ): Promise<void> {\n let partialConfigUpdateMessage: string;\n let currentConfigUpdateMessage = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n partialConfigUpdateMessage = this.decoder.decode(value, { stream: true });\n currentConfigUpdateMessage += partialConfigUpdateMessage;\n\n if (partialConfigUpdateMessage.includes('}')) {\n currentConfigUpdateMessage = this.parseAndValidateConfigUpdateMessage(\n currentConfigUpdateMessage\n );\n\n if (currentConfigUpdateMessage.length === 0) {\n continue;\n }\n\n try {\n const jsonObject = JSON.parse(currentConfigUpdateMessage);\n\n if (this.isEventListenersEmpty()) {\n break;\n }\n\n if (\n REALTIME_DISABLED_KEY in jsonObject &&\n jsonObject[REALTIME_DISABLED_KEY] === true\n ) {\n const error = ERROR_FACTORY.create(\n ErrorCode.CONFIG_UPDATE_UNAVAILABLE,\n {\n originalErrorMessage:\n 'The server is temporarily unavailable. Try again in a few minutes.'\n }\n );\n this.propagateError(error);\n break;\n }\n\n if (TEMPLATE_VERSION_KEY in jsonObject) {\n const oldTemplateVersion =\n await this.storage.getActiveConfigTemplateVersion();\n const targetTemplateVersion = Number(\n jsonObject[TEMPLATE_VERSION_KEY]\n );\n if (\n oldTemplateVersion &&\n targetTemplateVersion > oldTemplateVersion\n ) {\n await this.autoFetch(\n MAXIMUM_FETCH_ATTEMPTS,\n targetTemplateVersion\n );\n }\n }\n\n // This field in the response indicates that the realtime request should retry after the\n // specified interval to establish a long-lived connection. This interval extends the\n // backoff duration without affecting the number of retries, so it will not enter an\n // exponential backoff state.\n if (REALTIME_RETRY_INTERVAL in jsonObject) {\n const retryIntervalSeconds = Number(\n jsonObject[REALTIME_RETRY_INTERVAL]\n );\n await this.updateBackoffMetadataWithRetryInterval(\n retryIntervalSeconds\n );\n }\n } catch (e: unknown) {\n this.logger.debug('Unable to parse latest config update message.', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n this.propagateError(\n ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_MESSAGE_INVALID, {\n originalErrorMessage: errorMessage\n })\n );\n }\n currentConfigUpdateMessage = '';\n }\n }\n }\n\n private async listenForNotifications(\n reader: ReadableStreamDefaultReader\n ): Promise<void> {\n try {\n await this.handleNotifications(reader);\n } catch (e) {\n // If the real-time connection is at an unexpected lifecycle state when the app is\n // backgrounded, it's expected closing the connection will throw an exception.\n if (!this.isInBackground) {\n // Otherwise, the real-time server connection was closed due to a transient issue.\n this.logger.debug(\n 'Real-time connection was closed due to an exception.'\n );\n }\n }\n }\n\n /**\n * Open the real-time connection, begin listening for updates, and auto-fetch when an update is\n * received.\n *\n * If the connection is successful, this method will block on its thread while it reads the\n * chunk-encoded HTTP body. When the connection closes, it attempts to reestablish the stream.\n */\n private async prepareAndBeginRealtimeHttpStream(): Promise<void> {\n if (!this.checkAndSetHttpConnectionFlagIfNotRunning()) {\n return;\n }\n\n let backoffMetadata = await this.storage.getRealtimeBackoffMetadata();\n if (!backoffMetadata) {\n backoffMetadata = {\n backoffEndTimeMillis: new Date(NO_BACKOFF_TIME_IN_MILLIS),\n numFailedStreams: NO_FAILED_REALTIME_STREAMS\n };\n }\n const backoffEndTime = backoffMetadata.backoffEndTimeMillis.getTime();\n if (Date.now() < backoffEndTime) {\n await this.retryHttpConnectionWhenBackoffEnds();\n return;\n }\n\n let response: Response | undefined;\n let responseCode: number | undefined;\n try {\n response = await this.createRealtimeConnection();\n responseCode = response.status;\n if (response.ok && response.body) {\n this.resetRetryCount();\n await this.resetRealtimeBackoff();\n const reader = response.body.getReader();\n this.reader = reader;\n // Start listening for realtime notifications.\n await this.listenForNotifications(reader);\n }\n } catch (error) {\n if (this.isInBackground) {\n // It's possible the app was backgrounded while the connection was open, which\n // threw an exception trying to read the response. No real error here, so treat\n // this as a success, even if we haven't read a 200 response code yet.\n this.resetRetryCount();\n } else {\n //there might have been a transient error so the client will retry the connection.\n this.logger.debug(\n 'Exception connecting to real-time RC backend. Retrying the connection...:',\n error\n );\n }\n } finally {\n // Close HTTP connection and associated streams.\n await this.closeRealtimeHttpConnection();\n this.setIsHttpConnectionRunning(false);\n\n // Update backoff metadata if the connection failed in the foreground.\n const connectionFailed =\n !this.isInBackground &&\n (responseCode === undefined ||\n this.isStatusCodeRetryable(responseCode));\n\n if (connectionFailed) {\n await this.updateBackoffMetadataWithLastFailedStreamConnectionTime(\n new Date()\n );\n }\n // If responseCode is null then no connection was made to server and the SDK should still retry.\n if (connectionFailed || response?.ok) {\n await this.retryHttpConnectionWhenBackoffEnds();\n } else {\n const errorMessage = `Unable to connect to the server. HTTP status code: ${responseCode}`;\n const firebaseError = ERROR_FACTORY.create(\n ErrorCode.CONFIG_UPDATE_STREAM_ERROR,\n {\n originalErrorMessage: errorMessage\n }\n );\n this.propagateError(firebaseError);\n }\n }\n }\n\n /**\n * Checks whether connection can be made or not based on some conditions\n * @returns booelean\n */\n private canEstablishStreamConnection(): boolean {\n const hasActiveListeners = this.observers.size > 0;\n const isNotDisabled = !this.isRealtimeDisabled;\n const isNoConnectionActive = !this.isConnectionActive;\n const inForeground = !this.isInBackground;\n return (\n hasActiveListeners &&\n isNotDisabled &&\n isNoConnectionActive &&\n inForeground\n );\n }\n\n private async makeRealtimeHttpConnection(delayMillis: number): Promise<void> {\n if (!this.canEstablishStreamConnection()) {\n return;\n }\n if (this.httpRetriesRemaining > 0) {\n this.httpRetriesRemaining--;\n await new Promise(resolve => setTimeout(resolve, delayMillis));\n void this.prepareAndBeginRealtimeHttpStream();\n } else if (!this.isInBackground) {\n const error = ERROR_FACTORY.create(ErrorCode.CONFIG_UPDATE_STREAM_ERROR, {\n originalErrorMessage:\n 'Unable to connect to the server. Check your connection and try again.'\n });\n this.propagateError(error);\n }\n }\n\n private async beginRealtime(): Promise<void> {\n if (this.observers.size > 0) {\n await this.makeRealtimeHttpConnection(0);\n }\n }\n\n /**\n * Adds an observer to the realtime updates.\n * @param observer The observer to add.\n */\n addObserver(observer: ConfigUpdateObserver): void {\n this.observers.add(observer);\n void this.beginRealtime();\n }\n\n /**\n * Removes an observer from the realtime updates.\n * @param observer The observer to remove.\n */\n removeObserver(observer: ConfigUpdateObserver): void {\n if (this.observers.has(observer)) {\n this.observers.delete(observer);\n }\n }\n\n /**\n * Handles changes to the application's visibility state, managing the real-time connection.\n *\n * When the application is moved to the background, this method closes the existing\n * real-time connection to save resources. When the application returns to the\n * foreground, it attempts to re-establish the connection.\n */\n private async onVisibilityChange(visible: unknown): Promise<void> {\n this.isInBackground = !visible;\n if (!visible) {\n await this.closeRealtimeHttpConnection();\n } else if (visible) {\n await this.beginRealtime();\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\nimport { isIndexedDBAvailable } from '@firebase/util';\nimport {\n Component,\n ComponentType,\n ComponentContainer\n} from '@firebase/component';\nimport { Logger, LogLevel as FirebaseLogLevel } from '@firebase/logger';\nimport { RemoteConfig, RemoteConfigOptions } from './public_types';\nimport { name as packageName, version } from '../package.json';\nimport { ensureInitialized } from './api';\nimport { CachingClient } from './client/caching_client';\nimport { RestClient } from './client/rest_client';\nimport { RetryingClient } from './client/retrying_client';\nimport { RC_COMPONENT_NAME } from './constants';\nimport { ErrorCode, ERROR_FACTORY } from './errors';\nimport { RemoteConfig as RemoteConfigImpl } from './remote_config';\nimport { IndexedDbStorage, InMemoryStorage } from './storage/storage';\nimport { StorageCache } from './storage/storage_cache';\nimport { RealtimeHandler } from './client/realtime_handler';\n// This needs to be in the same file that calls `getProvider()` on the component\n// or it will get tree-shaken out.\nimport '@firebase/installations';\n\nexport function registerRemoteConfig(): void {\n _registerComponent(\n new Component(\n RC_COMPONENT_NAME,\n remoteConfigFactory,\n ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n\n registerVersion(packageName, version);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(packageName, version, '__BUILD_TARGET__');\n\n function remoteConfigFactory(\n container: ComponentContainer,\n { options }: { options?: RemoteConfigOptions }\n ): RemoteConfig {\n /* Dependencies */\n // getImmediate for FirebaseApp will always succeed\n const app = container.getProvider('app').getImmediate();\n // The following call will always succeed because rc has `import '@firebase/installations'`\n const installations = container\n .getProvider('installations-internal')\n .getImmediate();\n const analyticsProvider = container.getProvider('analytics-internal');\n\n // Normalizes optional inputs.\n const { projectId, apiKey, appId } = app.options;\n if (!projectId) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_PROJECT_ID);\n }\n if (!apiKey) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_API_KEY);\n }\n if (!appId) {\n throw ERROR_FACTORY.create(ErrorCode.REGISTRATION_APP_ID);\n }\n const namespace = options?.templateId || 'firebase';\n\n const storage = isIndexedDBAvailable()\n ? new IndexedDbStorage(appId, app.name, namespace)\n : new InMemoryStorage();\n const storageCache = new StorageCache(storage);\n\n const logger = new Logger(packageName);\n\n // Sets ERROR as the default log level.\n // See RemoteConfig#setLogLevel for corresponding normalization to ERROR log level.\n logger.logLevel = FirebaseLogLevel.ERROR;\n\n const restClient = new RestClient(\n installations,\n // Uses the JS SDK version, by which the RC package version can be deduced, if necessary.\n SDK_VERSION,\n namespace,\n projectId,\n apiKey,\n appId\n );\n const retryingClient = new RetryingClient(restClient, storage);\n const cachingClient = new CachingClient(\n retryingClient,\n storage,\n storageCache,\n logger\n );\n\n const realtimeHandler = new RealtimeHandler(\n installations,\n storage,\n SDK_VERSION,\n namespace,\n projectId,\n apiKey,\n appId,\n logger,\n storageCache,\n cachingClient\n );\n\n const remoteConfigInstance = new RemoteConfigImpl(\n app,\n cachingClient,\n storageCache,\n storage,\n logger,\n realtimeHandler,\n analyticsProvider\n );\n\n // Starts warming cache.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ensureInitialized(remoteConfigInstance);\n\n return remoteConfigInstance;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RemoteConfig } from './public_types';\nimport { activate, fetchConfig } from './api';\nimport {\n getModularInstance,\n isIndexedDBAvailable,\n validateIndexedDBOpenable\n} from '@firebase/util';\n\n// This API is put in a separate file, so we can stub fetchConfig and activate in tests.\n// It's not possible to stub standalone functions from the same module.\n/**\n *\n * Performs fetch and activate operations, as a convenience.\n *\n * @param remoteConfig - The {@link RemoteConfig} instance.\n *\n * @returns A `Promise` which resolves to true if the current call activated the fetched configs.\n * If the fetched configs were already activated, the `Promise` will resolve to false.\n *\n * @public\n */\nexport async function fetchAndActivate(\n remoteConfig: RemoteConfig\n): Promise<boolean> {\n remoteConfig = getModularInstance(remoteConfig);\n await fetchConfig(remoteConfig);\n return activate(remoteConfig);\n}\n\n/**\n * This method provides two different checks:\n *\n * 1. Check if IndexedDB exists in the browser environment.\n * 2. Check if the current browser context allows IndexedDB `open()` calls.\n *\n * @returns A `Promise` which resolves to true if a {@link RemoteConfig} instance\n * can be initialized in this environment, or false if it cannot.\n * @public\n */\nexport async function isSupported(): Promise<boolean> {\n if (!isIndexedDBAvailable()) {\n return false;\n }\n\n try {\n const isDBOpenable: boolean = await validateIndexedDBOpenable();\n return isDBOpenable;\n } catch (error) {\n return false;\n }\n}\n","/**\n * The Firebase Remote Config Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { registerRemoteConfig } from './register';\n\n// Facilitates debugging by enabling settings changes without rebuilding asset.\n// Note these debug options are not part of a documented, supported API and can change at any time.\n// Consolidates debug options for easier discovery.\n// Uses transient variables on window to avoid lingering state causing panic.\ndeclare global {\n interface Window {\n FIREBASE_REMOTE_CONFIG_URL_BASE: string;\n }\n}\n\nexport * from './api';\nexport * from './api2';\nexport * from './public_types';\n\n/** register component and version */\nregisterRemoteConfig();\n"],"names":["ValueImpl","FirebaseLogLevel","packageName","RemoteConfigImpl"],"mappings":"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"}