@esfaenza/httpservice 20.3.8 → 20.3.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.
@@ -2,11 +2,10 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, Injectable, Optional, Inject, NgModule } from '@angular/core';
3
3
  import * as i3 from '@angular/common/http';
4
4
  import { HttpEventType, HttpHeaders, HttpErrorResponse, HttpParams } from '@angular/common/http';
5
- import { first, concatMap, delay, finalize, map, catchError, scan } from 'rxjs/operators';
5
+ import { first, concatMap, delay, tap, map, catchError, finalize, scan } from 'rxjs/operators';
6
6
  import { Subject, forkJoin, of, from, throwError, Observable } from 'rxjs';
7
7
  import * as i2 from '@esfaenza/localizations';
8
8
  import * as i4 from '@esfaenza/preferences';
9
- import * as i5 from '@esfaenza/extensions';
10
9
 
11
10
  /**
12
11
  * Dizionario di invalidazioni delle chiamate HTTP
@@ -133,7 +132,7 @@ class HTTPService {
133
132
  /**
134
133
  * @ignore
135
134
  */
136
- constructor(EXTENSION_CLASS, HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE, bc, http, localStorage, hash, utisExts) {
135
+ constructor(EXTENSION_CLASS, HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE, bc, http, localStorage) {
137
136
  this.EXTENSION_CLASS = EXTENSION_CLASS;
138
137
  this.HTTP_INVALIDATION = HTTP_INVALIDATION;
139
138
  this.CLIENT_CACHE_DURATION_S = CLIENT_CACHE_DURATION_S;
@@ -142,8 +141,6 @@ class HTTPService {
142
141
  this.bc = bc;
143
142
  this.http = http;
144
143
  this.localStorage = localStorage;
145
- this.hash = hash;
146
- this.utisExts = utisExts;
147
144
  /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
148
145
  this.callStatus = {};
149
146
  /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */
@@ -169,6 +166,17 @@ class HTTPService {
169
166
  this.GET_Trans_BeginTrans = "/api/Trans/BeginTrans";
170
167
  this.GET_Trans_CheckExecution = "/api/Trans/CheckExecution";
171
168
  this.GET_Trans_EndTrans = "/api/Trans/EndTrans";
169
+ /*****************************************************************************************************************************************
170
+ ***************************************************** ROBA PER HASHING ******************************************************************
171
+ *****************************************************************************************************************************************/
172
+ /**
173
+ * Blacklist dei tipi da ignorare quando si effettua l'hashing degli oggetti
174
+ */
175
+ this.objBlacklist = {
176
+ "NgForm": true, "ElementRef": true, "ExtensionsService": true, "ToastrService": true, "LocaleService": true, "AppState": true, "Router": true,
177
+ "ActivatedRoute": true, "HTTPService": true, "Location": true, "CanvasComponent": true, "ModalDirective": true, "ChangeDetectorRef": true,
178
+ "DateService": true, "EventEmitter": true, "ViewRef_": true, "Subscriber": true, "ItemLocalization": true
179
+ };
172
180
  this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
173
181
  }
174
182
  setAppConfig(myconfig) {
@@ -221,13 +229,13 @@ class HTTPService {
221
229
  let cachedInfos = this.tryGetCacheInformations(url, params);
222
230
  if (cachedInfos.cache && cachedInfos.cacheItem) {
223
231
  this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
224
- return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
232
+ return of(cachedInfos.cacheItem).pipe(delay(0), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); }));
225
233
  }
226
234
  var httpCall = this.http.get(cachedInfos.finalUrl, { headers: this.getHeaders(ret.locale, transaction), params: params });
227
235
  return httpCall.pipe(map((res) => {
228
236
  let responseItem = res;
229
237
  if (cachedInfos.cache) {
230
- let toCache = this.utisExts ? this.utisExts.deepClone(responseItem) : JSON.parse(JSON.stringify(responseItem));
238
+ let toCache = JSON.parse(JSON.stringify(responseItem));
231
239
  this.cacheResponse(toCache, cachedInfos);
232
240
  this.log(this.loc("Cached result for") + " " + url);
233
241
  }
@@ -236,7 +244,7 @@ class HTTPService {
236
244
  if (errorCallback)
237
245
  errorCallback();
238
246
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);
239
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid, cachedInfos); }));
247
+ }), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res), cachedInfos); }));
240
248
  }));
241
249
  }
242
250
  /**
@@ -262,7 +270,7 @@ class HTTPService {
262
270
  let cachedInfos = this.tryGetCacheInformations(url, params);
263
271
  if (cachedInfos.cache && cachedInfos.cacheItem) {
264
272
  this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
265
- return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
273
+ return of(cachedInfos.cacheItem).pipe(delay(0), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); }));
266
274
  }
267
275
  var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: type, headers: this.getHeaders(ret.locale, transaction), params: params });
268
276
  return httpCall.pipe(map((blob) => {
@@ -275,7 +283,7 @@ class HTTPService {
275
283
  if (errorCallback)
276
284
  errorCallback();
277
285
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);
278
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid, cachedInfos); }));
286
+ }), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res), cachedInfos); }));
279
287
  }));
280
288
  }
281
289
  /**
@@ -303,7 +311,22 @@ class HTTPService {
303
311
  var httpCall = this.http.post(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });
304
312
  return httpCall.pipe(catchError((err, _) => {
305
313
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid, true, onError);
306
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
314
+ }), tap((res) => {
315
+ // Secco gli items dalle ricerche paginate lato richiesta
316
+ let request = JSON.parse(JSON.stringify(bodyData));
317
+ if (request?.items && request?.itemsperpageoverride)
318
+ delete request.items;
319
+ // Rimuovo i blob di eventuali AppFile (se ci sono AppFile a livello 2+ del DTO, fanculo)
320
+ for (var prop in request) {
321
+ if (request[prop]?.fileb64)
322
+ request[prop].fileb64 = "*REDACTED*";
323
+ }
324
+ // Secco gli items dalle ricerche paginate lato risposta
325
+ let response = JSON.parse(JSON.stringify(res));
326
+ if (response?.items && response?.itemsperpageoverride)
327
+ delete response.items;
328
+ this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? " § " : "") + JSON.stringify(request), JSON.stringify(response));
329
+ }));
307
330
  }));
308
331
  }
309
332
  /**
@@ -323,9 +346,9 @@ class HTTPService {
323
346
  locale: this.getlocaleObservable()
324
347
  }).pipe(concatMap((ret) => {
325
348
  var httpCall = this.http.delete(url, { headers: this.getHeaders(ret.locale, transaction), params: params });
326
- return httpCall.pipe(catchError((err, caught) => {
349
+ return httpCall.pipe(catchError((err, _) => {
327
350
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);
328
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
351
+ }), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); }));
329
352
  }));
330
353
  }
331
354
  /**
@@ -346,9 +369,9 @@ class HTTPService {
346
369
  locale: this.getlocaleObservable()
347
370
  }).pipe(concatMap((ret) => {
348
371
  var httpCall = this.http.put(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });
349
- return httpCall.pipe(catchError((err, caught) => {
372
+ return httpCall.pipe(catchError((err, _) => {
350
373
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);
351
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
374
+ }), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? " § " : "") + JSON.stringify(bodyData), JSON.stringify(res)); }));
352
375
  }));
353
376
  }
354
377
  /**
@@ -373,7 +396,7 @@ class HTTPService {
373
396
  return httpCall.pipe(catchError((err, caught) => {
374
397
  onError?.();
375
398
  return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);
376
- }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
399
+ }), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? " § " : "") + JSON.stringify(bodyData), JSON.stringify(res)); }));
377
400
  }));
378
401
  }
379
402
  /**
@@ -392,11 +415,11 @@ class HTTPService {
392
415
  async postGetFile(url, bodyData, filename, getFileCallback, afterGetFile = null, handleError = true, pars) {
393
416
  let myGuid = this.defaultStartCall(url);
394
417
  let locale = await this.getlocaleObservable().toPromise();
395
- this.http.post(url, bodyData, { params: pars, headers: this.getHeaders(locale), observe: 'response', responseType: "blob" }).pipe(catchError((err, caught) => {
418
+ this.http.post(url, bodyData, { params: pars, headers: this.getHeaders(locale), observe: 'response', responseType: "blob" }).pipe(catchError((err, _) => {
396
419
  if (afterGetFile && !handleError)
397
420
  afterGetFile();
398
421
  return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);
399
- }), finalize(() => { this.tryFinalizeByGuid(myGuid); })).subscribe((response) => {
422
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid, JSON.stringify(bodyData)); })).subscribe((response) => {
400
423
  let retUrl = window.URL.createObjectURL(response.body);
401
424
  let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\"/g, '');
402
425
  getFileCallback(retUrl, filename || fn);
@@ -420,11 +443,11 @@ class HTTPService {
420
443
  async getFile(url, params = null, filename, getFileCallback, afterGetFile = null, handleError = true) {
421
444
  let myGuid = this.defaultStartCall(url);
422
445
  let locale = await this.getlocaleObservable().toPromise();
423
- this.http.get(url, { params: params, headers: this.getHeaders(locale), observe: 'response', responseType: "blob" }).pipe(catchError((err, caught) => {
446
+ this.http.get(url, { params: params, headers: this.getHeaders(locale), observe: 'response', responseType: "blob" }).pipe(catchError((err, _) => {
424
447
  if (afterGetFile && !handleError)
425
448
  afterGetFile();
426
449
  return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);
427
- }), finalize(() => { this.tryFinalizeByGuid(myGuid); })).subscribe((response) => {
450
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid, params?.toString()); })).subscribe((response) => {
428
451
  let retUrl = window.URL.createObjectURL(response.body);
429
452
  let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\"/g, '');
430
453
  getFileCallback(retUrl, filename || fn);
@@ -444,7 +467,7 @@ class HTTPService {
444
467
  // let parKeys = params.keys();
445
468
  // for (let i = 0; i < parKeys.length; i++)
446
469
  // encodedParams = encodedParams.set(parKeys[i], encodeURIComponent(params.get(parKeys[i])));
447
- let finalUrl = url + (params ? "?" + params.toString().replace(/\+/g, '%2b') : "");
470
+ let finalUrl = url + (params ? "?" + params?.toString()?.replace(/\+/g, '%2b') : "");
448
471
  window.location.href = finalUrl;
449
472
  }
450
473
  /**
@@ -480,7 +503,7 @@ class HTTPService {
480
503
  return { progress: 100, state: 'DONE', content: event.body };
481
504
  }
482
505
  return previous;
483
- }, { state: 'PENDING', progress: 0, content: null }), catchError((err, _) => { return this.registerErrorAndReturnEmptyObservable(err, ret.myGuid); }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid); }));
506
+ }, { state: 'PENDING', progress: 0, content: null }), catchError((err, _) => { return this.registerErrorAndReturnEmptyObservable(err, ret.myGuid); }), finalize(() => { this.tryFinalizeByGuid(ret.myGuid, params?.toString()); }));
484
507
  }));
485
508
  }
486
509
  /**
@@ -548,16 +571,15 @@ class HTTPService {
548
571
  * @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare
549
572
  * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni
550
573
  */
551
- async tryFinalizeByGuid(guid, cacheInfos) {
574
+ async tryFinalizeByGuid(guid, requestJson, responseJson, cacheInfos) {
552
575
  this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (!this.callStatus[guid] ? 'Unknown' : this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));
553
- // TODO: Perdere 3-4 ore per capire perché ogni tanto arriva null in casi pesanti di Observable spammati a random
554
576
  if (this.callStatus[guid]) {
555
577
  // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
556
578
  // e riiniziare a valutare errori di javashit
557
579
  if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())
558
580
  this.ExtensionsImpl.writeRedirectionStatus(false);
559
581
  // Aggiungo la chiamata alla lista delle ultime 3 completate
560
- this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url);
582
+ this.LastThreeCompletedCalls.unshift({ api: this.callStatus[guid].url, requestJson: requestJson, responseJson: responseJson });
561
583
  if (this.LastThreeCompletedCalls.length > 3)
562
584
  this.LastThreeCompletedCalls.pop();
563
585
  // In ogni caso questa posso rimuoverla
@@ -699,7 +721,7 @@ class HTTPService {
699
721
  this.ExtensionsImpl.handleBlockingException(res.status, finalError);
700
722
  return;
701
723
  case 0:
702
- finalError = `Generic connection error while calling '[${guid}] - ${this.callStatus[guid].url}' at ${dayjs().format()}. Response: ${JSON.stringify(res)}`;
724
+ finalError = `Generic connection error while calling '[${guid}] - ${this.callStatus[guid].url}' at ${new Date().toISOString()}. Response: ${JSON.stringify(res)}`;
703
725
  }
704
726
  }
705
727
  this.ExtensionsImpl.handleException(finalStatus, finalError);
@@ -797,7 +819,7 @@ class HTTPService {
797
819
  let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
798
820
  let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);
799
821
  let cache = cacheLs ? cacheLs : {};
800
- if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {
822
+ if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey].__expire)) {
801
823
  // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco
802
824
  // dalle proprietà interne che gli ho aggiunto per controllarne la scadenza
803
825
  if (cacheTime)
@@ -806,7 +828,7 @@ class HTTPService {
806
828
  }
807
829
  }
808
830
  // Per assicurarmi che il rifeirmento degli oggetti sia diverso utilizzo il deepClone
809
- let toCache = this.utisExts ? this.utisExts.deepClone(item) : JSON.parse(JSON.stringify(item));
831
+ let toCache = JSON.parse(JSON.stringify(item));
810
832
  return new CacheInfos(url, useCaching && this.CacheInitialized, cachingKey, cacheTime, toCache);
811
833
  }
812
834
  /**
@@ -820,8 +842,11 @@ class HTTPService {
820
842
  let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);
821
843
  let cache = cacheLs ? cacheLs : {};
822
844
  cache[cacheInfos.cacheKey] = item;
823
- if (cacheInfos.cacheTime)
824
- cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, "seconds");
845
+ if (cacheInfos.cacheTime) {
846
+ let date = new Date();
847
+ date.setSeconds(date.getSeconds() + parseInt(cacheInfos.cacheTime));
848
+ cache[cacheInfos.cacheKey].__expire = date;
849
+ }
825
850
  this.localStorage?.setLocalItem?.(cacheKey, cache);
826
851
  }
827
852
  /**
@@ -831,7 +856,7 @@ class HTTPService {
831
856
  */
832
857
  untimedCacheExpired() {
833
858
  let expire = JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));
834
- return !expire || expire && dayjs(expire) < dayjs();
859
+ return !expire || (expire && this.timedCacheItemExpired(expire));
835
860
  }
836
861
  /**
837
862
  * Controlla se la cache per una chiamata che ha un tempo di vita ben definito è scaduta o meno
@@ -840,8 +865,8 @@ class HTTPService {
840
865
  *
841
866
  * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti
842
867
  */
843
- timedCacheItemExpired(item) {
844
- return dayjs(item.__expire) < dayjs();
868
+ timedCacheItemExpired(dtCheck) {
869
+ return new Date(dtCheck) < new Date();
845
870
  }
846
871
  /**
847
872
  * 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**)
@@ -850,7 +875,9 @@ class HTTPService {
850
875
  if (!this.CacheInitialized || !this.localStorage)
851
876
  return;
852
877
  await this.localStorage.setItem(this.localStorageHttpCacheKey, {}).toPromise();
853
- localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, "second")));
878
+ let date = new Date();
879
+ date.setSeconds(date.getSeconds() + (this.CLIENT_CACHE_DURATION_S ?? 3600));
880
+ localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(date));
854
881
  }
855
882
  /**
856
883
  * Ripulisce la cache delle chiamate con un tempo di expire definito
@@ -911,19 +938,22 @@ class HTTPService {
911
938
  getAll(view, api, pars, transaction) {
912
939
  if (!view.selection.all)
913
940
  return of(view.selection.items);
914
- if (!this.hash)
915
- throw "[@esfaenza/httpservice] to use getAll, you need a Hasing service. WTF are you doing? this should be configured by @esfaenza core";
916
- var jsonView = this.utisExts ? this.utisExts.deepClone(view) : JSON.parse(JSON.stringify(view));
941
+ var jsonView = JSON.parse(JSON.stringify(view));
917
942
  jsonView.page = 1;
918
943
  jsonView.itemsperpageoverride = 999999;
919
944
  return this.post(api, jsonView, pars, transaction).pipe(map(res => {
920
945
  let items = res.items;
921
- items.forEach(t => t.hash = this.hash.hashObject(t, null, false));
946
+ items.forEach(t => t.hash = this.hashObject(t));
922
947
  if (res.selection.exclusions?.length > 0)
923
- items = items.filter((t) => !res.selection.exclusions.find((e) => this.hash.hashObject(e, null, false) == t.hash));
948
+ items = items.filter((t) => !res.selection.exclusions.find((e) => this.hashObject(e) == t.hash));
924
949
  return items;
925
950
  }));
926
951
  }
952
+ hashObject(o, level = 0) {
953
+ var strDef = this.stringify(o, level);
954
+ var hash = this.simpleHash(strDef);
955
+ return hash;
956
+ }
927
957
  beginTransaction(executionKey, secondsTimeout) {
928
958
  this.log("beginTransaction call received: " + executionKey);
929
959
  var pars = new HttpParams().set("executionKey", executionKey);
@@ -940,7 +970,74 @@ class HTTPService {
940
970
  let pars = new HttpParams().set("idtrans", transactionKey).set("success", transactionResult.toString());
941
971
  return this.get(this.GET_Trans_EndTrans, pars);
942
972
  }
943
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: HTTPService, deps: [{ token: HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: CLIENT_CACHE_DURATION_S, optional: true }, { token: CACHE_BY_USER, optional: true }, { token: HTTP_DEBUG_MODE, optional: true }, { token: i2.BaseLocalization, optional: true }, { token: i3.HttpClient }, { token: i4.CacheService, optional: true }, { token: i5.HashingService, optional: true }, { token: i5.UtilityService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
973
+ /**
974
+ * Hash più semplice e più veloce dell'md5, ma meno sicuro
975
+ *
976
+ * Vedi https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript
977
+ *
978
+ * @param {string} str Stringa di cui calcolare l'hash
979
+ */
980
+ simpleHash(str, seed = 0) {
981
+ let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
982
+ for (let i = 0, ch; i < str.length; i++) {
983
+ ch = str.charCodeAt(i);
984
+ h1 = Math.imul(h1 ^ ch, 2654435761);
985
+ h2 = Math.imul(h2 ^ ch, 1597334677);
986
+ }
987
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
988
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
989
+ return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString();
990
+ }
991
+ /**
992
+ * Genera una stringa che identifica univocamente l'oggetto in questione
993
+ *
994
+ * @param {any} o Oggetto di cui calcolare la stringa univoca
995
+ * @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
996
+ * @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
997
+ */
998
+ stringify(o, level) {
999
+ var i, r;
1000
+ if (o === null)
1001
+ return "n";
1002
+ if (o === true)
1003
+ return "t";
1004
+ if (o === false)
1005
+ return "f";
1006
+ if (o instanceof Date)
1007
+ return 'd:' + o.valueOf().toString();
1008
+ i = typeof o;
1009
+ if (i === "string")
1010
+ return "s:" + o;
1011
+ if (i === "number")
1012
+ return "n:" + o;
1013
+ if (o instanceof Function)
1014
+ return "m:" + o.toString();
1015
+ if (o instanceof Array) {
1016
+ r = [];
1017
+ for (i = 0; i < o.length; i++) {
1018
+ let res = this.stringify(o[i], level);
1019
+ if (res)
1020
+ r.push(res);
1021
+ }
1022
+ return r.length > 0 ? "a:" + r.join(";") : "";
1023
+ }
1024
+ r = [];
1025
+ //Se è oggetto, escludo tutti quelli di sistema/inutili
1026
+ if (o) {
1027
+ var name = o.__proto__.constructor.name;
1028
+ if (!this.objBlacklist[name]) {
1029
+ for (i in o) {
1030
+ if (o.hasOwnProperty(i) && (level <= 2)) {
1031
+ let res = this.stringify(o[i], level + 1);
1032
+ if (res)
1033
+ r.push(i + ":" + res);
1034
+ }
1035
+ }
1036
+ }
1037
+ }
1038
+ return r.length > 0 ? "o:" + r.join(";") : "";
1039
+ }
1040
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: HTTPService, deps: [{ token: HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: CLIENT_CACHE_DURATION_S, optional: true }, { token: CACHE_BY_USER, optional: true }, { token: HTTP_DEBUG_MODE, optional: true }, { token: i2.BaseLocalization, optional: true }, { token: i3.HttpClient }, { token: i4.CacheService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
944
1041
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: HTTPService, providedIn: 'root' }); }
945
1042
  }
946
1043
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: HTTPService, decorators: [{
@@ -970,10 +1067,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
970
1067
  type: Optional
971
1068
  }] }, { type: i3.HttpClient }, { type: i4.CacheService, decorators: [{
972
1069
  type: Optional
973
- }] }, { type: i5.HashingService, decorators: [{
974
- type: Optional
975
- }] }, { type: i5.UtilityService, decorators: [{
976
- type: Optional
977
1070
  }] }] });
978
1071
 
979
1072
  class HttpserviceModule {
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-httpservice.mjs","sources":["../../../projects/httpservice/src/lib/tokens.ts","../../../projects/httpservice/src/lib/config/HttpServiceExtensions.ts","../../../projects/httpservice/src/lib/models/CacheInfos.ts","../../../projects/httpservice/src/lib/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.ts","../../../projects/httpservice/src/lib/models/Download.ts","../../../projects/httpservice/src/public-api.ts","../../../projects/httpservice/src/esfaenza-httpservice.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Dizionario di invalidazioni delle chiamate HTTP\r\n */\r\nexport const HTTP_INVALIDATION: InjectionToken<Record<string, string[]>> = new InjectionToken<Record<string, string[]>>('HTTP_INVALIDATION');\r\n\r\n/**\r\n * Durata della cache lato libreria dopo il quale la cache verrà ripulita\r\n */\r\nexport const CLIENT_CACHE_DURATION_S: InjectionToken<number> = new InjectionToken<number>('CLIENT_CACHE_DURATION_S');\r\n\r\n/**\r\n * 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 HTTP_DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DEBUG_MODE');","import { Injectable } from '@angular/core';\r\nimport { 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\n@Injectable({ providedIn: 'root' })\r\nexport class HttpServiceExtensions implements IHttpServiceExtensions {\r\n\r\n /**\r\n * Hook per recuperare l'access token con cui effettuare le chiamate HTTP\r\n */\r\n public retrieveAccessToken(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Hook per recuperare l'Identity corrente in un oggetto generico con le informazioni di User e Tenant\r\n */\r\n public retrieveIdentity(): { IdUser: string, Idtenant: string } {\r\n return null;\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già venendo ridirezionati al login, in modo da non tentare di effettuare \r\n * N redirect contemporaneamente qualora molte API fallissero allo stesso tempo nell'autenticazione\r\n */\r\n public readRedirectingToLogin(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo effettuando un redirect al login o meno\r\n */\r\n public writeRedirectingToLogin(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per effettuare il redirect al login\r\n */\r\n public redirectToLogin(): void {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un errore, in modo da non tentare di gestire \r\n * N errori contemporaneamente qualora molte API fallissero allo stesso tempo\r\n */\r\n public readHandlingErrorStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un errore o meno\r\n */\r\n public writeHandlingErrorStatus(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un redirect, in modo da non tentare di gestire \r\n * N redirect contemporaneamente qualora molte API lo richiedessero allo stesso tempo\r\n */\r\n public readRedirectionStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un redirect o meno\r\n */\r\n public writeRedirectionStatus(status: boolean): void {\r\n }\r\n\r\n /**\r\n * Hook per indicare se l'applicazione può gestire eccezioni del tipo \"NotConfigured\" (444). Qualora l'applicazione che lo implementa dichiari di gestirle verrà chiamata \r\n * la funzione **handleBlockingException** per ognuno di questi errori\r\n */\r\n public handleNotConfiguredException(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore bloccante per l'operazione attuale, ma non fatale (Generalmente gestibile da dialog di avviso)\r\n */\r\n public handleBlockingException(status: number, text: string) {\r\n console.error(\"ESHttpError Blocking Exception \" + status + \" \" + text);\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore fatale (Generalmente gestibile tramite navigazione a una pagina di errore custom per l'applicativo)\r\n */\r\n public handleException(status: number | string, text: string) {\r\n console.error(\"ESHttpError \" + status + \" \" + text);\r\n }\r\n}","export class CacheInfos {\r\n constructor(public finalUrl: string, public cache: boolean, public cacheKey: string, public cacheTime: string, public cacheItem: any) { }\r\n}","// Angular\r\nimport { HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpParams, HttpProgressEvent, HttpResponse } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Es Faenza\r\nimport { CacheService } from \"@esfaenza/preferences\";\r\nimport { HashingService, UtilityService } from \"@esfaenza/extensions\";\r\nimport { BaseLocalization } from \"@esfaenza/localizations\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, concatMap, delay, finalize, first, map, scan } from \"rxjs/operators\";\r\nimport { forkJoin, from, Observable, of, Subject, throwError } from \"rxjs\";\r\n\r\n// Chiamate ai Repository / tokens\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE } from './tokens';\r\n\r\n// Modelli \r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\nimport { Download } from './models/Download';\r\nimport { CacheInfos } from \"./models/CacheInfos\";\r\n\r\n/**\r\n * Dichiarazione della variabile globale dayjs. L'onere di \"crearla\" è affidato all'applicazione che utilizza questa libreria, \r\n * che dovrà importare lo script globale di dayjs nella CLI\r\n */\r\ndeclare var dayjs: any;\r\n\r\n/**\r\n * Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere \r\n * esteso/modificato il comportamento implementando la classe di \"hook\" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class HTTPService {\r\n\r\n /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */\r\n private callStatus: { [id: string]: { url: string, success: boolean } } = {};\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */\r\n private localStorageHttpCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching */\r\n private localStorageHttpTimedCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */\r\n private localStorageHttpCacheExpireKey = null;\r\n /** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */\r\n private me: { Idtenant: string, IdUser: string } = null;\r\n /** Indica che la cache a tempo dev'essere persistita il prima possibile */\r\n private PersistTimedCacheASAP: boolean = false;\r\n /** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */\r\n private PersistUntimedCacheASAP: boolean = false;\r\n /** Subject emesso quando il servizio http si stabilizza, cioè quando non c'è nessuna chiamata pending o in corso da qualche istante */\r\n public Stabilized: Subject<true> = new Subject<true>();\r\n\r\n /**\r\n * Implementazione della classe di estensione per collegare i comportamenti della libreria all'applicazione in cui è usata. \r\n * \r\n * Se è stato effettuato il provide della classe **HttpServiceExtensions** verrà usato quel provider, altrimenti verrà creata una nuova istanza di default\r\n */\r\n private ExtensionsImpl: HttpServiceExtensions;\r\n\r\n /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */\r\n public LastThreeCompletedCalls: string[] = [];\r\n\r\n private CacheInitialized: boolean = false;\r\n /**\r\n * @ignore\r\n */\r\n constructor(\r\n private EXTENSION_CLASS: HttpServiceExtensions,\r\n @Optional() @Inject(HTTP_INVALIDATION) private HTTP_INVALIDATION,\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(HTTP_DEBUG_MODE) private HTTP_DEBUG_MODE: boolean,\r\n @Optional() private bc: BaseLocalization,\r\n private http: HttpClient,\r\n @Optional() private localStorage: CacheService,\r\n @Optional() private hash: HashingService,\r\n @Optional() private utisExts: UtilityService\r\n ) {\r\n this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();\r\n }\r\n\r\n public setAppConfig(myconfig: { AppData: { ModuleId: string, ModuleDefId: number, ComponentEnvironment: string, ComponentVersion: string, ModuleDescription: string } }){\r\n this.localStorageHttpCacheKey = (myconfig.AppData.ModuleDescription).replace(/\\s/g, '_') + \"_HttpCache\";\r\n this.localStorageHttpTimedCacheKey = (myconfig.AppData.ModuleDescription).replace(/\\s/g, '_') + \"_HttpTimedCache\";\r\n this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + \"_Expire\";\r\n this.adjustOldStorageSystem();\r\n\r\n this.CacheInitialized = true;\r\n }\r\n\r\n /**\r\n * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.\r\n * Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage\r\n */\r\n private async adjustOldStorageSystem() {\r\n var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);\r\n var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);\r\n if (!lsTimed && !lsUntimed)\r\n return;\r\n\r\n localStorage.removeItem(this.localStorageHttpTimedCacheKey);\r\n localStorage.removeItem(this.localStorageHttpCacheKey);\r\n lsTimed = lsTimed ? JSON.parse(lsTimed) : {};\r\n lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};\r\n\r\n if(this.localStorage)\r\n await forkJoin([\r\n this.localStorage.setItem(this.localStorageHttpTimedCacheKey, lsTimed),\r\n this.localStorage.setItem(this.localStorageHttpCacheKey, lsUntimed)\r\n ]).toPromise();\r\n\r\n this.log(this.loc(\"Converted old storage system to new one\"));\r\n }\r\n\r\n getlocaleObservable() {\r\n return this.bc ? this.bc.Locale.pipe(first()) : of(\"it-IT\");\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 return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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(ret.myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get<T>(cachedInfos.finalUrl, { headers: this.getHeaders(ret.locale, 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 let toCache = this.utisExts ? this.utisExts.deepClone(responseItem) : JSON.parse(JSON.stringify(responseItem));\r\n this.cacheResponse(toCache, 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, ret.myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid, cachedInfos); })\r\n );\r\n })\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 return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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(ret.myGuid); }));\r\n }\r\n\r\n var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: <any>type, headers: this.getHeaders(ret.locale, 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, ret.myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid, cachedInfos); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public post<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true, onError?: (res) => void): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n // Se è una ricerca, shallow copy e rimuovo gli \"items\" per evitare di farli andare su e giù al backend\r\n if (!!bodyData?.items && !!bodyData?.page) {\r\n bodyData = { ...bodyData };\r\n delete bodyData.items;\r\n }\r\n\r\n var httpCall = this.http.post<T>(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, _): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid, true, onError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una DELETE HTTP\r\n *\r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public delete<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n var httpCall = this.http.delete<T>(url, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una PUT HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public put<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n var httpCall = this.http.put<T>(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid); })\r\n );\r\n })\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, params: HttpParams = null, succesfulResultMandatory: boolean = true, onError?: () => void): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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, { params: params, headers: this.getHeaders(ret.locale, null, true, null, null) });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => { \r\n onError?.();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid); \r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {K} bodyData DTO per la chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public async postGetFile<K>(url: string, bodyData: K, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true, pars?: HttpParams) {\r\n let myGuid = this.defaultStartCall(url);\r\n let locale = await this.getlocaleObservable().toPromise();\r\n\r\n this.http.post(url, bodyData, { params: pars, headers: this.getHeaders(locale), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public async getFile(url: string, params: HttpParams = null, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true) {\r\n let myGuid = this.defaultStartCall(url);\r\n let locale = await this.getlocaleObservable().toPromise();\r\n\r\n this.http.get(url, { params: params, headers: this.getHeaders(locale), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, caught): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Download nativo di un file. Internamente utilizza il pattern **window.location.href = \"...\"**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n */\r\n public getFileNative(url: string, params: HttpParams = null): void {\r\n\r\n // Encodo tutti i parametri per evitare casi particolari\r\n // var encodedParams = new HttpParams();\r\n // let parKeys = params.keys();\r\n // for (let i = 0; i < parKeys.length; i++)\r\n // encodedParams = encodedParams.set(parKeys[i], encodeURIComponent(params.get(parKeys[i])));\r\n\r\n let finalUrl = url + (params ? \"?\" + params.toString().replace(/\\+/g, '%2b') : \"\");\r\n window.location.href = finalUrl;\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET di un file che emette i vari eventi di progresso di download.\r\n * Utilizzarla per overridare la dialog nativa di progress del browser e sostituirla con qualcosa tipo quello che fa MEGA.\r\n * \r\n * In caso si voglia ottenere il risultato nativo del browser del download utilizzare **getFileNative(url, pars)**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * \r\n * @returns {Observable<Download>} Observable dei vari step di progresso del download\r\n */\r\n public getFileWithProgress(url: string, params: HttpParams = null, getFileCallback: (url: string, filename: string) => any): Observable<Download> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n return this.http.get(url, { responseType: 'blob', headers: this.getHeaders(ret.locale), params: params, observe: 'events', reportProgress: true })\r\n .pipe(\r\n scan((previous: Download, event: HttpEvent<Blob>): Download => {\r\n\r\n if (this.isHttpProgressEvent(event)) {\r\n let progress = event.total ? (event.loaded > event.total ? 100 : Math.round((100 * event.loaded) / event.total)) : previous.progress;\r\n return { progress: progress, state: 'IN_PROGRESS', content: null }\r\n }\r\n\r\n if (this.isHttpResponse(event)) {\r\n if (event.body) {\r\n let cdisp = event.headers.get('content-disposition');\r\n let cdispFilename = cdisp.split(';')[1].split('filename')[1].split('=')[1].trim().replace(/\\\"/g, '');\r\n let retUrl = window.URL.createObjectURL(event.body);\r\n getFileCallback(retUrl, cdispFilename);\r\n }\r\n return { progress: 100, state: 'DONE', content: event.body }\r\n }\r\n\r\n return previous;\r\n }, { state: 'PENDING', progress: 0, content: null }),\r\n catchError((err, _): Observable<Download> => { return this.registerErrorAndReturnEmptyObservable(err, ret.myGuid) }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpResponse<T>(event: HttpEvent<T>): event is HttpResponse<T> {\r\n return event.type === HttpEventType.Response\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpProgressEvent** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpProgressEvent(event: HttpEvent<unknown>): event is HttpProgressEvent {\r\n return event.type === HttpEventType.DownloadProgress || event.type === HttpEventType.UploadProgress\r\n }\r\n\r\n /**\r\n * Gestione dell'inizio di una chiamata ad un certo URL, viene generato un GUID da assegnarci, controllata la scadenza della cache, \r\n * e eventualmente loggato il fatto che sta per essere effettuata una chiamata HTTP\r\n * \r\n * @param {string} url Url a cui effettuare la chiamata\r\n * @returns {string} GUID assegnato alla chiamata\r\n */\r\n private defaultStartCall(url: string): string {\r\n let myGuid = this.getGUID();\r\n this.checkCacheInvalidation(url);\r\n this.callStatus[myGuid] = { url: url, success: true };\r\n this.log(this.loc(\"Starting call\") + \" \" + myGuid + \" \" + this.loc(\"at URL\") + \": \" + url);\r\n return myGuid;\r\n }\r\n\r\n /**\r\n * Dato un url vengono controllate le informazioni su tutti gli url da invalidare collegati all'url chiamato e, se presenti in cache, invalidati\r\n * \r\n * @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare\r\n */\r\n private checkCacheInvalidation(url: string) {\r\n if(!this.CacheInitialized)\r\n return;\r\n\r\n let cache = this.localStorage?.getLocalItem<any>?.(this.localStorageHttpCacheKey);\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n let cacheTime = tmp ? tmp[2] : null;\r\n let normalizedUrl_tmp = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n let normalizedUrl = normalizedUrl_tmp.substring(normalizedUrl_tmp.indexOf('/api'))\r\n\r\n if (!cache || !this.HTTP_INVALIDATION || !this.HTTP_INVALIDATION[normalizedUrl])\r\n return;\r\n\r\n let apisToInvalidate: string[] = this.HTTP_INVALIDATION[normalizedUrl];\r\n if (!apisToInvalidate || apisToInvalidate.length == 0)\r\n return;\r\n\r\n let keysToRemove: string[] = [];\r\n apisToInvalidate.forEach(api => {\r\n let cacheKey = this.makeCacheKey(api, null);\r\n for (let item in cache)\r\n if (item.indexOf(cacheKey) != -1)\r\n keysToRemove.push(item);\r\n });\r\n\r\n for (let i = 0; i < keysToRemove.length; i++) {\r\n let k = keysToRemove[i];\r\n this.log(this.loc(\"Invlalidating cache element\") + \" \" + k);\r\n delete cache[k];\r\n }\r\n\r\n this.localStorage?.setItem?.(this.localStorageHttpCacheKey, cache);\r\n }\r\n\r\n /**\r\n * Finalizzazione di una chiamata\r\n * \r\n * @param {string} guid GUID collegato alla chiamata appena terminata\r\n * @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare\r\n * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni\r\n */\r\n private async tryFinalizeByGuid(guid: string, cacheInfos?: CacheInfos) {\r\n this.log(this.loc(\"Finalizing call\") + \" \" + guid + \" \" + this.loc(\"with status\") + \": \" + (!this.callStatus[guid] ? 'Unknown' : this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));\r\n\r\n // TODO: Perdere 3-4 ore per capire perché ogni tanto arriva null in casi pesanti di Observable spammati a random\r\n if (this.callStatus[guid]) {\r\n // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false\r\n // e riiniziare a valutare errori di javashit\r\n if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())\r\n this.ExtensionsImpl.writeRedirectionStatus(false);\r\n\r\n // Aggiungo la chiamata alla lista delle ultime 3 completate\r\n this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url)\r\n if (this.LastThreeCompletedCalls.length > 3)\r\n this.LastThreeCompletedCalls.pop();\r\n\r\n // In ogni caso questa posso rimuoverla\r\n delete this.callStatus[guid];\r\n }\r\n\r\n // Se non ho nessun'altra chiamata in corso considero la situazione stabilizzatasi\r\n if (Object.keys(this.callStatus).length == 0)\r\n this.Stabilized.next(true);\r\n\r\n // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata\r\n if (cacheInfos && cacheInfos.cache) {\r\n this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;\r\n this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;\r\n this.log(this.loc(\"Marking cache to be persisted as soon as possible\"));\r\n }\r\n\r\n // Se una delle due cache devono essere aggiornate e non ho nessuna chiamata in corso effettuo l'aggiornamento in base a quale delle due va aggiornata\r\n // Alla fine di tutto marco come fatto\r\n if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0 && this.CacheInitialized) {\r\n\r\n var toCall = [];\r\n let tmpKey = \"\";\r\n if (this.PersistTimedCacheASAP && this.localStorage) {\r\n tmpKey = this.localStorageHttpTimedCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n if (this.PersistUntimedCacheASAP && this.localStorage) {\r\n tmpKey = this.localStorageHttpCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n this.log(this.loc(\"No more HTTP calls to be executed, entering idle state and persisting modified caches\") + \"...\");\r\n\r\n var ret = await forkJoin(toCall).toPromise();\r\n if (ret)\r\n this.log(this.loc(\"Caches succesfully persisted\"));\r\n else\r\n this.log(this.loc(\"Errors persisting modified caches\"));\r\n this.PersistTimedCacheASAP = false;\r\n this.PersistUntimedCacheASAP = false;\r\n }\r\n }\r\n\r\n /**\r\n * Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente \r\n * ad un backend ASP.NET da cui si potrà accedere a Request.Form.Files\r\n * \r\n * @param {File | File[]} fileArrayOrFile Singolo File o lista di File. N.B: nella firma della funzione viene considerato **any** per fare test sulle proprietà \r\n * invece che fare test con l'**istanceof**\r\n * \r\n * @returns {FormData} FormData contenente tutti i file passati\r\n */\r\n private getFilesFormData(fileArrayOrFile: any): FormData {\r\n var formData: FormData = new FormData();\r\n\r\n if (fileArrayOrFile) {\r\n if (fileArrayOrFile.length)\r\n fileArrayOrFile.forEach(t => { formData.append(\"file\", t, t.name); });\r\n else if (fileArrayOrFile.name)\r\n formData.append(\"files\", fileArrayOrFile, fileArrayOrFile.name);\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Helper che in base ai parametri disponibili genera gli Header HTTP per la chiamata da effettuare\r\n * \r\n * @param {string} contentType Indica se aggiungere agli header \"Content-Type\", valorizzato al valore del parametro\r\n * @param {string} accept Indica se aggiungere agli header \"Accept\", valorizzato al valore del parametro\r\n * @param {boolean} includeAuth Indica se aggiungere agli header \"Authorization\", valorizzato col token recuperato dall'hook **retrieveAccessToken** della classe di estensione\r\n * @param {string} transactionId Indica se aggiungere agli header \"X-TX-ID\", valorizzato al valore del parametro\r\n * \r\n * @returns {HttpHeaders} Header generati in base ai parametri\r\n */\r\n private getHeaders(locale = 'it-IT', 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 headers = headers.append(\"ngsw-bypass\", \"\");\r\n\r\n if (contentType)\r\n headers = headers.append(\"Content-Type\", contentType);\r\n\r\n if (transactionId)\r\n headers = headers.append(\"X-TX-ID\", transactionId);\r\n\r\n if (authtoken && includeAuth)\r\n headers = headers.append(\"Authorization\", \"Bearer \" + authtoken);\r\n\r\n if (accept)\r\n headers = headers.append(\"Accept\", accept);\r\n\r\n headers = headers.append(\"Accept-Language\", locale);\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gestione di default degli errori\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n */\r\n private async onError(res: HttpErrorResponse | TypeError, guid: string) {\r\n if (this.callStatus[guid])\r\n this.callStatus[guid].success = false;\r\n\r\n //Mi assicuro che tutti gli errori durante il redirect al login vengano ignorati\r\n if (this.ExtensionsImpl.readRedirectingToLogin()) {\r\n this.log(this.loc(\"Redirecting to Login, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n\r\n //Mi assicuro che venga gestito un solo errore per volta\r\n if (this.ExtensionsImpl.readHandlingErrorStatus()) {\r\n this.log(this.loc(\"Already Handling an error, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n else\r\n this.ExtensionsImpl.writeHandlingErrorStatus(true);\r\n\r\n let finalError = \"\";\r\n let finalStatus = \"\";\r\n if (this.isTypeError(res)) {\r\n finalError = res.message;\r\n finalStatus = \"HTTP Service Internal Error\";\r\n }\r\n else if (this.isHttpErrorResponse(res)) {\r\n\r\n finalError = await this.getHttpErrorText(res.error);\r\n finalStatus = res.status.toString();\r\n\r\n switch (res.status) {\r\n // Unauthorized\r\n case 401:\r\n if (this.ExtensionsImpl.readRedirectionStatus()) {\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n return;\r\n }\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n // Handled exception\r\n case 400:\r\n // No Permissions\r\n case 403:\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n // Not found\r\n case 404:\r\n this.ExtensionsImpl.handleBlockingException(res.status, this.loc(\"Resource not found\"));\r\n return;\r\n // NotConfiguredException\r\n case 444:\r\n if (this.ExtensionsImpl.readRedirectionStatus())\r\n this.log(this.loc(\"Error 444 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n else if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n case 0:\r\n finalError = `Generic connection error while calling '[${guid}] - ${this.callStatus[guid].url}' at ${dayjs().format()}. Response: ${JSON.stringify(res)}`;\r\n }\r\n }\r\n\r\n this.ExtensionsImpl.handleException(finalStatus, finalError);\r\n }\r\n\r\n /**\r\n * Dato un errore restituisce una promise con la stringa finale dell'errore in modo da poter fare un await\r\n * \r\n * @param {any} err Errore da controllare\r\n * \r\n * @returns {Promise<string>} Promise che risolve con la stringa finale dell'errore\r\n */\r\n private getHttpErrorText(err: any): Promise<string> {\r\n // Se ho un Blob può essere o un CallResult o suppongo una semplice stringa,\r\n // altrimenti potrebbe essere direttamente un CallResult, oppure una semplice stringa\r\n return new Promise<string>((resolve) => {\r\n if (err instanceof Blob) {\r\n let reader = new FileReader();\r\n reader.onload = (e: Event) => {\r\n let errMsg = (<any>e.target).result;\r\n let jsonerrMsg: any;\r\n try { jsonerrMsg = JSON.parse(errMsg); } catch (e) { }\r\n return resolve(jsonerrMsg && this.isCallResult(jsonerrMsg) ? jsonerrMsg.error.message : errMsg);\r\n };\r\n reader.readAsText(err)\r\n }\r\n else if (this.isCallResult(err))\r\n return resolve(err.error.message);\r\n else\r\n return resolve(err?.toString());\r\n });\r\n }\r\n\r\n /**\r\n * Riconosce se l'oggetto è di tipo **CallResult** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isCallResult(err: any): err is { error: { message: string } } {\r\n return !!err?.error?.message;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **HttpErrorResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isHttpErrorResponse(err: any): err is HttpErrorResponse {\r\n return err instanceof HttpErrorResponse;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **TypeError** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isTypeError(err: any): err is TypeError {\r\n return err.name == \"TypeError\";\r\n }\r\n\r\n /**\r\n * Come dice il nome, registra un errore e restituisce un Observable vuoto come risultato della chiamata\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n * @param {boolean} handleError Indica se gestire l'errore via libreria o se limitarsi a restituire l'Observable vuoto\r\n * \r\n * @returns {Observable<any>} Observable vuoto\r\n */\r\n private registerErrorAndReturnEmptyObservable(res: any, guid: string, handleError: boolean = true, onErrorOverride?: (res) => void): Observable<any> {\r\n if (handleError) {\r\n if (onErrorOverride)\r\n onErrorOverride(res);\r\n else\r\n this.onError(res, guid);\r\n }\r\n return new Observable(() => { });\r\n }\r\n\r\n /**\r\n * Dato un Url e dei parametri cerca di recuperare l'eventuale oggetto già salvato in cache con le informazioni base della cache stessa\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)\r\n * \r\n * @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): CacheInfos {\r\n\r\n let cachingKey = null, cacheTime = null, item = null;\r\n let useCaching = !!(/#cache/gi.exec(url));\r\n\r\n if (useCaching && this.CacheInitialized) {\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n cacheTime = tmp ? tmp[2] : null;\r\n\r\n url = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n if (this.untimedCacheExpired() && !cacheTime)\r\n this.resetHttpUntimedCacheStorage();\r\n\r\n cachingKey = this.makeCacheKey(url, params);\r\n let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {\r\n // Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco \r\n // dalle proprietà interne che gli ho aggiunto per controllarne la scadenza\r\n if (cacheTime)\r\n delete cache[cachingKey].__expire;\r\n\r\n item = cache[cachingKey]\r\n }\r\n }\r\n\r\n // Per assicurarmi che il rifeirmento degli oggetti sia diverso utilizzo il deepClone\r\n let toCache = this.utisExts ? this.utisExts.deepClone(item) : JSON.parse(JSON.stringify(item));\r\n return new CacheInfos(url, useCaching && this.CacheInitialized, cachingKey, cacheTime, toCache);\r\n }\r\n\r\n /**\r\n * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**\r\n * \r\n * @param {T} item Oggetto da inserire nella cache\r\n * @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: CacheInfos): void {\r\n let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n cache[cacheInfos.cacheKey] = item;\r\n if (cacheInfos.cacheTime)\r\n cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, \"seconds\");\r\n\r\n this.localStorage?.setLocalItem?.(cacheKey, cache);\r\n }\r\n\r\n /**\r\n * Controlla se la cache per le chiamate senza expire time è scaduta\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private untimedCacheExpired(): boolean {\r\n let expire = JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));\r\n return !expire || expire && dayjs(expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Controlla se la cache per una chiamata che ha un tempo di vita ben definito è scaduta o meno\r\n * \r\n * @param {any} item Oggetto recuperato dalla cache a cui ho aggiunto la chiave interna __expire\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private timedCacheItemExpired(item: any): boolean {\r\n return dayjs(item.__expire) < dayjs();\r\n }\r\n\r\n /**\r\n * Ripulisce la cache e imposta la prossima scadenza ad adesso + **CLIENT_CACHE_DURATION_S** (token valorizzato in fase di configurazione dalla proprietà **clientCacheDurationS** della classe **HttpServiceModuleConfig**)\r\n */\r\n public async resetHttpUntimedCacheStorage() {\r\n if(!this.CacheInitialized || !this.localStorage)\r\n return;\r\n\r\n await this.localStorage.setItem(this.localStorageHttpCacheKey, {}).toPromise();\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add(this.CLIENT_CACHE_DURATION_S ?? 3600, \"second\")));\r\n }\r\n\r\n /**\r\n * Ripulisce la cache delle chiamate con un tempo di expire definito\r\n */\r\n public async resetHttpTimedCacheStorage() {\r\n if(!this.CacheInitialized || !this.localStorage)\r\n return;\r\n \r\n await this.localStorage.setItem(this.localStorageHttpTimedCacheKey, {}).toPromise();\r\n }\r\n\r\n /**\r\n * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * \r\n * @returns {string} Chiave che rappresenta in maniera univoca la chiamata\r\n */\r\n private makeCacheKey(url: string, params: HttpParams): string {\r\n this.me = this.me || this.ExtensionsImpl.retrieveIdentity();\r\n\r\n let authKeyPart = (this.me ? this.me.Idtenant : \"\") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : \"\");\r\n let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev: any, next: any) => prev + \",\" + next + '=' + params.get(next), \"\") : \"\";\r\n return authKeyPart + \"_\" + url.substring(url.indexOf(\"api\") + 4) + \"?\" + paramsKeyPart;\r\n }\r\n\r\n /**\r\n * Generazione GUID\r\n * \r\n * @returns {string} Nuovo GUID generato in maniera casuale\r\n */\r\n private getGUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per scrivere log a console qualora **DEBUG_MODE** risultasse **true**\r\n * \r\n * @param {string} message Messaggio di log\r\n */\r\n private log(message: string): void {\r\n if (this.HTTP_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 // Togliamo velocemente ste localizzazioni inutili....\r\n return message;\r\n }\r\n\r\n /**\r\n * Helper per lanciare la selezione di tutto quello che è relativo a un api di ricerca con AppSearch (di cui non utilizzo il tipo vero per ridurre le dipendenze)\r\n */\r\n public getAll<T>(view: { items: T[], page: number, itemsperpageoverride: number, selection: { exclusions: T[], all: boolean, items: T[] } }, api: string, pars?: HttpParams, transaction?: string): Observable<T[]> {\r\n if (!view.selection.all)\r\n return of(view.selection.items);\r\n\r\n if(!this.hash)\r\n throw \"[@esfaenza/httpservice] to use getAll, you need a Hasing service. WTF are you doing? this should be configured by @esfaenza core\";\r\n\r\n var jsonView = this.utisExts ? this.utisExts.deepClone(view): JSON.parse(JSON.stringify(view));\r\n jsonView.page = 1;\r\n jsonView.itemsperpageoverride = 999999;\r\n\r\n return this.post<{ items: T[], selection: { exclusions: T[] } }>(api, jsonView, pars, transaction).pipe(map<{ items: T[], selection: { exclusions: T[] } }, T[]>(res => {\r\n let items = <T[]>res.items;\r\n items.forEach(t => (<any>t).hash = this.hash.hashObject(t, null, false));\r\n if (res.selection.exclusions?.length > 0)\r\n items = items.filter((t: any) => !res.selection.exclusions.find((e: any) => this.hash.hashObject(e, null, false) == t.hash));\r\n return items;\r\n }));\r\n }\r\n\r\n /*****************************************************************************************************************************************\r\n ***************************************************** TRANSACTION HELPERS ***************************************************************\r\n *****************************************************************************************************************************************/\r\n private GET_Trans_BeginTrans: string = \"/api/Trans/BeginTrans\";\r\n private GET_Trans_CheckExecution: string = \"/api/Trans/CheckExecution\";\r\n private GET_Trans_EndTrans: string = \"/api/Trans/EndTrans\";\r\n\r\n public beginTransaction(executionKey: string, secondsTimeout?: number): Observable<string> {\r\n this.log(\"beginTransaction call received: \" + executionKey);\r\n var pars = new HttpParams().set(\"executionKey\", executionKey);\r\n if (secondsTimeout)\r\n pars = pars.set(\"secondsTimeout\", secondsTimeout.toString());\r\n return this.get<string>(this.GET_Trans_BeginTrans, pars);\r\n }\r\n\r\n public checkTransaction(executionKey: string): Observable<number> {\r\n\r\n this.log(\"checkTransaction call received: \" + executionKey);\r\n return this.get<number>(this.GET_Trans_CheckExecution, new HttpParams().set(\"executionKey\", executionKey));\r\n }\r\n\r\n public endTransaction(transactionKey: string, transactionResult: boolean): Observable<string> {\r\n this.log(\"endTransaction call received: \" + transactionKey + \" Commit: \" + transactionResult);\r\n let pars = new HttpParams().set(\"idtrans\", transactionKey).set(\"success\", transactionResult.toString());\r\n return this.get<string>(this.GET_Trans_EndTrans, pars);\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HttpServiceModuleConfig } from './config/HttpServiceModuleConfig';\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE } from './tokens';\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 { provide: HTTP_INVALIDATION, useValue: config?.httpInvalidation },\r\n { provide: CLIENT_CACHE_DURATION_S, useValue: config?.clientCacheDurationS || 3600 },\r\n { provide: CACHE_BY_USER, useValue: config?.cacheByUser || false },\r\n { provide: HTTP_DEBUG_MODE, useValue: config?.debugMode || false }\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 /**\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 * Nome dell'applicazione che sta utilizzando la libreria, utilizzato per creare chiavi di cache specifiche per app\r\n */\r\n appName? : string;\r\n\r\n /**\r\n * Indica se la cache deve basarsi non solo sull'applicazione ma anche sull'utente connesso\r\n */\r\n cacheByUser? : boolean;\r\n\r\n /**\r\n * Abilita o disabilità la modalità di debug (Log a console)\r\n */\r\n debugMode? : boolean;\r\n}","export class Download {\r\n state: 'PENDING' | 'IN_PROGRESS' | 'DONE'\r\n progress: number\r\n content: Blob | null\r\n }","/*\r\n * Public API Surface of httpservice\r\n */\r\n\r\nexport * from './lib/tokens';\r\nexport * from './lib/httpservice.service';\r\nexport * from './lib/httpservice.module';\r\nexport * from './lib/config/HttpServiceModuleConfig';\r\nexport * from './lib/config/IHttpServiceExtensions';\r\nexport * from './lib/config/HttpServiceExtensions';\r\nexport * from './lib/models/Download';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-httpservice.mjs","sources":["../../../projects/httpservice/src/lib/tokens.ts","../../../projects/httpservice/src/lib/config/HttpServiceExtensions.ts","../../../projects/httpservice/src/lib/models/CacheInfos.ts","../../../projects/httpservice/src/lib/httpservice.service.ts","../../../projects/httpservice/src/lib/httpservice.module.ts","../../../projects/httpservice/src/lib/config/HttpServiceModuleConfig.ts","../../../projects/httpservice/src/lib/models/Download.ts","../../../projects/httpservice/src/public-api.ts","../../../projects/httpservice/src/esfaenza-httpservice.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Dizionario di invalidazioni delle chiamate HTTP\r\n */\r\nexport const HTTP_INVALIDATION: InjectionToken<Record<string, string[]>> = new InjectionToken<Record<string, string[]>>('HTTP_INVALIDATION');\r\n\r\n/**\r\n * Durata della cache lato libreria dopo il quale la cache verrà ripulita\r\n */\r\nexport const CLIENT_CACHE_DURATION_S: InjectionToken<number> = new InjectionToken<number>('CLIENT_CACHE_DURATION_S');\r\n\r\n/**\r\n * 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 HTTP_DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DEBUG_MODE');","import { Injectable } from '@angular/core';\r\nimport { 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\n@Injectable({ providedIn: 'root' })\r\nexport class HttpServiceExtensions implements IHttpServiceExtensions {\r\n\r\n /**\r\n * Hook per recuperare l'access token con cui effettuare le chiamate HTTP\r\n */\r\n public retrieveAccessToken(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Hook per recuperare l'Identity corrente in un oggetto generico con le informazioni di User e Tenant\r\n */\r\n public retrieveIdentity(): { IdUser: string, Idtenant: string } {\r\n return null;\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già venendo ridirezionati al login, in modo da non tentare di effettuare \r\n * N redirect contemporaneamente qualora molte API fallissero allo stesso tempo nell'autenticazione\r\n */\r\n public readRedirectingToLogin(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo effettuando un redirect al login o meno\r\n */\r\n public writeRedirectingToLogin(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per effettuare il redirect al login\r\n */\r\n public redirectToLogin(): void {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un errore, in modo da non tentare di gestire \r\n * N errori contemporaneamente qualora molte API fallissero allo stesso tempo\r\n */\r\n public readHandlingErrorStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un errore o meno\r\n */\r\n public writeHandlingErrorStatus(status: boolean) {\r\n }\r\n\r\n /**\r\n * Hook per leggere dallo stato dell'applicazione se stiamo già gestendo un redirect, in modo da non tentare di gestire \r\n * N redirect contemporaneamente qualora molte API lo richiedessero allo stesso tempo\r\n */\r\n public readRedirectionStatus(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per scrivere nello stato dell'applicazione se stiamo gestendo un redirect o meno\r\n */\r\n public writeRedirectionStatus(status: boolean): void {\r\n }\r\n\r\n /**\r\n * Hook per indicare se l'applicazione può gestire eccezioni del tipo \"NotConfigured\" (444). Qualora l'applicazione che lo implementa dichiari di gestirle verrà chiamata \r\n * la funzione **handleBlockingException** per ognuno di questi errori\r\n */\r\n public handleNotConfiguredException(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore bloccante per l'operazione attuale, ma non fatale (Generalmente gestibile da dialog di avviso)\r\n */\r\n public handleBlockingException(status: number, text: string) {\r\n console.error(\"ESHttpError Blocking Exception \" + status + \" \" + text);\r\n }\r\n\r\n /**\r\n * Hook per la gestione di un qualsiasi errore fatale (Generalmente gestibile tramite navigazione a una pagina di errore custom per l'applicativo)\r\n */\r\n public handleException(status: number | string, text: string) {\r\n console.error(\"ESHttpError \" + status + \" \" + text);\r\n }\r\n}","export class CacheInfos {\r\n constructor(public finalUrl: string, public cache: boolean, public cacheKey: string, public cacheTime: string, public cacheItem: any) { }\r\n}","// Angular\r\nimport { HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpParams, HttpProgressEvent, HttpResponse } from \"@angular/common/http\";\r\nimport { Injectable, Inject, Optional } from \"@angular/core\";\r\n\r\n// Es Faenza\r\nimport { CacheService } from \"@esfaenza/preferences\";\r\nimport { BaseLocalization } from \"@esfaenza/localizations\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { catchError, concatMap, delay, finalize, first, map, scan, tap } from \"rxjs/operators\";\r\nimport { forkJoin, from, Observable, of, Subject, throwError } from \"rxjs\";\r\n\r\n// Chiamate ai Repository / tokens\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE } from './tokens';\r\n\r\n// Modelli \r\nimport { HttpServiceExtensions } from './config/HttpServiceExtensions';\r\nimport { Download } from './models/Download';\r\nimport { CacheInfos } from \"./models/CacheInfos\";\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({ providedIn: 'root' })\r\nexport class HTTPService {\r\n\r\n /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */\r\n private callStatus: { [id: string]: { url: string, success: boolean } } = {};\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */\r\n private localStorageHttpCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching */\r\n private localStorageHttpTimedCacheKey = null;\r\n /** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */\r\n private localStorageHttpCacheExpireKey = null;\r\n /** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */\r\n private me: { Idtenant: string, IdUser: string } = null;\r\n /** Indica che la cache a tempo dev'essere persistita il prima possibile */\r\n private PersistTimedCacheASAP: boolean = false;\r\n /** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */\r\n private PersistUntimedCacheASAP: boolean = false;\r\n /** Subject emesso quando il servizio http si stabilizza, cioè quando non c'è nessuna chiamata pending o in corso da qualche istante */\r\n public Stabilized: Subject<true> = new Subject<true>();\r\n\r\n /**\r\n * Implementazione della classe di estensione per collegare i comportamenti della libreria all'applicazione in cui è usata. \r\n * \r\n * Se è stato effettuato il provide della classe **HttpServiceExtensions** verrà usato quel provider, altrimenti verrà creata una nuova istanza di default\r\n */\r\n private ExtensionsImpl: HttpServiceExtensions;\r\n\r\n /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */\r\n public LastThreeCompletedCalls: { api: string, requestJson: string, responseJson }[] = [];\r\n\r\n private CacheInitialized: boolean = false;\r\n /**\r\n * @ignore\r\n */\r\n constructor(\r\n private EXTENSION_CLASS: HttpServiceExtensions,\r\n @Optional() @Inject(HTTP_INVALIDATION) private HTTP_INVALIDATION,\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(HTTP_DEBUG_MODE) private HTTP_DEBUG_MODE: boolean,\r\n @Optional() private bc: BaseLocalization,\r\n private http: HttpClient,\r\n @Optional() private localStorage: CacheService\r\n ) {\r\n this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();\r\n }\r\n\r\n public setAppConfig(myconfig: { AppData: { ModuleId: string, ModuleDefId: number, ComponentEnvironment: string, ComponentVersion: string, ModuleDescription: string } }) {\r\n this.localStorageHttpCacheKey = (myconfig.AppData.ModuleDescription).replace(/\\s/g, '_') + \"_HttpCache\";\r\n this.localStorageHttpTimedCacheKey = (myconfig.AppData.ModuleDescription).replace(/\\s/g, '_') + \"_HttpTimedCache\";\r\n this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + \"_Expire\";\r\n this.adjustOldStorageSystem();\r\n\r\n this.CacheInitialized = true;\r\n }\r\n\r\n /**\r\n * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.\r\n * Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage\r\n */\r\n private async adjustOldStorageSystem() {\r\n var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);\r\n var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);\r\n if (!lsTimed && !lsUntimed)\r\n return;\r\n\r\n localStorage.removeItem(this.localStorageHttpTimedCacheKey);\r\n localStorage.removeItem(this.localStorageHttpCacheKey);\r\n lsTimed = lsTimed ? JSON.parse(lsTimed) : {};\r\n lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};\r\n\r\n if (this.localStorage)\r\n await forkJoin([\r\n this.localStorage.setItem(this.localStorageHttpTimedCacheKey, lsTimed),\r\n this.localStorage.setItem(this.localStorageHttpCacheKey, lsUntimed)\r\n ]).toPromise();\r\n\r\n this.log(this.loc(\"Converted old storage system to new one\"));\r\n }\r\n\r\n getlocaleObservable() {\r\n return this.bc ? this.bc.Locale.pipe(first()) : of(\"it-IT\");\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 return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); }));\r\n }\r\n\r\n var httpCall = this.http.get<T>(cachedInfos.finalUrl, { headers: this.getHeaders(ret.locale, 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 let toCache = JSON.parse(JSON.stringify(responseItem));\r\n this.cacheResponse(toCache, 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, ret.myGuid);\r\n }),\r\n tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res), cachedInfos); })\r\n );\r\n })\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 return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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), tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); }));\r\n }\r\n\r\n var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: <any>type, headers: this.getHeaders(ret.locale, 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, ret.myGuid);\r\n }),\r\n tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res), cachedInfos); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public post<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true, onError?: (res) => void): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n // Se è una ricerca, shallow copy e rimuovo gli \"items\" per evitare di farli andare su e giù al backend\r\n if (!!bodyData?.items && !!bodyData?.page) {\r\n bodyData = { ...bodyData };\r\n delete bodyData.items;\r\n }\r\n\r\n var httpCall = this.http.post<T>(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, _): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid, true, onError);\r\n }),\r\n tap((res) => {\r\n // Secco gli items dalle ricerche paginate lato richiesta\r\n let request = JSON.parse(JSON.stringify(bodyData));\r\n if (request?.items && request?.itemsperpageoverride)\r\n delete request.items;\r\n\r\n // Rimuovo i blob di eventuali AppFile (se ci sono AppFile a livello 2+ del DTO, fanculo)\r\n for (var prop in request) {\r\n if (request[prop]?.fileb64)\r\n request[prop].fileb64 = \"*REDACTED*\";\r\n }\r\n\r\n // Secco gli items dalle ricerche paginate lato risposta\r\n let response = JSON.parse(JSON.stringify(res));\r\n if (response?.items && response?.itemsperpageoverride)\r\n delete response.items;\r\n\r\n this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? \" § \" : \"\") + JSON.stringify(request), JSON.stringify(response));\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una DELETE HTTP\r\n *\r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public delete<T>(url: string, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n var httpCall = this.http.delete<T>(url, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, _): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);\r\n }),\r\n tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString(), JSON.stringify(res)); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una PUT HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {any} bodyData DTO per la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header \"X-TX-ID\" e lato Backend dovrà essere gestito di conseguenza\r\n * @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere \r\n * raccolto da chi usa la libreria nella pipe \"onError\" dell'Observable restituito ed essere gestito in maniera non standard\r\n * \r\n * @returns {Observable<T>} Observable che contiene il risultato della chiamata\r\n */\r\n public put<T>(url: string, bodyData: any, params: HttpParams = null, transaction = \"\", succesfulResultMandatory: boolean = true): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n var httpCall = this.http.put<T>(url, bodyData, { headers: this.getHeaders(ret.locale, transaction), params: params });\r\n\r\n return httpCall.pipe(\r\n catchError((err, _): Observable<T> => {\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);\r\n }),\r\n tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? \" § \" : \"\") + JSON.stringify(bodyData), JSON.stringify(res)); })\r\n );\r\n })\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, params: HttpParams = null, succesfulResultMandatory: boolean = true, onError?: () => void): Observable<T> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\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, { params: params, headers: this.getHeaders(ret.locale, null, true, null, null) });\r\n\r\n return httpCall.pipe(\r\n catchError((err, caught): Observable<T> => {\r\n onError?.();\r\n return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, ret.myGuid);\r\n }),\r\n tap((res) => { this.tryFinalizeByGuid(ret.myGuid, params?.toString() + (params?.toString() ? \" § \" : \"\") + JSON.stringify(bodyData), JSON.stringify(res)); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Esecuzione di una POST HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {K} bodyData DTO per la chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public async postGetFile<K>(url: string, bodyData: K, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true, pars?: HttpParams) {\r\n let myGuid = this.defaultStartCall(url);\r\n let locale = await this.getlocaleObservable().toPromise();\r\n\r\n this.http.post(url, bodyData, { params: pars, headers: this.getHeaders(locale), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, _): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, JSON.stringify(bodyData)); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET HTTP\r\n * \r\n * Casistica particolare in cui viene restituito un file gestito come ObjectURL il cui URL si può gestire dal parametro di callback **getFileCallback**. \r\n * La chiamata non ha un tipo restituito in quanto il risultato dev'essere gestito attraverso la callback **getFileCallback**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {string} filename Nome del file che si sta richiedendo, rimane lato Frontend e serve per assegnare arbitrariamente un nome al file restituito, se vuoto viene utilizzata la Content-Disposition della risposta\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * @param {Function} afterGetFile Callback da chiamare dopo aver gestito la risposta del **getFileCallback**, in caso **handleError** fosse **false** verrà richiamato anche in caso di errore\r\n * @param {boolean} handleError Indica se di default gli errori devono essere gestiti dalla libreria o se devono essere ignorati\r\n */\r\n public async getFile(url: string, params: HttpParams = null, filename: string, getFileCallback: (url: string, filename: string) => any, afterGetFile: () => any = null, handleError: boolean = true) {\r\n let myGuid = this.defaultStartCall(url);\r\n let locale = await this.getlocaleObservable().toPromise();\r\n\r\n this.http.get(url, { params: params, headers: this.getHeaders(locale), observe: 'response', responseType: \"blob\" }).pipe(\r\n catchError((err, _): Observable<string> => {\r\n if (afterGetFile && !handleError) afterGetFile();\r\n return this.registerErrorAndReturnEmptyObservable(err, myGuid, handleError);\r\n }),\r\n finalize(() => { this.tryFinalizeByGuid(myGuid, params?.toString()); })\r\n ).subscribe((response: HttpResponse<Blob>) => {\r\n let retUrl = window.URL.createObjectURL(response.body);\r\n let fn = response.headers.get('content-disposition')?.split(';')[1]?.split('filename')[1]?.split('=')[1]?.trim().replace(/\\\"/g, '');\r\n\r\n getFileCallback(retUrl, filename || fn);\r\n if (afterGetFile) afterGetFile();\r\n });\r\n }\r\n\r\n /**\r\n * Download nativo di un file. Internamente utilizza il pattern **window.location.href = \"...\"**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n */\r\n public getFileNative(url: string, params: HttpParams = null): void {\r\n\r\n // Encodo tutti i parametri per evitare casi particolari\r\n // var encodedParams = new HttpParams();\r\n // let parKeys = params.keys();\r\n // for (let i = 0; i < parKeys.length; i++)\r\n // encodedParams = encodedParams.set(parKeys[i], encodeURIComponent(params.get(parKeys[i])));\r\n\r\n let finalUrl = url + (params ? \"?\" + params?.toString()?.replace(/\\+/g, '%2b') : \"\");\r\n window.location.href = finalUrl;\r\n }\r\n\r\n /**\r\n * Esecuzione di una GET di un file che emette i vari eventi di progresso di download.\r\n * Utilizzarla per overridare la dialog nativa di progress del browser e sostituirla con qualcosa tipo quello che fa MEGA.\r\n * \r\n * In caso si voglia ottenere il risultato nativo del browser del download utilizzare **getFileNative(url, pars)**\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * @param {Function} getFileCallback Callback a due parametri (url: string, filename: string) per gestire il risultato del file richiesto. **Utilizzare UtilityService.fileDownload** di @esfaenza/extensions\r\n * \r\n * @returns {Observable<Download>} Observable dei vari step di progresso del download\r\n */\r\n public getFileWithProgress(url: string, params: HttpParams = null, getFileCallback: (url: string, filename: string) => any): Observable<Download> {\r\n return forkJoin(\r\n {\r\n myGuid: from([this.defaultStartCall(url)]),\r\n locale: this.getlocaleObservable()\r\n }).pipe(\r\n concatMap((ret: { myGuid: string, locale: string }) => {\r\n\r\n return this.http.get(url, { responseType: 'blob', headers: this.getHeaders(ret.locale), params: params, observe: 'events', reportProgress: true })\r\n .pipe(\r\n scan((previous: Download, event: HttpEvent<Blob>): Download => {\r\n\r\n if (this.isHttpProgressEvent(event)) {\r\n let progress = event.total ? (event.loaded > event.total ? 100 : Math.round((100 * event.loaded) / event.total)) : previous.progress;\r\n return { progress: progress, state: 'IN_PROGRESS', content: null }\r\n }\r\n\r\n if (this.isHttpResponse(event)) {\r\n if (event.body) {\r\n let cdisp = event.headers.get('content-disposition');\r\n let cdispFilename = cdisp.split(';')[1].split('filename')[1].split('=')[1].trim().replace(/\\\"/g, '');\r\n let retUrl = window.URL.createObjectURL(event.body);\r\n getFileCallback(retUrl, cdispFilename);\r\n }\r\n return { progress: 100, state: 'DONE', content: event.body }\r\n }\r\n\r\n return previous;\r\n }, { state: 'PENDING', progress: 0, content: null }),\r\n catchError((err, _): Observable<Download> => { return this.registerErrorAndReturnEmptyObservable(err, ret.myGuid) }),\r\n finalize(() => { this.tryFinalizeByGuid(ret.myGuid, params?.toString()); })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpResponse<T>(event: HttpEvent<T>): event is HttpResponse<T> {\r\n return event.type === HttpEventType.Response\r\n }\r\n\r\n /**\r\n * Riconosce se l'evento HTTP è di tipo **HttpProgressEvent** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n */\r\n private isHttpProgressEvent(event: HttpEvent<unknown>): event is HttpProgressEvent {\r\n return event.type === HttpEventType.DownloadProgress || event.type === HttpEventType.UploadProgress\r\n }\r\n\r\n /**\r\n * Gestione dell'inizio di una chiamata ad un certo URL, viene generato un GUID da assegnarci, controllata la scadenza della cache, \r\n * e eventualmente loggato il fatto che sta per essere effettuata una chiamata HTTP\r\n * \r\n * @param {string} url Url a cui effettuare la chiamata\r\n * @returns {string} GUID assegnato alla chiamata\r\n */\r\n private defaultStartCall(url: string): string {\r\n let myGuid = this.getGUID();\r\n this.checkCacheInvalidation(url);\r\n this.callStatus[myGuid] = { url: url, success: true };\r\n this.log(this.loc(\"Starting call\") + \" \" + myGuid + \" \" + this.loc(\"at URL\") + \": \" + url);\r\n return myGuid;\r\n }\r\n\r\n /**\r\n * Dato un url vengono controllate le informazioni su tutti gli url da invalidare collegati all'url chiamato e, se presenti in cache, invalidati\r\n * \r\n * @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare\r\n */\r\n private checkCacheInvalidation(url: string) {\r\n if (!this.CacheInitialized)\r\n return;\r\n\r\n let cache = this.localStorage?.getLocalItem<any>?.(this.localStorageHttpCacheKey);\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n let cacheTime = tmp ? tmp[2] : null;\r\n let normalizedUrl_tmp = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n let normalizedUrl = normalizedUrl_tmp.substring(normalizedUrl_tmp.indexOf('/api'))\r\n\r\n if (!cache || !this.HTTP_INVALIDATION || !this.HTTP_INVALIDATION[normalizedUrl])\r\n return;\r\n\r\n let apisToInvalidate: string[] = this.HTTP_INVALIDATION[normalizedUrl];\r\n if (!apisToInvalidate || apisToInvalidate.length == 0)\r\n return;\r\n\r\n let keysToRemove: string[] = [];\r\n apisToInvalidate.forEach(api => {\r\n let cacheKey = this.makeCacheKey(api, null);\r\n for (let item in cache)\r\n if (item.indexOf(cacheKey) != -1)\r\n keysToRemove.push(item);\r\n });\r\n\r\n for (let i = 0; i < keysToRemove.length; i++) {\r\n let k = keysToRemove[i];\r\n this.log(this.loc(\"Invlalidating cache element\") + \" \" + k);\r\n delete cache[k];\r\n }\r\n\r\n this.localStorage?.setItem?.(this.localStorageHttpCacheKey, cache);\r\n }\r\n\r\n /**\r\n * Finalizzazione di una chiamata\r\n * \r\n * @param {string} guid GUID collegato alla chiamata appena terminata\r\n * @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare\r\n * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni\r\n */\r\n private async tryFinalizeByGuid(guid: string, requestJson: string, responseJson?: string, cacheInfos?: CacheInfos) {\r\n this.log(this.loc(\"Finalizing call\") + \" \" + guid + \" \" + this.loc(\"with status\") + \": \" + (!this.callStatus[guid] ? 'Unknown' : this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));\r\n\r\n if (this.callStatus[guid]) {\r\n // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false\r\n // e riiniziare a valutare errori di javashit\r\n if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())\r\n this.ExtensionsImpl.writeRedirectionStatus(false);\r\n\r\n // Aggiungo la chiamata alla lista delle ultime 3 completate\r\n this.LastThreeCompletedCalls.unshift({ api: this.callStatus[guid].url, requestJson: requestJson, responseJson: responseJson })\r\n if (this.LastThreeCompletedCalls.length > 3)\r\n this.LastThreeCompletedCalls.pop();\r\n\r\n // In ogni caso questa posso rimuoverla\r\n delete this.callStatus[guid];\r\n }\r\n\r\n // Se non ho nessun'altra chiamata in corso considero la situazione stabilizzatasi\r\n if (Object.keys(this.callStatus).length == 0)\r\n this.Stabilized.next(true);\r\n\r\n // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata\r\n if (cacheInfos && cacheInfos.cache) {\r\n this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;\r\n this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;\r\n this.log(this.loc(\"Marking cache to be persisted as soon as possible\"));\r\n }\r\n\r\n // Se una delle due cache devono essere aggiornate e non ho nessuna chiamata in corso effettuo l'aggiornamento in base a quale delle due va aggiornata\r\n // Alla fine di tutto marco come fatto\r\n if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0 && this.CacheInitialized) {\r\n\r\n var toCall = [];\r\n let tmpKey = \"\";\r\n if (this.PersistTimedCacheASAP && this.localStorage) {\r\n tmpKey = this.localStorageHttpTimedCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n if (this.PersistUntimedCacheASAP && this.localStorage) {\r\n tmpKey = this.localStorageHttpCacheKey;\r\n toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));\r\n }\r\n\r\n this.log(this.loc(\"No more HTTP calls to be executed, entering idle state and persisting modified caches\") + \"...\");\r\n\r\n var ret = await forkJoin(toCall).toPromise();\r\n if (ret)\r\n this.log(this.loc(\"Caches succesfully persisted\"));\r\n else\r\n this.log(this.loc(\"Errors persisting modified caches\"));\r\n this.PersistTimedCacheASAP = false;\r\n this.PersistUntimedCacheASAP = false;\r\n }\r\n }\r\n\r\n /**\r\n * Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente \r\n * ad un backend ASP.NET da cui si potrà accedere a Request.Form.Files\r\n * \r\n * @param {File | File[]} fileArrayOrFile Singolo File o lista di File. N.B: nella firma della funzione viene considerato **any** per fare test sulle proprietà \r\n * invece che fare test con l'**istanceof**\r\n * \r\n * @returns {FormData} FormData contenente tutti i file passati\r\n */\r\n private getFilesFormData(fileArrayOrFile: any): FormData {\r\n var formData: FormData = new FormData();\r\n\r\n if (fileArrayOrFile) {\r\n if (fileArrayOrFile.length)\r\n fileArrayOrFile.forEach(t => { formData.append(\"file\", t, t.name); });\r\n else if (fileArrayOrFile.name)\r\n formData.append(\"files\", fileArrayOrFile, fileArrayOrFile.name);\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Helper che in base ai parametri disponibili genera gli Header HTTP per la chiamata da effettuare\r\n * \r\n * @param {string} contentType Indica se aggiungere agli header \"Content-Type\", valorizzato al valore del parametro\r\n * @param {string} accept Indica se aggiungere agli header \"Accept\", valorizzato al valore del parametro\r\n * @param {boolean} includeAuth Indica se aggiungere agli header \"Authorization\", valorizzato col token recuperato dall'hook **retrieveAccessToken** della classe di estensione\r\n * @param {string} transactionId Indica se aggiungere agli header \"X-TX-ID\", valorizzato al valore del parametro\r\n * \r\n * @returns {HttpHeaders} Header generati in base ai parametri\r\n */\r\n private getHeaders(locale = 'it-IT', 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 headers = headers.append(\"ngsw-bypass\", \"\");\r\n\r\n if (contentType)\r\n headers = headers.append(\"Content-Type\", contentType);\r\n\r\n if (transactionId)\r\n headers = headers.append(\"X-TX-ID\", transactionId);\r\n\r\n if (authtoken && includeAuth)\r\n headers = headers.append(\"Authorization\", \"Bearer \" + authtoken);\r\n\r\n if (accept)\r\n headers = headers.append(\"Accept\", accept);\r\n\r\n headers = headers.append(\"Accept-Language\", locale);\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gestione di default degli errori\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n */\r\n private async onError(res: HttpErrorResponse | TypeError, guid: string) {\r\n if (this.callStatus[guid])\r\n this.callStatus[guid].success = false;\r\n\r\n //Mi assicuro che tutti gli errori durante il redirect al login vengano ignorati\r\n if (this.ExtensionsImpl.readRedirectingToLogin()) {\r\n this.log(this.loc(\"Redirecting to Login, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n\r\n //Mi assicuro che venga gestito un solo errore per volta\r\n if (this.ExtensionsImpl.readHandlingErrorStatus()) {\r\n this.log(this.loc(\"Already Handling an error, ignoring HTTP error on call\") + \" \" + guid);\r\n return;\r\n }\r\n else\r\n this.ExtensionsImpl.writeHandlingErrorStatus(true);\r\n\r\n let finalError = \"\";\r\n let finalStatus = \"\";\r\n if (this.isTypeError(res)) {\r\n finalError = res.message;\r\n finalStatus = \"HTTP Service Internal Error\";\r\n }\r\n else if (this.isHttpErrorResponse(res)) {\r\n\r\n finalError = await this.getHttpErrorText(res.error);\r\n finalStatus = res.status.toString();\r\n\r\n switch (res.status) {\r\n // Unauthorized\r\n case 401:\r\n if (this.ExtensionsImpl.readRedirectionStatus()) {\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n return;\r\n }\r\n this.log(this.loc(\"Error 401 on call\") + \" \" + guid + \" \" + this.loc(\"redirecting to login.\"));\r\n this.ExtensionsImpl.writeRedirectionStatus(true);\r\n this.ExtensionsImpl.writeRedirectingToLogin(true);\r\n this.ExtensionsImpl.redirectToLogin();\r\n return;\r\n // Handled exception\r\n case 400:\r\n // No Permissions\r\n case 403:\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n // Not found\r\n case 404:\r\n this.ExtensionsImpl.handleBlockingException(res.status, this.loc(\"Resource not found\"));\r\n return;\r\n // NotConfiguredException\r\n case 444:\r\n if (this.ExtensionsImpl.readRedirectionStatus())\r\n this.log(this.loc(\"Error 444 on call\") + \" \" + guid + \" \" + this.loc(\"with redirect already in progress. Ignoring this event\"));\r\n else if (!this.ExtensionsImpl.handleNotConfiguredException())\r\n this.ExtensionsImpl.handleBlockingException(res.status, finalError);\r\n return;\r\n case 0:\r\n finalError = `Generic connection error while calling '[${guid}] - ${this.callStatus[guid].url}' at ${new Date().toISOString()}. Response: ${JSON.stringify(res)}`;\r\n }\r\n }\r\n\r\n this.ExtensionsImpl.handleException(finalStatus, finalError);\r\n }\r\n\r\n /**\r\n * Dato un errore restituisce una promise con la stringa finale dell'errore in modo da poter fare un await\r\n * \r\n * @param {any} err Errore da controllare\r\n * \r\n * @returns {Promise<string>} Promise che risolve con la stringa finale dell'errore\r\n */\r\n private getHttpErrorText(err: any): Promise<string> {\r\n // Se ho un Blob può essere o un CallResult o suppongo una semplice stringa,\r\n // altrimenti potrebbe essere direttamente un CallResult, oppure una semplice stringa\r\n return new Promise<string>((resolve) => {\r\n if (err instanceof Blob) {\r\n let reader = new FileReader();\r\n reader.onload = (e: Event) => {\r\n let errMsg = (<any>e.target).result;\r\n let jsonerrMsg: any;\r\n try { jsonerrMsg = JSON.parse(errMsg); } catch (e) { }\r\n return resolve(jsonerrMsg && this.isCallResult(jsonerrMsg) ? jsonerrMsg.error.message : errMsg);\r\n };\r\n reader.readAsText(err)\r\n }\r\n else if (this.isCallResult(err))\r\n return resolve(err.error.message);\r\n else\r\n return resolve(err?.toString());\r\n });\r\n }\r\n\r\n /**\r\n * Riconosce se l'oggetto è di tipo **CallResult** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isCallResult(err: any): err is { error: { message: string } } {\r\n return !!err?.error?.message;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **HttpErrorResponse** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isHttpErrorResponse(err: any): err is HttpErrorResponse {\r\n return err instanceof HttpErrorResponse;\r\n }\r\n\r\n /**\r\n * Riconosce se l'errore è di tipo **TypeError** e, se sì, lo casta al tipo corretto per essere utilizzato correttamente nel blocco di codice successivo\r\n * \r\n * @param {any} err Errore da controllare\r\n */\r\n private isTypeError(err: any): err is TypeError {\r\n return err.name == \"TypeError\";\r\n }\r\n\r\n /**\r\n * Come dice il nome, registra un errore e restituisce un Observable vuoto come risultato della chiamata\r\n * \r\n * @param {any} res Risultato della chiamata effettuata\r\n * @param {string} guid Identificativo GUID della chiamata effettuata\r\n * @param {boolean} handleError Indica se gestire l'errore via libreria o se limitarsi a restituire l'Observable vuoto\r\n * \r\n * @returns {Observable<any>} Observable vuoto\r\n */\r\n private registerErrorAndReturnEmptyObservable(res: any, guid: string, handleError: boolean = true, onErrorOverride?: (res) => void): Observable<any> {\r\n if (handleError) {\r\n if (onErrorOverride)\r\n onErrorOverride(res);\r\n else\r\n this.onError(res, guid);\r\n }\r\n return new Observable(() => { });\r\n }\r\n\r\n /**\r\n * Dato un Url e dei parametri cerca di recuperare l'eventuale oggetto già salvato in cache con le informazioni base della cache stessa\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)\r\n * \r\n * @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato\r\n */\r\n private tryGetCacheInformations(url: string, params: HttpParams): CacheInfos {\r\n\r\n let cachingKey = null, cacheTime = null, item = null;\r\n let useCaching = !!(/#cache/gi.exec(url));\r\n\r\n if (useCaching && this.CacheInitialized) {\r\n let tmp = /#cache(:?-(\\d+))/gi.exec(url);\r\n cacheTime = tmp ? tmp[2] : null;\r\n\r\n url = url.replace(\"#cache\" + (cacheTime ? \"-\" + cacheTime : \"\"), \"\");\r\n if (this.untimedCacheExpired() && !cacheTime)\r\n this.resetHttpUntimedCacheStorage();\r\n\r\n cachingKey = this.makeCacheKey(url, params);\r\n let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey].__expire)) {\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 // Per assicurarmi che il rifeirmento degli oggetti sia diverso utilizzo il deepClone\r\n let toCache = JSON.parse(JSON.stringify(item));\r\n return new CacheInfos(url, useCaching && this.CacheInitialized, cachingKey, cacheTime, toCache);\r\n }\r\n\r\n /**\r\n * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**\r\n * \r\n * @param {T} item Oggetto da inserire nella cache\r\n * @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**\r\n */\r\n private cacheResponse<T>(item: T, cacheInfos: CacheInfos): void {\r\n let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey\r\n let cacheLs = this.localStorage?.getLocalItem?.(cacheKey);\r\n let cache = cacheLs ? cacheLs : {};\r\n\r\n cache[cacheInfos.cacheKey] = item;\r\n if (cacheInfos.cacheTime) {\r\n let date = new Date();\r\n date.setSeconds(date.getSeconds() + parseInt(cacheInfos.cacheTime));\r\n cache[cacheInfos.cacheKey].__expire = date;\r\n }\r\n\r\n this.localStorage?.setLocalItem?.(cacheKey, cache);\r\n }\r\n\r\n /**\r\n * Controlla se la cache per le chiamate senza expire time è scaduta\r\n * \r\n * @returns {boolean} **true** se la cache è scaduta e dev'essere ripulita, **false** altrimenti\r\n */\r\n private untimedCacheExpired(): boolean {\r\n let expire = JSON.parse(localStorage.getItem(this.localStorageHttpCacheExpireKey));\r\n return !expire || (expire && this.timedCacheItemExpired(expire));\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(dtCheck: Date): boolean {\r\n return new Date(dtCheck) < new Date();\r\n }\r\n\r\n /**\r\n * Ripulisce la cache e imposta la prossima scadenza ad adesso + **CLIENT_CACHE_DURATION_S** (token valorizzato in fase di configurazione dalla proprietà **clientCacheDurationS** della classe **HttpServiceModuleConfig**)\r\n */\r\n public async resetHttpUntimedCacheStorage() {\r\n if (!this.CacheInitialized || !this.localStorage)\r\n return;\r\n\r\n await this.localStorage.setItem(this.localStorageHttpCacheKey, {}).toPromise();\r\n let date = new Date();\r\n date.setSeconds(date.getSeconds() + (this.CLIENT_CACHE_DURATION_S ?? 3600));\r\n localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(date));\r\n }\r\n\r\n /**\r\n * Ripulisce la cache delle chiamate con un tempo di expire definito\r\n */\r\n public async resetHttpTimedCacheStorage() {\r\n if (!this.CacheInitialized || !this.localStorage)\r\n return;\r\n\r\n await this.localStorage.setItem(this.localStorageHttpTimedCacheKey, {}).toPromise();\r\n }\r\n\r\n /**\r\n * Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP\r\n * \r\n * @param {string} url URL su cui effettuare la chiamata\r\n * @param {HttpParams} params Parametri della chiamata\r\n * \r\n * @returns {string} Chiave che rappresenta in maniera univoca la chiamata\r\n */\r\n private makeCacheKey(url: string, params: HttpParams): string {\r\n this.me = this.me || this.ExtensionsImpl.retrieveIdentity();\r\n\r\n let authKeyPart = (this.me ? this.me.Idtenant : \"\") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : \"\");\r\n let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev: any, next: any) => prev + \",\" + next + '=' + params.get(next), \"\") : \"\";\r\n return authKeyPart + \"_\" + url.substring(url.indexOf(\"api\") + 4) + \"?\" + paramsKeyPart;\r\n }\r\n\r\n /**\r\n * Generazione GUID\r\n * \r\n * @returns {string} Nuovo GUID generato in maniera casuale\r\n */\r\n private getGUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n /**\r\n * Metodo per scrivere log a console qualora **DEBUG_MODE** risultasse **true**\r\n * \r\n * @param {string} message Messaggio di log\r\n */\r\n private log(message: string): void {\r\n if (this.HTTP_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 // Togliamo velocemente ste localizzazioni inutili....\r\n return message;\r\n }\r\n\r\n /**\r\n * Helper per lanciare la selezione di tutto quello che è relativo a un api di ricerca con AppSearch (di cui non utilizzo il tipo vero per ridurre le dipendenze)\r\n */\r\n public getAll<T>(view: { items: T[], page: number, itemsperpageoverride: number, selection: { exclusions: T[], all: boolean, items: T[] } }, api: string, pars?: HttpParams, transaction?: string): Observable<T[]> {\r\n if (!view.selection.all)\r\n return of(view.selection.items);\r\n\r\n var jsonView = JSON.parse(JSON.stringify(view));\r\n jsonView.page = 1;\r\n jsonView.itemsperpageoverride = 999999;\r\n\r\n return this.post<{ items: T[], selection: { exclusions: T[] } }>(api, jsonView, pars, transaction).pipe(map<{ items: T[], selection: { exclusions: T[] } }, T[]>(res => {\r\n let items = <T[]>res.items;\r\n items.forEach(t => (<any>t).hash = this.hashObject(t));\r\n if (res.selection.exclusions?.length > 0)\r\n items = items.filter((t: any) => !res.selection.exclusions.find((e: any) => this.hashObject(e) == t.hash));\r\n return items;\r\n }));\r\n }\r\n\r\n private hashObject(o: any, level: number = 0): string {\r\n var strDef = this.stringify(o, level);\r\n var hash: string = this.simpleHash(strDef);\r\n return hash;\r\n }\r\n\r\n /*****************************************************************************************************************************************\r\n ***************************************************** TRANSACTION HELPERS ***************************************************************\r\n *****************************************************************************************************************************************/\r\n private GET_Trans_BeginTrans: string = \"/api/Trans/BeginTrans\";\r\n private GET_Trans_CheckExecution: string = \"/api/Trans/CheckExecution\";\r\n private GET_Trans_EndTrans: string = \"/api/Trans/EndTrans\";\r\n\r\n public beginTransaction(executionKey: string, secondsTimeout?: number): Observable<string> {\r\n this.log(\"beginTransaction call received: \" + executionKey);\r\n var pars = new HttpParams().set(\"executionKey\", executionKey);\r\n if (secondsTimeout)\r\n pars = pars.set(\"secondsTimeout\", secondsTimeout.toString());\r\n return this.get<string>(this.GET_Trans_BeginTrans, pars);\r\n }\r\n\r\n public checkTransaction(executionKey: string): Observable<number> {\r\n\r\n this.log(\"checkTransaction call received: \" + executionKey);\r\n return this.get<number>(this.GET_Trans_CheckExecution, new HttpParams().set(\"executionKey\", executionKey));\r\n }\r\n\r\n public endTransaction(transactionKey: string, transactionResult: boolean): Observable<string> {\r\n this.log(\"endTransaction call received: \" + transactionKey + \" Commit: \" + transactionResult);\r\n let pars = new HttpParams().set(\"idtrans\", transactionKey).set(\"success\", transactionResult.toString());\r\n return this.get<string>(this.GET_Trans_EndTrans, pars);\r\n }\r\n\r\n /*****************************************************************************************************************************************\r\n ***************************************************** ROBA PER HASHING ******************************************************************\r\n *****************************************************************************************************************************************/\r\n\r\n /**\r\n * Blacklist dei tipi da ignorare quando si effettua l'hashing degli oggetti\r\n */\r\n private objBlacklist = {\r\n \"NgForm\": true, \"ElementRef\": true, \"ExtensionsService\": true, \"ToastrService\": true, \"LocaleService\": true, \"AppState\": true, \"Router\": true,\r\n \"ActivatedRoute\": true, \"HTTPService\": true, \"Location\": true, \"CanvasComponent\": true, \"ModalDirective\": true, \"ChangeDetectorRef\": true,\r\n \"DateService\": true, \"EventEmitter\": true, \"ViewRef_\": true, \"Subscriber\": true, \"ItemLocalization\": true\r\n };\r\n\r\n /**\r\n * Hash più semplice e più veloce dell'md5, ma meno sicuro\r\n * \r\n * Vedi https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript\r\n *\r\n * @param {string} str Stringa di cui calcolare l'hash\r\n */\r\n private simpleHash(str: string, seed = 0): string {\r\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i);\r\n h1 = Math.imul(h1 ^ ch, 2654435761);\r\n h2 = Math.imul(h2 ^ ch, 1597334677);\r\n }\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\r\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString();\r\n }\r\n\r\n /**\r\n * Genera una stringa che identifica univocamente l'oggetto in questione\r\n * \r\n * @param {any} o Oggetto di cui calcolare la stringa univoca\r\n * @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti\r\n * @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello\r\n */\r\n private stringify(o: any, level: number) {\r\n var i: any, r: any;\r\n if (o === null) return \"n\";\r\n if (o === true) return \"t\";\r\n if (o === false) return \"f\";\r\n if (o instanceof Date) return 'd:' + o.valueOf().toString();\r\n i = typeof o;\r\n if (i === \"string\") return \"s:\" + o;\r\n if (i === \"number\") return \"n:\" + o;\r\n if (o instanceof Function) return \"m:\" + o.toString();\r\n if (o instanceof Array) {\r\n r = [];\r\n for (i = 0; i < o.length; i++) {\r\n let res = this.stringify(o[i], level);\r\n if (res) r.push(res);\r\n }\r\n return r.length > 0 ? \"a:\" + r.join(\";\") : \"\";\r\n }\r\n r = [];\r\n\r\n //Se è oggetto, escludo tutti quelli di sistema/inutili\r\n if (o) {\r\n var name = o.__proto__.constructor.name;\r\n\r\n if (!this.objBlacklist[name]) {\r\n for (i in o) {\r\n if (o.hasOwnProperty(i) && (level <= 2)) {\r\n let res = this.stringify(o[i], level + 1);\r\n if (res) r.push(i + \":\" + res);\r\n }\r\n }\r\n }\r\n }\r\n return r.length > 0 ? \"o:\" + r.join(\";\") : \"\";\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HttpServiceModuleConfig } from './config/HttpServiceModuleConfig';\r\nimport { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE } from './tokens';\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 { provide: HTTP_INVALIDATION, useValue: config?.httpInvalidation },\r\n { provide: CLIENT_CACHE_DURATION_S, useValue: config?.clientCacheDurationS || 3600 },\r\n { provide: CACHE_BY_USER, useValue: config?.cacheByUser || false },\r\n { provide: HTTP_DEBUG_MODE, useValue: config?.debugMode || false }\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 /**\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 * Nome dell'applicazione che sta utilizzando la libreria, utilizzato per creare chiavi di cache specifiche per app\r\n */\r\n appName? : string;\r\n\r\n /**\r\n * Indica se la cache deve basarsi non solo sull'applicazione ma anche sull'utente connesso\r\n */\r\n cacheByUser? : boolean;\r\n\r\n /**\r\n * Abilita o disabilità la modalità di debug (Log a console)\r\n */\r\n debugMode? : boolean;\r\n}","export class Download {\r\n state: 'PENDING' | 'IN_PROGRESS' | 'DONE'\r\n progress: number\r\n content: Blob | null\r\n }","/*\r\n * Public API Surface of httpservice\r\n */\r\n\r\nexport * from './lib/tokens';\r\nexport * from './lib/httpservice.service';\r\nexport * from './lib/httpservice.module';\r\nexport * from './lib/config/HttpServiceModuleConfig';\r\nexport * from './lib/config/IHttpServiceExtensions';\r\nexport * from './lib/config/HttpServiceExtensions';\r\nexport * from './lib/models/Download';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -2,7 +2,6 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, ModuleWithProviders } from '@angular/core';
3
3
  import { HttpClient, HttpParams } from '@angular/common/http';
4
4
  import { CacheService } from '@esfaenza/preferences';
5
- import { HashingService, UtilityService } from '@esfaenza/extensions';
6
5
  import { BaseLocalization } from '@esfaenza/localizations';
7
6
  import { Subject, Observable } from 'rxjs';
8
7
 
@@ -172,8 +171,6 @@ declare class HTTPService {
172
171
  private bc;
173
172
  private http;
174
173
  private localStorage;
175
- private hash;
176
- private utisExts;
177
174
  /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
178
175
  private callStatus;
179
176
  /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */
@@ -197,12 +194,16 @@ declare class HTTPService {
197
194
  */
198
195
  private ExtensionsImpl;
199
196
  /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
200
- LastThreeCompletedCalls: string[];
197
+ LastThreeCompletedCalls: {
198
+ api: string;
199
+ requestJson: string;
200
+ responseJson: any;
201
+ }[];
201
202
  private CacheInitialized;
202
203
  /**
203
204
  * @ignore
204
205
  */
205
- constructor(EXTENSION_CLASS: HttpServiceExtensions, HTTP_INVALIDATION: any, CLIENT_CACHE_DURATION_S: any, CACHE_BY_USER: boolean, HTTP_DEBUG_MODE: boolean, bc: BaseLocalization, http: HttpClient, localStorage: CacheService, hash: HashingService, utisExts: UtilityService);
206
+ constructor(EXTENSION_CLASS: HttpServiceExtensions, HTTP_INVALIDATION: any, CLIENT_CACHE_DURATION_S: any, CACHE_BY_USER: boolean, HTTP_DEBUG_MODE: boolean, bc: BaseLocalization, http: HttpClient, localStorage: CacheService);
206
207
  setAppConfig(myconfig: {
207
208
  AppData: {
208
209
  ModuleId: string;
@@ -519,6 +520,7 @@ declare class HTTPService {
519
520
  items: T[];
520
521
  };
521
522
  }, api: string, pars?: HttpParams, transaction?: string): Observable<T[]>;
523
+ private hashObject;
522
524
  /*****************************************************************************************************************************************
523
525
  ***************************************************** TRANSACTION HELPERS ***************************************************************
524
526
  *****************************************************************************************************************************************/
@@ -528,7 +530,30 @@ declare class HTTPService {
528
530
  beginTransaction(executionKey: string, secondsTimeout?: number): Observable<string>;
529
531
  checkTransaction(executionKey: string): Observable<number>;
530
532
  endTransaction(transactionKey: string, transactionResult: boolean): Observable<string>;
531
- static ɵfac: i0.ɵɵFactoryDeclaration<HTTPService, [null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
533
+ /*****************************************************************************************************************************************
534
+ ***************************************************** ROBA PER HASHING ******************************************************************
535
+ *****************************************************************************************************************************************/
536
+ /**
537
+ * Blacklist dei tipi da ignorare quando si effettua l'hashing degli oggetti
538
+ */
539
+ private objBlacklist;
540
+ /**
541
+ * Hash più semplice e più veloce dell'md5, ma meno sicuro
542
+ *
543
+ * Vedi https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript
544
+ *
545
+ * @param {string} str Stringa di cui calcolare l'hash
546
+ */
547
+ private simpleHash;
548
+ /**
549
+ * Genera una stringa che identifica univocamente l'oggetto in questione
550
+ *
551
+ * @param {any} o Oggetto di cui calcolare la stringa univoca
552
+ * @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
553
+ * @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
554
+ */
555
+ private stringify;
556
+ static ɵfac: i0.ɵɵFactoryDeclaration<HTTPService, [null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, null, { optional: true; }]>;
532
557
  static ɵprov: i0.ɵɵInjectableDeclaration<HTTPService>;
533
558
  }
534
559
 
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@esfaenza/httpservice",
3
- "version": "20.3.8",
3
+ "version": "20.3.10",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0"
6
6
  },
7
7
  "peerDependencies": {
8
8
  "@angular/common": "^20.3.24",
9
9
  "@angular/core": "^20.3.24",
10
- "@esfaenza/extensions": "^20.3.7",
11
- "@esfaenza/localizations": "^20.3.6",
12
- "@esfaenza/preferences": "^20.3.6",
10
+ "@esfaenza/extensions": "^20.3.10",
11
+ "@esfaenza/localizations": "^20.3.7",
12
+ "@esfaenza/preferences": "^20.3.8",
13
13
  "sweetalert2": "11.26.25",
14
14
  "dayjs": "1.11.21",
15
15
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"