UNPKG

firebase

Version:

Firebase JavaScript library for web and Node.js

3 lines (2 loc) • 38.7 kB
((e,t)=>{"object"==typeof exports&&"undefined"!=typeof module?t(require("@firebase/app-compat"),require("@firebase/app")):"function"==typeof define&&define.amd?define(["@firebase/app-compat","@firebase/app"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).firebase,e.firebase.INTERNAL.modularAPIs)})(this,function(tt,at){try{!(function(){function B(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function a(e,t){if(!e)throw e=t,new Error("Firebase Database ("+H.SDK_VERSION+") INTERNAL ASSERT FAILED: "+e)}let O=B(tt),H={NODE_CLIENT:!1,NODE_ADMIN:!1,SDK_VERSION:"${JSCORE_VERSION}"};function u(){try{return"object"==typeof indexedDB}catch(e){}}class n extends Error{constructor(e,t,a){super(t),this.code=e,this.customData=a,this.name="FirebaseError",Object.setPrototypeOf(this,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,i.prototype.create)}}class i{constructor(e,t,a){this.service=e,this.serviceName=t,this.errors=a}create(e,...t){var i,a=t[0]||{},s=this.service+"/"+e,r=this.errors[e],r=r?(i=a,r.replace(j,(e,t)=>{var a=i[t];return null!=a?String(a):`<${t}?>`})):"Error",r=this.serviceName+`: ${r} (${s}).`;return new n(s,r,a)}}let j=/\{\$([^}]+)}/g;function o(e,t=1e3,a=2){var i=t*Math.pow(a,e),s=Math.round(.5*i*(Math.random()-.5)*2);return Math.min(144e5,i+s)}function r(e){return e&&e._delegate?e._delegate:e}class e{constructor(e,t,a){this.name=e,this.instanceFactory=t,this.type=a,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}var d,s;(w=d=d||{})[w.DEBUG=0]="DEBUG",w[w.VERBOSE=1]="VERBOSE",w[w.INFO=2]="INFO",w[w.WARN=3]="WARN",w[w.ERROR=4]="ERROR",w[w.SILENT=5]="SILENT";let x={debug:d.DEBUG,verbose:d.VERBOSE,info:d.INFO,warn:d.WARN,error:d.ERROR,silent:d.SILENT},V=d.INFO,$={[d.DEBUG]:"log",[d.VERBOSE]:"log",[d.INFO]:"info",[d.WARN]:"warn",[d.ERROR]:"error"},U=(e,t,...a)=>{if(!(t<e.logLevel)){var i=(new Date).toISOString(),s=$[t];if(!s)throw new Error(`Attempted to log a message with an invalid logType (value: ${t})`);console[s](`[${i}] ${e.name}:`,...a)}};class K{constructor(e){this.name=e,this._logLevel=V,this._logHandler=U,this._userLogHandler=null}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in d))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?x[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,d.DEBUG,...e),this._logHandler(this,d.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,d.VERBOSE,...e),this._logHandler(this,d.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,d.INFO,...e),this._logHandler(this,d.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,d.WARN,...e),this._logHandler(this,d.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,d.ERROR,...e),this._logHandler(this,d.ERROR,...e)}}let q=(t,e)=>e.some(e=>t instanceof e),c,z;let W=new WeakMap,l=new WeakMap,G=new WeakMap,g=new WeakMap,h=new WeakMap;let f={get(e,t,a){if(e instanceof IDBTransaction){if("done"===t)return l.get(e);if("objectStoreNames"===t)return e.objectStoreNames||G.get(e);if("store"===t)return a.objectStoreNames[1]?void 0:a.objectStore(a.objectStoreNames[0])}return p(e[t])},set(e,t,a){return e[t]=a,!0},has(e,t){return e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e}};function J(i){return i!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(z=z||[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey]).includes(i)?function(...e){return i.apply(m(this),e),p(W.get(this))}:function(...e){return p(i.apply(m(this),e))}:function(e,...t){var a=i.call(m(this),e,...t);return G.set(a,e.sort?e.sort():[e]),p(a)}}function X(e){var r,t;return"function"==typeof e?J(e):(e instanceof IDBTransaction&&(r=e,l.has(r)||(t=new Promise((e,t)=>{let a=()=>{r.removeEventListener("complete",i),r.removeEventListener("error",s),r.removeEventListener("abort",s)},i=()=>{e(),a()},s=()=>{t(r.error||new DOMException("AbortError","AbortError")),a()};r.addEventListener("complete",i),r.addEventListener("error",s),r.addEventListener("abort",s)}),l.set(r,t))),q(e,c=c||[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])?new Proxy(e,f):e)}function p(e){var r,t;return e instanceof IDBRequest?(r=e,(t=new Promise((e,t)=>{let a=()=>{r.removeEventListener("success",i),r.removeEventListener("error",s)},i=()=>{e(p(r.result)),a()},s=()=>{t(r.error),a()};r.addEventListener("success",i),r.addEventListener("error",s)})).then(e=>{e instanceof IDBCursor&&W.set(e,r)}).catch(()=>{}),h.set(t,r),t):g.has(e)?g.get(e):((t=X(e))!==e&&(g.set(e,t),h.set(t,e)),t)}let m=e=>h.get(e);let Y=["get","getKey","getAll","getAllKeys","count"],Z=["put","add","delete","clear"],v=new Map;function Q(e,t){if(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t){if(v.get(t))return v.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=Z.includes(s);var a;return s in(r?IDBIndex:IDBObjectStore).prototype&&(n||Y.includes(s))?(a=async function(e,...t){var a=this.transaction(e,n?"readwrite":"readonly");let i=a.store;return r&&(i=i.index(t.shift())),(await Promise.all([i[s](...t),n&&a.done]))[0]},v.set(t,a),a):void 0}}f={...s=f,get:(e,t,a)=>Q(e,t)||s.get(e,t,a),has:(e,t)=>!!Q(e,t)||s.has(e,t)};var ee="@firebase/installations",t="0.6.19";let te=1e4,ae="w:"+t,ie="FIS_v2",se="https://firebaseinstallations.googleapis.com/v1",re=36e5;var w;let b=new i("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function ne(e){return e instanceof n&&e.code.includes("request-failed")}function oe({projectId:e}){return se+`/projects/${e}/installations`}function ce(e){return{token:e.token,requestStatus:2,expiresIn:Number(e.expiresIn.replace("s","000")),creationTime:Date.now()}}async function le(e,t){var a=(await t.json()).error;return b.create("request-failed",{requestName:e,serverCode:a.code,serverMessage:a.message,serverStatus:a.status})}function ge({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function he(e,{refreshToken:t}){var a=ge(e);return a.append("Authorization",(e=t,ie+" "+e)),a}async function ue(e){var t=await e();return 500<=t.status&&t.status<600?e():t}function de(t){return new Promise(e=>{setTimeout(e,t)})}let fe=/^[cdef][\w-]{21}$/,y="";function pe(){try{var e=new Uint8Array(17),t=((self.crypto||self.msCrypto).getRandomValues(e),e[0]=112+e[0]%16,(e=>btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_"))(e).substr(0,22));return fe.test(t)?t:y}catch{return y}}function C(e){return e.appName+"!"+e.appId}let me=new Map;function ve(e,t){var a=C(e),e=(we(a,t),a),a=(()=>(!E&&"BroadcastChannel"in self&&((E=new BroadcastChannel("[Firebase] FID Change")).onmessage=e=>{we(e.data.key,e.data.fid)}),E))();a&&a.postMessage({key:e,fid:t}),0===me.size&&E&&(E.close(),E=null)}function we(e,t){var a=me.get(e);if(a)for(var i of a)i(t)}let E=null;let be="firebase-installations-database",ye=1,S="firebase-installations-store",Ce=null;function _(){return Ce=Ce||((e,t,{blocked:a,upgrade:i,blocking:s,terminated:r})=>{let n=indexedDB.open(e,t);var o=p(n);return i&&n.addEventListener("upgradeneeded",e=>{i(p(n.result),e.oldVersion,e.newVersion,p(n.transaction),e)}),a&&n.addEventListener("blocked",e=>a(e.oldVersion,e.newVersion,e)),o.then(e=>{r&&e.addEventListener("close",()=>r()),s&&e.addEventListener("versionchange",e=>s(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o})(be,ye,{upgrade:(e,t)=>{0===t&&e.createObjectStore(S)}})}async function I(e,t){var a=C(e),i=(await _()).transaction(S,"readwrite"),s=i.objectStore(S),r=await s.get(a);return await s.put(t,a),await i.done,r&&r.fid===t.fid||ve(e,t.fid),t}async function Ee(e){var t=C(e),a=(await _()).transaction(S,"readwrite");await a.objectStore(S).delete(t),await a.done}async function T(e,t){var a=C(e),i=(await _()).transaction(S,"readwrite"),s=i.objectStore(S),r=await s.get(a),n=t(r);return void 0===n?await s.delete(a):await s.put(n,a),await i.done,!n||r&&r.fid===n.fid||ve(e,n.fid),n}async function k(a){let i;var e=await T(a.appConfig,e=>{var t=_e(e||{fid:pe(),registrationStatus:0}),t=((e,t)=>{var a,i;return 0===t.registrationStatus?navigator.onLine?(a={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},i=(async(t,a)=>{try{var e=await(async({appConfig:e,heartbeatServiceProvider:t},{fid:a})=>{let i=oe(e);var s=ge(e),r=((r=t.getImmediate({optional:!0}))&&(r=await r.getHeartbeatsHeader())&&s.append("x-firebase-client",r),{fid:a,authVersion:ie,appId:e.appId,sdkVersion:ae});let n={method:"POST",headers:s,body:JSON.stringify(r)};if((s=await ue(()=>fetch(i,n))).ok)return{fid:(r=await s.json()).fid||a,registrationStatus:2,refreshToken:r.refreshToken,authToken:ce(r.authToken)};throw await le("Create Installation",s)})(t,a);return I(t.appConfig,e)}catch(e){throw ne(e)&&409===e.customData.serverCode?await Ee(t.appConfig):await I(t.appConfig,{fid:a.fid,registrationStatus:0}),e}})(e,a),{installationEntry:a,registrationPromise:i}):(a=Promise.reject(b.create("app-offline")),{installationEntry:t,registrationPromise:a}):1===t.registrationStatus?{installationEntry:t,registrationPromise:(async e=>{let t=await Se(e.appConfig);for(;1===t.registrationStatus;)await de(100),t=await Se(e.appConfig);var a,i;return 0!==t.registrationStatus?t:({installationEntry:a,registrationPromise:i}=await k(e),i||a)})(e)}:{installationEntry:t}})(a,t);return i=t.registrationPromise,t.installationEntry});return e.fid===y?{installationEntry:await i}:{installationEntry:e,registrationPromise:i}}function Se(e){return T(e,e=>{if(e)return _e(e);throw b.create("installation-not-found")})}function _e(e){var t;return 1===(t=e).registrationStatus&&t.registrationTime+te<Date.now()?{fid:e.fid,registrationStatus:0}:e}async function Ie({appConfig:e,heartbeatServiceProvider:t},a){[s,r]=[e,a.fid];let i=oe(s)+`/${r}/authTokens:generate`;var s,r,n=he(e,a),o=t.getImmediate({optional:!0}),o=(o&&(o=await o.getHeartbeatsHeader())&&n.append("x-firebase-client",o),{installation:{sdkVersion:ae,appId:e.appId}});let c={method:"POST",headers:n,body:JSON.stringify(o)};n=await ue(()=>fetch(i,c));if(n.ok)return ce(await n.json());throw await le("Generate Auth Token",n)}async function R(i,s=!1){let r;var e=await T(i.appConfig,e=>{if(!ke(e))throw b.create("not-registered");var t,a=e.authToken;if(s||2!==(t=a).requestStatus||(e=>{var t=Date.now();return t<e.creationTime||e.creationTime+e.expiresIn<t+re})(t)){if(1===a.requestStatus)return r=(async(e,t)=>{let a=await Te(e.appConfig);for(;1===a.authToken.requestStatus;)await de(100),a=await Te(e.appConfig);var i=a.authToken;return 0===i.requestStatus?R(e,t):i})(i,s),e;if(navigator.onLine)return t=e,a={requestStatus:1,requestTime:Date.now()},a={...t,authToken:a},r=(async(t,a)=>{try{var e=await Ie(t,a),i={...a,authToken:e};return await I(t.appConfig,i),e}catch(e){var s;throw!ne(e)||401!==e.customData.serverCode&&404!==e.customData.serverCode?(s={...a,authToken:{requestStatus:0}},await I(t.appConfig,s)):await Ee(t.appConfig),e}})(i,a),a;throw b.create("app-offline")}return e});return r?await r:e.authToken}function Te(e){return T(e,e=>{var t,a;if(ke(e))return t=e.authToken,1===(a=t).requestStatus&&a.requestTime+te<Date.now()?{...e,authToken:{requestStatus:0}}:e;throw b.create("not-registered")})}function ke(e){return void 0!==e&&2===e.registrationStatus}async function Re(e,t=!1){var a=e,i=(await(!(i=(await k(a)).registrationPromise)||!await i),await R(a,t));return i.token}function M(e){return b.create("missing-app-config-values",{valueName:e})}let Me="installations",Le=e=>{var t=e.getProvider("app").getImmediate();return{app:t,appConfig:(e=>{if(!e||!e.options)throw M("App Configuration");if(!e.name)throw M("App Name");var t;for(t of["projectId","apiKey","appId"])if(!e.options[t])throw M(t);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}})(t),heartbeatServiceProvider:at._getProvider(t,"heartbeat"),_delete:()=>Promise.resolve()}},Fe=e=>{var t=e.getProvider("app").getImmediate();let a=at._getProvider(t,Me).getImmediate();return{getId:()=>(async e=>{var t=e,{installationEntry:a,registrationPromise:i}=await k(t);return(i||R(t)).catch(console.error),a.fid})(a),getToken:e=>Re(a,e)}};at._registerComponent(new e(Me,Le,"PUBLIC")),at._registerComponent(new e("installations-internal",Fe,"PRIVATE")),at.registerVersion(ee,t),at.registerVersion(ee,t,"esm2020");let L="@firebase/remote-config";class De{constructor(){this.listeners=[]}addEventListener(e){this.listeners.push(e)}abort(){this.listeners.forEach(e=>e())}}let F=new i("remoteconfig","Remote Config",{"already-initialized":"Remote Config already initialized","registration-window":"Undefined window object. This SDK only supports usage in a browser environment.","registration-project-id":"Undefined project identifier. Check Firebase app initialization.","registration-api-key":"Undefined API key. Check Firebase app initialization.","registration-app-id":"Undefined app identifier. Check Firebase app initialization.","storage-open":"Error thrown when opening storage. Original error: {$originalErrorMessage}.","storage-get":"Error thrown when reading from storage. Original error: {$originalErrorMessage}.","storage-set":"Error thrown when writing to storage. Original error: {$originalErrorMessage}.","storage-delete":"Error thrown when deleting from storage. Original error: {$originalErrorMessage}.","fetch-client-network":"Fetch client failed to connect to a network. Check Internet connection. Original error: {$originalErrorMessage}.","fetch-timeout":'The config fetch request timed out. Configure timeout using "fetchTimeoutMillis" SDK setting.',"fetch-throttle":'The config fetch request timed out while in an exponential backoff state. Configure timeout using "fetchTimeoutMillis" SDK setting. Unix timestamp in milliseconds when fetch request throttling ends: {$throttleEndTimeMillis}.',"fetch-client-parse":"Fetch client could not parse response. Original error: {$originalErrorMessage}.","fetch-status":"Fetch server returned an HTTP error status. HTTP status: {$httpStatus}.","indexed-db-unavailable":"Indexed DB is not supported by current browser","custom-signal-max-allowed-signals":"Setting more than {$maxSignals} custom signals is not supported.","stream-error":"The stream was not able to connect to the backend: {$originalErrorMessage}.","realtime-unavailable":"The Realtime service is unavailable: {$originalErrorMessage}","update-message-invalid":"The stream invalidation message was unparsable: {$originalErrorMessage}","update-not-fetched":"Unable to fetch the latest config: {$originalErrorMessage}"});let Ae=["1","true","t","yes","y","on"];class D{constructor(e,t=""){this._source=e,this._value=t}asString(){return this._value}asBoolean(){return"static"!==this._source&&0<=Ae.indexOf(this._value.toLowerCase())}asNumber(){if("static"===this._source)return 0;let e=Number(this._value);return e=isNaN(e)?0:e}getSource(){return this._source}}async function Ne(e){var t=r(e),[a,i]=await Promise.all([t._storage.getLastSuccessfulFetchResponse(),t._storage.getActiveConfigEtag()]);return!!(a&&a.config&&a.eTag&&a.templateVersion&&a.eTag!==i)&&(await Promise.all([t._storageCache.setActiveConfig(a.config),t._storage.setActiveConfigEtag(a.eTag),t._storage.setActiveConfigTemplateVersion(a.templateVersion)]),!0)}function Pe(e){let t=r(e);return t._initializePromise||(t._initializePromise=t._storageCache.loadFromStorage().then(()=>{t._isInitializationComplete=!0})),t._initializePromise}async function Be(t){var a=r(t);let e=new De;setTimeout(async()=>{e.abort()},a.settings.fetchTimeoutMillis);var i,s=a._storageCache.getCustomSignals();s&&a._logger.debug("Fetching config with custom signals: "+JSON.stringify(s));try{await a._client.fetch({cacheMaxAgeMillis:a.settings.minimumFetchIntervalMillis,signal:e,customSignals:s}),await a._storageCache.setLastFetchStatus("success")}catch(e){t="fetch-throttle";s=(i=e)instanceof n&&-1!==i.code.indexOf(t)?"throttle":"failure";throw await a._storageCache.setLastFetchStatus(s),e}}function Oe(a){var e,t,i=r(a);return[e={},t={}]=[i._storageCache.getActiveConfig(),i.defaultConfig],Object.keys({...e,...t}).reduce((e,t)=>(e[t]=A(a,t),e),{})}function A(e,t){var a=r(e),i=(a._isInitializationComplete||a._logger.debug(`A value was requested for key "${t}" before SDK initialization completed.`+" Await on ensureInitialized if the intent was to get a previously activated value."),a._storageCache.getActiveConfig());return i&&void 0!==i[t]?new D("remote",i[t]):a.defaultConfig&&void 0!==a.defaultConfig[t]?new D("default",String(a.defaultConfig[t])):(a._logger.debug(`Returning static value for key "${t}".`+" Define a default or remote value if this is unintentional."),new D("static"))}class He{constructor(e,t,a,i){this.client=e,this.storage=t,this.storageCache=a,this.logger=i}isCachedDataFresh(e,t){var a;return t?(a=Date.now()-t,this.logger.debug("Config fetch cache check."+` Cache age millis: ${a}.`+` Cache max age millis (minimumFetchIntervalMillis setting): ${e}.`+` Is cache hit: ${a=a<=e}.`),a):(this.logger.debug("Config fetch cache check. Cache unpopulated."),!1)}async fetch(e){var[t,a]=await Promise.all([this.storage.getLastSuccessfulFetchTimestampMillis(),this.storage.getLastSuccessfulFetchResponse()]);if(a&&this.isCachedDataFresh(e.cacheMaxAgeMillis,t))return a;e.eTag=a&&a.eTag;t=await this.client.fetch(e),a=[this.storageCache.setLastSuccessfulFetchTimestampMillis(Date.now())];return 200===t.status&&a.push(this.storage.setLastSuccessfulFetchResponse(t)),await Promise.all(a),t}}class je{constructor(e,t,a,i,s,r){this.firebaseInstallations=e,this.sdkVersion=t,this.namespace=a,this.projectId=i,this.apiKey=s,this.appId=r}async fetch(a){var e,[t,i]=await Promise.all([this.firebaseInstallations.getId(),this.firebaseInstallations.getToken()]),s=`${window.FIREBASE_REMOTE_CONFIG_URL_BASE||"https://firebaseremoteconfig.googleapis.com"}/v1/projects/${this.projectId}/namespaces/${this.namespace}:fetch?key=`+this.apiKey,r={"Content-Type":"application/json","Content-Encoding":"gzip","If-None-Match":a.eTag||"*"},t={sdk_version:this.sdkVersion,app_instance_id:t,app_instance_id_token:i,app_id:this.appId,language_code:(e=navigator).languages&&e.languages[0]||e.language,custom_signals:a.customSignals},i={method:"POST",headers:r,body:JSON.stringify(t)},r=fetch(s,i),t=new Promise((e,t)=>{a.signal.addEventListener(()=>{var e=new Error("The operation was aborted.");e.name="AbortError",t(e)})});let n;try{await Promise.race([r,t]),n=await r}catch(e){let t="fetch-client-network";throw"AbortError"===e?.name&&(t="fetch-timeout"),F.create(t,{originalErrorMessage:e?.message})}let o=n.status;s=n.headers.get("ETag")||void 0;let c,l,g;if(200===n.status){let e;try{e=await n.json()}catch(e){throw F.create("fetch-client-parse",{originalErrorMessage:e?.message})}c=e.entries,l=e.state,g=e.templateVersion}if("INSTANCE_STATE_UNSPECIFIED"===l?o=500:"NO_CHANGE"===l?o=304:"NO_TEMPLATE"!==l&&"EMPTY_CONFIG"!==l||(c={}),304!==o&&200!==o)throw F.create("fetch-status",{httpStatus:o});return{status:o,eTag:s,config:c,templateVersion:g}}}class xe{constructor(e,t){this.client=e,this.storage=t}async fetch(e){var t=await this.storage.getThrottleMetadata()||{backoffCount:0,throttleEndTimeMillis:Date.now()};return this.attemptFetch(e,t)}async attemptFetch(t,{throttleEndTimeMillis:e,backoffCount:a}){var s,r;s=t.signal,r=e,await new Promise((e,t)=>{var a=Math.max(r-Date.now(),0);let i=setTimeout(e,a);s.addEventListener(()=>{clearTimeout(i),t(F.create("fetch-throttle",{throttleEndTimeMillis:r}))})});try{var i=await this.client.fetch(t);return await this.storage.deleteThrottleMetadata(),i}catch(e){if((e=>{var t;return e instanceof n&&e.customData&&(429===(t=Number(e.customData.httpStatus))||500===t||503===t||504===t)})(e))return i={throttleEndTimeMillis:Date.now()+o(a),backoffCount:a+1},await this.storage.setThrottleMetadata(i),this.attemptFetch(t,i);throw e}}}class Ve{get fetchTimeMillis(){return this._storageCache.getLastSuccessfulFetchTimestampMillis()||-1}get lastFetchStatus(){return this._storageCache.getLastFetchStatus()||"no-fetch-yet"}constructor(e,t,a,i,s,r){this.app=e,this._client=t,this._storageCache=a,this._storage=i,this._logger=s,this._realtimeHandler=r,this._isInitializationComplete=!1,this.settings={fetchTimeoutMillis:6e4,minimumFetchIntervalMillis:432e5},this.defaultConfig={}}}function N(e,t){var a=e.target.error||void 0;return F.create(t,{originalErrorMessage:a&&a?.message})}let P="app_namespace_store";class $e{getLastFetchStatus(){return this.get("last_fetch_status")}setLastFetchStatus(e){return this.set("last_fetch_status",e)}getLastSuccessfulFetchTimestampMillis(){return this.get("last_successful_fetch_timestamp_millis")}setLastSuccessfulFetchTimestampMillis(e){return this.set("last_successful_fetch_timestamp_millis",e)}getLastSuccessfulFetchResponse(){return this.get("last_successful_fetch_response")}setLastSuccessfulFetchResponse(e){return this.set("last_successful_fetch_response",e)}getActiveConfig(){return this.get("active_config")}setActiveConfig(e){return this.set("active_config",e)}getActiveConfigEtag(){return this.get("active_config_etag")}setActiveConfigEtag(e){return this.set("active_config_etag",e)}getThrottleMetadata(){return this.get("throttle_metadata")}setThrottleMetadata(e){return this.set("throttle_metadata",e)}deleteThrottleMetadata(){return this.delete("throttle_metadata")}getCustomSignals(){return this.get("custom_signals")}getRealtimeBackoffMetadata(){return this.get("realtime_backoff_metadata")}setRealtimeBackoffMetadata(e){return this.set("realtime_backoff_metadata",e)}getActiveConfigTemplateVersion(){return this.get("last_known_template_version")}setActiveConfigTemplateVersion(e){return this.set("last_known_template_version",e)}}class Ue extends $e{constructor(e,t,a,i=(()=>new Promise((t,a)=>{try{var e=indexedDB.open("firebase_remote_config",1);e.onerror=e=>{a(N(e,"storage-open"))},e.onsuccess=e=>{t(e.target.result)},e.onupgradeneeded=e=>{var t=e.target.result;0===e.oldVersion&&t.createObjectStore(P,{keyPath:"compositeKey"})}}catch(e){a(F.create("storage-open",{originalErrorMessage:e?.message}))}}))()){super(),this.appId=e,this.appName=t,this.namespace=a,this.openDbPromise=i}async setCustomSignals(e){var t=(await this.openDbPromise).transaction([P],"readwrite"),a=qe(e,await this.getWithTransaction("custom_signals",t)||{});return await this.setWithTransaction("custom_signals",a,t),a}async getWithTransaction(r,n){return new Promise((a,t)=>{var e=n.objectStore(P),i=this.createCompositeKey(r);try{var s=e.get(i);s.onerror=e=>{t(N(e,"storage-get"))},s.onsuccess=e=>{var t=e.target.result;a(t?t.value:void 0)}}catch(e){t(F.create("storage-get",{originalErrorMessage:e?.message}))}})}async setWithTransaction(r,n,o){return new Promise((e,t)=>{var a=o.objectStore(P),i=this.createCompositeKey(r);try{var s=a.put({compositeKey:i,value:n});s.onerror=e=>{t(N(e,"storage-set"))},s.onsuccess=()=>{e()}}catch(e){t(F.create("storage-set",{originalErrorMessage:e?.message}))}})}async get(e){var t=(await this.openDbPromise).transaction([P],"readonly");return this.getWithTransaction(e,t)}async set(e,t){var a=(await this.openDbPromise).transaction([P],"readwrite");return this.setWithTransaction(e,t,a)}async delete(r){let n=await this.openDbPromise;return new Promise((e,t)=>{var a=n.transaction([P],"readwrite").objectStore(P),i=this.createCompositeKey(r);try{var s=a.delete(i);s.onerror=e=>{t(N(e,"storage-delete"))},s.onsuccess=()=>{e()}}catch(e){t(F.create("storage-delete",{originalErrorMessage:e?.message}))}})}createCompositeKey(e){return[this.appId,this.appName,this.namespace,e].join()}}class Ke extends $e{constructor(){super(...arguments),this.storage={}}async get(e){return Promise.resolve(this.storage[e])}async set(e,t){return this.storage[e]=t,Promise.resolve(void 0)}async delete(e){return this.storage[e]=void 0,Promise.resolve()}async setCustomSignals(e){var t=this.storage.custom_signals||{};return this.storage.custom_signals=qe(e,t),Promise.resolve(this.storage.custom_signals)}}function qe(e,t){var a={...t,...e},a=Object.fromEntries(Object.entries(a).filter(([,e])=>null!==e).map(([e,t])=>"number"==typeof t?[e,t.toString()]:[e,t]));if(100<Object.keys(a).length)throw F.create("custom-signal-max-allowed-signals",{maxSignals:100});return a}class ze{constructor(e){this.storage=e}getLastFetchStatus(){return this.lastFetchStatus}getLastSuccessfulFetchTimestampMillis(){return this.lastSuccessfulFetchTimestampMillis}getActiveConfig(){return this.activeConfig}getCustomSignals(){return this.customSignals}async loadFromStorage(){var e=this.storage.getLastFetchStatus(),t=this.storage.getLastSuccessfulFetchTimestampMillis(),a=this.storage.getActiveConfig(),i=this.storage.getCustomSignals(),e=await e,e=(e&&(this.lastFetchStatus=e),await t),t=(e&&(this.lastSuccessfulFetchTimestampMillis=e),await a),e=(t&&(this.activeConfig=t),await i);e&&(this.customSignals=e)}setLastFetchStatus(e){return this.lastFetchStatus=e,this.storage.setLastFetchStatus(e)}setLastSuccessfulFetchTimestampMillis(e){return this.lastSuccessfulFetchTimestampMillis=e,this.storage.setLastSuccessfulFetchTimestampMillis(e)}setActiveConfig(e){return this.activeConfig=e,this.storage.setActiveConfig(e)}async setCustomSignals(e){this.customSignals=await this.storage.setCustomSignals(e)}}class We extends class{constructor(e){this.allowedEvents_=e,this.listeners_={},a(Array.isArray(e)&&0<e.length,"Requires a non-empty array")}trigger(t,...a){if(Array.isArray(this.listeners_[t])){var i=[...this.listeners_[t]];for(let e=0;e<i.length;e++)i[e].callback.apply(i[e].context,a)}}on(e,t,a){this.validateEventType_(e),this.listeners_[e]=this.listeners_[e]||[],this.listeners_[e].push({callback:t,context:a});var i=this.getInitialEvent(e);i&&t.apply(a,i)}off(e,t,a){this.validateEventType_(e);var i=this.listeners_[e]||[];for(let s=0;s<i.length;s++)if(i[s].callback===t&&(!a||a===i[s].context))return void i.splice(s,1)}validateEventType_(t){a(this.allowedEvents_.find(e=>e===t),"Unknown event: "+t)}}{static getInstance(){return new We}constructor(){super(["visible"]);let t,e;"undefined"!=typeof document&&void 0!==document.addEventListener&&(void 0!==document.hidden?(e="visibilitychange",t="hidden"):void 0!==document.mozHidden?(e="mozvisibilitychange",t="mozHidden"):void 0!==document.msHidden?(e="msvisibilitychange",t="msHidden"):void 0!==document.webkitHidden&&(e="webkitvisibilitychange",t="webkitHidden")),this.visible_=!0,e&&document.addEventListener(e,()=>{var e=!document[t];e!==this.visible_&&(this.visible_=e,this.trigger("visible",e))},!1)}getInitialEvent(e){return a("visible"===e,"Unknown event type: "+e),[this.visible_]}}let Ge="featureDisabled",Je="retryIntervalSeconds",Xe="latestTemplateVersionNumber";class Ye{constructor(e,t,a,i,s,r,n,o,c,l){this.firebaseInstallations=e,this.storage=t,this.sdkVersion=a,this.namespace=i,this.projectId=s,this.apiKey=r,this.appId=n,this.logger=o,this.storageCache=c,this.cachingClient=l,this.observers=new Set,this.isConnectionActive=!1,this.isRealtimeDisabled=!1,this.httpRetriesRemaining=8,this.isInBackground=!1,this.decoder=new TextDecoder("utf-8"),this.isClosingConnection=!1,this.propagateError=t=>this.observers.forEach(e=>e.error?.(t)),this.isStatusCodeRetryable=e=>!e||[408,429,502,503,504].includes(e),this.setRetriesRemaining(),We.getInstance().on("visible",this.onVisibilityChange,this)}async setRetriesRemaining(){var e=(await this.storage.getRealtimeBackoffMetadata())?.numFailedStreams||0;this.httpRetriesRemaining=Math.max(8-e,1)}async updateBackoffMetadataWithLastFailedStreamConnectionTime(e){var t=((await this.storage.getRealtimeBackoffMetadata())?.numFailedStreams||0)+1,a=o(t,6e4,2);await this.storage.setRealtimeBackoffMetadata({backoffEndTimeMillis:new Date(e.getTime()+a),numFailedStreams:t})}async updateBackoffMetadataWithRetryInterval(e){var t=Date.now(),t=new Date(t+1e3*e);await this.storage.setRealtimeBackoffMetadata({backoffEndTimeMillis:t,numFailedStreams:0}),await this.retryHttpConnectionWhenBackoffEnds()}async closeRealtimeHttpConnection(){if(!this.isClosingConnection){this.isClosingConnection=!0;try{this.reader&&await this.reader.cancel()}catch(e){this.logger.debug("Failed to cancel the reader, connection was lost.")}finally{this.reader=void 0}this.controller&&(await this.controller.abort(),this.controller=void 0),this.isClosingConnection=!1}}async resetRealtimeBackoff(){await this.storage.setRealtimeBackoffMetadata({backoffEndTimeMillis:new Date(-1),numFailedStreams:0})}resetRetryCount(){this.httpRetriesRemaining=8}async establishRealtimeConnection(e,t,a,i){var s=await this.storage.getActiveConfigEtag(),r=await this.storage.getActiveConfigTemplateVersion(),s={"X-Goog-Api-Key":this.apiKey,"X-Goog-Firebase-Installations-Auth":a,"Content-Type":"application/json",Accept:"application/json","If-None-Match":s||"*","Content-Encoding":"gzip"},r={project:this.projectId,namespace:this.namespace,lastKnownVersionNumber:r,appId:this.appId,sdkVersion:this.sdkVersion,appInstanceId:t};return await fetch(e,{method:"POST",headers:s,body:JSON.stringify(r),signal:i})}getRealtimeUrl(){var e=`${window.FIREBASE_REMOTE_CONFIG_URL_BASE||"https://firebaseremoteconfigrealtime.googleapis.com"}/v1/projects/${this.projectId}/namespaces/${this.namespace}:streamFetchInvalidations?key=`+this.apiKey;return new URL(e)}async createRealtimeConnection(){var[e,t]=await Promise.all([this.firebaseInstallations.getId(),this.firebaseInstallations.getToken(!1)]),a=(this.controller=new AbortController,this.getRealtimeUrl());return await this.establishRealtimeConnection(a,e,t,this.controller.signal)}async retryHttpConnectionWhenBackoffEnds(){let e=await this.storage.getRealtimeBackoffMetadata();e=e||{backoffEndTimeMillis:new Date(-1),numFailedStreams:0};var t=new Date(e.backoffEndTimeMillis).getTime(),a=Date.now(),t=Math.max(0,t-a);await this.makeRealtimeHttpConnection(t)}setIsHttpConnectionRunning(e){this.isConnectionActive=e}checkAndSetHttpConnectionFlagIfNotRunning(){var e=this.canEstablishStreamConnection();return e&&this.setIsHttpConnectionRunning(!0),e}fetchResponseIsUpToDate(e,t){return null!=e.config&&e.templateVersion?e.templateVersion>=t:"success"===this.storageCache.getLastFetchStatus()}parseAndValidateConfigUpdateMessage(e){var t=e.indexOf("{"),a=e.indexOf("}",t);return t<0||a<0||a<=t?"":e.substring(t,a+1)}isEventListenersEmpty(){return 0===this.observers.size}getRandomInt(e){return Math.floor(Math.random()*e)}executeAllListenerCallbacks(t){this.observers.forEach(e=>e.next(t))}getChangedParams(e,t){var a,i,s=new Set,r=new Set(Object.keys(e||{})),n=new Set(Object.keys(t||{}));for(a of r)n.has(a)&&e[a]===t[a]||s.add(a);for(i of n)r.has(i)||s.add(i);return s}async fetchLatestConfig(e,a){var i=e-1,s=3-i,r=this.storageCache.getCustomSignals(),n=(r&&this.logger.debug("Fetching config with custom signals: "+JSON.stringify(r)),new De);try{var o,c={cacheMaxAgeMillis:0,signal:n,customSignals:r,fetchType:"REALTIME",fetchAttempt:s},l=await this.cachingClient.fetch(c);let t=await this.storage.getActiveConfig();if(this.fetchResponseIsUpToDate(l,a))if(null==l.config)this.logger.debug("The fetch succeeded, but the backend had no updates.");else{null==t&&(t={});let e=this.getChangedParams(l.config,t);0===e.size?this.logger.debug("Config was fetched, but no params changed."):(o={getUpdatedKeys(){return new Set(e)}},this.executeAllListenerCallbacks(o))}else this.logger.debug("Fetched template version is the same as SDK's current version. Retrying fetch."),await this.autoFetch(i,a)}catch(e){n=e instanceof Error?e.message:String(e),r=F.create("update-not-fetched",{originalErrorMessage:"Failed to auto-fetch config update: "+n});this.propagateError(r)}}async autoFetch(e,a){var t;if(0===e)t=F.create("update-not-fetched",{originalErrorMessage:"Unable to fetch the latest version of the template."}),this.propagateError(t);else{let t=1e3*this.getRandomInt(4);await new Promise(e=>setTimeout(e,t)),await this.fetchLatestConfig(e,a)}}async handleNotifications(e){let t="";for(;;){var{done:a,value:i}=await e.read();if(a)break;if(a=this.decoder.decode(i,{stream:!0}),t+=a,a.includes("}")&&0!==(t=this.parseAndValidateConfigUpdateMessage(t)).length){try{var s,r,n,o=JSON.parse(t);if(this.isEventListenersEmpty())break;if(Ge in o&&!0===o[Ge]){var c=F.create("realtime-unavailable",{originalErrorMessage:"The server is temporarily unavailable. Try again in a few minutes."});this.propagateError(c);break}Xe in o&&(s=await this.storage.getActiveConfigTemplateVersion(),r=Number(o[Xe]),s)&&s<r&&await this.autoFetch(3,r),Je in o&&(n=Number(o[Je]),await this.updateBackoffMetadataWithRetryInterval(n))}catch(e){this.logger.debug("Unable to parse latest config update message.",e);i=e instanceof Error?e.message:String(e);this.propagateError(F.create("update-message-invalid",{originalErrorMessage:i}))}t=""}}}async listenForNotifications(e){try{await this.handleNotifications(e)}catch(e){this.isInBackground||this.logger.debug("Real-time connection was closed due to an exception.")}}async prepareAndBeginRealtimeHttpStream(){if(this.checkAndSetHttpConnectionFlagIfNotRunning()){let e=await this.storage.getRealtimeBackoffMetadata();var a=(e=e||{backoffEndTimeMillis:new Date(-1),numFailedStreams:0}).backoffEndTimeMillis.getTime();if(Date.now()<a)await this.retryHttpConnectionWhenBackoffEnds();else{let e,t;try{e=await this.createRealtimeConnection(),t=e.status,e.ok&&e.body&&(this.resetRetryCount(),await this.resetRealtimeBackoff(),i=e.body.getReader(),this.reader=i,await this.listenForNotifications(i))}catch(e){this.isInBackground?this.resetRetryCount():this.logger.debug("Exception connecting to real-time RC backend. Retrying the connection...:",e)}finally{await this.closeRealtimeHttpConnection(),this.setIsHttpConnectionRunning(!1);var i,a=!this.isInBackground&&(void 0===t||this.isStatusCodeRetryable(t));a&&await this.updateBackoffMetadataWithLastFailedStreamConnectionTime(new Date),a||e?.ok?await this.retryHttpConnectionWhenBackoffEnds():(i="Unable to connect to the server. HTTP status code: "+t,a=F.create("stream-error",{originalErrorMessage:i}),this.propagateError(a))}}}}canEstablishStreamConnection(){var e=0<this.observers.size,t=!this.isRealtimeDisabled,a=!this.isConnectionActive,i=!this.isInBackground;return e&&t&&a&&i}async makeRealtimeHttpConnection(t){var e;this.canEstablishStreamConnection()&&(0<this.httpRetriesRemaining?(this.httpRetriesRemaining--,await new Promise(e=>setTimeout(e,t)),this.prepareAndBeginRealtimeHttpStream()):this.isInBackground||(e=F.create("stream-error",{originalErrorMessage:"Unable to connect to the server. Check your connection and try again."}),this.propagateError(e)))}async beginRealtime(){0<this.observers.size&&await this.makeRealtimeHttpConnection(0)}addObserver(e){this.observers.add(e),this.beginRealtime()}removeObserver(e){this.observers.has(e)&&this.observers.delete(e)}async onVisibilityChange(e){this.isInBackground=!e,e?await this.beginRealtime():await this.closeRealtimeHttpConnection()}}async function Ze(){if(!u())return!1;try{return await new Promise((i,s)=>{try{let e=!0,t="validate-browser-context-for-indexeddb-analytics-module",a=self.indexedDB.open(t);a.onsuccess=()=>{a.result.close(),e||self.indexedDB.deleteDatabase(t),i(!0)},a.onupgradeneeded=()=>{e=!1},a.onerror=()=>{s(a.error?.message||"")}}catch(e){s(e)}})}catch(e){return!1}}at._registerComponent(new e("remote-config",function(e,{options:t}){var a=e.getProvider("app").getImmediate(),i=e.getProvider("installations-internal").getImmediate(),{projectId:s,apiKey:r,appId:n}=a.options;if(!s)throw F.create("registration-project-id");if(!r)throw F.create("registration-api-key");if(!n)throw F.create("registration-app-id");var o=t?.templateId||"firebase",c=u()?new Ue(n,a.name,o):new Ke,l=new ze(c),g=new K(L),h=(g.logLevel=d.ERROR,new je(i,at.SDK_VERSION,o,s,r,n)),h=new xe(h,c),h=new He(h,c,l,g),i=new Ye(i,c,at.SDK_VERSION,o,s,r,n,g,l,h),o=new Ve(a,h,l,c,g,i);return Pe(o),o},"PUBLIC").setMultipleInstances(!0)),at.registerVersion(L,"0.7.0"),at.registerVersion(L,"0.7.0","esm2020");class Qe{constructor(e,t){this.app=e,this._delegate=t}get defaultConfig(){return this._delegate.defaultConfig}set defaultConfig(e){this._delegate.defaultConfig=e}get fetchTimeMillis(){return this._delegate.fetchTimeMillis}get lastFetchStatus(){return this._delegate.lastFetchStatus}get settings(){return this._delegate.settings}set settings(e){this._delegate.settings=e}activate(){return Ne(this._delegate)}ensureInitialized(){return Pe(this._delegate)}fetch(){return Be(this._delegate)}fetchAndActivate(){return(async e=>(await Be(e=r(e)),Ne(e)))(this._delegate)}getAll(){return Oe(this._delegate)}getBoolean(e){return A(r(this._delegate),e).asBoolean()}getNumber(e){return A(r(this._delegate),e).asNumber()}getString(e){return A(r(this._delegate),e).asString()}getValue(e){return A(this._delegate,e)}setLogLevel(e){var t=this._delegate,a=r(t);switch(e){case"debug":a._logger.logLevel=d.DEBUG;break;case"silent":a._logger.logLevel=d.SILENT;break;default:a._logger.logLevel=d.ERROR}}}function et(e,{instanceIdentifier:t}){var a=e.getProvider("app-compat").getImmediate(),i=e.getProvider("remote-config").getImmediate({identifier:t});return new Qe(a,i)}(w=O.default).INTERNAL.registerComponent(new e("remoteConfig-compat",et,"PUBLIC").setMultipleInstances(!0).setServiceProps({isSupported:Ze})),w.registerVersion("@firebase/remote-config-compat","0.2.20")}).apply(this,arguments)}catch(e){throw console.error(e),new Error("Cannot instantiate firebase-remote-config-compat.js - be sure to load firebase-app.js first.")}}); //# sourceMappingURL=firebase-remote-config-compat.js.map