@esfaenza/httpservice 11.2.6 → 11.2.10

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.
@@ -188,6 +188,7 @@
188
188
  this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + "_Expire";
189
189
  if (this.untimedCacheExpired())
190
190
  this.resetHttpUntimedCacheStorage();
191
+ this.resetHttpTimedCacheStorage();
191
192
  }
192
193
  /**
193
194
  * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
@@ -209,23 +210,19 @@
209
210
  if (errorCallback === void 0) { errorCallback = null; }
210
211
  var myGuid = this.defaultStartCall(url);
211
212
  var cachedInfos = this.tryGetCacheInformations(url, params);
212
- if (cachedInfos.cache && cachedInfos.cacheitem) {
213
+ if (cachedInfos.cache && cachedInfos.cacheItem) {
213
214
  this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
214
- return rxjs.of(cachedInfos.cacheitem).pipe(operators.delay(0), operators.finalize(function () { _this.tryFinalizeByGuid(myGuid); }));
215
+ return rxjs.of(cachedInfos.cacheItem).pipe(operators.delay(0), operators.finalize(function () { _this.tryFinalizeByGuid(myGuid); }));
215
216
  }
216
- var httpCall = this.http.get(url, { headers: this.getHeaders(transaction), params: params });
217
+ var httpCall = this.http.get(cachedInfos.finalUrl, { headers: this.getHeaders(transaction), params: params });
217
218
  return httpCall.pipe(operators.map(function (res) {
218
219
  var responseItem = res;
219
- if (Ema && Ema.BigLog)
220
- console.log("@httpservice BigLog: GET Success with response -" + JSON.stringify(responseItem));
221
220
  if (cachedInfos.cache) {
222
221
  _this.cacheResponse(responseItem, cachedInfos);
223
222
  _this.log(_this.loc("Cached result for") + " " + url);
224
223
  }
225
224
  return responseItem;
226
225
  }), operators.catchError(function (err, caught) {
227
- if (Ema && Ema.BigLog)
228
- console.log("@httpservice BigLog: GET Catch with error -" + JSON.stringify(err));
229
226
  if (errorCallback)
230
227
  errorCallback();
231
228
  return !succesfulResultMandatory ? rxjs.throwError(err) : _this.registerErrorAndReturnEmptyObservable(err, myGuid);
@@ -255,11 +252,11 @@
255
252
  if (errorCallback === void 0) { errorCallback = null; }
256
253
  var myGuid = this.defaultStartCall(url);
257
254
  var cachedInfos = this.tryGetCacheInformations(url, params);
258
- if (cachedInfos.cache && cachedInfos.cacheitem) {
255
+ if (cachedInfos.cache && cachedInfos.cacheItem) {
259
256
  this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
260
- return rxjs.of(cachedInfos.cacheitem).pipe(operators.delay(0), operators.finalize(function () { _this.tryFinalizeByGuid(myGuid); }));
257
+ return rxjs.of(cachedInfos.cacheItem).pipe(operators.delay(0), operators.finalize(function () { _this.tryFinalizeByGuid(myGuid); }));
261
258
  }
262
- var httpCall = this.http.get(url, { responseType: type, headers: this.getHeaders(transaction), params: params });
259
+ var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: type, headers: this.getHeaders(transaction), params: params });
263
260
  return httpCall.pipe(operators.map(function (blob) {
264
261
  if (cachedInfos.cache) {
265
262
  _this.cacheResponse(blob, cachedInfos);
@@ -292,12 +289,8 @@
292
289
  var httpCall = this.http.post(url, bodyData, { headers: this.getHeaders(transaction) });
293
290
  return httpCall.pipe(operators.map(function (res) {
294
291
  var responseItem = res;
295
- if (Ema && Ema.BigLog)
296
- console.log("@httpservice BigLog: POST Success with response -" + JSON.stringify(responseItem));
297
292
  return responseItem;
298
293
  }), operators.catchError(function (err, caught) {
299
- if (Ema && Ema.BigLog)
300
- console.log("@httpservice BigLog: POST Catch with error -" + JSON.stringify(err));
301
294
  return !succesfulResultMandatory ? rxjs.throwError(err) : _this.registerErrorAndReturnEmptyObservable(err, myGuid);
302
295
  }), operators.finalize(function () { _this.tryFinalizeByGuid(myGuid); }));
303
296
  };
@@ -372,7 +365,9 @@
372
365
  HTTPService.prototype.checkCacheInvalidation = function (url) {
373
366
  var _this = this;
374
367
  var cache = JSON.parse(localStorage.getItem(this.localStorageHttpCacheKey));
375
- var normalizedUrl = url.replace("#cache", "").replace(this.BACKEND_URL, "");
368
+ var tmp = /#cache(:?-(\d+))/gi.exec(url);
369
+ var cacheTime = tmp ? tmp[2] : null;
370
+ var normalizedUrl = url.replace("#cache" + (cacheTime ? "-" + cacheTime : ""), "").replace(this.BACKEND_URL, "");
376
371
  if (!cache || !this.HTTP_INVALIDATION || !this.HTTP_INVALIDATION[normalizedUrl])
377
372
  return;
378
373
  var apisToInvalidate = this.HTTP_INVALIDATION[normalizedUrl];
@@ -515,7 +510,7 @@
515
510
  this.ExtensionsImpl.handleBlockingException(res.status, text);
516
511
  return;
517
512
  }
518
- this.ExtensionsImpl.handleException(res.status || '???', res.status ? text : JSON.stringify(res));
513
+ this.ExtensionsImpl.handleException(res.status || 'HTTP Service Internal Error', res.status ? text : res.message);
519
514
  };
520
515
  /**
521
516
  * Come dice il nome, registra un errore e restituisce un Observable vuoto come risultato della chiamata
@@ -538,7 +533,7 @@
538
533
  * @param {string} url URL su cui effettuare la chiamata
539
534
  * @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)
540
535
  *
541
- * @returns {{ cache: boolean, cachetime: string, cacheitem: any }} Oggetto contenente le informazioni sulla cache per l'oggetto specificato
536
+ * @returns {{ finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any }} Oggetto contenente le informazioni sulla cache per l'oggetto specificato
542
537
  */
543
538
  HTTPService.prototype.tryGetCacheInformations = function (url, params) {
544
539
  var cachingKey = null, cacheTime = null, cache = null, item = null;
@@ -550,29 +545,33 @@
550
545
  if (this.untimedCacheExpired() && !cacheTime)
551
546
  this.resetHttpUntimedCacheStorage();
552
547
  cachingKey = this.makeCacheKey(url, params);
553
- cache = JSON.parse(localStorage.getItem(cacheTime ? this.localStorageHttpCacheExpireKey : this.localStorageHttpCacheKey));
554
- if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {
548
+ var cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
549
+ var cacheLs = localStorage.getItem(cacheKey);
550
+ var cache_1 = cacheLs ? JSON.parse(cacheLs) : {};
551
+ if (cache_1 && cache_1[cachingKey] && !this.timedCacheItemExpired(cache_1[cachingKey])) {
555
552
  // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco
556
553
  // dalle proprietà interne che gli ho aggiunto per controllarne la scadenza
557
554
  if (cacheTime)
558
- delete cache[cachingKey].__expire;
559
- item = cache[cachingKey];
555
+ delete cache_1[cachingKey].__expire;
556
+ item = cache_1[cachingKey];
560
557
  }
561
558
  }
562
- return { cache: useCaching, cacheKey: cachingKey, cachetime: cacheTime, cacheitem: item };
559
+ return { finalUrl: url, cache: useCaching, cacheKey: cachingKey, cacheTime: cacheTime, cacheItem: item };
563
560
  };
564
561
  /**
565
562
  * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**
566
563
  *
567
564
  * @param {T} item Oggetto da inserire nella cache
568
- * @param {{ cache: boolean, cacheKey: string, cachetime: string, cacheitem: any }} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**
565
+ * @param {{ finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any }} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**
569
566
  */
570
567
  HTTPService.prototype.cacheResponse = function (item, cacheInfos) {
571
- var cache = JSON.parse(localStorage.getItem(cacheInfos.cachetime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey));
568
+ var cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
569
+ var cacheLs = localStorage.getItem(cacheKey);
570
+ var cache = cacheLs ? JSON.parse(cacheLs) : {};
572
571
  cache[cacheInfos.cacheKey] = item;
573
- if (cacheInfos.cachetime)
574
- cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cachetime, "seconds");
575
- localStorage.setItem(cacheInfos.cachetime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey, JSON.stringify(cache));
572
+ if (cacheInfos.cacheTime)
573
+ cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, "seconds");
574
+ localStorage.setItem(cacheKey, JSON.stringify(cache));
576
575
  };
577
576
  /**
578
577
  * Controlla se la cache per le chiamate senza expire time è scaduta
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-httpservice.umd.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/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.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, 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}","// Angular\r\nimport { HttpClient, HttpHeaders, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, delay, finalize, map } from \"rxjs/operators\";\r\nimport { 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 { Loc } from './httpservice.service.loc';\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 * Schifo da settare da F12 per permettere di attivare una modalità di Log parecchio ignorante...\r\n * Usato per debuggare le chiamate HTTP che restituiscono ciolle\r\n */\r\ndeclare var Ema: { BigLog: boolean };\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 /**\r\n * Formato della data di expire della cache\r\n */\r\n private cacheExpireFormat = \"YYYY/MM/DD HH:mm:ss\";\r\n\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 */\r\n private callStatus: { [id: string]: boolean } = {};\r\n\r\n /**\r\n * Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary\r\n */\r\n private localStorageHttpCacheKey = null;\r\n\r\n /**\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 */\r\n private localStorageHttpTimedCacheKey = null;\r\n\r\n /**\r\n * Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa\r\n */\r\n private localStorageHttpCacheExpireKey = null;\r\n\r\n /**\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 */\r\n private me: { Idtenant: string, IdUser: string } = null;\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 ) {\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 if (this.untimedCacheExpired())\r\n this.resetHttpUntimedCacheStorage();\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>(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\r\n if (Ema && Ema.BigLog)\r\n console.log(\"@httpservice BigLog: GET Success with response -\" + JSON.stringify(responseItem));\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 (Ema && Ema.BigLog)\r\n console.log(\"@httpservice BigLog: GET Catch with error -\" + JSON.stringify(err));\r\n\r\n if (errorCallback) errorCallback();\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 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(url, { 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); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP. Tipizzata sia in Input che in Output\r\n * \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 {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, 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) });\r\n\r\n return httpCall.pipe(\r\n map((res: T) => {\r\n let responseItem = <T>res;\r\n\r\n if (Ema && Ema.BigLog)\r\n console.log(\"@httpservice BigLog: POST Success with response -\" + JSON.stringify(responseItem));\r\n\r\n return responseItem;\r\n }),\r\n catchError((err, caught): Observable<T> => {\r\n\r\n if (Ema && Ema.BigLog)\r\n console.log(\"@httpservice BigLog: POST Catch with error -\" + JSON.stringify(err));\r\n\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\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto\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(), responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError)\r\n afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: Blob) => {\r\n var blob = response;\r\n var retUrl = window.URL.createObjectURL(blob);\r\n getFileCallback(retUrl, filename);\r\n if (afterGetFile)\r\n afterGetFile();\r\n });\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 = JSON.parse(localStorage.getItem(this.localStorageHttpCacheKey));\r\n let normalizedUrl = url.replace(\"#cache\", \"\").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 localStorage.setItem(this.localStorageHttpCacheKey, JSON.stringify(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 */\r\n private tryFinalizeByGuid(guid: string) {\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\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 onError(res: any, guid: string) {\r\n this.callStatus[guid] = false;\r\n\r\n if (res.status == 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\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n }\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 if (res.status == 0) {\r\n if (res.statusText)\r\n res.statusText = \"Server Offline?\" + \" (\" + res.statusText + \") \";\r\n else\r\n res.statusText = \"Server Offline?\";\r\n }\r\n\r\n var text = \"\";\r\n if (res.error) {\r\n var convertedError = res.error;\r\n\r\n if (convertedError.error)\r\n text = convertedError.error.message;\r\n else\r\n text = convertedError.toString();\r\n } else\r\n text = res.statusText;\r\n\r\n // 444: NotConfiguredException\r\n if (res.status == 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 return;\r\n }\r\n\r\n if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, text);\r\n return;\r\n }\r\n\r\n if (res.status == 403) {\r\n this.ExtensionsImpl.handleBlockingException(res.status, text);\r\n return;\r\n }\r\n\r\n this.ExtensionsImpl.handleException(res.status || '???', res.status ? text : JSON.stringify(res));\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 {{ cache: boolean, cachetime: string, cacheitem: any }} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): { cache: boolean, cacheKey: string, cachetime: string, cacheitem: any } {\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 cache = JSON.parse(localStorage.getItem(cacheTime ? this.localStorageHttpCacheExpireKey : this.localStorageHttpCacheKey));\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 { cache: useCaching, cacheKey: cachingKey, cachetime: cacheTime, cacheitem: 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 {{ cache: boolean, cacheKey: string, cachetime: string, cacheitem: any }} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: { cache: boolean, cacheKey: string, cachetime: string, cacheitem: any }): void {\r\n let cache = JSON.parse(localStorage.getItem(cacheInfos.cachetime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey));\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 localStorage.setItem(cacheInfos.cachetime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey, JSON.stringify(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, this.cacheExpireFormat) < 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, this.cacheExpireFormat) < 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 localStorage.setItem(this.localStorageHttpCacheKey, JSON.stringify({}));\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, \"second\").format(this.cacheExpireFormat)));\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 localStorage.setItem(this.localStorageHttpTimedCacheKey, JSON.stringify({}));\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 // Parametri castati ad 'any' dato che la proprietà updates è privata\r\n let paramsKeyPart = params && (<any>params).updates ? (<any>params).updates.reduce((prev: any, next: any) => prev + next.param + '=' + next.value, \"\") : \"\";\r\n return authKeyPart + url + 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}","/*\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';","/**\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":["InjectionToken","of","delay","finalize","map","catchError","throwError","HttpHeaders","Observable","Injectable","Inject","Optional","HttpClient","NgModule"],"mappings":";;;;;;IAEA;;;QAGa,iBAAiB,GAA6C,IAAIA,mBAAc,CAA2B,mBAAmB,EAAE;IAE7I;;;QAGa,uBAAuB,GAA2B,IAAIA,mBAAc,CAAS,yBAAyB,EAAE;IAErH;;;QAGa,WAAW,GAA2B,IAAIA,mBAAc,CAAS,aAAa,EAAE;IAE7F;;;QAGa,WAAW,GAA2B,IAAIA,mBAAc,CAAS,aAAa,EAAE;IAE7F;;;QAGa,QAAQ,GAA2B,IAAIA,mBAAc,CAAS,UAAU,EAAE;IAEvF;;;QAGa,aAAa,GAA4B,IAAIA,mBAAc,CAAU,eAAe,EAAE;IAEnG;;;QAGa,UAAU,GAA4B,IAAIA,mBAAc,CAAU,YAAY;;ICjC3F;;;;;QAIA;SAqFC;;;;QAhFU,mDAAmB,GAAnB;YACH,OAAO,EAAE,CAAC;SACb;;;;QAKM,gDAAgB,GAAhB;YACH,OAAO,IAAI,CAAC;SACf;;;;;QAMM,sDAAsB,GAAtB;YACH,OAAO,KAAK,CAAC;SAChB;;;;QAKM,uDAAuB,GAAvB,UAAwB,MAAe;SAC7C;;;;QAKM,+CAAe,GAAf;SACN;;;;;QAMM,uDAAuB,GAAvB;YACH,OAAO,KAAK,CAAC;SAChB;;;;QAKM,wDAAwB,GAAxB,UAAyB,MAAe;SAC9C;;;;;QAMM,qDAAqB,GAArB;YACH,OAAO,KAAK,CAAC;SAChB;;;;QAKM,sDAAsB,GAAtB,UAAuB,MAAe;SAC5C;;;;;QAMM,4DAA4B,GAA5B;YACH,OAAO,KAAK,CAAC;SAChB;;;;QAKM,uDAAuB,GAAvB,UAAwB,MAAc,EAAE,IAAY;YACvD,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;SAC1E;;;;QAKM,+CAAe,GAAf,UAAgB,MAAc,EAAE,IAAY;YAC/C,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;SACvD;oCACJ;KAAA;;IC3FD;;;IAGO,IAAM,GAAG,GAAE;QACd,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG;QAClE,sBAAsB,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,wBAAwB,GAAG;QAC/F,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,8BAA8B,GAAG;QAC/F,eAAe,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG;QAC7E,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG;QACpD,6BAA6B,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,+BAA+B,GAAG;QACpH,iBAAiB,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,GAAG;QACjF,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG;QAChE,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG;QACxD,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG;QACzD,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,GAAG;QACzF,wDAAwD,EAAE,EAAE,OAAO,EAAE,wDAAwD,EAAE,OAAO,EAAE,+CAA+C,GAAG;QAC1L,sBAAsB,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,GAAG;QAC7F,mDAAmD,EAAE,EAAE,OAAO,EAAE,mDAAmD,EAAE,OAAO,EAAE,sDAAsD,GAAG;QACvL,wDAAwD,EAAE,EAAE,OAAO,EAAE,wDAAwD,EAAE,OAAO,EAAE,yEAAyE,GAAG;QACpN,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,GAAG;KAC5F;;ICpBD;IA2BA;;;;;;;;QA+CE,qBAC+B,WAAW,EAChC,eAAsC,EACC,iBAAiB,EACvB,MAAM,EACT,QAAQ,EACO,uBAAuB,EACjC,aAAsB,EACzB,UAAmB,EACnD,IAAgB;;YARK,gBAAW,GAAX,WAAW,CAAA;YAChC,oBAAe,GAAf,eAAe,CAAuB;YACC,sBAAiB,GAAjB,iBAAiB,CAAA;YACvB,WAAM,GAAN,MAAM,CAAA;YACT,aAAQ,GAAR,QAAQ,CAAA;YACO,4BAAuB,GAAvB,uBAAuB,CAAA;YACjC,kBAAa,GAAb,aAAa,CAAS;YACzB,eAAU,GAAV,UAAU,CAAS;YACnD,SAAI,GAAJ,IAAI,CAAY;;;;YA9ClB,sBAAiB,GAAG,qBAAqB,CAAC;;;;YAK1C,eAAU,GAA8B,EAAE,CAAC;;;;YAK3C,6BAAwB,GAAG,IAAI,CAAC;;;;YAKhC,kCAA6B,GAAG,IAAI,CAAC;;;;YAKrC,mCAA8B,GAAG,IAAI,CAAC;;;;YAKtC,OAAE,GAAyC,IAAI,CAAC;YAwBtD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,qBAAqB,EAAE,CAAC;YAC1E,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YACjD,IAAI,CAAC,wBAAwB,GAAG,OAAC,IAAI,CAAC,QAAQ,mCAAI,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC;YAC5F,IAAI,CAAC,6BAA6B,GAAG,OAAC,IAAI,CAAC,QAAQ,mCAAI,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC;YACtG,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAEhF,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,IAAI,CAAC,4BAA4B,EAAE,CAAC;SACvC;;;;;;;;;;;;;QAcM,yBAAG,GAAH,UAAO,GAAW,EAAE,MAAyB,EAAE,WAAgB,EAAE,wBAAwC,EAAE,aAA8B;YAAzI,iBAkCN;YAlC0B,uBAAA,EAAA,aAAyB;YAAE,4BAAA,EAAA,gBAAgB;YAAE,yCAAA,EAAA,+BAAwC;YAAE,8BAAA,EAAA,oBAA8B;YAC9I,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE;gBAC9C,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;gBACtF,OAAOC,OAAE,CAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAACC,eAAK,CAAC,CAAC,CAAC,EAAEC,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACzG;YAED,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhG,OAAO,QAAQ,CAAC,IAAI,CAClBC,aAAG,CAAC,UAAC,GAAM;gBACT,IAAI,YAAY,GAAM,GAAG,CAAC;gBAE1B,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;oBACnB,OAAO,CAAC,GAAG,CAAC,kDAAkD,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;gBAEjG,IAAI,WAAW,CAAC,KAAK,EAAE;oBACrB,KAAI,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAC9C,KAAI,CAAC,GAAG,CAAC,KAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;iBACrD;gBAED,OAAO,YAAY,CAAC;aACrB,CAAC,EACFC,oBAAU,CAAC,UAAC,GAAG,EAAE,MAAM;gBACrB,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;oBACnB,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEnF,IAAI,aAAa;oBAAE,aAAa,EAAE,CAAC;gBACnC,OAAO,CAAC,wBAAwB,GAAGC,eAAU,CAAC,GAAG,CAAC,GAAG,KAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;aAC9G,CAAC,EACFH,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;SACH;;;;;;;;;;;;;;;;QAiBM,4BAAM,GAAN,UAAO,GAAW,EAAE,MAAyB,EAAE,IAA4C,EAAE,WAAgB,EAAE,wBAAwC,EAAE,aAAoB;YAA7K,iBA2BN;YA3B0B,uBAAA,EAAA,aAAyB;YAAE,qBAAA,EAAA,oBAA4C;YAAE,4BAAA,EAAA,gBAAgB;YAAE,yCAAA,EAAA,+BAAwC;YAAE,8BAAA,EAAA,oBAAoB;YAClL,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE;gBAC9C,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;gBACtF,OAAOF,OAAE,CAAM,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAACC,eAAK,CAAC,CAAC,CAAC,EAAEC,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3G;YAED,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtH,OAAO,QAAQ,CAAC,IAAI,CAClBC,aAAG,CAAC,UAAC,IAAwB;gBAE3B,IAAI,WAAW,CAAC,KAAK,EAAE;oBACrB,KAAI,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBACtC,KAAI,CAAC,GAAG,CAAC,KAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;iBACrD;gBAED,OAAO,IAAI,CAAC;aACb,CAAC,EACFC,oBAAU,CAAC,UAAC,GAAG,EAAE,MAAM;gBACrB,IAAI,aAAa;oBAAE,aAAa,EAAE,CAAC;gBACnC,OAAO,CAAC,wBAAwB,GAAGC,eAAU,CAAC,GAAG,CAAC,GAAG,KAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;aAC9G,CAAC,EACFH,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;SACH;;;;;;;;;;;;;QAcM,0BAAI,GAAJ,UAAQ,GAAW,EAAE,QAAa,EAAE,WAAgB,EAAE,wBAAwC;YAA9F,iBAuBN;YAvB0C,4BAAA,EAAA,gBAAgB;YAAE,yCAAA,EAAA,+BAAwC;YACnG,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3F,OAAO,QAAQ,CAAC,IAAI,CAClBC,aAAG,CAAC,UAAC,GAAM;gBACT,IAAI,YAAY,GAAM,GAAG,CAAC;gBAE1B,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;oBACnB,OAAO,CAAC,GAAG,CAAC,mDAAmD,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;gBAElG,OAAO,YAAY,CAAC;aACrB,CAAC,EACFC,oBAAU,CAAC,UAAC,GAAG,EAAE,MAAM;gBAErB,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;oBACnB,OAAO,CAAC,GAAG,CAAC,8CAA8C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEpF,OAAO,CAAC,wBAAwB,GAAGC,eAAU,CAAC,GAAG,CAAC,GAAG,KAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;aAC9G,CAAC,EACFH,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;SACH;;;;;;;;;;;;QAaM,mCAAa,GAAb,UAAiB,GAAW,EAAE,QAAa,EAAE,eAA8B;YAA3E,iBAYN;YAXC,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACtD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAElD,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;YAEtG,OAAO,QAAQ,CAAC,IAAI,CAClBE,oBAAU,CAAC,UAAC,GAAG,EAAE,MAAM,IAAsB,OAAO,KAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAC/GF,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;SACH;;;;;;;;;;;;;;QAeM,iCAAW,GAAX,UAAe,GAAW,EAAE,QAAW,EAAE,QAAgB,EAAE,eAAuD,EAAE,YAA8B,EAAE,WAA2B;YAA/K,iBAiBN;YAjB0H,6BAAA,EAAA,mBAA8B;YAAE,4BAAA,EAAA,kBAA2B;YACpL,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CACtFE,oBAAU,CAAC,UAAC,GAAG,EAAE,MAAM;gBACrB,IAAI,YAAY,IAAI,CAAC,WAAW;oBAC9B,YAAY,EAAE,CAAC;gBACjB,OAAO,KAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;aAC7E,CAAC,EACFF,kBAAQ,CAAC,cAAQ,KAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC,SAAS,CAAC,UAAC,QAAc;gBACzB,IAAI,IAAI,GAAG,QAAQ,CAAC;gBACpB,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC9C,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAClC,IAAI,YAAY;oBACd,YAAY,EAAE,CAAC;aAClB,CAAC,CAAC;SACJ;;;;;;;;QASO,sCAAgB,GAAhB,UAAiB,GAAW;YAClC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAC/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;YAC3F,OAAO,MAAM,CAAC;SACf;;;;;;QAOO,4CAAsB,GAAtB,UAAuB,GAAW;YAAlC,iBA0BP;YAzBC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC5E,IAAI,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;gBAC7E,OAAO;YAET,IAAI,gBAAgB,GAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YACvE,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC;gBACnD,OAAO;YAET,IAAI,YAAY,GAAa,EAAE,CAAC;YAChC,gBAAgB,CAAC,OAAO,CAAC,UAAA,GAAG;gBAC1B,IAAI,QAAQ,GAAG,KAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5C,KAAK,IAAI,IAAI,IAAI,KAAK;oBACpB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAC9B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC7B,CAAC,CAAC;YAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;aACjB;YAED,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SAC5E;;;;;;QAOO,uCAAiB,GAAjB,UAAkB,IAAY;YACpC,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;SAC9B;;;;;;;;;;QAWO,sCAAgB,GAAhB,UAAiB,eAAoB;YAC3C,IAAI,QAAQ,GAAa,IAAI,QAAQ,EAAE,CAAC;YAExC,IAAI,eAAe,EAAE;gBACnB,IAAI,eAAe,CAAC,MAAM;oBACxB,eAAe,CAAC,OAAO,CAAC,UAAA,CAAC,IAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;qBACnE,IAAI,eAAe,CAAC,IAAI;oBAC3B,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;aACnE;YAED,OAAO,QAAQ,CAAC;SACjB;;;;;;;;;;;QAYO,gCAAU,GAAV,UAAW,aAAkB,EAAE,WAA2B,EAAE,WAAwC,EAAE,MAAmC;YAA9H,8BAAA,EAAA,kBAAkB;YAAE,4BAAA,EAAA,kBAA2B;YAAE,4BAAA,EAAA,gCAAwC;YAAE,uBAAA,EAAA,2BAAmC;;YAC/I,IAAI,OAAO,GAAG,IAAII,gBAAW,EAAE,CAAC;YAChC,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAE1D,IAAI,WAAW;gBACb,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAExD,IAAI,aAAa;gBACf,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAErD,IAAI,SAAS,IAAI,WAAW;gBAC1B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;YAEnE,IAAI,MAAM;gBACR,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAEzD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,QAAE,IAAI,CAAC,MAAM,mCAAI,OAAO,CAAC,CAAC;YACpE,OAAO,OAAO,CAAC;SAChB;;;;;;;QAQO,6BAAO,GAAP,UAAQ,GAAQ,EAAE,IAAY;YACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAE9B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;gBACrB,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,EAAE;oBAC/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;oBAChI,OAAO;iBACR;gBAED,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;gBAE/F,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACjD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;gBACtC,OAAO;aACR;;YAGD,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,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;gBACnB,IAAI,GAAG,CAAC,UAAU;oBAChB,GAAG,CAAC,UAAU,GAAG,iBAAiB,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;;oBAElE,GAAG,CAAC,UAAU,GAAG,iBAAiB,CAAC;aACtC;YAED,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,KAAK,EAAE;gBACb,IAAI,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC;gBAE/B,IAAI,cAAc,CAAC,KAAK;oBACtB,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;;oBAEpC,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;aACpC;;gBACC,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;;YAGxB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;gBACrB,IAAI,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,EAAE;oBAC/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;oBAChI,OAAO;iBACR;gBAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,4BAA4B,EAAE;oBACrD,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAChE,OAAO;aACR;YAED,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;gBACrB,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC9D,OAAO;aACR;YAED,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;SACnG;;;;;;;;;;QAWO,2DAAqC,GAArC,UAAsC,GAAQ,EAAE,IAAY,EAAE,WAA2B;YAA3B,4BAAA,EAAA,kBAA2B;YAC/F,IAAI,WAAW;gBACb,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,IAAIC,eAAU,CAAC,eAAS,CAAC,CAAC;SAClC;;;;;;;;;QAUO,6CAAuB,GAAvB,UAAwB,GAAW,EAAE,MAAkB;YAE7D,IAAI,UAAU,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;YACnE,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAE1C,IAAI,UAAU,EAAE;gBACd,IAAI,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBAEhC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrE,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS;oBAC1C,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBAEtC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC5C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAE1H,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE;;;oBAGhF,IAAI,SAAS;wBACX,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC;oBAEpC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;iBACzB;aACF;YAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC3F;;;;;;;QAQO,mCAAa,GAAb,UAAiB,IAAO,EAAE,UAAmF;YACnH,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAExI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;YAClC,IAAI,UAAU,CAAC,SAAS;gBACtB,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAErF,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACxI;;;;;;QAOO,yCAAmB,GAAnB;YACN,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,CAAC;SAC7E;;;;;;;;QASO,2CAAqB,GAArB,UAAsB,IAAS;YACrC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,CAAC;SAC/D;;;;QAKM,kDAA4B,GAA5B;;YACL,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YACxE,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,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;SACvK;;;;QAKM,gDAA0B,GAA1B;YACL,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9E;;;;;;;;;QAUO,kCAAY,GAAZ,UAAa,GAAW,EAAE,MAAkB;YAClD,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;;YAE5G,IAAI,aAAa,GAAG,MAAM,IAAU,MAAO,CAAC,OAAO,GAAS,MAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAC,IAAS,EAAE,IAAS,IAAK,OAAA,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,GAAA,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YAC5J,OAAO,WAAW,GAAG,GAAG,GAAG,aAAa,CAAC;SAC1C;;;;;;QAOO,6BAAO,GAAP;YACN,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;gBACxE,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;gBACnE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aACvB,CAAC,CAAC;SACJ;;;;;;QAOO,yBAAG,GAAH,UAAI,OAAe;YACzB,IAAI,IAAI,CAAC,UAAU;gBACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,CAAA;SAC1C;;;;;;;;QASO,yBAAG,GAAH,UAAI,OAAe;YACzB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACjB,OAAO,CAAC,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,CAAA;gBAChD,OAAO,EAAE,CAAC;aACX;YACD,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC;;;;gBArlBFC,eAAU;;;gDA4CNC,WAAM,SAAC,WAAW;gBA/Dd,qBAAqB;gDAiEzBC,aAAQ,YAAID,WAAM,SAAC,iBAAiB;gDACpCC,aAAQ,YAAID,WAAM,SAAC,WAAW;gDAC9BC,aAAQ,YAAID,WAAM,SAAC,QAAQ;gDAC3BC,aAAQ,YAAID,WAAM,SAAC,uBAAuB;8CAC1CC,aAAQ,YAAID,WAAM,SAAC,aAAa;8CAChCC,aAAQ,YAAID,WAAM,SAAC,UAAU;gBAjFzBE,eAAU;;;;QCMnB;;QACW,yBAAO,GAAd,UAAe,MAAgC;YAC3C,OAAO;gBACH,QAAQ,EAAE,iBAAiB;gBAC3B,SAAS,EAAE;oBACP,WAAW;oBACX,qBAAqB;oBACrB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,EAAE;oBAClE,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,oBAAoB,EAAE;oBAC5E,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,EAAE;oBACtD,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,OAAO,EAAE;oBACjE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE;oBAChD,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE;oBACzD,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EAAE;iBACvD;aACJ,CAAC;SACL;;;;gBAjBJC,aAAQ;;;ICNT;;;;QAGA;SAsCC;sCAAA;KAAA;;ICzCD;;;;ICAA;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"esfaenza-httpservice.umd.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/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.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, 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}","// Angular\r\nimport { HttpClient, HttpHeaders, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, delay, finalize, map } from \"rxjs/operators\";\r\nimport { 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 { Loc } from './httpservice.service.loc';\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 /**\r\n * Formato della data di expire della cache\r\n */\r\n private cacheExpireFormat = \"YYYY/MM/DD HH:mm:ss\";\r\n\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 */\r\n private callStatus: { [id: string]: boolean } = {};\r\n\r\n /**\r\n * Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary\r\n */\r\n private localStorageHttpCacheKey = null;\r\n\r\n /**\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 */\r\n private localStorageHttpTimedCacheKey = null;\r\n\r\n /**\r\n * Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa\r\n */\r\n private localStorageHttpCacheExpireKey = null;\r\n\r\n /**\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 */\r\n private me: { Idtenant: string, IdUser: string } = null;\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 ) {\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 if (this.untimedCacheExpired())\r\n this.resetHttpUntimedCacheStorage();\r\n this.resetHttpTimedCacheStorage();\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); })\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); })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP. Tipizzata sia in Input che in Output\r\n * \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 {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, 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) });\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\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto\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(), responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError)\r\n afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: Blob) => {\r\n var blob = response;\r\n var retUrl = window.URL.createObjectURL(blob);\r\n getFileCallback(retUrl, filename);\r\n if (afterGetFile)\r\n afterGetFile();\r\n });\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 = JSON.parse(localStorage.getItem(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 localStorage.setItem(this.localStorageHttpCacheKey, JSON.stringify(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 */\r\n private tryFinalizeByGuid(guid: string) {\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\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 onError(res: any, guid: string) {\r\n this.callStatus[guid] = false;\r\n\r\n if (res.status == 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\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n }\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 if (res.status == 0) {\r\n if (res.statusText)\r\n res.statusText = \"Server Offline?\" + \" (\" + res.statusText + \") \";\r\n else\r\n res.statusText = \"Server Offline?\";\r\n }\r\n\r\n var text = \"\";\r\n if (res.error) {\r\n var convertedError = res.error;\r\n\r\n if (convertedError.error)\r\n text = convertedError.error.message;\r\n else\r\n text = convertedError.toString();\r\n } else\r\n text = res.statusText;\r\n\r\n // 444: NotConfiguredException\r\n if (res.status == 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 return;\r\n }\r\n\r\n if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, text);\r\n return;\r\n }\r\n\r\n if (res.status == 403) {\r\n this.ExtensionsImpl.handleBlockingException(res.status, text);\r\n return;\r\n }\r\n\r\n this.ExtensionsImpl.handleException(res.status || 'HTTP Service Internal Error', res.status ? text : res.message);\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 {{ finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any }} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): { finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any } {\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 = localStorage.getItem(cacheKey);\r\n let cache = cacheLs ? JSON.parse(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 { finalUrl: url, cache: useCaching, cacheKey: cachingKey, cacheTime: cacheTime, cacheItem: 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 {{ finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any }} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: { finalUrl: string, cache: boolean, cacheKey: string, cacheTime: string, cacheItem: any }): void {\r\n let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = localStorage.getItem(cacheKey);\r\n let cache = cacheLs ? JSON.parse(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 localStorage.setItem(cacheKey, JSON.stringify(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, this.cacheExpireFormat) < 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, this.cacheExpireFormat) < 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 localStorage.setItem(this.localStorageHttpCacheKey, JSON.stringify({}));\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, \"second\").format(this.cacheExpireFormat)));\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 localStorage.setItem(this.localStorageHttpTimedCacheKey, JSON.stringify({}));\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 // Parametri castati ad 'any' dato che la proprietà updates è privata\r\n let paramsKeyPart = params && (<any>params).updates ? (<any>params).updates.reduce((prev: any, next: any) => prev + next.param + '=' + next.value, \"\") : \"\";\r\n return authKeyPart + url + 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}","/*\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';","/**\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":["InjectionToken","of","delay","finalize","map","catchError","throwError","HttpHeaders","Observable","Injectable","Inject","Optional","HttpClient","NgModule"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/common/http"),require("@angular/core"),require("rxjs/operators"),require("rxjs")):"function"==typeof define&&define.amd?define("@esfaenza/httpservice",["exports","@angular/common/http","@angular/core","rxjs/operators","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).esfaenza=e.esfaenza||{},e.esfaenza.httpservice={}),e.ng.common.http,e.ng.core,e.rxjs.operators,e.rxjs)}(this,(function(e,t,r,i,o){"use strict";var n=new r.InjectionToken("HTTP_INVALIDATION"),a=new r.InjectionToken("CLIENT_CACHE_DURATION_S"),s=new r.InjectionToken("BACKEND_URL"),c=new r.InjectionToken("HTTP_LOCALE"),l=new r.InjectionToken("APP_NAME"),p=new r.InjectionToken("CACHE_BY_USER"),h=new r.InjectionToken("DEBUG_MODE"),u=function(){function e(){}return e.prototype.retrieveAccessToken=function(){return""},e.prototype.retrieveIdentity=function(){return null},e.prototype.readRedirectingToLogin=function(){return!1},e.prototype.writeRedirectingToLogin=function(e){},e.prototype.redirectToLogin=function(){},e.prototype.readHandlingErrorStatus=function(){return!1},e.prototype.writeHandlingErrorStatus=function(e){},e.prototype.readRedirectionStatus=function(){return!1},e.prototype.writeRedirectionStatus=function(e){},e.prototype.handleNotConfiguredException=function(){return!1},e.prototype.handleBlockingException=function(e,t){console.error("ESHttpError Blocking Exception "+e+" "+t)},e.prototype.handleException=function(e,t){console.error("ESHttpError "+e+" "+t)},e}(),d={"Result for":{"en-US":"Result for","it-IT":"Risultato per"},"retrieved from cache":{"en-US":"retrieved from cache","it-IT":"recuperato dalla cache"},"Cached result for":{"en-US":"Cached result for","it-IT":"Messo in cache risultato per"},"Starting call":{"en-US":"Starting call","it-IT":"Inizio la chiamata"},"at URL":{"en-US":"at URL","it-IT":"all'URL"},"Invlalidating cache element":{"en-US":"Invlalidating cache element","it-IT":"Invalido elemento della cache"},"Finalizing call":{"en-US":"Finalizing call","it-IT":"Finalizzo chiamata"},"with status":{"en-US":"with status","it-IT":"con stato"},Success:{"en-US":"Success","it-IT":"Successso"},Failure:{"en-US":"Failure","it-IT":"Fallimento"},"Error 401 on call":{"en-US":"Error 401 on call","it-IT":"Errore 401 su chiamata"},"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"},"redirecting to login":{"en-US":"redirecting to login","it-IT":"redireziono al login"},"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"},"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"},"Error 444 on call":{"en-US":"Error 444 on call","it-IT":"Errore 444 su chiamata"}},g=function(){function e(e,t,r,i,o,n,a,s,c){var l,p;this.BACKEND_URL=e,this.EXTENSION_CLASS=t,this.HTTP_INVALIDATION=r,this.LOCALE=i,this.APP_NAME=o,this.CLIENT_CACHE_DURATION_S=n,this.CACHE_BY_USER=a,this.DEBUG_MODE=s,this.http=c,this.cacheExpireFormat="YYYY/MM/DD HH:mm:ss",this.callStatus={},this.localStorageHttpCacheKey=null,this.localStorageHttpTimedCacheKey=null,this.localStorageHttpCacheExpireKey=null,this.me=null,this.ExtensionsImpl=this.EXTENSION_CLASS||new u,this.me=this.ExtensionsImpl.retrieveIdentity(),this.localStorageHttpCacheKey=(null!==(l=this.APP_NAME)&&void 0!==l?l:"APP").replace(/\s/g,"_")+"_HttpCache",this.localStorageHttpTimedCacheKey=(null!==(p=this.APP_NAME)&&void 0!==p?p:"APP").replace(/\s/g,"_")+"_HttpTimedCache",this.localStorageHttpCacheExpireKey=this.localStorageHttpCacheKey+"_Expire",this.untimedCacheExpired()&&this.resetHttpUntimedCacheStorage()}return e.prototype.get=function(e,t,r,n,a){var s=this;void 0===t&&(t=null),void 0===r&&(r=""),void 0===n&&(n=!0),void 0===a&&(a=null);var c=this.defaultStartCall(e),l=this.tryGetCacheInformations(e,t);return l.cache&&l.cacheitem?(this.log(this.loc("Result for")+" "+e+" "+this.loc("retrieved from cache")),o.of(l.cacheitem).pipe(i.delay(0),i.finalize((function(){s.tryFinalizeByGuid(c)})))):this.http.get(e,{headers:this.getHeaders(r),params:t}).pipe(i.map((function(t){var r=t;return Ema&&Ema.BigLog&&console.log("@httpservice BigLog: GET Success with response -"+JSON.stringify(r)),l.cache&&(s.cacheResponse(r,l),s.log(s.loc("Cached result for")+" "+e)),r})),i.catchError((function(e,t){return Ema&&Ema.BigLog&&console.log("@httpservice BigLog: GET Catch with error -"+JSON.stringify(e)),a&&a(),n?s.registerErrorAndReturnEmptyObservable(e,c):o.throwError(e)})),i.finalize((function(){s.tryFinalizeByGuid(c)})))},e.prototype.getRaw=function(e,t,r,n,a,s){var c=this;void 0===t&&(t=null),void 0===r&&(r="arraybuffer"),void 0===n&&(n=""),void 0===a&&(a=!0),void 0===s&&(s=null);var l=this.defaultStartCall(e),p=this.tryGetCacheInformations(e,t);return p.cache&&p.cacheitem?(this.log(this.loc("Result for")+" "+e+" "+this.loc("retrieved from cache")),o.of(p.cacheitem).pipe(i.delay(0),i.finalize((function(){c.tryFinalizeByGuid(l)})))):this.http.get(e,{responseType:r,headers:this.getHeaders(n),params:t}).pipe(i.map((function(t){return p.cache&&(c.cacheResponse(t,p),c.log(c.loc("Cached result for")+" "+e)),t})),i.catchError((function(e,t){return s&&s(),a?c.registerErrorAndReturnEmptyObservable(e,l):o.throwError(e)})),i.finalize((function(){c.tryFinalizeByGuid(l)})))},e.prototype.post=function(e,t,r,n){var a=this;void 0===r&&(r=""),void 0===n&&(n=!0);var s=this.defaultStartCall(e);return this.http.post(e,t,{headers:this.getHeaders(r)}).pipe(i.map((function(e){var t=e;return Ema&&Ema.BigLog&&console.log("@httpservice BigLog: POST Success with response -"+JSON.stringify(t)),t})),i.catchError((function(e,t){return Ema&&Ema.BigLog&&console.log("@httpservice BigLog: POST Catch with error -"+JSON.stringify(e)),n?a.registerErrorAndReturnEmptyObservable(e,s):o.throwError(e)})),i.finalize((function(){a.tryFinalizeByGuid(s)})))},e.prototype.postwithFiles=function(e,t,r){var o=this,n=this.defaultStartCall(e),a=this.getFilesFormData(r);return a.append("body",JSON.stringify(t)),this.http.post(e,a,{headers:this.getHeaders(null,!0,null,null)}).pipe(i.catchError((function(e,t){return o.registerErrorAndReturnEmptyObservable(e,n)})),i.finalize((function(){o.tryFinalizeByGuid(n)})))},e.prototype.postGetFile=function(e,t,r,o,n,a){var s=this;void 0===n&&(n=null),void 0===a&&(a=!0);var c=this.defaultStartCall(e);this.http.post(e,t,{headers:this.getHeaders(),responseType:"blob"}).pipe(i.catchError((function(e,t){return n&&!a&&n(),s.registerErrorAndReturnEmptyObservable(e,c,a)})),i.finalize((function(){s.tryFinalizeByGuid(c)}))).subscribe((function(e){var t=e,i=window.URL.createObjectURL(t);o(i,r),n&&n()}))},e.prototype.defaultStartCall=function(e){var t=this.getGUID();return this.checkCacheInvalidation(e),this.callStatus[t]=!0,this.log(this.loc("Starting call")+" "+t+" "+this.loc("at URL")+": "+e),t},e.prototype.checkCacheInvalidation=function(e){var t=this,r=JSON.parse(localStorage.getItem(this.localStorageHttpCacheKey)),i=e.replace("#cache","").replace(this.BACKEND_URL,"");if(r&&this.HTTP_INVALIDATION&&this.HTTP_INVALIDATION[i]){var o=this.HTTP_INVALIDATION[i];if(o&&0!=o.length){var n=[];o.forEach((function(e){var i=t.makeCacheKey(e,null);for(var o in r)-1!=o.indexOf(i)&&n.push(o)}));for(var a=0;a<n.length;a++){var s=n[a];this.log(this.loc("Invlalidating cache element")+" "+s),delete r[s]}localStorage.setItem(this.localStorageHttpCacheKey,JSON.stringify(r))}}},e.prototype.tryFinalizeByGuid=function(e){this.log(this.loc("Finalizing call")+" "+e+" "+this.loc("with status")+": "+(this.callStatus[e]?this.loc("Success"):this.loc("Failure"))),this.callStatus[e]&&this.ExtensionsImpl.readRedirectionStatus()&&this.ExtensionsImpl.writeRedirectionStatus(!1),delete this.callStatus[e]},e.prototype.getFilesFormData=function(e){var t=new FormData;return e&&(e.length?e.forEach((function(e){t.append("file",e,e.name)})):e.name&&t.append("files",e,e.name)),t},e.prototype.getHeaders=function(e,r,i,o){var n;void 0===e&&(e=""),void 0===r&&(r=!0),void 0===i&&(i="application/json"),void 0===o&&(o="application/json");var a=new t.HttpHeaders,s=this.ExtensionsImpl.retrieveAccessToken();return i&&(a=a.append("Content-Type",i)),e&&(a=a.append("X-TX-ID",e)),s&&r&&(a=a.append("Authorization","Bearer "+s)),o&&(a=a.append("Accept","application/json")),a=a.append("Accept-Language",null!==(n=this.LOCALE)&&void 0!==n?n:"it-IT")},e.prototype.onError=function(e,t){if(this.callStatus[t]=!1,401==e.status)return this.ExtensionsImpl.readRedirectionStatus()?void this.log(this.loc("Error 401 on call")+" "+t+" "+this.loc("with redirect already in progress. Ignoring this event")):(this.log(this.loc("Error 401 on call")+" "+t+" "+this.loc("redirecting to login.")),this.ExtensionsImpl.writeRedirectionStatus(!0),this.ExtensionsImpl.writeRedirectingToLogin(!0),void this.ExtensionsImpl.redirectToLogin());if(this.ExtensionsImpl.readRedirectingToLogin())this.log(this.loc("Redirecting to Login, ignoring HTTP error on call")+" "+t);else if(this.ExtensionsImpl.readHandlingErrorStatus())this.log(this.loc("Already Handling an error, ignoring HTTP error on call")+" "+t);else{this.ExtensionsImpl.writeHandlingErrorStatus(!0),0==e.status&&(e.statusText?e.statusText="Server Offline? ("+e.statusText+") ":e.statusText="Server Offline?");var r="";if(e.error){var i=e.error;r=i.error?i.error.message:i.toString()}else r=e.statusText;if(444==e.status)return this.ExtensionsImpl.readRedirectionStatus()?void this.log(this.loc("Error 444 on call")+" "+t+" "+this.loc("with redirect already in progress. Ignoring this event")):void(this.ExtensionsImpl.handleNotConfiguredException()||this.ExtensionsImpl.handleBlockingException(e.status,r));403!=e.status?this.ExtensionsImpl.handleException(e.status||"???",e.status?r:JSON.stringify(e)):this.ExtensionsImpl.handleBlockingException(e.status,r)}},e.prototype.registerErrorAndReturnEmptyObservable=function(e,t,r){return void 0===r&&(r=!0),r&&this.onError(e,t),new o.Observable((function(){}))},e.prototype.tryGetCacheInformations=function(e,t){var r=null,i=null,o=null,n=null,a=!!/#cache/gi.exec(e);if(a){var s=/#cache(:?-(\d+))/gi.exec(e);i=s?s[2]:null,e=e.replace("#cache"+(i?"-"+i:""),""),this.untimedCacheExpired()&&!i&&this.resetHttpUntimedCacheStorage(),r=this.makeCacheKey(e,t),(o=JSON.parse(localStorage.getItem(i?this.localStorageHttpCacheExpireKey:this.localStorageHttpCacheKey)))&&o[r]&&!this.timedCacheItemExpired(o[r])&&(i&&delete o[r].__expire,n=o[r])}return{cache:a,cacheKey:r,cachetime:i,cacheitem:n}},e.prototype.cacheResponse=function(e,t){var r=JSON.parse(localStorage.getItem(t.cachetime?this.localStorageHttpTimedCacheKey:this.localStorageHttpCacheKey));r[t.cacheKey]=e,t.cachetime&&(r[t.cacheKey].__expire=dayjs().add(t.cachetime,"seconds")),localStorage.setItem(t.cachetime?this.localStorageHttpTimedCacheKey:this.localStorageHttpCacheKey,JSON.stringify(r))},e.prototype.untimedCacheExpired=function(){var e=JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));return!e||e&&dayjs(e,this.cacheExpireFormat)<dayjs()},e.prototype.timedCacheItemExpired=function(e){return dayjs(e.__expire,this.cacheExpireFormat)<dayjs()},e.prototype.resetHttpUntimedCacheStorage=function(){var e;localStorage.setItem(this.localStorageHttpCacheKey,JSON.stringify({})),localStorage.setItem(this.localStorageHttpCacheExpireKey,JSON.stringify(dayjs().add(null!==(e=this.CLIENT_CACHE_DURATION_S)&&void 0!==e?e:3600,"second").format(this.cacheExpireFormat)))},e.prototype.resetHttpTimedCacheStorage=function(){localStorage.setItem(this.localStorageHttpTimedCacheKey,JSON.stringify({}))},e.prototype.makeCacheKey=function(e,t){return(this.me?this.me.Idtenant:"")+(this.me&&this.CACHE_BY_USER?this.me.IdUser:"")+e+(t&&t.updates?t.updates.reduce((function(e,t){return e+t.param+"="+t.value}),""):"")},e.prototype.getGUID=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))},e.prototype.log=function(e){this.DEBUG_MODE&&console.log("@httpservice: "+e)},e.prototype.loc=function(e){return d[e]?d[e][this.LOCALE]:(console.warn("Untranslated message: "+e),"")},e}();g.decorators=[{type:r.Injectable}],g.ctorParameters=function(){return[{type:void 0,decorators:[{type:r.Inject,args:[s]}]},{type:u},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[n]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[c]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[l]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[a]}]},{type:Boolean,decorators:[{type:r.Optional},{type:r.Inject,args:[p]}]},{type:Boolean,decorators:[{type:r.Optional},{type:r.Inject,args:[h]}]},{type:t.HttpClient}]};var f=function(){function e(){}return e.forRoot=function(t){return{ngModule:e,providers:[g,u,{provide:n,useValue:null==t?void 0:t.httpInvalidation},{provide:a,useValue:null==t?void 0:t.clientCacheDurationS},{provide:s,useValue:null==t?void 0:t.backendUrl},{provide:c,useValue:(null==t?void 0:t.httpLocale)||"it-IT"},{provide:l,useValue:null==t?void 0:t.appName},{provide:p,useValue:null==t?void 0:t.cacheByUser},{provide:h,useValue:null==t?void 0:t.debugMode}]}},e}();f.decorators=[{type:r.NgModule}];var y=function(){};e.HTTPService=g,e.HttpServiceExtensions=u,e.HttpServiceModuleConfig=y,e.HttpserviceModule=f,e["ɵa"]=n,e["ɵb"]=a,e["ɵc"]=s,e["ɵd"]=c,e["ɵe"]=l,e["ɵf"]=p,e["ɵg"]=h,Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/common/http"),require("@angular/core"),require("rxjs/operators"),require("rxjs")):"function"==typeof define&&define.amd?define("@esfaenza/httpservice",["exports","@angular/common/http","@angular/core","rxjs/operators","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).esfaenza=e.esfaenza||{},e.esfaenza.httpservice={}),e.ng.common.http,e.ng.core,e.rxjs.operators,e.rxjs)}(this,(function(e,t,r,i,o){"use strict";var n=new r.InjectionToken("HTTP_INVALIDATION"),a=new r.InjectionToken("CLIENT_CACHE_DURATION_S"),s=new r.InjectionToken("BACKEND_URL"),l=new r.InjectionToken("HTTP_LOCALE"),c=new r.InjectionToken("APP_NAME"),p=new r.InjectionToken("CACHE_BY_USER"),h=new r.InjectionToken("DEBUG_MODE"),u=function(){function e(){}return e.prototype.retrieveAccessToken=function(){return""},e.prototype.retrieveIdentity=function(){return null},e.prototype.readRedirectingToLogin=function(){return!1},e.prototype.writeRedirectingToLogin=function(e){},e.prototype.redirectToLogin=function(){},e.prototype.readHandlingErrorStatus=function(){return!1},e.prototype.writeHandlingErrorStatus=function(e){},e.prototype.readRedirectionStatus=function(){return!1},e.prototype.writeRedirectionStatus=function(e){},e.prototype.handleNotConfiguredException=function(){return!1},e.prototype.handleBlockingException=function(e,t){console.error("ESHttpError Blocking Exception "+e+" "+t)},e.prototype.handleException=function(e,t){console.error("ESHttpError "+e+" "+t)},e}(),d={"Result for":{"en-US":"Result for","it-IT":"Risultato per"},"retrieved from cache":{"en-US":"retrieved from cache","it-IT":"recuperato dalla cache"},"Cached result for":{"en-US":"Cached result for","it-IT":"Messo in cache risultato per"},"Starting call":{"en-US":"Starting call","it-IT":"Inizio la chiamata"},"at URL":{"en-US":"at URL","it-IT":"all'URL"},"Invlalidating cache element":{"en-US":"Invlalidating cache element","it-IT":"Invalido elemento della cache"},"Finalizing call":{"en-US":"Finalizing call","it-IT":"Finalizzo chiamata"},"with status":{"en-US":"with status","it-IT":"con stato"},Success:{"en-US":"Success","it-IT":"Successso"},Failure:{"en-US":"Failure","it-IT":"Fallimento"},"Error 401 on call":{"en-US":"Error 401 on call","it-IT":"Errore 401 su chiamata"},"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"},"redirecting to login":{"en-US":"redirecting to login","it-IT":"redireziono al login"},"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"},"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"},"Error 444 on call":{"en-US":"Error 444 on call","it-IT":"Errore 444 su chiamata"}},g=function(){function e(e,t,r,i,o,n,a,s,l){var c,p;this.BACKEND_URL=e,this.EXTENSION_CLASS=t,this.HTTP_INVALIDATION=r,this.LOCALE=i,this.APP_NAME=o,this.CLIENT_CACHE_DURATION_S=n,this.CACHE_BY_USER=a,this.DEBUG_MODE=s,this.http=l,this.cacheExpireFormat="YYYY/MM/DD HH:mm:ss",this.callStatus={},this.localStorageHttpCacheKey=null,this.localStorageHttpTimedCacheKey=null,this.localStorageHttpCacheExpireKey=null,this.me=null,this.ExtensionsImpl=this.EXTENSION_CLASS||new u,this.me=this.ExtensionsImpl.retrieveIdentity(),this.localStorageHttpCacheKey=(null!==(c=this.APP_NAME)&&void 0!==c?c:"APP").replace(/\s/g,"_")+"_HttpCache",this.localStorageHttpTimedCacheKey=(null!==(p=this.APP_NAME)&&void 0!==p?p:"APP").replace(/\s/g,"_")+"_HttpTimedCache",this.localStorageHttpCacheExpireKey=this.localStorageHttpCacheKey+"_Expire",this.untimedCacheExpired()&&this.resetHttpUntimedCacheStorage(),this.resetHttpTimedCacheStorage()}return e.prototype.get=function(e,t,r,n,a){var s=this;void 0===t&&(t=null),void 0===r&&(r=""),void 0===n&&(n=!0),void 0===a&&(a=null);var l=this.defaultStartCall(e),c=this.tryGetCacheInformations(e,t);return c.cache&&c.cacheItem?(this.log(this.loc("Result for")+" "+e+" "+this.loc("retrieved from cache")),o.of(c.cacheItem).pipe(i.delay(0),i.finalize((function(){s.tryFinalizeByGuid(l)})))):this.http.get(c.finalUrl,{headers:this.getHeaders(r),params:t}).pipe(i.map((function(t){var r=t;return c.cache&&(s.cacheResponse(r,c),s.log(s.loc("Cached result for")+" "+e)),r})),i.catchError((function(e,t){return a&&a(),n?s.registerErrorAndReturnEmptyObservable(e,l):o.throwError(e)})),i.finalize((function(){s.tryFinalizeByGuid(l)})))},e.prototype.getRaw=function(e,t,r,n,a,s){var l=this;void 0===t&&(t=null),void 0===r&&(r="arraybuffer"),void 0===n&&(n=""),void 0===a&&(a=!0),void 0===s&&(s=null);var c=this.defaultStartCall(e),p=this.tryGetCacheInformations(e,t);return p.cache&&p.cacheItem?(this.log(this.loc("Result for")+" "+e+" "+this.loc("retrieved from cache")),o.of(p.cacheItem).pipe(i.delay(0),i.finalize((function(){l.tryFinalizeByGuid(c)})))):this.http.get(p.finalUrl,{responseType:r,headers:this.getHeaders(n),params:t}).pipe(i.map((function(t){return p.cache&&(l.cacheResponse(t,p),l.log(l.loc("Cached result for")+" "+e)),t})),i.catchError((function(e,t){return s&&s(),a?l.registerErrorAndReturnEmptyObservable(e,c):o.throwError(e)})),i.finalize((function(){l.tryFinalizeByGuid(c)})))},e.prototype.post=function(e,t,r,n){var a=this;void 0===r&&(r=""),void 0===n&&(n=!0);var s=this.defaultStartCall(e);return this.http.post(e,t,{headers:this.getHeaders(r)}).pipe(i.map((function(e){return e})),i.catchError((function(e,t){return n?a.registerErrorAndReturnEmptyObservable(e,s):o.throwError(e)})),i.finalize((function(){a.tryFinalizeByGuid(s)})))},e.prototype.postwithFiles=function(e,t,r){var o=this,n=this.defaultStartCall(e),a=this.getFilesFormData(r);return a.append("body",JSON.stringify(t)),this.http.post(e,a,{headers:this.getHeaders(null,!0,null,null)}).pipe(i.catchError((function(e,t){return o.registerErrorAndReturnEmptyObservable(e,n)})),i.finalize((function(){o.tryFinalizeByGuid(n)})))},e.prototype.postGetFile=function(e,t,r,o,n,a){var s=this;void 0===n&&(n=null),void 0===a&&(a=!0);var l=this.defaultStartCall(e);this.http.post(e,t,{headers:this.getHeaders(),responseType:"blob"}).pipe(i.catchError((function(e,t){return n&&!a&&n(),s.registerErrorAndReturnEmptyObservable(e,l,a)})),i.finalize((function(){s.tryFinalizeByGuid(l)}))).subscribe((function(e){var t=e,i=window.URL.createObjectURL(t);o(i,r),n&&n()}))},e.prototype.defaultStartCall=function(e){var t=this.getGUID();return this.checkCacheInvalidation(e),this.callStatus[t]=!0,this.log(this.loc("Starting call")+" "+t+" "+this.loc("at URL")+": "+e),t},e.prototype.checkCacheInvalidation=function(e){var t=this,r=JSON.parse(localStorage.getItem(this.localStorageHttpCacheKey)),i=/#cache(:?-(\d+))/gi.exec(e),o=i?i[2]:null,n=e.replace("#cache"+(o?"-"+o:""),"").replace(this.BACKEND_URL,"");if(r&&this.HTTP_INVALIDATION&&this.HTTP_INVALIDATION[n]){var a=this.HTTP_INVALIDATION[n];if(a&&0!=a.length){var s=[];a.forEach((function(e){var i=t.makeCacheKey(e,null);for(var o in r)-1!=o.indexOf(i)&&s.push(o)}));for(var l=0;l<s.length;l++){var c=s[l];this.log(this.loc("Invlalidating cache element")+" "+c),delete r[c]}localStorage.setItem(this.localStorageHttpCacheKey,JSON.stringify(r))}}},e.prototype.tryFinalizeByGuid=function(e){this.log(this.loc("Finalizing call")+" "+e+" "+this.loc("with status")+": "+(this.callStatus[e]?this.loc("Success"):this.loc("Failure"))),this.callStatus[e]&&this.ExtensionsImpl.readRedirectionStatus()&&this.ExtensionsImpl.writeRedirectionStatus(!1),delete this.callStatus[e]},e.prototype.getFilesFormData=function(e){var t=new FormData;return e&&(e.length?e.forEach((function(e){t.append("file",e,e.name)})):e.name&&t.append("files",e,e.name)),t},e.prototype.getHeaders=function(e,r,i,o){var n;void 0===e&&(e=""),void 0===r&&(r=!0),void 0===i&&(i="application/json"),void 0===o&&(o="application/json");var a=new t.HttpHeaders,s=this.ExtensionsImpl.retrieveAccessToken();return i&&(a=a.append("Content-Type",i)),e&&(a=a.append("X-TX-ID",e)),s&&r&&(a=a.append("Authorization","Bearer "+s)),o&&(a=a.append("Accept","application/json")),a=a.append("Accept-Language",null!==(n=this.LOCALE)&&void 0!==n?n:"it-IT")},e.prototype.onError=function(e,t){if(this.callStatus[t]=!1,401==e.status)return this.ExtensionsImpl.readRedirectionStatus()?void this.log(this.loc("Error 401 on call")+" "+t+" "+this.loc("with redirect already in progress. Ignoring this event")):(this.log(this.loc("Error 401 on call")+" "+t+" "+this.loc("redirecting to login.")),this.ExtensionsImpl.writeRedirectionStatus(!0),this.ExtensionsImpl.writeRedirectingToLogin(!0),void this.ExtensionsImpl.redirectToLogin());if(this.ExtensionsImpl.readRedirectingToLogin())this.log(this.loc("Redirecting to Login, ignoring HTTP error on call")+" "+t);else if(this.ExtensionsImpl.readHandlingErrorStatus())this.log(this.loc("Already Handling an error, ignoring HTTP error on call")+" "+t);else{this.ExtensionsImpl.writeHandlingErrorStatus(!0),0==e.status&&(e.statusText?e.statusText="Server Offline? ("+e.statusText+") ":e.statusText="Server Offline?");var r="";if(e.error){var i=e.error;r=i.error?i.error.message:i.toString()}else r=e.statusText;if(444==e.status)return this.ExtensionsImpl.readRedirectionStatus()?void this.log(this.loc("Error 444 on call")+" "+t+" "+this.loc("with redirect already in progress. Ignoring this event")):void(this.ExtensionsImpl.handleNotConfiguredException()||this.ExtensionsImpl.handleBlockingException(e.status,r));403!=e.status?this.ExtensionsImpl.handleException(e.status||"HTTP Service Internal Error",e.status?r:e.message):this.ExtensionsImpl.handleBlockingException(e.status,r)}},e.prototype.registerErrorAndReturnEmptyObservable=function(e,t,r){return void 0===r&&(r=!0),r&&this.onError(e,t),new o.Observable((function(){}))},e.prototype.tryGetCacheInformations=function(e,t){var r=null,i=null,o=null,n=!!/#cache/gi.exec(e);if(n){var a=/#cache(:?-(\d+))/gi.exec(e);i=a?a[2]:null,e=e.replace("#cache"+(i?"-"+i:""),""),this.untimedCacheExpired()&&!i&&this.resetHttpUntimedCacheStorage(),r=this.makeCacheKey(e,t);var s=i?this.localStorageHttpTimedCacheKey:this.localStorageHttpCacheKey,l=localStorage.getItem(s),c=l?JSON.parse(l):{};c&&c[r]&&!this.timedCacheItemExpired(c[r])&&(i&&delete c[r].__expire,o=c[r])}return{finalUrl:e,cache:n,cacheKey:r,cacheTime:i,cacheItem:o}},e.prototype.cacheResponse=function(e,t){var r=t.cacheTime?this.localStorageHttpTimedCacheKey:this.localStorageHttpCacheKey,i=localStorage.getItem(r),o=i?JSON.parse(i):{};o[t.cacheKey]=e,t.cacheTime&&(o[t.cacheKey].__expire=dayjs().add(t.cacheTime,"seconds")),localStorage.setItem(r,JSON.stringify(o))},e.prototype.untimedCacheExpired=function(){var e=JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));return!e||e&&dayjs(e,this.cacheExpireFormat)<dayjs()},e.prototype.timedCacheItemExpired=function(e){return dayjs(e.__expire,this.cacheExpireFormat)<dayjs()},e.prototype.resetHttpUntimedCacheStorage=function(){var e;localStorage.setItem(this.localStorageHttpCacheKey,JSON.stringify({})),localStorage.setItem(this.localStorageHttpCacheExpireKey,JSON.stringify(dayjs().add(null!==(e=this.CLIENT_CACHE_DURATION_S)&&void 0!==e?e:3600,"second").format(this.cacheExpireFormat)))},e.prototype.resetHttpTimedCacheStorage=function(){localStorage.setItem(this.localStorageHttpTimedCacheKey,JSON.stringify({}))},e.prototype.makeCacheKey=function(e,t){return(this.me?this.me.Idtenant:"")+(this.me&&this.CACHE_BY_USER?this.me.IdUser:"")+e+(t&&t.updates?t.updates.reduce((function(e,t){return e+t.param+"="+t.value}),""):"")},e.prototype.getGUID=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))},e.prototype.log=function(e){this.DEBUG_MODE&&console.log("@httpservice: "+e)},e.prototype.loc=function(e){return d[e]?d[e][this.LOCALE]:(console.warn("Untranslated message: "+e),"")},e}();g.decorators=[{type:r.Injectable}],g.ctorParameters=function(){return[{type:void 0,decorators:[{type:r.Inject,args:[s]}]},{type:u},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[n]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[l]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[c]}]},{type:void 0,decorators:[{type:r.Optional},{type:r.Inject,args:[a]}]},{type:Boolean,decorators:[{type:r.Optional},{type:r.Inject,args:[p]}]},{type:Boolean,decorators:[{type:r.Optional},{type:r.Inject,args:[h]}]},{type:t.HttpClient}]};var f=function(){function e(){}return e.forRoot=function(t){return{ngModule:e,providers:[g,u,{provide:n,useValue:null==t?void 0:t.httpInvalidation},{provide:a,useValue:null==t?void 0:t.clientCacheDurationS},{provide:s,useValue:null==t?void 0:t.backendUrl},{provide:l,useValue:(null==t?void 0:t.httpLocale)||"it-IT"},{provide:c,useValue:null==t?void 0:t.appName},{provide:p,useValue:null==t?void 0:t.cacheByUser},{provide:h,useValue:null==t?void 0:t.debugMode}]}},e}();f.decorators=[{type:r.NgModule}];var y=function(){};e.HTTPService=g,e.HttpServiceExtensions=u,e.HttpServiceModuleConfig=y,e.HttpserviceModule=f,e["ɵa"]=n,e["ɵb"]=a,e["ɵc"]=s,e["ɵd"]=l,e["ɵe"]=c,e["ɵf"]=p,e["ɵg"]=h,Object.defineProperty(e,"__esModule",{value:!0})}));
2
2
  //# sourceMappingURL=esfaenza-httpservice.umd.min.js.map