{ "version": 3, "sources": ["src/app/main/service/cache.service.ts"], "sourcesContent": ["import { Injectable } from '@angular/core';\r\nimport { Observable, Subscription, Subject } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\n\r\nexport class CacheItem {\r\n value: any;\r\n scopes: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CacheService {\r\n items = {\r\n showChat: 'showChat',\r\n chatTesting: 'chatTesting',\r\n userLinkedAccountsData: 'userLinkedAccountsData',\r\n userLinkedAccounts: 'userLinkedAccounts',\r\n optinShown: 'optinShown',\r\n guestAccount: 'guestAccountContext',\r\n guestDocuments: 'guestDocumentContext',\r\n guestPayment: 'guestPaymentContext',\r\n guestPaymentMethod: 'guestPaymentMethodContext',\r\n paymentContext: 'paymentContext',\r\n accountContext: 'accountContext',\r\n paymentEditContext: 'paymentEditContext',\r\n promoCodes: 'promoCodesContext',\r\n showChangeLogin: 'showChangeLogin',\r\n rewardPromoCode: 'rewardPromoCode',\r\n irrelevantBrowserMessageOrigins: 'irrelevantBrowserMessageOrigins',\r\n newLoginEmail: 'newLoginEmail',\r\n newExperiment: 'newExperiment',\r\n customBingEvents: 'customBingEventsContext',\r\n multiFactorAuth: 'multiFactorAuthContext',\r\n contactUsMessage: 'contactUsMessage'\r\n };\r\n\r\n lastPaymentSubmitTimes = {};\r\n private subjects = new Map>();\r\n private cache = new Map();\r\n private inFlight = new Map();\r\n\r\n get(itemName: string): any {\r\n if (this.cache.has(itemName)) {\r\n return this.cache.get(itemName).value;\r\n }\r\n\r\n const stashedValue = environment.unstash(itemName);\r\n if (stashedValue) {\r\n return stashedValue;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n publish(itemName: string, value?: any) {\r\n this.setItem(itemName, { value: value, scopes: [] }, true);\r\n }\r\n\r\n set(itemName: string, value?: any, scopes?: string[]): void {\r\n this.setItem(itemName, { value: value, scopes: scopes || [] });\r\n }\r\n\r\n setItem(itemName: string, item: CacheItem, republish: boolean = false) {\r\n if (!this.cache.has(itemName) || this.cache.get(itemName).value !== item.value || republish) {\r\n this.cache.set(itemName, item);\r\n\r\n if (this.subjects.has(itemName)) {\r\n this.subjects.get(itemName).next(item.value);\r\n }\r\n }\r\n\r\n environment.stash(itemName, item.value);\r\n }\r\n\r\n error(itemName: string, err: any) {\r\n console.log('error', itemName, err);\r\n\r\n if (this.subjects.has(itemName)) {\r\n const subject = this.subjects.get(itemName);\r\n subject.observers.forEach(x => x.error(err)); // don't call subject.error(), keep subject alive\r\n }\r\n\r\n this.set(itemName, null);\r\n }\r\n\r\n dump() {\r\n this.cache.forEach((item, key) => environment.log(key, item));\r\n }\r\n\r\n // Subscribe to current value (if any) and all future values\r\n subscribe(itemName: string, callback: (value: any) => void, error?: (error: any) => void, complete?: () => void): Subscription {\r\n return this.asObservable(itemName, true).subscribe(callback, error, complete);\r\n }\r\n\r\n // Subscribe to future values only\r\n subscribeChanges(itemName: string, callback: (value: any) => void, error?: (error: any) => void, complete?: () => void): Subscription {\r\n return this.asObservable(itemName, false).subscribe(callback, error, complete);\r\n }\r\n\r\n clearItem(itemName: string) {\r\n this.set(itemName, undefined);\r\n }\r\n\r\n clear(scope?: string) {\r\n this.cache.forEach((value, key) => {\r\n if (!scope) {\r\n this.clearItem(key);\r\n }\r\n\r\n const item = this.cache.get(key);\r\n if (item && item.scopes && item.scopes.includes(scope)) {\r\n this.clearItem(key);\r\n }\r\n });\r\n }\r\n\r\n asObservable(itemName: string, sendCachedValue: boolean = true): Observable {\r\n if (!this.subjects.has(itemName)) {\r\n this.subjects.set(itemName, new Subject());\r\n }\r\n\r\n let observable = this.subjects.get(itemName).asObservable();\r\n\r\n if (sendCachedValue) {\r\n const value = this.get(itemName);\r\n if (value !== undefined) {\r\n observable = observable.pipe(startWith(value));\r\n }\r\n }\r\n\r\n observable['itemName'] = itemName;\r\n\r\n return observable;\r\n }\r\n\r\n getOrFetch(itemName: string, fetchData: () => Observable, transform: (value: any) => CacheItem, refresh = false): Observable {\r\n const observable = this.asObservable(itemName, !refresh);\r\n\r\n if (refresh || (!this.get(itemName) && !this.inFlight.has(itemName))) {\r\n this.inFlight.set(itemName, true);\r\n fetchData().subscribe(\r\n res => this.setItem(itemName, transform(res)),\r\n err => this.error(itemName, err),\r\n () => this.inFlight.delete(itemName));\r\n }\r\n\r\n return observable;\r\n }\r\n}\r\n"], "mappings": "8FAaA,IAAaA,GAAY,IAAA,CAAnB,IAAOA,EAAP,MAAOA,CAAY,CAHzBC,aAAA,CAII,KAAAC,MAAQ,CACJC,SAAU,WACVC,YAAa,cACbC,uBAAwB,yBACxBC,mBAAoB,qBACpBC,WAAY,aACZC,aAAc,sBACdC,eAAgB,uBAChBC,aAAc,sBACdC,mBAAoB,4BACpBC,eAAgB,iBAChBC,eAAgB,iBAChBC,mBAAoB,qBACpBC,WAAY,oBACZC,gBAAiB,kBACjBC,gBAAiB,kBACjBC,gCAAiC,kCACjCC,cAAe,gBACfC,cAAe,gBACfC,iBAAkB,0BAClBC,gBAAiB,yBACjBC,iBAAkB,oBAGtB,KAAAC,uBAAyB,CAAA,EACjB,KAAAC,SAAW,IAAIC,IACf,KAAAC,MAAQ,IAAID,IACZ,KAAAE,SAAW,IAAIF,IAEvBG,IAAIC,EAAgB,CAChB,GAAI,KAAKH,MAAMI,IAAID,CAAQ,EACvB,OAAO,KAAKH,MAAME,IAAIC,CAAQ,EAAEE,MAGpC,IAAMC,EAAeC,EAAYC,QAAQL,CAAQ,EACjD,GAAIG,EACA,OAAOA,CAIf,CAEAG,QAAQN,EAAkBE,EAAW,CACjC,KAAKK,QAAQP,EAAsB,CAAEE,MAAOA,EAAOM,OAAQ,CAAA,CAAE,EAAI,EAAI,CACzE,CAEAC,IAAIT,EAAkBE,EAAaM,EAAiB,CAChD,KAAKD,QAAQP,EAAsB,CAAEE,MAAOA,EAAOM,OAAQA,GAAU,CAAA,CAAE,CAAE,CAC7E,CAEAD,QAAQP,EAAkBU,EAAiBC,EAAqB,GAAK,EAC7D,CAAC,KAAKd,MAAMI,IAAID,CAAQ,GAAK,KAAKH,MAAME,IAAIC,CAAQ,EAAEE,QAAUQ,EAAKR,OAASS,KAC9E,KAAKd,MAAMY,IAAIT,EAAUU,CAAI,EAEzB,KAAKf,SAASM,IAAID,CAAQ,GAC1B,KAAKL,SAASI,IAAIC,CAAQ,EAAEY,KAAKF,EAAKR,KAAK,GAInDE,EAAYS,MAAMb,EAAUU,EAAKR,KAAK,CAC1C,CAEAY,MAAMd,EAAkBe,EAAQ,CAC5BC,QAAQC,IAAI,QAASjB,EAAUe,CAAG,EAE9B,KAAKpB,SAASM,IAAID,CAAQ,GACV,KAAKL,SAASI,IAAIC,CAAQ,EAClCkB,UAAUC,QAAQC,GAAKA,EAAEN,MAAMC,CAAG,CAAC,EAG/C,KAAKN,IAAIT,EAAU,IAAI,CAC3B,CAEAqB,MAAI,CACA,KAAKxB,MAAMsB,QAAQ,CAACT,EAAMY,IAAQlB,EAAYa,IAAIK,EAAKZ,CAAI,CAAC,CAChE,CAGAa,UAAUvB,EAAkBwB,EAAgCV,EAA8BW,EAAqB,CAC3G,OAAO,KAAKC,aAAa1B,EAAU,EAAI,EAAEuB,UAAUC,EAAUV,EAAOW,CAAQ,CAChF,CAGAE,iBAAiB3B,EAAkBwB,EAAgCV,EAA8BW,EAAqB,CAClH,OAAO,KAAKC,aAAa1B,EAAU,EAAK,EAAEuB,UAAUC,EAAUV,EAAOW,CAAQ,CACjF,CAEAG,UAAU5B,EAAgB,CACtB,KAAKS,IAAIT,EAAU6B,MAAS,CAChC,CAEAC,MAAMC,EAAc,CAChB,KAAKlC,MAAMsB,QAAQ,CAACjB,EAAOoB,IAAO,CACzBS,GACD,KAAKH,UAAUN,CAAG,EAGtB,IAAMZ,EAAO,KAAKb,MAAME,IAAIuB,CAAG,EAC3BZ,GAAQA,EAAKF,QAAUE,EAAKF,OAAOwB,SAASD,CAAK,GACjD,KAAKH,UAAUN,CAAG,CAE1B,CAAC,CACL,CAEAI,aAAa1B,EAAkBiC,EAA2B,GAAI,CACrD,KAAKtC,SAASM,IAAID,CAAQ,GAC3B,KAAKL,SAASc,IAAIT,EAAU,IAAIkC,CAAc,EAGlD,IAAIC,EAAa,KAAKxC,SAASI,IAAIC,CAAQ,EAAE0B,aAAY,EAEzD,GAAIO,EAAiB,CACjB,IAAM/B,EAAQ,KAAKH,IAAIC,CAAQ,EAC3BE,IAAU2B,SACVM,EAAaA,EAAWC,KAAKC,EAAUnC,CAAK,CAAC,EAErD,CAEAiC,OAAAA,EAAW,SAAcnC,EAElBmC,CACX,CAEAG,WAActC,EAAkBuC,EAAkCC,EAAsCC,EAAU,GAAK,CACnH,IAAMN,EAAa,KAAKT,aAAa1B,EAAU,CAACyC,CAAO,EAEvD,OAAIA,GAAY,CAAC,KAAK1C,IAAIC,CAAQ,GAAK,CAAC,KAAKF,SAASG,IAAID,CAAQ,KAC9D,KAAKF,SAASW,IAAIT,EAAU,EAAI,EAChCuC,EAAS,EAAGhB,UACRmB,GAAO,KAAKnC,QAAQP,EAAUwC,EAAUE,CAAG,CAAC,EAC5C3B,GAAO,KAAKD,MAAMd,EAAUe,CAAG,EAC/B,IAAM,KAAKjB,SAAS6C,OAAO3C,CAAQ,CAAC,GAGrCmC,CACX,yCAxISjE,EAAY,wBAAZA,EAAY0E,QAAZ1E,EAAY2E,UAAAC,WAFX,MAAM,CAAA,EAEd,IAAO5E,EAAP6E,SAAO7E,CAAY,GAAA", "names": ["CacheService", "constructor", "items", "showChat", "chatTesting", "userLinkedAccountsData", "userLinkedAccounts", "optinShown", "guestAccount", "guestDocuments", "guestPayment", "guestPaymentMethod", "paymentContext", "accountContext", "paymentEditContext", "promoCodes", "showChangeLogin", "rewardPromoCode", "irrelevantBrowserMessageOrigins", "newLoginEmail", "newExperiment", "customBingEvents", "multiFactorAuth", "contactUsMessage", "lastPaymentSubmitTimes", "subjects", "Map", "cache", "inFlight", "get", "itemName", "has", "value", "stashedValue", "environment", "unstash", "publish", "setItem", "scopes", "set", "item", "republish", "next", "stash", "error", "err", "console", "log", "observers", "forEach", "x", "dump", "key", "subscribe", "callback", "complete", "asObservable", "subscribeChanges", "clearItem", "undefined", "clear", "scope", "includes", "sendCachedValue", "Subject", "observable", "pipe", "startWith", "getOrFetch", "fetchData", "transform", "refresh", "res", "delete", "factory", "\u0275fac", "providedIn", "_CacheService"] }