UNPKG

21 kBSource Map (JSON)View Raw
1{"version":3,"file":"angular-fire-remote-config.js","sources":["../../../src/remote-config/base.ts","../../../src/remote-config/remote-config.ts","../../../src/remote-config/remote-config.module.ts","../../../src/remote-config/angular-fire-remote-config.ts"],"sourcesContent":["export const proxyPolyfillCompat = {\n settings: null,\n defaultConfig: null,\n fetchTimeMillis: null,\n lastFetchStatus: null,\n activate: null,\n ensureInitialized: null,\n fetch: null,\n fetchAndActivate: null,\n getAll: null,\n getBoolean: null,\n getNumber: null,\n getString: null,\n getValue: null,\n setLogLevel: null,\n};\n","import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core';\nimport { concat, EMPTY, MonoTypeOperatorFunction, Observable, of, OperatorFunction, pipe } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n groupBy,\n map,\n mergeMap,\n observeOn,\n scan,\n shareReplay,\n startWith,\n switchMap,\n tap,\n withLatestFrom\n} from 'rxjs/operators';\nimport {\n FIREBASE_APP_NAME,\n FIREBASE_OPTIONS,\n FirebaseAppConfig,\n FirebaseOptions,\n ɵAngularFireSchedulers,\n ɵfirebaseAppFactory,\n ɵkeepUnstableUntilFirstFactory,\n ɵlazySDKProxy,\n ɵPromiseProxy,\n ɵapplyMixins\n} from '@angular/fire';\nimport { isPlatformBrowser } from '@angular/common';\nimport firebase from 'firebase/app';\nimport { Settings } from './interfaces';\nimport { proxyPolyfillCompat } from './base';\nimport { ɵfetchInstance } from '@angular/fire';\n\nexport interface ConfigTemplate {\n [key: string]: string | number | boolean;\n}\n\nexport const SETTINGS = new InjectionToken<Settings>('angularfire2.remoteConfig.settings');\nexport const DEFAULTS = new InjectionToken<ConfigTemplate>('angularfire2.remoteConfig.defaultConfig');\n\nexport interface AngularFireRemoteConfig extends ɵPromiseProxy<firebase.remoteConfig.RemoteConfig> {\n}\n\nconst AS_TO_FN = { strings: 'asString', numbers: 'asNumber', booleans: 'asBoolean' };\nconst STATIC_VALUES = { numbers: 0, booleans: false, strings: undefined };\n\n// TODO look into the types here, I don't like the anys\nconst proxyAll = (observable: Observable<Parameter[]>, as: 'numbers' | 'booleans' | 'strings') => new Proxy(\n observable.pipe(mapToObject(as as any)), {\n get: (self, name: string) => self[name] || observable.pipe(\n map(all => all.find(p => p.key === name)),\n map(param => param ? param[AS_TO_FN[as]]() : STATIC_VALUES[as]),\n distinctUntilChanged()\n )\n }\n) as any;\n\n// TODO export as implements Partial<...> so minor doesn't break us\nexport class Value implements firebase.remoteConfig.Value {\n asBoolean() {\n return ['1', 'true', 't', 'y', 'yes', 'on'].indexOf(this._value.toLowerCase()) > -1;\n }\n\n asString() {\n return this._value;\n }\n\n asNumber() {\n return Number(this._value) || 0;\n }\n\n getSource() {\n return this._source;\n }\n\n // tslint:disable-next-line:variable-name\n constructor(public _source: firebase.remoteConfig.ValueSource, public _value: string) {\n }\n}\n\n// SEMVER use ConstructorParameters when we can support Typescript 3.6\nexport class Parameter extends Value {\n constructor(public key: string, public fetchTimeMillis: number, source: firebase.remoteConfig.ValueSource, value: string) {\n super(source, value);\n }\n}\n\n// If it's a Parameter array, test any, else test the individual Parameter\nconst filterTest = (fn: (param: Parameter) => boolean) => filter<Parameter | Parameter[]>(it => Array.isArray(it) ? it.some(fn) : fn(it));\n\n// Allow the user to bypass the default values and wait till they get something from the server, even if it's a cached copy;\n// if used in conjuntion with first() it will only fetch RC values from the server if they aren't cached locally\nexport const filterRemote = () => filterTest(p => p.getSource() === 'remote');\n\n// filterFresh allows the developer to effectively set up a maximum cache time\nexport const filterFresh = (howRecentInMillis: number) => filterTest(p => p.fetchTimeMillis + howRecentInMillis >= new Date().getTime());\n\n\n// I ditched loading the defaults into RC and a simple map for scan since we already have our own defaults implementation.\n// The idea here being that if they have a default that never loads from the server, they will be able to tell via fetchTimeMillis\n// on the Parameter. Also if it doesn't come from the server it won't emit again in .changes, due to the distinctUntilChanged,\n// which we can simplify to === rather than deep comparison\nconst scanToParametersArray = (\n remoteConfig: Observable<firebase.remoteConfig.RemoteConfig | undefined>\n): OperatorFunction<{ [key: string]: firebase.remoteConfig.Value }, Parameter[]> => pipe(\n withLatestFrom(remoteConfig),\n scan((existing, [all, rc]) => {\n // SEMVER use \"new Set\" to unique once we're only targeting es6\n // at the scale we expect remote config to be at, we probably won't see a performance hit from this unoptimized uniqueness\n // implementation.\n // const allKeys = [...new Set([...existing.map(p => p.key), ...Object.keys(all)])];\n const allKeys = [...existing.map(p => p.key), ...Object.keys(all)].filter((v, i, a) => a.indexOf(v) === i);\n return allKeys.map(key => {\n const updatedValue = all[key];\n return updatedValue ? new Parameter(key, rc ? rc.fetchTimeMillis : -1, updatedValue.getSource(), updatedValue.asString())\n : existing.find(p => p.key === key);\n });\n }, [] as Array<Parameter>)\n);\n\n\n@Injectable({\n providedIn: 'any'\n})\nexport class AngularFireRemoteConfig {\n\n readonly changes: Observable<Parameter>;\n readonly parameters: Observable<Parameter[]>;\n readonly numbers: Observable<{ [key: string]: number | undefined }> & { [key: string]: Observable<number> };\n readonly booleans: Observable<{ [key: string]: boolean | undefined }> & { [key: string]: Observable<boolean> };\n readonly strings: Observable<{ [key: string]: string | undefined }> & { [key: string]: Observable<string | undefined> };\n\n constructor(\n @Inject(FIREBASE_OPTIONS) options: FirebaseOptions,\n @Optional() @Inject(FIREBASE_APP_NAME) nameOrConfig: string | FirebaseAppConfig | null | undefined,\n @Optional() @Inject(SETTINGS) settings: Settings | null,\n @Optional() @Inject(DEFAULTS) defaultConfig: ConfigTemplate | null,\n private zone: NgZone,\n // tslint:disable-next-line:ban-types\n @Inject(PLATFORM_ID) platformId: Object\n ) {\n\n const schedulers = new ɵAngularFireSchedulers(zone);\n\n const remoteConfig$ = of(undefined).pipe(\n observeOn(schedulers.outsideAngular),\n switchMap(() => isPlatformBrowser(platformId) ? import('firebase/remote-config') : EMPTY),\n switchMap(() => import('@firebase/remote-config')),\n tap(rc => rc.registerRemoteConfig && rc.registerRemoteConfig(firebase as any)),\n map(() => ɵfirebaseAppFactory(options, zone, nameOrConfig)),\n map(app => ɵfetchInstance(`${app.name}.remote-config`, 'AngularFireRemoteConfig', app, () => {\n const rc = app.remoteConfig();\n if (settings) {\n rc.settings = settings;\n }\n if (defaultConfig) {\n rc.defaultConfig = defaultConfig;\n }\n return rc;\n }, [settings, defaultConfig])),\n // tslint:disable-next-line\n startWith(undefined),\n shareReplay({ bufferSize: 1, refCount: false })\n );\n\n const loadedRemoteConfig$ = remoteConfig$.pipe(\n filter<firebase.remoteConfig.RemoteConfig>(rc => !!rc)\n );\n\n const default$: Observable<{ [key: string]: firebase.remoteConfig.Value }> = of(Object.keys(defaultConfig || {}).reduce(\n (c, k) => ({ ...c, [k]: new Value('default', defaultConfig[k].toString()) }), {}\n ));\n\n // we should filter out the defaults we provided to RC, since we have our own implementation\n // that gives us a -1 for fetchTimeMillis (so filterFresh can filter them out)\n const filterOutDefaults = map<{ [key: string]: firebase.remoteConfig.Value }, { [key: string]: firebase.remoteConfig.Value }>(all =>\n Object.keys(all)\n .filter(key => all[key].getSource() !== 'default')\n .reduce((acc, key) => ({ ...acc, [key]: all[key] }), {})\n );\n\n const existing$ = loadedRemoteConfig$.pipe(\n switchMap(rc =>\n rc.activate()\n .then(() => rc.ensureInitialized())\n .then(() => rc.getAll())\n ),\n filterOutDefaults\n );\n\n const fresh$ = loadedRemoteConfig$.pipe(\n switchMap(rc => zone.runOutsideAngular(() =>\n rc.fetchAndActivate()\n .then(() => rc.ensureInitialized())\n .then(() => rc.getAll())\n )),\n filterOutDefaults\n );\n\n this.parameters = concat(default$, existing$, fresh$).pipe(\n scanToParametersArray(remoteConfig$),\n ɵkeepUnstableUntilFirstFactory(schedulers),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n this.changes = this.parameters.pipe(\n switchMap(params => of(...params)),\n groupBy(param => param.key),\n mergeMap(group => group.pipe(\n distinctUntilChanged()\n ))\n );\n\n this.strings = proxyAll(this.parameters, 'strings');\n this.booleans = proxyAll(this.parameters, 'booleans');\n this.numbers = proxyAll(this.parameters, 'numbers');\n\n return ɵlazySDKProxy(this, loadedRemoteConfig$, zone);\n }\n\n}\n\n\nexport const budget = <T>(interval: number): MonoTypeOperatorFunction<T> => (source: Observable<T>) => new Observable<T>(observer => {\n let timedOut = false;\n // TODO use scheduler task rather than settimeout\n const timeout = setTimeout(() => {\n observer.complete();\n timedOut = true;\n }, interval);\n return source.subscribe({\n next(val) {\n if (!timedOut) {\n observer.next(val);\n }\n },\n error(err) {\n if (!timedOut) {\n clearTimeout(timeout);\n observer.error(err);\n }\n },\n complete() {\n if (!timedOut) {\n clearTimeout(timeout);\n observer.complete();\n }\n }\n });\n});\n\nconst typedMethod = (it: any) => {\n switch (typeof it) {\n case 'string':\n return 'asString';\n case 'boolean':\n return 'asBoolean';\n case 'number':\n return 'asNumber';\n default:\n return 'asString';\n }\n};\n\n\nexport function scanToObject(): OperatorFunction<Parameter, { [key: string]: string | undefined }>;\nexport function scanToObject(to: 'numbers'): OperatorFunction<Parameter, { [key: string]: number | undefined }>;\nexport function scanToObject(to: 'booleans'): OperatorFunction<Parameter, { [key: string]: boolean | undefined }>;\n// tslint:disable-next-line:unified-signatures\nexport function scanToObject(to: 'strings'): OperatorFunction<Parameter, { [key: string]: string | undefined }>;\nexport function scanToObject<T extends ConfigTemplate>(template: T): OperatorFunction<Parameter, T & { [key: string]: string | undefined }>;\nexport function scanToObject<T extends ConfigTemplate>(to: 'numbers' | 'booleans' | 'strings' | T = 'strings') {\n return pipe(\n // TODO cleanup\n scan(\n (c, p: Parameter) => ({\n ...c, [p.key]: typeof to === 'object' ?\n p[typedMethod(to[p.key])]() :\n p[AS_TO_FN[to]]()\n }),\n typeof to === 'object' ?\n to as T & { [key: string]: string | undefined } :\n {} as { [key: string]: number | boolean | string }\n ),\n debounceTime(1),\n budget(10),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))\n );\n}\n\nexport function mapToObject(): OperatorFunction<Parameter[], { [key: string]: string | undefined }>;\nexport function mapToObject(to: 'numbers'): OperatorFunction<Parameter[], { [key: string]: number | undefined }>;\nexport function mapToObject(to: 'booleans'): OperatorFunction<Parameter[], { [key: string]: boolean | undefined }>;\n// tslint:disable-next-line:unified-signatures\nexport function mapToObject(to: 'strings'): OperatorFunction<Parameter[], { [key: string]: string | undefined }>;\nexport function mapToObject<T extends ConfigTemplate>(template: T):\n OperatorFunction<Parameter[], T & { [key: string]: string | undefined }>;\nexport function mapToObject<T extends ConfigTemplate>(to: 'numbers' | 'booleans' | 'strings' | T = 'strings') {\n return pipe(\n // TODO this is getting a little long, cleanup\n map((params: Parameter[]) => params.reduce(\n (c, p) => ({\n ...c, [p.key]: typeof to === 'object' ?\n p[typedMethod(to[p.key])]() :\n p[AS_TO_FN[to]]()\n }),\n typeof to === 'object' ?\n to as T & { [key: string]: string | undefined } :\n {} as { [key: string]: number | boolean | string }\n )),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))\n );\n}\n\nɵapplyMixins(AngularFireRemoteConfig, [proxyPolyfillCompat]);\n","import { NgModule } from '@angular/core';\nimport { AngularFireRemoteConfig } from './remote-config';\n\n@NgModule({\n providers: [AngularFireRemoteConfig]\n})\nexport class AngularFireRemoteConfigModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n\nexport {Settings as ɵa} from './interfaces';"],"names":[],"mappings":"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"}
\No newline at end of file