@esfaenza/httpservice 11.2.34 → 11.2.38

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.
@@ -185,6 +185,8 @@ class HTTPService {
185
185
  this.PersistTimedCacheASAP = false;
186
186
  /** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */
187
187
  this.PersistUntimedCacheASAP = false;
188
+ /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
189
+ this.LastThreeCompletedCalls = [];
188
190
  this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
189
191
  this.me = this.ExtensionsImpl.retrieveIdentity();
190
192
  this.localStorageHttpCacheKey = ((_a = this.APP_NAME) !== null && _a !== void 0 ? _a : "APP").replace(/\s/g, '_') + "_HttpCache";
@@ -209,8 +211,8 @@ class HTTPService {
209
211
  lsTimed = lsTimed ? JSON.parse(lsTimed) : {};
210
212
  lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};
211
213
  yield forkJoin([
212
- this.localStorage.store(this.localStorageHttpTimedCacheKey, lsTimed),
213
- this.localStorage.store(this.localStorageHttpCacheKey, lsUntimed)
214
+ this.localStorage.setItem(this.localStorageHttpTimedCacheKey, lsTimed),
215
+ this.localStorage.setItem(this.localStorageHttpCacheKey, lsUntimed)
214
216
  ]).toPromise();
215
217
  this.log(this.loc("Converted old storage system to new one"));
216
218
  });
@@ -486,7 +488,7 @@ class HTTPService {
486
488
  defaultStartCall(url) {
487
489
  let myGuid = this.getGUID();
488
490
  this.checkCacheInvalidation(url);
489
- this.callStatus[myGuid] = true;
491
+ this.callStatus[myGuid] = { url: url, success: true };
490
492
  this.log(this.loc("Starting call") + " " + myGuid + " " + this.loc("at URL") + ": " + url);
491
493
  return myGuid;
492
494
  }
@@ -496,7 +498,7 @@ class HTTPService {
496
498
  * @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare
497
499
  */
498
500
  checkCacheInvalidation(url) {
499
- let cache = this.localStorage.retrieveLocal(this.localStorageHttpCacheKey);
501
+ let cache = this.localStorage.getLocalItem(this.localStorageHttpCacheKey);
500
502
  let tmp = /#cache(:?-(\d+))/gi.exec(url);
501
503
  let cacheTime = tmp ? tmp[2] : null;
502
504
  let normalizedUrl = url.replace("#cache" + (cacheTime ? "-" + cacheTime : ""), "").replace(this.BACKEND_URL, "");
@@ -517,7 +519,7 @@ class HTTPService {
517
519
  this.log(this.loc("Invlalidating cache element") + " " + k);
518
520
  delete cache[k];
519
521
  }
520
- this.localStorage.storeLocal(this.localStorageHttpCacheKey, cache);
522
+ this.localStorage.setLocalItem(this.localStorageHttpCacheKey, cache);
521
523
  }
522
524
  /**
523
525
  * Finalizzazione di una chiamata
@@ -528,12 +530,16 @@ class HTTPService {
528
530
  */
529
531
  tryFinalizeByGuid(guid, cacheInfos) {
530
532
  return __awaiter(this, void 0, void 0, function* () {
531
- this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (this.callStatus[guid] ? this.loc('Success') : this.loc('Failure')));
532
- //Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
533
- //e riiniziare a valutare errori di javashit
534
- if (this.callStatus[guid] && this.ExtensionsImpl.readRedirectionStatus())
533
+ this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));
534
+ // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
535
+ // e riiniziare a valutare errori di javashit
536
+ if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())
535
537
  this.ExtensionsImpl.writeRedirectionStatus(false);
536
- //In ogni caso questa posso rimuoverla
538
+ // Aggiungo la chiamata alla lista delle ultime 3 completate
539
+ this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url);
540
+ if (this.LastThreeCompletedCalls.length > 3)
541
+ this.LastThreeCompletedCalls.pop();
542
+ // In ogni caso questa posso rimuoverla
537
543
  delete this.callStatus[guid];
538
544
  // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
539
545
  if (cacheInfos && cacheInfos.cache) {
@@ -548,13 +554,13 @@ class HTTPService {
548
554
  let tmpKey = "";
549
555
  if (this.PersistTimedCacheASAP) {
550
556
  tmpKey = this.localStorageHttpTimedCacheKey;
551
- toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
557
+ toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));
552
558
  }
553
559
  if (this.PersistUntimedCacheASAP) {
554
560
  tmpKey = this.localStorageHttpCacheKey;
555
- toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
561
+ toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));
556
562
  }
557
- this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches..."));
563
+ this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches") + "...");
558
564
  var ret = yield forkJoin(toCall).toPromise();
559
565
  if (ret)
560
566
  this.log(this.loc("Caches succesfully persisted"));
@@ -605,7 +611,7 @@ class HTTPService {
605
611
  if (authtoken && includeAuth)
606
612
  headers = headers.append("Authorization", "Bearer " + authtoken);
607
613
  if (accept)
608
- headers = headers.append("Accept", "application/json");
614
+ headers = headers.append("Accept", accept);
609
615
  headers = headers.append("Accept-Language", (_a = this.LOCALE) !== null && _a !== void 0 ? _a : 'it-IT');
610
616
  return headers;
611
617
  }
@@ -617,7 +623,8 @@ class HTTPService {
617
623
  */
618
624
  onError(res, guid) {
619
625
  return __awaiter(this, void 0, void 0, function* () {
620
- this.callStatus[guid] = false;
626
+ if (this.callStatus[guid])
627
+ this.callStatus[guid].success = false;
621
628
  //Mi assicuro che tutti gli errori durante il redirect al login vengano ignorati
622
629
  if (this.ExtensionsImpl.readRedirectingToLogin()) {
623
630
  this.log(this.loc("Redirecting to Login, ignoring HTTP error on call") + " " + guid);
@@ -763,7 +770,7 @@ class HTTPService {
763
770
  this.resetHttpUntimedCacheStorage();
764
771
  cachingKey = this.makeCacheKey(url, params);
765
772
  let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
766
- let cacheLs = this.localStorage.retrieveLocal(cacheKey);
773
+ let cacheLs = this.localStorage.getLocalItem(cacheKey);
767
774
  let cache = cacheLs ? cacheLs : {};
768
775
  if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {
769
776
  // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco
@@ -783,12 +790,12 @@ class HTTPService {
783
790
  */
784
791
  cacheResponse(item, cacheInfos) {
785
792
  let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
786
- let cacheLs = this.localStorage.retrieveLocal(cacheKey);
793
+ let cacheLs = this.localStorage.getLocalItem(cacheKey);
787
794
  let cache = cacheLs ? cacheLs : {};
788
795
  cache[cacheInfos.cacheKey] = item;
789
796
  if (cacheInfos.cacheTime)
790
797
  cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, "seconds");
791
- this.localStorage.storeLocal(cacheKey, cache);
798
+ this.localStorage.setLocalItem(cacheKey, cache);
792
799
  }
793
800
  /**
794
801
  * Controlla se la cache per le chiamate senza expire time è scaduta
@@ -814,14 +821,18 @@ class HTTPService {
814
821
  */
815
822
  resetHttpUntimedCacheStorage() {
816
823
  var _a;
817
- this.localStorage.store(this.localStorageHttpCacheKey, {}).subscribe();
818
- localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add((_a = this.CLIENT_CACHE_DURATION_S) !== null && _a !== void 0 ? _a : 3600, "second")));
824
+ return __awaiter(this, void 0, void 0, function* () {
825
+ yield this.localStorage.setItem(this.localStorageHttpCacheKey, {}).toPromise();
826
+ localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add((_a = this.CLIENT_CACHE_DURATION_S) !== null && _a !== void 0 ? _a : 3600, "second")));
827
+ });
819
828
  }
820
829
  /**
821
830
  * Ripulisce la cache delle chiamate con un tempo di expire definito
822
831
  */
823
832
  resetHttpTimedCacheStorage() {
824
- this.localStorage.store(this.localStorageHttpTimedCacheKey, {});
833
+ return __awaiter(this, void 0, void 0, function* () {
834
+ yield this.localStorage.setItem(this.localStorageHttpTimedCacheKey, {}).toPromise();
835
+ });
825
836
  }
826
837
  /**
827
838
  * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-httpservice.js","sources":["../../../projects/httpservice/src/lib/tokens.ts","../../../projects/httpservice/src/lib/config/HttpServiceExtensions.ts","../../../projects/httpservice/src/lib/httpservice.service.loc.ts","../../../projects/httpservice/src/lib/models/CacheInfos.ts","../../../projects/httpservice/src/lib/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.ts","../../../projects/httpservice/src/lib/models/Download.ts","../../../projects/httpservice/src/public-api.ts","../../../projects/httpservice/src/esfaenza-httpservice.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Dizionario di invalidazioni delle chiamate HTTP\r\n */\r\nexport const HTTP_INVALIDATION: InjectionToken<Record<string, string[]>> = new InjectionToken<Record<string, string[]>>('HTTP_INVALIDATION');\r\n\r\n/**\r\n * Durata della cache lato libreria dopo il quale la cache verrà ripulita\r\n */\r\nexport const CLIENT_CACHE_DURATION_S: InjectionToken<number> = new InjectionToken<number>('CLIENT_CACHE_DURATION_S');\r\n\r\n/**\r\n * URL del Backend a cui inviare le chiamate\r\n */\r\nexport const BACKEND_URL: InjectionToken<string> = new InjectionToken<string>('BACKEND_URL');\r\n\r\n/**\r\n * Locale della libreria per messaggi d'errore ed Header di default \"Accept-Language\". Sono supportati \"it-IT\" ed \"en-US\"\r\n */\r\nexport const HTTP_LOCALE: InjectionToken<string> = new InjectionToken<string>('HTTP_LOCALE');\r\n\r\n/**\r\n * Nome dell'APP utilizzato per creare le chiavi delle cache specifiche per l'applicazione corrente\r\n */\r\nexport const APP_NAME: InjectionToken<string> = new InjectionToken<string>('APP_NAME');\r\n\r\n/**\r\n * Indica se utilizzare l'identificativo utente nella cache\r\n */\r\nexport const CACHE_BY_USER: InjectionToken<boolean> = new InjectionToken<boolean>('CACHE_BY_USER');\r\n\r\n/**\r\n * Indica se fare log nella console ad ogni azione significativa\r\n */\r\nexport const DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DEBUG_MODE');","import { IHttpServiceExtensions } from './IHttpServiceExtensions';\r\n\r\n/**\r\n * Classe d'estensione che permette di modificare il comportamento della libreria negli hook definiti da interfaccia, in modo da poterla adattare \r\n * con un certo grado di customizzazione a qualsiasi struttura di frontend\r\n */\r\nexport class HttpServiceExtensions implements IHttpServiceExtensions {\r\n\r\n /**\r\n * Hook per recuperare l'access token con cui effettuare le chiamate HTTP\r\n */\r\n public retrieveAccessToken(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Hook per recuperare l'Identity corrente in un oggetto generico con le informazioni di User e Tenant\r\n */\r\n public retrieveIdentity(): { IdUser: string, Idtenant: string } {\r\n return null;\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già venendo ridirezionati al login, in modo da non tentare di effettuare \r\n * N redirect contemporaneamente qualora molte API fallissero allo stesso tempo nell'autenticazione\r\n */\r\n public readRedirectingToLogin(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo effettuando un redirect al login o meno\r\n */\r\n public writeRedirectingToLogin(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per effettuare il redirect al login\r\n */\r\n public redirectToLogin(): void {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un errore, in modo da non tentare di gestire \r\n * N errori contemporaneamente qualora molte API fallissero allo stesso tempo\r\n */\r\n public readHandlingErrorStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un errore o meno\r\n */\r\n public writeHandlingErrorStatus(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un redirect, in modo da non tentare di gestire \r\n * N redirect contemporaneamente qualora molte API lo richiedessero allo stesso tempo\r\n */\r\n public readRedirectionStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un redirect o meno\r\n */\r\n public writeRedirectionStatus(status: boolean): void {\r\n }\r\n\r\n /**\r\n * Hook per indicare se l'applicazione può gestire eccezioni del tipo \"NotConfigured\" (444). Qualora l'applicazione che lo implementa dichiari di gestirle verrà chiamata \r\n * la funzione **handleBlockingException** per ognuno di questi errori\r\n */\r\n public handleNotConfiguredException(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore bloccante per l'operazione attuale, ma non fatale (Generalmente gestibile da dialog di avviso)\r\n */\r\n public handleBlockingException(status: number, text: string) {\r\n console.error(\"ESHttpError Blocking Exception \" + status + \" \" + text);\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore fatale (Generalmente gestibile tramite navigazione a una pagina di errore custom per l'applicativo)\r\n */\r\n public handleException(status: number | string, text: string) {\r\n console.error(\"ESHttpError \" + status + \" \" + text);\r\n }\r\n}","/**\r\n * Oggetto statico di localizzazione per i messaggi\r\n */\r\nexport const Loc ={\r\n \"Result for\": { \"en-US\": \"Result for\", \"it-IT\": \"Risultato per\", },\r\n \"retrieved from cache\": { \"en-US\": \"retrieved from cache\", \"it-IT\": \"recuperato dalla cache\", },\r\n \"Cached result for\": { \"en-US\": \"Cached result for\", \"it-IT\": \"Messo in cache risultato per\", },\r\n \"Starting call\": { \"en-US\": \"Starting call\", \"it-IT\": \"Inizio la chiamata\", },\r\n \"at URL\": { \"en-US\": \"at URL\", \"it-IT\": \"all'URL\", },\r\n \"Invlalidating cache element\": { \"en-US\": \"Invlalidating cache element\", \"it-IT\": \"Invalido elemento della cache\", },\r\n \"Finalizing call\": { \"en-US\": \"Finalizing call\", \"it-IT\": \"Finalizzo chiamata\", },\r\n \"with status\": { \"en-US\": \"with status\", \"it-IT\": \"con stato\", },\r\n \"Success\": { \"en-US\": \"Success\", \"it-IT\": \"Successso\", },\r\n \"Failure\": { \"en-US\": \"Failure\", \"it-IT\": \"Fallimento\", },\r\n \"Error 401 on call\": { \"en-US\": \"Error 401 on call\", \"it-IT\": \"Errore 401 su chiamata\", },\r\n \"with redirect already in progress. Ignoring this event\": { \"en-US\": \"with redirect already in progress. Ignoring this event\", \"it-IT\": \"con redirezione già in corso. Ignoro l'evento\", },\r\n \"redirecting to login\": { \"en-US\": \"redirecting to login\", \"it-IT\": \"redireziono al login\", },\r\n \"Redirecting to Login, ignoring HTTP error on call\": { \"en-US\": \"Redirecting to Login, ignoring HTTP error on call\", \"it-IT\": \"Redireziono al login ignorando errori sulla chiamata\", },\r\n \"Already Handling an error, ignoring HTTP error on call\": { \"en-US\": \"Already Handling an error, ignoring HTTP error on call\", \"it-IT\": \"sto già gestendo un errore, ignoro quello corrente per la chiamata HTTP\", },\r\n \"Error 444 on call\": { \"en-US\": \"Error 444 on call\", \"it-IT\": \"Errore 444 su chiamata\" },\r\n \"Resource not found\": { \"en-US\": \"Resource not found\", \"it-IT\": \"Risorsa non trovata\" },\r\n \"Converted old storage system to new one\": { \"en-US\": \"Converted old storage system to new one\", \"it-IT\": \"Convertito il vecchio sistema di storicizzazione al nuovo\" },\r\n \"Marking cache to be persisted as soon as possible\": { \"en-US\": \"Marking cache to be persisted as soon as possible\", \"it-IT\": \"Marco cache da persistere il prima possibile\" },\r\n \"No more HTTP calls to be executed, entering idle state and persisting modified caches\": { \"en-US\": \"No more HTTP calls to be executed, entering idle state and persisting modified caches\", \"it-IT\": \"Nessun'altra chiamata HTTP dev'essere eseguita, entro in stato IDLE e persisto le cache modificate\" },\r\n \"Caches succesfully persisted\": { \"en-US\": \"Caches succesfully persisted\", \"it-IT\": \"Le cache sono state persistite con successo\" },\r\n \"Errors persisting modified caches\": { \"en-US\": \"Errors persisting modified caches\", \"it-IT\": \"Errori nella persistizione delle cache (esiste persistizione? boh...)\" },\r\n}","export class CacheInfos {\r\n constructor(public finalUrl: string, public cache: boolean, public cacheKey: string, public cacheTime: string, public cacheItem: any) { }\r\n}","// Angular\r\nimport { HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpParams, HttpProgressEvent, HttpResponse } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Es Faenza\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, delay, finalize, map, scan } from \"rxjs/operators\";\r\nimport { forkJoin, Observable, of, throwError } from \"rxjs\";\r\n\r\n// Chiamate ai Repository / tokens\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';\r\n\r\n// Modelli \r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\nimport { Download } from './models/Download';\r\nimport { Loc } from './httpservice.service.loc';\r\nimport { CacheInfos } from \"./models/CacheInfos\";\r\n\r\n/**\r\n * Dichiarazione della variabile globale dayjs. L'onere di \"crearla\" è affidato all'applicazione che utilizza questa libreria, \r\n * che dovrà importare lo script globale di dayjs nella CLI\r\n */\r\ndeclare var dayjs: any;\r\n\r\n/**\r\n * Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere \r\n * esteso/modificato il comportamento implementando la classe di \"hook\" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**\r\n */\r\n@Injectable()\r\nexport class HTTPService {\r\n\r\n /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */\r\n private callStatus: { [id: string]: boolean } = {};\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */\r\n private localStorageHttpCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching */\r\n private localStorageHttpTimedCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */\r\n private localStorageHttpCacheExpireKey = null;\r\n /** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */\r\n private me: { Idtenant: string, IdUser: string } = null;\r\n /** Indica che la cache a tempo dev'essere persistita il prima possibile */\r\n private PersistTimedCacheASAP: boolean = false;\r\n /** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */\r\n private PersistUntimedCacheASAP: boolean = false;\r\n\r\n /**\r\n * Implementazione della classe di estensione per collegare i comportamenti della libreria all'applicazione in cui è usata. \r\n * \r\n * Se è stato effettuato il provide della classe **HttpServiceExtensions** verrà usato quel provider, altrimenti verrà creata una nuova istanza di default\r\n */\r\n private ExtensionsImpl: HttpServiceExtensions;\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(\r\n @Inject(BACKEND_URL) private BACKEND_URL,\r\n private EXTENSION_CLASS: HttpServiceExtensions,\r\n @Optional() @Inject(HTTP_INVALIDATION) private HTTP_INVALIDATION,\r\n @Optional() @Inject(HTTP_LOCALE) private LOCALE,\r\n @Optional() @Inject(APP_NAME) private APP_NAME,\r\n @Optional() @Inject(CLIENT_CACHE_DURATION_S) private CLIENT_CACHE_DURATION_S,\r\n @Optional() @Inject(CACHE_BY_USER) private CACHE_BY_USER: boolean,\r\n @Optional() @Inject(DEBUG_MODE) private DEBUG_MODE: boolean,\r\n private http: HttpClient,\r\n private localStorage: PreferencesService\r\n ) {\r\n\r\n this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();\r\n this.me = this.ExtensionsImpl.retrieveIdentity();\r\n this.localStorageHttpCacheKey = (this.APP_NAME ?? \"APP\").replace(/\\s/g, '_') + \"_HttpCache\";\r\n this.localStorageHttpTimedCacheKey = (this.APP_NAME ?? \"APP\").replace(/\\s/g, '_') + \"_HttpTimedCache\";\r\n this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + \"_Expire\";\r\n\r\n this.adjustOldStorageSystem();\r\n\r\n if (this.untimedCacheExpired())\r\n this.resetHttpUntimedCacheStorage();\r\n }\r\n\r\n /**\r\n * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.\r\n * Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage\r\n */\r\n private async adjustOldStorageSystem() {\r\n var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);\r\n var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);\r\n if (!lsTimed && !lsUntimed)\r\n return;\r\n\r\n localStorage.removeItem(this.localStorageHttpTimedCacheKey);\r\n localStorage.removeItem(this.localStorageHttpCacheKey);\r\n lsTimed = lsTimed ? JSON.parse(lsTimed) : {};\r\n lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};\r\n\r\n await forkJoin([\r\n this.localStorage.store(this.localStorageHttpTimedCacheKey, lsTimed),\r\n this.localStorage.store(this.localStorageHttpCacheKey, lsUntimed)\r\n ]).toPromise();\r\n\r\n this.log(this.loc(\"Converted old storage system to new one\"));\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione \"#cache\"\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * @param {Function} errorCallback Callback chiamato in caso di errore\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public get<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true, errorCallback: Function = null): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n let cachedInfos = this.tryGetCacheInformations(url, params);\r\n if (cachedInfos.cache && cachedInfos.cacheItem) {\r\n this.log(this.loc(\"Result for\") + \" \" + url + \" \" + this.loc(\"retrieved from cache\"));\r\n return of<T>(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get<T>(cachedInfos.finalUrl, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n\r\n if (cachedInfos.cache) {\r\n this.cacheResponse(responseItem, cachedInfos);\r\n this.log(this.loc(\"Cached result for\") + \" \" + url);\r\n }\r\n\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n if (errorCallback) errorCallback();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione \"#cache\"\r\n * \r\n * Caso specifico di chiamata che deve restituire un Blob o un ArrayBuffer nativo da elaborare\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {\"arraybuffer\"| \"blob\"} type Tipo di ritorno richiesto\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * @param {Function} errorCallback Callback chiamato in caso di errore\r\n * \r\n * @returns {Observable<Blob | ArrayBuffer>} Observable che contiene il risultato della chiamata\r\n */\r\n public getRaw(url: string, params: HttpParams = null, type: \"arraybuffer\" | \"blob\" = \"arraybuffer\", transaction = \"\", succesfulResultMandatory: boolean = true, errorCallback = null): Observable<Blob | ArrayBuffer> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n let cachedInfos = this.tryGetCacheInformations(url, params);\r\n if (cachedInfos.cache && cachedInfos.cacheItem) {\r\n this.log(this.loc(\"Result for\") + \" \" + url + \" \" + this.loc(\"retrieved from cache\"));\r\n return of<any>(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: <any>type, headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((blob: Blob | ArrayBuffer) => {\r\n\r\n if (cachedInfos.cache) {\r\n this.cacheResponse(blob, cachedInfos);\r\n this.log(this.loc(\"Cached result for\") + \" \" + url);\r\n }\r\n\r\n return blob;\r\n }),\r\n catchError((err, caught): Observable<Blob> => {\r\n if (errorCallback) errorCallback();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public post<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.post<T>(url, bodyData, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n \r\n /**\r\n * Esecuzione di una DELETE HTTP\r\n *\r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public delete<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.delete<T>(url, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una PUT HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public put<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.put<T>(url, bodyData, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui bisogna anche inviare dei File\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {File[] | File} fileArrayOrFile Singolo file o lista di file da inviare. Il tipo **File** è quello nativo del Javascript\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public postwithFiles<T>(url: string, bodyData: any, fileArrayOrFile: File[] | File): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var formData = this.getFilesFormData(fileArrayOrFile);\r\n formData.append(\"body\", JSON.stringify(bodyData));\r\n\r\n var httpCall = this.http.post<T>(url, formData, { headers: this.getHeaders(null, true, null, null) });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => { return this.registerErrorAndReturnEmptyObservable(err, myGuid); }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {K} bodyData DTO per la chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public postGetFile<K>(url: string, bodyData: K, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true): void {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n this.http.post(url, bodyData, { headers: this.getHeaders(), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public getFile(url: string, params: HttpParams = null, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true): void {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n this.http.get(url, { params: params, headers: this.getHeaders(), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Download nativo di un file. Internamente utilizza il pattern **window.location.href = \"...\"**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n */\r\n public getFileNative(url: string, params: HttpParams = null): void {\r\n let finalUrl = url + (params ? \"?\" + params.toString() : \"\");\r\n window.location.href = finalUrl;\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET di un file che emette i vari eventi di progresso di download.\r\n * Utilizzarla per overridare la dialog nativa di progress del browser e sostituirla con qualcosa tipo quello che fa MEGA.\r\n * \r\n * In caso si voglia ottenere il risultato nativo del browser del download utilizzare **getFileNative(url, pars)**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * \r\n * @returns {Observable<Download>} Observable dei vari step di progresso del download\r\n */\r\n public getFileWithProgress(url: string, params: HttpParams = null, getFileCallback: (url: string, filename: string) => any): Observable<Download> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n return this.http.get(url, { responseType: 'blob', headers: this.getHeaders(), params: params, observe: 'events', reportProgress: true })\r\n .pipe(\r\n scan((previous: Download, event: HttpEvent<Blob>): Download => {\r\n\r\n if (this.isHttpProgressEvent(event)) {\r\n let progress = event.total ? (event.loaded > event.total ? 100 : Math.round((100 * event.loaded) / event.total)) : previous.progress;\r\n return { progress: progress, state: 'IN_PROGRESS', content: null }\r\n }\r\n\r\n if (this.isHttpResponse(event)) {\r\n if (event.body) {\r\n let cdisp = event.headers.get('content-disposition');\r\n let cdispFilename = cdisp.split(';')[1].split('filename')[1].split('=')[1].trim().replace(/\\\"/g, '');\r\n let retUrl = window.URL.createObjectURL(event.body);\r\n getFileCallback(retUrl, cdispFilename);\r\n }\r\n return { progress: 100, state: 'DONE', content: event.body }\r\n }\r\n\r\n return previous;\r\n }, { state: 'PENDING', progress: 0, content: null }),\r\n catchError((err, _): Observable<Download> => { return this.registerErrorAndReturnEmptyObservable(err, myGuid) }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpResponse<T>(event: HttpEvent<T>): event is HttpResponse<T> {\r\n return event.type === HttpEventType.Response\r\n }\r\n \r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpProgressEvent** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpProgressEvent(event: HttpEvent<unknown>): event is HttpProgressEvent {\r\n return event.type === HttpEventType.DownloadProgress || event.type === HttpEventType.UploadProgress\r\n }\r\n\r\n /**\r\n * Gestione dell'inizio di una chiamata ad un certo URL, viene generato un GUID da assegnarci, controllata la scadenza della cache, \r\n * e eventualmente loggato il fatto che sta per essere effettuata una chiamata HTTP\r\n * \r\n * @param {string} url Url a cui effettuare la chiamata\r\n * @returns {string} GUID assegnato alla chiamata\r\n */\r\n private defaultStartCall(url: string): string {\r\n let myGuid = this.getGUID();\r\n this.checkCacheInvalidation(url);\r\n this.callStatus[myGuid] = true;\r\n this.log(this.loc(\"Starting call\") + \" \" + myGuid + \" \" + this.loc(\"at URL\") + \": \" + url);\r\n return myGuid;\r\n }\r\n\r\n /**\r\n * Dato un url vengono controllate le informazioni su tutti gli url da invalidare collegati all'url chiamato e, se presenti in cache, invalidati\r\n * \r\n * @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare\r\n */\r\n private checkCacheInvalidation(url: string) {\r\n let cache = this.localStorage.retrieveLocal<any>(this.localStorageHttpCacheKey);\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n let cacheTime = tmp ? tmp[2] : null;\r\n let normalizedUrl = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\").replace(this.BACKEND_URL, \"\");\r\n\r\n if (!cache || !this.HTTP_INVALIDATION || !this.HTTP_INVALIDATION[normalizedUrl])\r\n return;\r\n\r\n let apisToInvalidate: string[] = this.HTTP_INVALIDATION[normalizedUrl];\r\n if (!apisToInvalidate || apisToInvalidate.length == 0)\r\n return;\r\n\r\n let keysToRemove: string[] = [];\r\n apisToInvalidate.forEach(api => {\r\n let cacheKey = this.makeCacheKey(api, null);\r\n for (let item in cache)\r\n if (item.indexOf(cacheKey) != -1)\r\n keysToRemove.push(item);\r\n });\r\n\r\n for (let i = 0; i < keysToRemove.length; i++) {\r\n let k = keysToRemove[i];\r\n this.log(this.loc(\"Invlalidating cache element\") + \" \" + k);\r\n delete cache[k];\r\n }\r\n\r\n this.localStorage.storeLocal(this.localStorageHttpCacheKey, cache);\r\n }\r\n\r\n /**\r\n * Finalizzazione di una chiamata\r\n * \r\n * @param {string} guid GUID collegato alla chiamata appena terminata\r\n * @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare\r\n * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni\r\n */\r\n private async tryFinalizeByGuid(guid: string, cacheInfos?: CacheInfos) {\r\n this.log(this.loc(\"Finalizing call\") + \" \" + guid + \" \" + this.loc(\"with status\") + \": \" + (this.callStatus[guid] ? this.loc('Success') : this.loc('Failure')));\r\n\r\n //Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false\r\n //e riiniziare a valutare errori di javashit\r\n if (this.callStatus[guid] && this.ExtensionsImpl.readRedirectionStatus())\r\n this.ExtensionsImpl.writeRedirectionStatus(false);\r\n\r\n //In ogni caso questa posso rimuoverla\r\n delete this.callStatus[guid];\r\n\r\n // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata\r\n if (cacheInfos && cacheInfos.cache) {\r\n this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;\r\n this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;\r\n this.log(this.loc(\"Marking cache to be persisted as soon as possible\"));\r\n }\r\n\r\n // Se una delle due cache devono essere aggiornate e non ho nessuna chiamata in corso effettuo l'aggiornamento in base a quale delle due va aggiornata\r\n // Alla fine di tutto marco come fatto\r\n if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0) {\r\n\r\n var toCall = [];\r\n let tmpKey = \"\";\r\n if (this.PersistTimedCacheASAP) {\r\n tmpKey = this.localStorageHttpTimedCacheKey;\r\n toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));\r\n }\r\n\r\n if (this.PersistUntimedCacheASAP) {\r\n tmpKey = this.localStorageHttpCacheKey;\r\n toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));\r\n }\r\n\r\n this.log(this.loc(\"No more HTTP calls to be executed, entering idle state and persisting modified caches...\"));\r\n var ret = await forkJoin(toCall).toPromise();\r\n if (ret)\r\n this.log(this.loc(\"Caches succesfully persisted\"));\r\n else\r\n this.log(this.loc(\"Errors persisting modified caches\"));\r\n this.PersistTimedCacheASAP = false;\r\n this.PersistUntimedCacheASAP = false;\r\n }\r\n }\r\n\r\n /**\r\n * Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente \r\n * ad un backend ASP.NET da cui si potrà accedere a Request.Form.Files\r\n * \r\n * @param {File | File[]} fileArrayOrFile Singolo File o lista di File. N.B: nella firma della funzione viene considerato **any** per fare test sulle proprietà \r\n * invece che fare test con l'**istanceof**\r\n * \r\n * @returns {FormData} FormData contenente tutti i file passati\r\n */\r\n private getFilesFormData(fileArrayOrFile: any): FormData {\r\n var formData: FormData = new FormData();\r\n\r\n if (fileArrayOrFile) {\r\n if (fileArrayOrFile.length)\r\n fileArrayOrFile.forEach(t => { formData.append(\"file\", t, t.name); });\r\n else if (fileArrayOrFile.name)\r\n formData.append(\"files\", fileArrayOrFile, fileArrayOrFile.name);\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Helper che in base ai parametri disponibili genera gli Header HTTP per la chiamata da effettuare\r\n * \r\n * @param {string} contentType Indica se aggiungere agli header \"Content-Type\", valorizzato al valore del parametro\r\n * @param {string} accept Indica se aggiungere agli header \"Accept\", valorizzato al valore del parametro\r\n * @param {boolean} includeAuth Indica se aggiungere agli header \"Authorization\", valorizzato col token recuperato dall'hook **retrieveAccessToken** della classe di estensione\r\n * @param {string} transactionId Indica se aggiungere agli header \"X-TX-ID\", valorizzato al valore del parametro\r\n * \r\n * @returns {HttpHeaders} Header generati in base ai parametri\r\n */\r\n private getHeaders(transactionId = \"\", includeAuth: boolean = true, contentType: string = \"application/json\", accept: string = \"application/json\"): HttpHeaders {\r\n var headers = new HttpHeaders();\r\n var authtoken = this.ExtensionsImpl.retrieveAccessToken();\r\n\r\n if (contentType)\r\n headers = headers.append(\"Content-Type\", contentType);\r\n\r\n if (transactionId)\r\n headers = headers.append(\"X-TX-ID\", transactionId);\r\n\r\n if (authtoken && includeAuth)\r\n headers = headers.append(\"Authorization\", \"Bearer \" + authtoken);\r\n\r\n if (accept)\r\n headers = headers.append(\"Accept\", \"application/json\");\r\n\r\n headers = headers.append(\"Accept-Language\", this.LOCALE ?? 'it-IT');\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gestione di default degli errori\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n */\r\n private async onError(res: HttpErrorResponse | TypeError, guid: string) {\r\n this.callStatus[guid] = false;\r\n\r\n //Mi assicuro che tutti gli errori durante il redirect al login vengano ignorati\r\n if (this.ExtensionsImpl.readRedirectingToLogin()) {\r\n this.log(this.loc(\"Redirecting to Login, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n\r\n //Mi assicuro che venga gestito un solo errore per volta\r\n if (this.ExtensionsImpl.readHandlingErrorStatus()) {\r\n this.log(this.loc(\"Already Handling an error, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n else\r\n this.ExtensionsImpl.writeHandlingErrorStatus(true);\r\n\r\n let finalError = \"\";\r\n let finalStatus = \"\";\r\n if (this.isTypeError(res)) {\r\n finalError = res.message;\r\n finalStatus = \"HTTP Service Internal Error\";\r\n }\r\n else if (this.isHttpErrorResponse(res)) {\r\n\r\n finalError = await this.getHttpErrorText(res.error);\r\n finalStatus = res.status.toString();\r\n\r\n switch (res.status) {\r\n // Unauthorized\r\n case 401:\r\n if (this.ExtensionsImpl.readRedirectionStatus()) {\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n return;\r\n }\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n // Handled exception\r\n case 400:\r\n // No Permissions\r\n case 403:\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n // Not found\r\n case 404:\r\n this.ExtensionsImpl.handleBlockingException(res.status, this.loc(\"Resource not found\"));\r\n return;\r\n // NotConfiguredException\r\n case 444:\r\n if (this.ExtensionsImpl.readRedirectionStatus())\r\n this.log(this.loc(\"Error 444 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n else if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n case 0:\r\n finalError = \"Server might be offline\" + (res.statusText ? \" (\" + res.statusText + \") \" : \"\");\r\n }\r\n }\r\n\r\n this.ExtensionsImpl.handleException(finalStatus, finalError);\r\n }\r\n\r\n /**\r\n * Dato un errore restituisce una promise con la stringa finale dell'errore in modo da poter fare un await\r\n * \r\n * @param {any} err Errore da controllare\r\n * \r\n * @returns {Promise<string>} Promise che risolve con la stringa finale dell'errore\r\n */\r\n private getHttpErrorText(err: any): Promise<string> {\r\n // Se ho un Blob può essere o un CallResult o suppongo una semplice stringa,\r\n // altrimenti potrebbe essere direttamente un CallResult, oppure una semplice stringa\r\n return new Promise<string>((resolve) => {\r\n if (err instanceof Blob) {\r\n let reader = new FileReader();\r\n reader.onload = (e: Event) => {\r\n let errMsg = (<any>e.target).result;\r\n let jsonerrMsg: any;\r\n try { jsonerrMsg = JSON.parse(errMsg); } catch (e) { }\r\n return resolve(jsonerrMsg && this.isCallResult(jsonerrMsg) ? jsonerrMsg.error.message : errMsg);\r\n };\r\n reader.readAsText(err)\r\n }\r\n else if (this.isCallResult(err))\r\n return resolve(err.error.message);\r\n else\r\n return resolve(err?.toString());\r\n });\r\n }\r\n\r\n /**\r\n * Riconosce se l'oggetto è di tipo **CallResult** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isCallResult(err: any): err is { error: { message: string } } {\r\n return !!err?.error?.message;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **HttpErrorResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isHttpErrorResponse(err: any): err is HttpErrorResponse {\r\n return err instanceof HttpErrorResponse;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **TypeError** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isTypeError(err: any): err is TypeError {\r\n return err.name == \"TypeError\";\r\n }\r\n\r\n /**\r\n * Come dice il nome, registra un errore e restituisce un Observable vuoto come risultato della chiamata\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n * @param {boolean} handleError Indica se gestire l'errore via libreria o se limitarsi a restituire l'Observable vuoto\r\n * \r\n * @returns {Observable<any>} Observable vuoto\r\n */\r\n private registerErrorAndReturnEmptyObservable(res: any, guid: string, handleError: boolean = true): Observable<any> {\r\n if (handleError)\r\n this.onError(res, guid);\r\n return new Observable(() => { });\r\n }\r\n\r\n /**\r\n * Dato un Url e dei parametri cerca di recuperare l'eventuale oggetto già salvato in cache con le informazioni base della cache stessa\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)\r\n * \r\n * @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): CacheInfos {\r\n\r\n let cachingKey = null, cacheTime = null, cache = null, item = null;\r\n let useCaching = !!(/#cache/gi.exec(url));\r\n\r\n if (useCaching) {\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n cacheTime = tmp ? tmp[2] : null;\r\n\r\n url = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n if (this.untimedCacheExpired() && !cacheTime)\r\n this.resetHttpUntimedCacheStorage();\r\n\r\n cachingKey = this.makeCacheKey(url, params);\r\n let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage.retrieveLocal(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {\r\n // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco \r\n // dalle proprietà interne che gli ho aggiunto per controllarne la scadenza\r\n if (cacheTime)\r\n delete cache[cachingKey].__expire;\r\n\r\n item = cache[cachingKey]\r\n }\r\n }\r\n\r\n return new CacheInfos(url, useCaching, cachingKey, cacheTime, item);\r\n }\r\n\r\n /**\r\n * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**\r\n * \r\n * @param {T} item Oggetto da inserire nella cache\r\n * @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: CacheInfos): void {\r\n let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage.retrieveLocal(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n cache[cacheInfos.cacheKey] = item;\r\n if (cacheInfos.cacheTime)\r\n cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, \"seconds\");\r\n\r\n this.localStorage.storeLocal(cacheKey, cache);\r\n }\r\n\r\n /**\r\n * Controlla se la cache per le chiamate senza expire time è scaduta\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private untimedCacheExpired(): boolean {\r\n let expire = JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));\r\n return !expire || expire && dayjs(expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Controlla se la cache per una chiamata che ha un tempo di vita ben definito è scaduta o meno\r\n * \r\n * @param {any} item Oggetto recuperato dalla cache a cui ho aggiunto la chiave interna __expire\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private timedCacheItemExpired(item: any): boolean {\r\n return dayjs(item.__expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Ripulisce la cache e imposta la prossima scadenza ad adesso + **CLIENT_CACHE_DURATION_S** (token valorizzato in fase di configurazione dalla proprietà **clientCacheDurationS** della classe **HttpServiceModuleConfig**)\r\n */\r\n public resetHttpUntimedCacheStorage() {\r\n this.localStorage.store(this.localStorageHttpCacheKey, {}).subscribe();\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, \"second\")));\r\n }\r\n\r\n /**\r\n * Ripulisce la cache delle chiamate con un tempo di expire definito\r\n */\r\n public resetHttpTimedCacheStorage() {\r\n this.localStorage.store(this.localStorageHttpTimedCacheKey, {});\r\n }\r\n\r\n /**\r\n * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * \r\n * @returns {string} Chiave che rappresenta in maniera univoca la chiamata\r\n */\r\n private makeCacheKey(url: string, params: HttpParams): string {\r\n let authKeyPart = (this.me ? this.me.Idtenant : \"\") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : \"\");\r\n let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev: any, next: any) => prev + \",\" + next + '=' + params.get(next), \"\") : \"\";\r\n return authKeyPart + \"_\" + url.substring(url.indexOf(\"api\") + 4) + \"?\" + paramsKeyPart;\r\n }\r\n\r\n /**\r\n * Generazione GUID\r\n * \r\n * @returns {string} Nuovo GUID generato in maniera casuale\r\n */\r\n private getGUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per scrivere log a console qualora **DEBUG_MODE** risultasse **true**\r\n * \r\n * @param {string} message Messaggio di log\r\n */\r\n private log(message: string): void {\r\n if (this.DEBUG_MODE)\r\n console.log(\"@httpservice: \" + message)\r\n }\r\n\r\n /**\r\n * Helper per la localizzazione dei messaggi\r\n * \r\n * @param {string} message Messaggio da localizzare\r\n * \r\n * @returns {string} Messaggio localizzato\r\n */\r\n private loc(message: string): string {\r\n if (!Loc[message]) {\r\n console.warn(\"Untranslated message: \" + message)\r\n return \"\";\r\n }\r\n return Loc[message][this.LOCALE];\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HttpServiceModuleConfig } from './config/HttpServiceModuleConfig';\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';\r\nimport { HTTPService } from './httpservice.service';\r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\n\r\n@NgModule()\r\nexport class HttpserviceModule {\r\n static forRoot(config?: HttpServiceModuleConfig): ModuleWithProviders<HttpserviceModule> {\r\n return {\r\n ngModule: HttpserviceModule,\r\n providers: [\r\n HTTPService,\r\n HttpServiceExtensions,\r\n { provide: HTTP_INVALIDATION, useValue: config?.httpInvalidation },\r\n { provide: CLIENT_CACHE_DURATION_S, useValue: config?.clientCacheDurationS },\r\n { provide: BACKEND_URL, useValue: config?.backendUrl },\r\n { provide: HTTP_LOCALE, useValue: config?.httpLocale || 'it-IT' },\r\n { provide: APP_NAME, useValue: config?.appName },\r\n { provide: CACHE_BY_USER, useValue: config?.cacheByUser },\r\n { provide: DEBUG_MODE, useValue: config?.debugMode }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Classe di configurazione per il Modulo della libreria\r\n */\r\nexport class HttpServiceModuleConfig {\r\n //mandatory\r\n\r\n /**\r\n * Indica l'URL del backend a cui inviare le richieste\r\n */\r\n backendUrl : string;\r\n\r\n //optionals\r\n /**\r\n * Indica quali chiamate vengono invalidate da quali chiamate quando viene utilizzata una cache sulle risposte\r\n */\r\n httpInvalidation? : Record<string, string[]>;\r\n\r\n /**\r\n * Indica la durata della cache lato client (Browser), se utilizzata\r\n */\r\n clientCacheDurationS? : number;\r\n\r\n /**\r\n * Locale della libreria utilizzato per la localizzazione dei messaggi e per il default all'Header \"Accept-Language\"\r\n */\r\n httpLocale? : string\r\n\r\n /**\r\n * Nome dell'applicazione che sta utilizzando la libreria, utilizzato per creare chiavi di cache specifiche per app\r\n */\r\n appName? : string;\r\n\r\n /**\r\n * Indica se la cache deve basarsi non solo sull'applicazione ma anche sull'utente connesso\r\n */\r\n cacheByUser? : boolean;\r\n\r\n /**\r\n * Abilita o disabilità la modalità di debug (Log a console)\r\n */\r\n debugMode? : boolean;\r\n}","export class Download {\r\n state: 'PENDING' | 'IN_PROGRESS' | 'DONE'\r\n progress: number\r\n content: Blob | null\r\n }","/*\r\n * Public API Surface of httpservice\r\n */\r\n\r\nexport * from './lib/httpservice.service';\r\nexport * from './lib/httpservice.module';\r\nexport * from './lib/config/HttpServiceModuleConfig';\r\nexport * from './lib/config/IHttpServiceExtensions';\r\nexport * from './lib/config/HttpServiceExtensions';\r\nexport * from './lib/models/Download';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {APP_NAME as ɵe,BACKEND_URL as ɵc,CACHE_BY_USER as ɵf,CLIENT_CACHE_DURATION_S as ɵb,DEBUG_MODE as ɵg,HTTP_INVALIDATION as ɵa,HTTP_LOCALE as ɵd} from './lib/tokens';"],"names":[],"mappings":";;;;;;;AAEA;;;MAGa,iBAAiB,GAA6C,IAAI,cAAc,CAA2B,mBAAmB,EAAE;AAE7I;;;MAGa,uBAAuB,GAA2B,IAAI,cAAc,CAAS,yBAAyB,EAAE;AAErH;;;MAGa,WAAW,GAA2B,IAAI,cAAc,CAAS,aAAa,EAAE;AAE7F;;;MAGa,WAAW,GAA2B,IAAI,cAAc,CAAS,aAAa,EAAE;AAE7F;;;MAGa,QAAQ,GAA2B,IAAI,cAAc,CAAS,UAAU,EAAE;AAEvF;;;MAGa,aAAa,GAA4B,IAAI,cAAc,CAAU,eAAe,EAAE;AAEnG;;;MAGa,UAAU,GAA4B,IAAI,cAAc,CAAU,YAAY;;ACjC3F;;;;MAIa,qBAAqB;;;;IAKvB,mBAAmB;QACtB,OAAO,EAAE,CAAC;KACb;;;;IAKM,gBAAgB;QACnB,OAAO,IAAI,CAAC;KACf;;;;;IAMM,sBAAsB;QACzB,OAAO,KAAK,CAAC;KAChB;;;;IAKM,uBAAuB,CAAC,MAAe;KAC7C;;;;IAKM,eAAe;KACrB;;;;;IAMM,uBAAuB;QAC1B,OAAO,KAAK,CAAC;KAChB;;;;IAKM,wBAAwB,CAAC,MAAe;KAC9C;;;;;IAMM,qBAAqB;QACxB,OAAO,KAAK,CAAC;KAChB;;;;IAKM,sBAAsB,CAAC,MAAe;KAC5C;;;;;IAMM,4BAA4B;QAC/B,OAAO,KAAK,CAAC;KAChB;;;;IAKM,uBAAuB,CAAC,MAAc,EAAE,IAAY;QACvD,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;KAC1E;;;;IAKM,eAAe,CAAC,MAAuB,EAAE,IAAY;QACxD,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;KACvD;;;AC1FL;;;AAGO,MAAM,GAAG,GAAE;IACd,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG;IAClE,sBAAsB,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,wBAAwB,GAAG;IAC/F,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,8BAA8B,GAAG;IAC/F,eAAe,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG;IAC7E,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG;IACpD,6BAA6B,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,+BAA+B,GAAG;IACpH,iBAAiB,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,GAAG;IACjF,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG;IAChE,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG;IACxD,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG;IACzD,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,GAAG;IACzF,wDAAwD,EAAE,EAAE,OAAO,EAAE,wDAAwD,EAAE,OAAO,EAAE,+CAA+C,GAAG;IAC1L,sBAAsB,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,GAAG;IAC7F,mDAAmD,EAAE,EAAE,OAAO,EAAE,mDAAmD,EAAE,OAAO,EAAE,sDAAsD,GAAG;IACvL,wDAAwD,EAAE,EAAE,OAAO,EAAE,wDAAwD,EAAE,OAAO,EAAE,yEAAyE,GAAG;IACpN,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,EAAE;IACxF,oBAAoB,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACvF,yCAAyC,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,OAAO,EAAE,2DAA2D,EAAE;IACvK,mDAAmD,EAAE,EAAE,OAAO,EAAE,mDAAmD,EAAE,OAAO,EAAE,8CAA8C,EAAE;IAC9K,uFAAuF,EAAE,EAAE,OAAO,EAAE,uFAAuF,EAAE,OAAO,EAAE,oGAAoG,EAAE;IAC5S,8BAA8B,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,OAAO,EAAE,6CAA6C,EAAE;IACnI,mCAAmC,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,OAAO,EAAE,uEAAuE,EAAE;CAC1K;;MC1BY,UAAU;IACnB,YAAmB,QAAgB,EAAS,KAAc,EAAS,QAAgB,EAAS,SAAiB,EAAS,SAAc;QAAjH,aAAQ,GAAR,QAAQ,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAS;QAAS,aAAQ,GAAR,QAAQ,CAAQ;QAAS,cAAS,GAAT,SAAS,CAAQ;QAAS,cAAS,GAAT,SAAS,CAAK;KAAK;;;ACyB7I;;;;MAKa,WAAW;;;;IA2BtB,YAC+B,WAAW,EAChC,eAAsC,EACC,iBAAiB,EACvB,MAAM,EACT,QAAQ,EACO,uBAAuB,EACjC,aAAsB,EACzB,UAAmB,EACnD,IAAgB,EAChB,YAAgC;;QATX,gBAAW,GAAX,WAAW,CAAA;QAChC,oBAAe,GAAf,eAAe,CAAuB;QACC,sBAAiB,GAAjB,iBAAiB,CAAA;QACvB,WAAM,GAAN,MAAM,CAAA;QACT,aAAQ,GAAR,QAAQ,CAAA;QACO,4BAAuB,GAAvB,uBAAuB,CAAA;QACjC,kBAAa,GAAb,aAAa,CAAS;QACzB,eAAU,GAAV,UAAU,CAAS;QACnD,SAAI,GAAJ,IAAI,CAAY;QAChB,iBAAY,GAAZ,YAAY,CAAoB;;QAlClC,eAAU,GAA8B,EAAE,CAAC;;QAE3C,6BAAwB,GAAG,IAAI,CAAC;;QAEhC,kCAA6B,GAAG,IAAI,CAAC;;QAErC,mCAA8B,GAAG,IAAI,CAAC;;QAEtC,OAAE,GAAyC,IAAI,CAAC;;QAEhD,0BAAqB,GAAY,KAAK,CAAC;;QAEvC,4BAAuB,GAAY,KAAK,CAAC;QAyB/C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,qBAAqB,EAAE,CAAC;QAC1E,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACjD,IAAI,CAAC,wBAAwB,GAAG,OAAC,IAAI,CAAC,QAAQ,mCAAI,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC;QAC5F,IAAI,CAAC,6BAA6B,GAAG,OAAC,IAAI,CAAC,QAAQ,mCAAI,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC;QACtG,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAEhF,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,IAAI,CAAC,4BAA4B,EAAE,CAAC;KACvC;;;;;IAMa,sBAAsB;;YAClC,IAAI,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACvE,IAAI,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACpE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;gBACxB,OAAO;YAET,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC5D,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvD,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC7C,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YAEnD,MAAM,QAAQ,CAAC;gBACb,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,OAAO,CAAC;gBACpE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC;aAClE,CAAC,CAAC,SAAS,EAAE,CAAC;YAEf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;SAC/D;KAAA;;;;;;;;;;;;;IAcM,GAAG,CAAI,GAAW,EAAE,SAAqB,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,2BAAoC,IAAI,EAAE,gBAA0B,IAAI;QAC9I,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE;YAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,CAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACzG;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjH,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,GAAM;YACT,IAAI,YAAY,GAAM,GAAG,CAAC;YAE1B,IAAI,WAAW,CAAC,KAAK,EAAE;gBACrB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;aACrD;YAED,OAAO,YAAY,CAAC;SACrB,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,IAAI,aAAa;gBAAE,aAAa,EAAE,CAAC;YACnC,OAAO,CAAC,wBAAwB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;SAC9G,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CACjE,CAAC;KACH;;;;;;;;;;;;;;;;IAiBM,MAAM,CAAC,GAAW,EAAE,SAAqB,IAAI,EAAE,OAA+B,aAAa,EAAE,WAAW,GAAG,EAAE,EAAE,2BAAoC,IAAI,EAAE,aAAa,GAAG,IAAI;QAClL,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE;YAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,CAAM,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAC3G;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvI,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,IAAwB;YAE3B,IAAI,WAAW,CAAC,KAAK,EAAE;gBACrB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;aACrD;YAED,OAAO,IAAI,CAAC;SACb,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,IAAI,aAAa;gBAAE,aAAa,EAAE,CAAC;YACnC,OAAO,CAAC,wBAAwB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;SAC9G,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CACjE,CAAC;KACH;;;;;;;;;;;;;IAcM,IAAI,CAAI,GAAW,EAAE,QAAa,EAAE,SAAqB,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,2BAAoC,IAAI;QAC9H,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3G,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,GAAM;YACT,IAAI,YAAY,GAAM,GAAG,CAAC;YAC1B,OAAO,YAAY,CAAC;SACrB,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,OAAO,CAAC,wBAAwB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;SAC9G,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;KACH;;;;;;;;;;;;IAaM,MAAM,CAAI,GAAW,EAAE,SAAqB,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,2BAAoC,IAAI;QACjH,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAEnG,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,GAAM;YACT,IAAI,YAAY,GAAM,GAAG,CAAC;YAC1B,OAAO,YAAY,CAAC;SACrB,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,OAAO,CAAC,wBAAwB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;SAC9G,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;KACH;;;;;;;;;;;;;IAcM,GAAG,CAAI,GAAW,EAAE,QAAa,EAAE,SAAqB,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,2BAAoC,IAAI;QAC7H,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE1G,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,GAAM;YACT,IAAI,YAAY,GAAM,GAAG,CAAC;YAC1B,OAAO,YAAY,CAAC;SACrB,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,OAAO,CAAC,wBAAwB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;SAC9G,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;KACH;;;;;;;;;;;;IAaM,aAAa,CAAI,GAAW,EAAE,QAAa,EAAE,eAA8B;QAChF,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAElD,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEtG,OAAO,QAAQ,CAAC,IAAI,CAClB,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM,OAAsB,OAAO,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAC/G,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;KACH;;;;;;;;;;;;;;IAeM,WAAW,CAAI,GAAW,EAAE,QAAW,EAAE,QAAgB,EAAE,eAAuD,EAAE,eAA0B,IAAI,EAAE,cAAuB,IAAI;QACpL,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC3G,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,IAAI,YAAY,IAAI,CAAC,WAAW;gBAAE,YAAY,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;SAC7E,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC,SAAS,CAAC,CAAC,QAA4B;;YACvC,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,EAAE,2BAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,2CAAG,KAAK,CAAC,UAAU,EAAE,CAAC,2CAAG,KAAK,CAAC,GAAG,EAAE,CAAC,2CAAG,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAEpI,eAAe,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,YAAY;gBAAE,YAAY,EAAE,CAAC;SAClC,CAAC,CAAC;KACJ;;;;;;;;;;;;;;IAeM,OAAO,CAAC,GAAW,EAAE,SAAqB,IAAI,EAAE,QAAgB,EAAE,eAAuD,EAAE,eAA0B,IAAI,EAAE,cAAuB,IAAI;QAC3L,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAChH,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM;YACrB,IAAI,YAAY,IAAI,CAAC,WAAW;gBAAE,YAAY,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;SAC7E,CAAC,EACF,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC,SAAS,CAAC,CAAC,QAA4B;;YACvC,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,EAAE,2BAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,2CAAG,KAAK,CAAC,UAAU,EAAE,CAAC,2CAAG,KAAK,CAAC,GAAG,EAAE,CAAC,2CAAG,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAEpI,eAAe,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,YAAY;gBAAE,YAAY,EAAE,CAAC;SAClC,CAAC,CAAC;KACJ;;;;;;;IAQM,aAAa,CAAC,GAAW,EAAE,SAAqB,IAAI;QACzD,IAAI,QAAQ,GAAG,GAAG,IAAI,MAAM,GAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC;KACjC;;;;;;;;;;;;;IAcM,mBAAmB,CAAC,GAAW,EAAE,SAAqB,IAAI,EAAE,eAAuD;QACxH,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;aACrI,IAAI,CACH,IAAI,CAAC,CAAC,QAAkB,EAAE,KAAsB;YAE9C,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBACnC,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC;gBACrI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;aACnE;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;gBAC9B,IAAI,KAAK,CAAC,IAAI,EAAE;oBACd,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;oBACrD,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACrG,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpD,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;iBACxC;gBACD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;aAC7D;YAED,OAAO,QAAQ,CAAC;SACjB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EACpD,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,OAA6B,OAAO,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA,EAAE,CAAC,EAChH,QAAQ,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;KACL;;;;IAKQ,cAAc,CAAI,KAAmB;QAC5C,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,CAAA;KAC7C;;;;IAKO,mBAAmB,CAAC,KAAyB;QACnD,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,cAAc,CAAA;KACpG;;;;;;;;IASO,gBAAgB,CAAC,GAAW;QAClC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC;KACf;;;;;;IAOO,sBAAsB,CAAC,GAAW;QACxC,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChF,IAAI,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACpC,IAAI,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAEjH,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;YAC7E,OAAO;QAET,IAAI,gBAAgB,GAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC;YACnD,OAAO;QAET,IAAI,YAAY,GAAa,EAAE,CAAC;QAChC,gBAAgB,CAAC,OAAO,CAAC,GAAG;YAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5C,KAAK,IAAI,IAAI,IAAI,KAAK;gBACpB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B,CAAC,CAAC;QAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;QAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;KACpE;;;;;;;;IASa,iBAAiB,CAAC,IAAY,EAAE,UAAuB;;YACnE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;YAIhK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;gBACtE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;;YAGpD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;;YAG7B,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE;gBAClC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;gBAClF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,qBAAqB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBACnF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;aACzE;;;YAID,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,uBAAuB,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;gBAE5G,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,qBAAqB,EAAE;oBAC9B,MAAM,GAAG,IAAI,CAAC,6BAA6B,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACvF;gBAED,IAAI,IAAI,CAAC,uBAAuB,EAAE;oBAChC,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACvF;gBAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC,CAAC;gBAC/G,IAAI,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC7C,IAAI,GAAG;oBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;;oBAEnD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;gBACnC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;aACtC;SACF;KAAA;;;;;;;;;;IAWO,gBAAgB,CAAC,eAAoB;QAC3C,IAAI,QAAQ,GAAa,IAAI,QAAQ,EAAE,CAAC;QAExC,IAAI,eAAe,EAAE;YACnB,IAAI,eAAe,CAAC,MAAM;gBACxB,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;iBACnE,IAAI,eAAe,CAAC,IAAI;gBAC3B,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;SACnE;QAED,OAAO,QAAQ,CAAC;KACjB;;;;;;;;;;;IAYO,UAAU,CAAC,aAAa,GAAG,EAAE,EAAE,cAAuB,IAAI,EAAE,cAAsB,kBAAkB,EAAE,SAAiB,kBAAkB;;QAC/I,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QAE1D,IAAI,WAAW;YACb,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAExD,IAAI,aAAa;YACf,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAErD,IAAI,SAAS,IAAI,WAAW;YAC1B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;QAEnE,IAAI,MAAM;YACR,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAEzD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,QAAE,IAAI,CAAC,MAAM,mCAAI,OAAO,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;KAChB;;;;;;;IAQa,OAAO,CAAC,GAAkC,EAAE,IAAY;;YACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;YAG9B,IAAI,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE,EAAE;gBAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mDAAmD,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;gBACrF,OAAO;aACR;;YAGD,IAAI,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,EAAE;gBACjD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,wDAAwD,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;gBAC1F,OAAO;aACR;;gBAEC,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAErD,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;gBACzB,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;gBACzB,WAAW,GAAG,6BAA6B,CAAC;aAC7C;iBACI,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;gBAEtC,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACpD,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAEpC,QAAQ,GAAG,CAAC,MAAM;;oBAEhB,KAAK,GAAG;wBACN,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,EAAE;4BAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;4BAChI,OAAO;yBACR;wBACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;wBAC/F,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;wBACjD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;wBAClD,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;wBACtC,OAAO;;oBAET,KAAK,GAAG,CAAC;;oBAET,KAAK,GAAG;wBACN,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;wBACpE,OAAO;;oBAET,KAAK,GAAG;wBACN,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;wBACxF,OAAO;;oBAET,KAAK,GAAG;wBACN,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;4BAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;6BAC7H,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,4BAA4B,EAAE;4BAC1D,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;wBACtE,OAAO;oBACT,KAAK,CAAC;wBACJ,UAAU,GAAG,yBAAyB,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;iBACjG;aACF;YAED,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;SAC9D;KAAA;;;;;;;;IASO,gBAAgB,CAAC,GAAQ;;;QAG/B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO;YACjC,IAAI,GAAG,YAAY,IAAI,EAAE;gBACvB,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAQ;oBACvB,IAAI,MAAM,GAAS,CAAC,CAAC,MAAO,CAAC,MAAM,CAAC;oBACpC,IAAI,UAAe,CAAC;oBACpB,IAAI;wBAAE,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;qBAAE;oBAAC,OAAO,CAAC,EAAE,GAAG;oBACtD,OAAO,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;iBACjG,CAAC;gBACF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;aACvB;iBACI,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;;gBAElC,OAAO,OAAO,CAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,GAAG,CAAC;SACnC,CAAC,CAAC;KACJ;;;;;;IAOO,YAAY,CAAC,GAAQ;;QAC3B,OAAO,CAAC,QAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,KAAK,0CAAE,OAAO,CAAA,CAAC;KAC9B;;;;;;IAOO,mBAAmB,CAAC,GAAQ;QAClC,OAAO,GAAG,YAAY,iBAAiB,CAAC;KACzC;;;;;;IAOO,WAAW,CAAC,GAAQ;QAC1B,OAAO,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;KAChC;;;;;;;;;;IAWO,qCAAqC,CAAC,GAAQ,EAAE,IAAY,EAAE,cAAuB,IAAI;QAC/F,IAAI,WAAW;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;KAClC;;;;;;;;;IAUO,uBAAuB,CAAC,GAAW,EAAE,MAAkB;QAE7D,IAAI,UAAU,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;QACnE,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,UAAU,EAAE;YACd,IAAI,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAEhC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS;gBAC1C,IAAI,CAAC,4BAA4B,EAAE,CAAC;YAEtC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,wBAAwB,CAAA;YAC7F,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;YAEnC,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE;;;gBAGhF,IAAI,SAAS;oBACX,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC;gBAEpC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;aACzB;SACF;QAED,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;KACrE;;;;;;;IAQO,aAAa,CAAI,IAAO,EAAE,UAAsB;QACtD,IAAI,QAAQ,GAAG,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,wBAAwB,CAAA;QACxG,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;QAEnC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAClC,IAAI,UAAU,CAAC,SAAS;YACtB,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAErF,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC/C;;;;;;IAOO,mBAAmB;QACzB,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;KACrD;;;;;;;;IASO,qBAAqB,CAAC,IAAS;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC;KACvC;;;;IAKM,4BAA4B;;QACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACvE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,OAAC,IAAI,CAAC,uBAAuB,mCAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KACxI;;;;IAKM,0BAA0B;QAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;KACjE;;;;;;;;;IAUQ,YAAY,CAAC,GAAW,EAAE,MAAkB;QACnD,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5G,IAAI,aAAa,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,IAAS,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QAC7J,OAAO,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC;KACxF;;;;;;IAOO,OAAO;QACb,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;YACxE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACvB,CAAC,CAAC;KACJ;;;;;;IAOO,GAAG,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,UAAU;YACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,CAAA;KAC1C;;;;;;;;IASO,GAAG,CAAC,OAAe;QACzB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,CAAA;YAChD,OAAO,EAAE,CAAC;SACX;QACD,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAClC;;;YAt0BF,UAAU;;;4CA6BN,MAAM,SAAC,WAAW;YA5Cd,qBAAqB;4CA8CzB,QAAQ,YAAI,MAAM,SAAC,iBAAiB;4CACpC,QAAQ,YAAI,MAAM,SAAC,WAAW;4CAC9B,QAAQ,YAAI,MAAM,SAAC,QAAQ;4CAC3B,QAAQ,YAAI,MAAM,SAAC,uBAAuB;0CAC1C,QAAQ,YAAI,MAAM,SAAC,aAAa;0CAChC,QAAQ,YAAI,MAAM,SAAC,UAAU;YAjEzB,UAAU;YAIV,kBAAkB;;;MCEd,iBAAiB;IAC1B,OAAO,OAAO,CAAC,MAAgC;QAC3C,OAAO;YACH,QAAQ,EAAE,iBAAiB;YAC3B,SAAS,EAAE;gBACP,WAAW;gBACX,qBAAqB;gBACrB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,EAAE;gBAClE,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,EAAE;gBAC5E,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,EAAE;gBACtD,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,OAAO,EAAE;gBACjE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE;gBAChD,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE;gBACzD,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EAAE;aACvD;SACJ,CAAC;KACL;;;YAjBJ,QAAQ;;;ACNT;;;MAGa,uBAAuB;;;MCHvB,QAAQ;;;ACArB;;;;ACAA;;;;;;"}
1
+ {"version":3,"file":"esfaenza-httpservice.js","sources":["../../../projects/httpservice/src/lib/tokens.ts","../../../projects/httpservice/src/lib/config/HttpServiceExtensions.ts","../../../projects/httpservice/src/lib/httpservice.service.loc.ts","../../../projects/httpservice/src/lib/models/CacheInfos.ts","../../../projects/httpservice/src/lib/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.ts","../../../projects/httpservice/src/lib/models/Download.ts","../../../projects/httpservice/src/public-api.ts","../../../projects/httpservice/src/esfaenza-httpservice.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Dizionario di invalidazioni delle chiamate HTTP\r\n */\r\nexport const HTTP_INVALIDATION: InjectionToken<Record<string, string[]>> = new InjectionToken<Record<string, string[]>>('HTTP_INVALIDATION');\r\n\r\n/**\r\n * Durata della cache lato libreria dopo il quale la cache verrà ripulita\r\n */\r\nexport const CLIENT_CACHE_DURATION_S: InjectionToken<number> = new InjectionToken<number>('CLIENT_CACHE_DURATION_S');\r\n\r\n/**\r\n * URL del Backend a cui inviare le chiamate\r\n */\r\nexport const BACKEND_URL: InjectionToken<string> = new InjectionToken<string>('BACKEND_URL');\r\n\r\n/**\r\n * Locale della libreria per messaggi d'errore ed Header di default \"Accept-Language\". Sono supportati \"it-IT\" ed \"en-US\"\r\n */\r\nexport const HTTP_LOCALE: InjectionToken<string> = new InjectionToken<string>('HTTP_LOCALE');\r\n\r\n/**\r\n * Nome dell'APP utilizzato per creare le chiavi delle cache specifiche per l'applicazione corrente\r\n */\r\nexport const APP_NAME: InjectionToken<string> = new InjectionToken<string>('APP_NAME');\r\n\r\n/**\r\n * Indica se utilizzare l'identificativo utente nella cache\r\n */\r\nexport const CACHE_BY_USER: InjectionToken<boolean> = new InjectionToken<boolean>('CACHE_BY_USER');\r\n\r\n/**\r\n * Indica se fare log nella console ad ogni azione significativa\r\n */\r\nexport const DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DEBUG_MODE');","import { IHttpServiceExtensions } from './IHttpServiceExtensions';\r\n\r\n/**\r\n * Classe d'estensione che permette di modificare il comportamento della libreria negli hook definiti da interfaccia, in modo da poterla adattare \r\n * con un certo grado di customizzazione a qualsiasi struttura di frontend\r\n */\r\nexport class HttpServiceExtensions implements IHttpServiceExtensions {\r\n\r\n /**\r\n * Hook per recuperare l'access token con cui effettuare le chiamate HTTP\r\n */\r\n public retrieveAccessToken(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Hook per recuperare l'Identity corrente in un oggetto generico con le informazioni di User e Tenant\r\n */\r\n public retrieveIdentity(): { IdUser: string, Idtenant: string } {\r\n return null;\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già venendo ridirezionati al login, in modo da non tentare di effettuare \r\n * N redirect contemporaneamente qualora molte API fallissero allo stesso tempo nell'autenticazione\r\n */\r\n public readRedirectingToLogin(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo effettuando un redirect al login o meno\r\n */\r\n public writeRedirectingToLogin(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per effettuare il redirect al login\r\n */\r\n public redirectToLogin(): void {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un errore, in modo da non tentare di gestire \r\n * N errori contemporaneamente qualora molte API fallissero allo stesso tempo\r\n */\r\n public readHandlingErrorStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un errore o meno\r\n */\r\n public writeHandlingErrorStatus(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un redirect, in modo da non tentare di gestire \r\n * N redirect contemporaneamente qualora molte API lo richiedessero allo stesso tempo\r\n */\r\n public readRedirectionStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un redirect o meno\r\n */\r\n public writeRedirectionStatus(status: boolean): void {\r\n }\r\n\r\n /**\r\n * Hook per indicare se l'applicazione può gestire eccezioni del tipo \"NotConfigured\" (444). Qualora l'applicazione che lo implementa dichiari di gestirle verrà chiamata \r\n * la funzione **handleBlockingException** per ognuno di questi errori\r\n */\r\n public handleNotConfiguredException(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore bloccante per l'operazione attuale, ma non fatale (Generalmente gestibile da dialog di avviso)\r\n */\r\n public handleBlockingException(status: number, text: string) {\r\n console.error(\"ESHttpError Blocking Exception \" + status + \" \" + text);\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore fatale (Generalmente gestibile tramite navigazione a una pagina di errore custom per l'applicativo)\r\n */\r\n public handleException(status: number | string, text: string) {\r\n console.error(\"ESHttpError \" + status + \" \" + text);\r\n }\r\n}","/**\r\n * Oggetto statico di localizzazione per i messaggi\r\n */\r\nexport const Loc ={\r\n \"Result for\": { \"en-US\": \"Result for\", \"it-IT\": \"Risultato per\", },\r\n \"retrieved from cache\": { \"en-US\": \"retrieved from cache\", \"it-IT\": \"recuperato dalla cache\", },\r\n \"Cached result for\": { \"en-US\": \"Cached result for\", \"it-IT\": \"Messo in cache risultato per\", },\r\n \"Starting call\": { \"en-US\": \"Starting call\", \"it-IT\": \"Inizio la chiamata\", },\r\n \"at URL\": { \"en-US\": \"at URL\", \"it-IT\": \"all'URL\", },\r\n \"Invlalidating cache element\": { \"en-US\": \"Invlalidating cache element\", \"it-IT\": \"Invalido elemento della cache\", },\r\n \"Finalizing call\": { \"en-US\": \"Finalizing call\", \"it-IT\": \"Finalizzo chiamata\", },\r\n \"with status\": { \"en-US\": \"with status\", \"it-IT\": \"con stato\", },\r\n \"Success\": { \"en-US\": \"Success\", \"it-IT\": \"Successso\", },\r\n \"Failure\": { \"en-US\": \"Failure\", \"it-IT\": \"Fallimento\", },\r\n \"Error 401 on call\": { \"en-US\": \"Error 401 on call\", \"it-IT\": \"Errore 401 su chiamata\", },\r\n \"with redirect already in progress. Ignoring this event\": { \"en-US\": \"with redirect already in progress. Ignoring this event\", \"it-IT\": \"con redirezione già in corso. Ignoro l'evento\", },\r\n \"redirecting to login\": { \"en-US\": \"redirecting to login\", \"it-IT\": \"redireziono al login\", },\r\n \"Redirecting to Login, ignoring HTTP error on call\": { \"en-US\": \"Redirecting to Login, ignoring HTTP error on call\", \"it-IT\": \"Redireziono al login ignorando errori sulla chiamata\", },\r\n \"Already Handling an error, ignoring HTTP error on call\": { \"en-US\": \"Already Handling an error, ignoring HTTP error on call\", \"it-IT\": \"sto già gestendo un errore, ignoro quello corrente per la chiamata HTTP\", },\r\n \"Error 444 on call\": { \"en-US\": \"Error 444 on call\", \"it-IT\": \"Errore 444 su chiamata\" },\r\n \"Resource not found\": { \"en-US\": \"Resource not found\", \"it-IT\": \"Risorsa non trovata\" },\r\n \"Converted old storage system to new one\": { \"en-US\": \"Converted old storage system to new one\", \"it-IT\": \"Convertito il vecchio sistema di storicizzazione al nuovo\" },\r\n \"Marking cache to be persisted as soon as possible\": { \"en-US\": \"Marking cache to be persisted as soon as possible\", \"it-IT\": \"Marco cache da persistere il prima possibile\" },\r\n \"No more HTTP calls to be executed, entering idle state and persisting modified caches\": { \"en-US\": \"No more HTTP calls to be executed, entering idle state and persisting modified caches\", \"it-IT\": \"Nessun'altra chiamata HTTP dev'essere eseguita, entro in stato IDLE e persisto le cache modificate\" },\r\n \"Caches succesfully persisted\": { \"en-US\": \"Caches succesfully persisted\", \"it-IT\": \"Le cache sono state persistite con successo\" },\r\n \"Errors persisting modified caches\": { \"en-US\": \"Errors persisting modified caches\", \"it-IT\": \"Errori nella persistizione delle cache (esiste persistizione? boh...)\" },\r\n}","export class CacheInfos {\r\n constructor(public finalUrl: string, public cache: boolean, public cacheKey: string, public cacheTime: string, public cacheItem: any) { }\r\n}","// Angular\r\nimport { HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpParams, HttpProgressEvent, HttpResponse } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Es Faenza\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, delay, finalize, map, scan } from \"rxjs/operators\";\r\nimport { forkJoin, Observable, of, throwError } from \"rxjs\";\r\n\r\n// Chiamate ai Repository / tokens\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';\r\n\r\n// Modelli \r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\nimport { Download } from './models/Download';\r\nimport { Loc } from './httpservice.service.loc';\r\nimport { CacheInfos } from \"./models/CacheInfos\";\r\n\r\n/**\r\n * Dichiarazione della variabile globale dayjs. L'onere di \"crearla\" è affidato all'applicazione che utilizza questa libreria, \r\n * che dovrà importare lo script globale di dayjs nella CLI\r\n */\r\ndeclare var dayjs: any;\r\n\r\n/**\r\n * Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere \r\n * esteso/modificato il comportamento implementando la classe di \"hook\" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**\r\n */\r\n@Injectable()\r\nexport class HTTPService {\r\n\r\n /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */\r\n private callStatus: { [id: string]: { url: string, success: boolean } } = {};\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */\r\n private localStorageHttpCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching */\r\n private localStorageHttpTimedCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */\r\n private localStorageHttpCacheExpireKey = null;\r\n /** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */\r\n private me: { Idtenant: string, IdUser: string } = null;\r\n /** Indica che la cache a tempo dev'essere persistita il prima possibile */\r\n private PersistTimedCacheASAP: boolean = false;\r\n /** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */\r\n private PersistUntimedCacheASAP: boolean = false;\r\n\r\n /**\r\n * Implementazione della classe di estensione per collegare i comportamenti della libreria all'applicazione in cui è usata. \r\n * \r\n * Se è stato effettuato il provide della classe **HttpServiceExtensions** verrà usato quel provider, altrimenti verrà creata una nuova istanza di default\r\n */\r\n private ExtensionsImpl: HttpServiceExtensions;\r\n\r\n /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */\r\n public LastThreeCompletedCalls: string[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(\r\n @Inject(BACKEND_URL) private BACKEND_URL,\r\n private EXTENSION_CLASS: HttpServiceExtensions,\r\n @Optional() @Inject(HTTP_INVALIDATION) private HTTP_INVALIDATION,\r\n @Optional() @Inject(HTTP_LOCALE) private LOCALE,\r\n @Optional() @Inject(APP_NAME) private APP_NAME,\r\n @Optional() @Inject(CLIENT_CACHE_DURATION_S) private CLIENT_CACHE_DURATION_S,\r\n @Optional() @Inject(CACHE_BY_USER) private CACHE_BY_USER: boolean,\r\n @Optional() @Inject(DEBUG_MODE) private DEBUG_MODE: boolean,\r\n private http: HttpClient,\r\n private localStorage: PreferencesService\r\n ) {\r\n\r\n this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();\r\n this.me = this.ExtensionsImpl.retrieveIdentity();\r\n this.localStorageHttpCacheKey = (this.APP_NAME ?? \"APP\").replace(/\\s/g, '_') + \"_HttpCache\";\r\n this.localStorageHttpTimedCacheKey = (this.APP_NAME ?? \"APP\").replace(/\\s/g, '_') + \"_HttpTimedCache\";\r\n this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + \"_Expire\";\r\n\r\n this.adjustOldStorageSystem();\r\n\r\n if (this.untimedCacheExpired())\r\n this.resetHttpUntimedCacheStorage();\r\n }\r\n\r\n /**\r\n * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.\r\n * Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage\r\n */\r\n private async adjustOldStorageSystem() {\r\n var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);\r\n var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);\r\n if (!lsTimed && !lsUntimed)\r\n return;\r\n\r\n localStorage.removeItem(this.localStorageHttpTimedCacheKey);\r\n localStorage.removeItem(this.localStorageHttpCacheKey);\r\n lsTimed = lsTimed ? JSON.parse(lsTimed) : {};\r\n lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};\r\n\r\n await forkJoin([\r\n this.localStorage.setItem(this.localStorageHttpTimedCacheKey, lsTimed),\r\n this.localStorage.setItem(this.localStorageHttpCacheKey, lsUntimed)\r\n ]).toPromise();\r\n\r\n this.log(this.loc(\"Converted old storage system to new one\"));\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione \"#cache\"\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * @param {Function} errorCallback Callback chiamato in caso di errore\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public get<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true, errorCallback: Function = null): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n let cachedInfos = this.tryGetCacheInformations(url, params);\r\n if (cachedInfos.cache && cachedInfos.cacheItem) {\r\n this.log(this.loc(\"Result for\") + \" \" + url + \" \" + this.loc(\"retrieved from cache\"));\r\n return of<T>(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get<T>(cachedInfos.finalUrl, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n\r\n if (cachedInfos.cache) {\r\n this.cacheResponse(responseItem, cachedInfos);\r\n this.log(this.loc(\"Cached result for\") + \" \" + url);\r\n }\r\n\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n if (errorCallback) errorCallback();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione \"#cache\"\r\n * \r\n * Caso specifico di chiamata che deve restituire un Blob o un ArrayBuffer nativo da elaborare\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {\"arraybuffer\"| \"blob\"} type Tipo di ritorno richiesto\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * @param {Function} errorCallback Callback chiamato in caso di errore\r\n * \r\n * @returns {Observable<Blob | ArrayBuffer>} Observable che contiene il risultato della chiamata\r\n */\r\n public getRaw(url: string, params: HttpParams = null, type: \"arraybuffer\" | \"blob\" = \"arraybuffer\", transaction = \"\", succesfulResultMandatory: boolean = true, errorCallback = null): Observable<Blob | ArrayBuffer> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n let cachedInfos = this.tryGetCacheInformations(url, params);\r\n if (cachedInfos.cache && cachedInfos.cacheItem) {\r\n this.log(this.loc(\"Result for\") + \" \" + url + \" \" + this.loc(\"retrieved from cache\"));\r\n return of<any>(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: <any>type, headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((blob: Blob | ArrayBuffer) => {\r\n\r\n if (cachedInfos.cache) {\r\n this.cacheResponse(blob, cachedInfos);\r\n this.log(this.loc(\"Cached result for\") + \" \" + url);\r\n }\r\n\r\n return blob;\r\n }),\r\n catchError((err, caught): Observable<Blob> => {\r\n if (errorCallback) errorCallback();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public post<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.post<T>(url, bodyData, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n \r\n /**\r\n * Esecuzione di una DELETE HTTP\r\n *\r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public delete<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.delete<T>(url, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una PUT HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public put<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var httpCall = this.http.put<T>(url, bodyData, { headers: this.getHeaders(transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui bisogna anche inviare dei File\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {File[] | File} fileArrayOrFile Singolo file o lista di file da inviare. Il tipo **File** è quello nativo del Javascript\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public postwithFiles<T>(url: string, bodyData: any, fileArrayOrFile: File[] | File): Observable<T> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n var formData = this.getFilesFormData(fileArrayOrFile);\r\n formData.append(\"body\", JSON.stringify(bodyData));\r\n\r\n var httpCall = this.http.post<T>(url, formData, { headers: this.getHeaders(null, true, null, null) });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => { return this.registerErrorAndReturnEmptyObservable(err, myGuid); }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {K} bodyData DTO per la chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public postGetFile<K>(url: string, bodyData: K, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true): void {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n this.http.post(url, bodyData, { headers: this.getHeaders(), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public getFile(url: string, params: HttpParams = null, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true): void {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n this.http.get(url, { params: params, headers: this.getHeaders(), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Download nativo di un file. Internamente utilizza il pattern **window.location.href = \"...\"**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n */\r\n public getFileNative(url: string, params: HttpParams = null): void {\r\n let finalUrl = url + (params ? \"?\" + params.toString() : \"\");\r\n window.location.href = finalUrl;\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET di un file che emette i vari eventi di progresso di download.\r\n * Utilizzarla per overridare la dialog nativa di progress del browser e sostituirla con qualcosa tipo quello che fa MEGA.\r\n * \r\n * In caso si voglia ottenere il risultato nativo del browser del download utilizzare **getFileNative(url, pars)**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * \r\n * @returns {Observable<Download>} Observable dei vari step di progresso del download\r\n */\r\n public getFileWithProgress(url: string, params: HttpParams = null, getFileCallback: (url: string, filename: string) => any): Observable<Download> {\r\n let myGuid = this.defaultStartCall(url);\r\n\r\n return this.http.get(url, { responseType: 'blob', headers: this.getHeaders(), params: params, observe: 'events', reportProgress: true })\r\n .pipe(\r\n scan((previous: Download, event: HttpEvent<Blob>): Download => {\r\n\r\n if (this.isHttpProgressEvent(event)) {\r\n let progress = event.total ? (event.loaded > event.total ? 100 : Math.round((100 * event.loaded) / event.total)) : previous.progress;\r\n return { progress: progress, state: 'IN_PROGRESS', content: null }\r\n }\r\n\r\n if (this.isHttpResponse(event)) {\r\n if (event.body) {\r\n let cdisp = event.headers.get('content-disposition');\r\n let cdispFilename = cdisp.split(';')[1].split('filename')[1].split('=')[1].trim().replace(/\\\"/g, '');\r\n let retUrl = window.URL.createObjectURL(event.body);\r\n getFileCallback(retUrl, cdispFilename);\r\n }\r\n return { progress: 100, state: 'DONE', content: event.body }\r\n }\r\n\r\n return previous;\r\n }, { state: 'PENDING', progress: 0, content: null }),\r\n catchError((err, _): Observable<Download> => { return this.registerErrorAndReturnEmptyObservable(err, myGuid) }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n );\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpResponse<T>(event: HttpEvent<T>): event is HttpResponse<T> {\r\n return event.type === HttpEventType.Response\r\n }\r\n \r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpProgressEvent** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpProgressEvent(event: HttpEvent<unknown>): event is HttpProgressEvent {\r\n return event.type === HttpEventType.DownloadProgress || event.type === HttpEventType.UploadProgress\r\n }\r\n\r\n /**\r\n * Gestione dell'inizio di una chiamata ad un certo URL, viene generato un GUID da assegnarci, controllata la scadenza della cache, \r\n * e eventualmente loggato il fatto che sta per essere effettuata una chiamata HTTP\r\n * \r\n * @param {string} url Url a cui effettuare la chiamata\r\n * @returns {string} GUID assegnato alla chiamata\r\n */\r\n private defaultStartCall(url: string): string {\r\n let myGuid = this.getGUID();\r\n this.checkCacheInvalidation(url);\r\n this.callStatus[myGuid] = { url: url, success: true };\r\n this.log(this.loc(\"Starting call\") + \" \" + myGuid + \" \" + this.loc(\"at URL\") + \": \" + url);\r\n return myGuid;\r\n }\r\n\r\n /**\r\n * Dato un url vengono controllate le informazioni su tutti gli url da invalidare collegati all'url chiamato e, se presenti in cache, invalidati\r\n * \r\n * @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare\r\n */\r\n private checkCacheInvalidation(url: string) {\r\n let cache = this.localStorage.getLocalItem<any>(this.localStorageHttpCacheKey);\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n let cacheTime = tmp ? tmp[2] : null;\r\n let normalizedUrl = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\").replace(this.BACKEND_URL, \"\");\r\n\r\n if (!cache || !this.HTTP_INVALIDATION || !this.HTTP_INVALIDATION[normalizedUrl])\r\n return;\r\n\r\n let apisToInvalidate: string[] = this.HTTP_INVALIDATION[normalizedUrl];\r\n if (!apisToInvalidate || apisToInvalidate.length == 0)\r\n return;\r\n\r\n let keysToRemove: string[] = [];\r\n apisToInvalidate.forEach(api => {\r\n let cacheKey = this.makeCacheKey(api, null);\r\n for (let item in cache)\r\n if (item.indexOf(cacheKey) != -1)\r\n keysToRemove.push(item);\r\n });\r\n\r\n for (let i = 0; i < keysToRemove.length; i++) {\r\n let k = keysToRemove[i];\r\n this.log(this.loc(\"Invlalidating cache element\") + \" \" + k);\r\n delete cache[k];\r\n }\r\n\r\n this.localStorage.setLocalItem(this.localStorageHttpCacheKey, cache);\r\n }\r\n\r\n /**\r\n * Finalizzazione di una chiamata\r\n * \r\n * @param {string} guid GUID collegato alla chiamata appena terminata\r\n * @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare\r\n * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni\r\n */\r\n private async tryFinalizeByGuid(guid: string, cacheInfos?: CacheInfos) {\r\n this.log(this.loc(\"Finalizing call\") + \" \" + guid + \" \" + this.loc(\"with status\") + \": \" + (this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));\r\n\r\n // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false\r\n // e riiniziare a valutare errori di javashit\r\n if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())\r\n this.ExtensionsImpl.writeRedirectionStatus(false);\r\n\r\n // Aggiungo la chiamata alla lista delle ultime 3 completate\r\n this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url)\r\n if (this.LastThreeCompletedCalls.length > 3)\r\n this.LastThreeCompletedCalls.pop();\r\n\r\n // In ogni caso questa posso rimuoverla\r\n delete this.callStatus[guid];\r\n\r\n // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata\r\n if (cacheInfos && cacheInfos.cache) {\r\n this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;\r\n this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;\r\n this.log(this.loc(\"Marking cache to be persisted as soon as possible\"));\r\n }\r\n\r\n // Se una delle due cache devono essere aggiornate e non ho nessuna chiamata in corso effettuo l'aggiornamento in base a quale delle due va aggiornata\r\n // Alla fine di tutto marco come fatto\r\n if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0) {\r\n\r\n var toCall = [];\r\n let tmpKey = \"\";\r\n if (this.PersistTimedCacheASAP) {\r\n tmpKey = this.localStorageHttpTimedCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n if (this.PersistUntimedCacheASAP) {\r\n tmpKey = this.localStorageHttpCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n this.log(this.loc(\"No more HTTP calls to be executed, entering idle state and persisting modified caches\") + \"...\");\r\n var ret = await forkJoin(toCall).toPromise();\r\n if (ret)\r\n this.log(this.loc(\"Caches succesfully persisted\"));\r\n else\r\n this.log(this.loc(\"Errors persisting modified caches\"));\r\n this.PersistTimedCacheASAP = false;\r\n this.PersistUntimedCacheASAP = false;\r\n }\r\n }\r\n\r\n /**\r\n * Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente \r\n * ad un backend ASP.NET da cui si potrà accedere a Request.Form.Files\r\n * \r\n * @param {File | File[]} fileArrayOrFile Singolo File o lista di File. N.B: nella firma della funzione viene considerato **any** per fare test sulle proprietà \r\n * invece che fare test con l'**istanceof**\r\n * \r\n * @returns {FormData} FormData contenente tutti i file passati\r\n */\r\n private getFilesFormData(fileArrayOrFile: any): FormData {\r\n var formData: FormData = new FormData();\r\n\r\n if (fileArrayOrFile) {\r\n if (fileArrayOrFile.length)\r\n fileArrayOrFile.forEach(t => { formData.append(\"file\", t, t.name); });\r\n else if (fileArrayOrFile.name)\r\n formData.append(\"files\", fileArrayOrFile, fileArrayOrFile.name);\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Helper che in base ai parametri disponibili genera gli Header HTTP per la chiamata da effettuare\r\n * \r\n * @param {string} contentType Indica se aggiungere agli header \"Content-Type\", valorizzato al valore del parametro\r\n * @param {string} accept Indica se aggiungere agli header \"Accept\", valorizzato al valore del parametro\r\n * @param {boolean} includeAuth Indica se aggiungere agli header \"Authorization\", valorizzato col token recuperato dall'hook **retrieveAccessToken** della classe di estensione\r\n * @param {string} transactionId Indica se aggiungere agli header \"X-TX-ID\", valorizzato al valore del parametro\r\n * \r\n * @returns {HttpHeaders} Header generati in base ai parametri\r\n */\r\n private getHeaders(transactionId = \"\", includeAuth: boolean = true, contentType: string = \"application/json\", accept: string = \"application/json\"): HttpHeaders {\r\n var headers = new HttpHeaders();\r\n var authtoken = this.ExtensionsImpl.retrieveAccessToken();\r\n\r\n if (contentType)\r\n headers = headers.append(\"Content-Type\", contentType);\r\n\r\n if (transactionId)\r\n headers = headers.append(\"X-TX-ID\", transactionId);\r\n\r\n if (authtoken && includeAuth)\r\n headers = headers.append(\"Authorization\", \"Bearer \" + authtoken);\r\n\r\n if (accept)\r\n headers = headers.append(\"Accept\", accept);\r\n\r\n headers = headers.append(\"Accept-Language\", this.LOCALE ?? 'it-IT');\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gestione di default degli errori\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n */\r\n private async onError(res: HttpErrorResponse | TypeError, guid: string) {\r\n if(this.callStatus[guid])\r\n this.callStatus[guid].success = false;\r\n\r\n //Mi assicuro che tutti gli errori durante il redirect al login vengano ignorati\r\n if (this.ExtensionsImpl.readRedirectingToLogin()) {\r\n this.log(this.loc(\"Redirecting to Login, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n\r\n //Mi assicuro che venga gestito un solo errore per volta\r\n if (this.ExtensionsImpl.readHandlingErrorStatus()) {\r\n this.log(this.loc(\"Already Handling an error, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n else\r\n this.ExtensionsImpl.writeHandlingErrorStatus(true);\r\n\r\n let finalError = \"\";\r\n let finalStatus = \"\";\r\n if (this.isTypeError(res)) {\r\n finalError = res.message;\r\n finalStatus = \"HTTP Service Internal Error\";\r\n }\r\n else if (this.isHttpErrorResponse(res)) {\r\n\r\n finalError = await this.getHttpErrorText(res.error);\r\n finalStatus = res.status.toString();\r\n\r\n switch (res.status) {\r\n // Unauthorized\r\n case 401:\r\n if (this.ExtensionsImpl.readRedirectionStatus()) {\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n return;\r\n }\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n // Handled exception\r\n case 400:\r\n // No Permissions\r\n case 403:\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n // Not found\r\n case 404:\r\n this.ExtensionsImpl.handleBlockingException(res.status, this.loc(\"Resource not found\"));\r\n return;\r\n // NotConfiguredException\r\n case 444:\r\n if (this.ExtensionsImpl.readRedirectionStatus())\r\n this.log(this.loc(\"Error 444 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n else if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n case 0:\r\n finalError = \"Server might be offline\" + (res.statusText ? \" (\" + res.statusText + \") \" : \"\");\r\n }\r\n }\r\n\r\n this.ExtensionsImpl.handleException(finalStatus, finalError);\r\n }\r\n\r\n /**\r\n * Dato un errore restituisce una promise con la stringa finale dell'errore in modo da poter fare un await\r\n * \r\n * @param {any} err Errore da controllare\r\n * \r\n * @returns {Promise<string>} Promise che risolve con la stringa finale dell'errore\r\n */\r\n private getHttpErrorText(err: any): Promise<string> {\r\n // Se ho un Blob può essere o un CallResult o suppongo una semplice stringa,\r\n // altrimenti potrebbe essere direttamente un CallResult, oppure una semplice stringa\r\n return new Promise<string>((resolve) => {\r\n if (err instanceof Blob) {\r\n let reader = new FileReader();\r\n reader.onload = (e: Event) => {\r\n let errMsg = (<any>e.target).result;\r\n let jsonerrMsg: any;\r\n try { jsonerrMsg = JSON.parse(errMsg); } catch (e) { }\r\n return resolve(jsonerrMsg && this.isCallResult(jsonerrMsg) ? jsonerrMsg.error.message : errMsg);\r\n };\r\n reader.readAsText(err)\r\n }\r\n else if (this.isCallResult(err))\r\n return resolve(err.error.message);\r\n else\r\n return resolve(err?.toString());\r\n });\r\n }\r\n\r\n /**\r\n * Riconosce se l'oggetto è di tipo **CallResult** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isCallResult(err: any): err is { error: { message: string } } {\r\n return !!err?.error?.message;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **HttpErrorResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isHttpErrorResponse(err: any): err is HttpErrorResponse {\r\n return err instanceof HttpErrorResponse;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **TypeError** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isTypeError(err: any): err is TypeError {\r\n return err.name == \"TypeError\";\r\n }\r\n\r\n /**\r\n * Come dice il nome, registra un errore e restituisce un Observable vuoto come risultato della chiamata\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n * @param {boolean} handleError Indica se gestire l'errore via libreria o se limitarsi a restituire l'Observable vuoto\r\n * \r\n * @returns {Observable<any>} Observable vuoto\r\n */\r\n private registerErrorAndReturnEmptyObservable(res: any, guid: string, handleError: boolean = true): Observable<any> {\r\n if (handleError)\r\n this.onError(res, guid);\r\n return new Observable(() => { });\r\n }\r\n\r\n /**\r\n * Dato un Url e dei parametri cerca di recuperare l'eventuale oggetto già salvato in cache con le informazioni base della cache stessa\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)\r\n * \r\n * @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): CacheInfos {\r\n\r\n let cachingKey = null, cacheTime = null, cache = null, item = null;\r\n let useCaching = !!(/#cache/gi.exec(url));\r\n\r\n if (useCaching) {\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n cacheTime = tmp ? tmp[2] : null;\r\n\r\n url = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n if (this.untimedCacheExpired() && !cacheTime)\r\n this.resetHttpUntimedCacheStorage();\r\n\r\n cachingKey = this.makeCacheKey(url, params);\r\n let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage.getLocalItem(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {\r\n // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco \r\n // dalle proprietà interne che gli ho aggiunto per controllarne la scadenza\r\n if (cacheTime)\r\n delete cache[cachingKey].__expire;\r\n\r\n item = cache[cachingKey]\r\n }\r\n }\r\n\r\n return new CacheInfos(url, useCaching, cachingKey, cacheTime, item);\r\n }\r\n\r\n /**\r\n * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**\r\n * \r\n * @param {T} item Oggetto da inserire nella cache\r\n * @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: CacheInfos): void {\r\n let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage.getLocalItem(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n cache[cacheInfos.cacheKey] = item;\r\n if (cacheInfos.cacheTime)\r\n cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, \"seconds\");\r\n\r\n this.localStorage.setLocalItem(cacheKey, cache);\r\n }\r\n\r\n /**\r\n * Controlla se la cache per le chiamate senza expire time è scaduta\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private untimedCacheExpired(): boolean {\r\n let expire = JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));\r\n return !expire || expire && dayjs(expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Controlla se la cache per una chiamata che ha un tempo di vita ben definito è scaduta o meno\r\n * \r\n * @param {any} item Oggetto recuperato dalla cache a cui ho aggiunto la chiave interna __expire\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private timedCacheItemExpired(item: any): boolean {\r\n return dayjs(item.__expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Ripulisce la cache e imposta la prossima scadenza ad adesso + **CLIENT_CACHE_DURATION_S** (token valorizzato in fase di configurazione dalla proprietà **clientCacheDurationS** della classe **HttpServiceModuleConfig**)\r\n */\r\n public async resetHttpUntimedCacheStorage() {\r\n await this.localStorage.setItem(this.localStorageHttpCacheKey, {}).toPromise();\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, \"second\")));\r\n }\r\n\r\n /**\r\n * Ripulisce la cache delle chiamate con un tempo di expire definito\r\n */\r\n public async resetHttpTimedCacheStorage() {\r\n await this.localStorage.setItem(this.localStorageHttpTimedCacheKey, {}).toPromise();\r\n }\r\n\r\n /**\r\n * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * \r\n * @returns {string} Chiave che rappresenta in maniera univoca la chiamata\r\n */\r\n private makeCacheKey(url: string, params: HttpParams): string {\r\n let authKeyPart = (this.me ? this.me.Idtenant : \"\") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : \"\");\r\n let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev: any, next: any) => prev + \",\" + next + '=' + params.get(next), \"\") : \"\";\r\n return authKeyPart + \"_\" + url.substring(url.indexOf(\"api\") + 4) + \"?\" + paramsKeyPart;\r\n }\r\n\r\n /**\r\n * Generazione GUID\r\n * \r\n * @returns {string} Nuovo GUID generato in maniera casuale\r\n */\r\n private getGUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per scrivere log a console qualora **DEBUG_MODE** risultasse **true**\r\n * \r\n * @param {string} message Messaggio di log\r\n */\r\n private log(message: string): void {\r\n if (this.DEBUG_MODE)\r\n console.log(\"@httpservice: \" + message)\r\n }\r\n\r\n /**\r\n * Helper per la localizzazione dei messaggi\r\n * \r\n * @param {string} message Messaggio da localizzare\r\n * \r\n * @returns {string} Messaggio localizzato\r\n */\r\n private loc(message: string): string {\r\n if (!Loc[message]) {\r\n console.warn(\"Untranslated message: \" + message)\r\n return \"\";\r\n }\r\n return Loc[message][this.LOCALE];\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HttpServiceModuleConfig } from './config/HttpServiceModuleConfig';\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';\r\nimport { HTTPService } from './httpservice.service';\r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\n\r\n@NgModule()\r\nexport class HttpserviceModule {\r\n static forRoot(config?: HttpServiceModuleConfig): ModuleWithProviders<HttpserviceModule> {\r\n return {\r\n ngModule: HttpserviceModule,\r\n providers: [\r\n HTTPService,\r\n HttpServiceExtensions,\r\n { provide: HTTP_INVALIDATION, useValue: config?.httpInvalidation },\r\n { provide: CLIENT_CACHE_DURATION_S, useValue: config?.clientCacheDurationS },\r\n { provide: BACKEND_URL, useValue: config?.backendUrl },\r\n { provide: HTTP_LOCALE, useValue: config?.httpLocale || 'it-IT' },\r\n { provide: APP_NAME, useValue: config?.appName },\r\n { provide: CACHE_BY_USER, useValue: config?.cacheByUser },\r\n { provide: DEBUG_MODE, useValue: config?.debugMode }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Classe di configurazione per il Modulo della libreria\r\n */\r\nexport class HttpServiceModuleConfig {\r\n //mandatory\r\n\r\n /**\r\n * Indica l'URL del backend a cui inviare le richieste\r\n */\r\n backendUrl : string;\r\n\r\n //optionals\r\n /**\r\n * Indica quali chiamate vengono invalidate da quali chiamate quando viene utilizzata una cache sulle risposte\r\n */\r\n httpInvalidation? : Record<string, string[]>;\r\n\r\n /**\r\n * Indica la durata della cache lato client (Browser), se utilizzata\r\n */\r\n clientCacheDurationS? : number;\r\n\r\n /**\r\n * Locale della libreria utilizzato per la localizzazione dei messaggi e per il default all'Header \"Accept-Language\"\r\n */\r\n httpLocale? : string\r\n\r\n /**\r\n * Nome dell'applicazione che sta utilizzando la libreria, utilizzato per creare chiavi di cache specifiche per app\r\n */\r\n appName? : string;\r\n\r\n /**\r\n * Indica se la cache deve basarsi non solo sull'applicazione ma anche sull'utente connesso\r\n */\r\n cacheByUser? : boolean;\r\n\r\n /**\r\n * Abilita o disabilità la modalità di debug (Log a console)\r\n */\r\n debugMode? : boolean;\r\n}","export class Download {\r\n state: 'PENDING' | 'IN_PROGRESS' | 'DONE'\r\n progress: number\r\n content: Blob | null\r\n }","/*\r\n * Public API Surface of httpservice\r\n */\r\n\r\nexport * from './lib/httpservice.service';\r\nexport * from './lib/httpservice.module';\r\nexport * from './lib/config/HttpServiceModuleConfig';\r\nexport * from './lib/config/IHttpServiceExtensions';\r\nexport * from './lib/config/HttpServiceExtensions';\r\nexport * from './lib/models/Download';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {APP_NAME as ɵe,BACKEND_URL as ɵc,CACHE_BY_USER as ɵf,CLIENT_CACHE_DURATION_S as ɵb,DEBUG_MODE as ɵg,HTTP_INVALIDATION as ɵa,HTTP_LOCALE as ɵd} from './lib/tokens';"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ export declare class HTTPService {
38
38
  * Se è stato effettuato il provide della classe **HttpServiceExtensions** verrà usato quel provider, altrimenti verrà creata una nuova istanza di default
39
39
  */
40
40
  private ExtensionsImpl;
41
+ /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
42
+ LastThreeCompletedCalls: string[];
41
43
  /**
42
44
  * @ignore
43
45
  */
@@ -301,11 +303,11 @@ export declare class HTTPService {
301
303
  /**
302
304
  * Ripulisce la cache e imposta la prossima scadenza ad adesso + **CLIENT_CACHE_DURATION_S** (token valorizzato in fase di configurazione dalla proprietà **clientCacheDurationS** della classe **HttpServiceModuleConfig**)
303
305
  */
304
- resetHttpUntimedCacheStorage(): void;
306
+ resetHttpUntimedCacheStorage(): Promise<void>;
305
307
  /**
306
308
  * Ripulisce la cache delle chiamate con un tempo di expire definito
307
309
  */
308
- resetHttpTimedCacheStorage(): void;
310
+ resetHttpTimedCacheStorage(): Promise<void>;
309
311
  /**
310
312
  * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP
311
313
  *
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@esfaenza/httpservice",
3
- "version": "11.2.34",
3
+ "version": "11.2.38",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },
7
7
  "peerDependencies": {
8
8
  "@angular/common": "~11.2.14",
9
9
  "@angular/core": "~11.2.14",
10
- "@esfaenza/preferences": "^11.2.10"
10
+ "@esfaenza/preferences": "^11.2.18"
11
11
  },
12
12
  "main": "bundles/esfaenza-httpservice.umd.js",
13
13
  "module": "fesm2015/esfaenza-httpservice.js",