@esfaenza/httpservice 11.2.30 → 11.2.34
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.
- package/bundles/esfaenza-httpservice.umd.js +184 -50
- package/bundles/esfaenza-httpservice.umd.js.map +1 -1
- package/bundles/esfaenza-httpservice.umd.min.js +2 -2
- package/bundles/esfaenza-httpservice.umd.min.js.map +1 -1
- package/esfaenza-httpservice.metadata.json +1 -1
- package/esm2015/lib/httpservice.service.js +143 -47
- package/esm2015/lib/httpservice.service.loc.js +7 -2
- package/esm2015/lib/models/CacheInfos.js +10 -0
- package/fesm2015/esfaenza-httpservice.js +156 -47
- package/fesm2015/esfaenza-httpservice.js.map +1 -1
- package/lib/httpservice.service.d.ts +49 -21
- package/lib/httpservice.service.loc.d.ts +20 -0
- package/lib/models/CacheInfos.d.ts +8 -0
- package/package.json +3 -2
|
@@ -18,6 +18,11 @@ export const Loc = {
|
|
|
18
18
|
"Redirecting to Login, ignoring HTTP error on call": { "en-US": "Redirecting to Login, ignoring HTTP error on call", "it-IT": "Redireziono al login ignorando errori sulla chiamata", },
|
|
19
19
|
"Already Handling an error, ignoring HTTP error on call": { "en-US": "Already Handling an error, ignoring HTTP error on call", "it-IT": "sto già gestendo un errore, ignoro quello corrente per la chiamata HTTP", },
|
|
20
20
|
"Error 444 on call": { "en-US": "Error 444 on call", "it-IT": "Errore 444 su chiamata" },
|
|
21
|
-
"Resource not found": { "en-US": "Resource not found", "it-IT": "Risorsa non trovata" }
|
|
21
|
+
"Resource not found": { "en-US": "Resource not found", "it-IT": "Risorsa non trovata" },
|
|
22
|
+
"Converted old storage system to new one": { "en-US": "Converted old storage system to new one", "it-IT": "Convertito il vecchio sistema di storicizzazione al nuovo" },
|
|
23
|
+
"Marking cache to be persisted as soon as possible": { "en-US": "Marking cache to be persisted as soon as possible", "it-IT": "Marco cache da persistere il prima possibile" },
|
|
24
|
+
"No more HTTP calls to be executed, entering idle state and persisting modified caches": { "en-US": "No more HTTP calls to be executed, entering idle state and persisting modified caches", "it-IT": "Nessun'altra chiamata HTTP dev'essere eseguita, entro in stato IDLE e persisto le cache modificate" },
|
|
25
|
+
"Caches succesfully persisted": { "en-US": "Caches succesfully persisted", "it-IT": "Le cache sono state persistite con successo" },
|
|
26
|
+
"Errors persisting modified caches": { "en-US": "Errors persisting modified caches", "it-IT": "Errori nella persistizione delle cache (esiste persistizione? boh...)" },
|
|
22
27
|
};
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5sb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwc2VydmljZS9zcmMvbGliL2h0dHBzZXJ2aWNlLnNlcnZpY2UubG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFFO0lBQ2QsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxHQUFHO0lBQ2xFLHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSx3QkFBd0IsR0FBRztJQUMvRixtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsOEJBQThCLEdBQUc7SUFDL0YsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEdBQUc7SUFDN0UsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxHQUFHO0lBQ3BELDZCQUE2QixFQUFFLEVBQUUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sRUFBRSwrQkFBK0IsR0FBRztJQUNwSCxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEdBQUc7SUFDakYsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsV0FBVyxHQUFHO0lBQ2hFLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsR0FBRztJQUN4RCxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEdBQUc7SUFDekQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixHQUFHO0lBQ3pGLHdEQUF3RCxFQUFFLEVBQUUsT0FBTyxFQUFFLHdEQUF3RCxFQUFFLE9BQU8sRUFBRSwrQ0FBK0MsR0FBRztJQUMxTCxzQkFBc0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEdBQUc7SUFDN0YsbURBQW1ELEVBQUUsRUFBRSxPQUFPLEVBQUUsbURBQW1ELEVBQUUsT0FBTyxFQUFFLHNEQUFzRCxHQUFHO0lBQ3ZMLHdEQUF3RCxFQUFFLEVBQUUsT0FBTyxFQUFFLHdEQUF3RCxFQUFFLE9BQU8sRUFBRSx5RUFBeUUsR0FBRztJQUNwTixtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUU7SUFDeEYsb0JBQW9CLEVBQUUsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO0lBQ3ZGLHlDQUF5QyxFQUFFLEVBQUUsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE9BQU8sRUFBRSwyREFBMkQsRUFBRTtJQUN2SyxtREFBbUQsRUFBRSxFQUFFLE9BQU8sRUFBRSxtREFBbUQsRUFBRSxPQUFPLEVBQUUsOENBQThDLEVBQUU7SUFDOUssdUZBQXVGLEVBQUUsRUFBRSxPQUFPLEVBQUUsdUZBQXVGLEVBQUUsT0FBTyxFQUFFLG9HQUFvRyxFQUFFO0lBQzVTLDhCQUE4QixFQUFFLEVBQUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSw2Q0FBNkMsRUFBRTtJQUNuSSxtQ0FBbUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxPQUFPLEVBQUUsdUVBQXVFLEVBQUU7Q0FDMUssQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBPZ2dldHRvIHN0YXRpY28gZGkgbG9jYWxpenphemlvbmUgcGVyIGkgbWVzc2FnZ2lcclxuICovXHJcbmV4cG9ydCBjb25zdCBMb2MgPXtcclxuICAgIFwiUmVzdWx0IGZvclwiOiB7IFwiZW4tVVNcIjogXCJSZXN1bHQgZm9yXCIsIFwiaXQtSVRcIjogXCJSaXN1bHRhdG8gcGVyXCIsIH0sXHJcbiAgICBcInJldHJpZXZlZCBmcm9tIGNhY2hlXCI6IHsgXCJlbi1VU1wiOiBcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIsIFwiaXQtSVRcIjogXCJyZWN1cGVyYXRvIGRhbGxhIGNhY2hlXCIsIH0sXHJcbiAgICBcIkNhY2hlZCByZXN1bHQgZm9yXCI6IHsgXCJlbi1VU1wiOiBcIkNhY2hlZCByZXN1bHQgZm9yXCIsIFwiaXQtSVRcIjogXCJNZXNzbyBpbiBjYWNoZSByaXN1bHRhdG8gcGVyXCIsIH0sXHJcbiAgICBcIlN0YXJ0aW5nIGNhbGxcIjogeyBcImVuLVVTXCI6IFwiU3RhcnRpbmcgY2FsbFwiLCBcIml0LUlUXCI6IFwiSW5pemlvIGxhIGNoaWFtYXRhXCIsIH0sXHJcbiAgICBcImF0IFVSTFwiOiB7IFwiZW4tVVNcIjogXCJhdCBVUkxcIiwgXCJpdC1JVFwiOiBcImFsbCdVUkxcIiwgfSxcclxuICAgIFwiSW52bGFsaWRhdGluZyBjYWNoZSBlbGVtZW50XCI6IHsgXCJlbi1VU1wiOiBcIkludmxhbGlkYXRpbmcgY2FjaGUgZWxlbWVudFwiLCBcIml0LUlUXCI6IFwiSW52YWxpZG8gZWxlbWVudG8gZGVsbGEgY2FjaGVcIiwgfSxcclxuICAgIFwiRmluYWxpemluZyBjYWxsXCI6IHsgXCJlbi1VU1wiOiBcIkZpbmFsaXppbmcgY2FsbFwiLCBcIml0LUlUXCI6IFwiRmluYWxpenpvIGNoaWFtYXRhXCIsIH0sXHJcbiAgICBcIndpdGggc3RhdHVzXCI6IHsgXCJlbi1VU1wiOiBcIndpdGggc3RhdHVzXCIsIFwiaXQtSVRcIjogXCJjb24gc3RhdG9cIiwgfSxcclxuICAgIFwiU3VjY2Vzc1wiOiB7IFwiZW4tVVNcIjogXCJTdWNjZXNzXCIsIFwiaXQtSVRcIjogXCJTdWNjZXNzc29cIiwgfSxcclxuICAgIFwiRmFpbHVyZVwiOiB7IFwiZW4tVVNcIjogXCJGYWlsdXJlXCIsIFwiaXQtSVRcIjogXCJGYWxsaW1lbnRvXCIsIH0sXHJcbiAgICBcIkVycm9yIDQwMSBvbiBjYWxsXCI6IHsgXCJlbi1VU1wiOiBcIkVycm9yIDQwMSBvbiBjYWxsXCIsIFwiaXQtSVRcIjogXCJFcnJvcmUgNDAxIHN1IGNoaWFtYXRhXCIsIH0sXHJcbiAgICBcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiOiB7IFwiZW4tVVNcIjogXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIiwgXCJpdC1JVFwiOiBcImNvbiByZWRpcmV6aW9uZSBnacOgIGluIGNvcnNvLiBJZ25vcm8gbCdldmVudG9cIiwgfSxcclxuICAgIFwicmVkaXJlY3RpbmcgdG8gbG9naW5cIjogeyBcImVuLVVTXCI6IFwicmVkaXJlY3RpbmcgdG8gbG9naW5cIiwgXCJpdC1JVFwiOiBcInJlZGlyZXppb25vIGFsIGxvZ2luXCIsIH0sXHJcbiAgICBcIlJlZGlyZWN0aW5nIHRvIExvZ2luLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIjogeyBcImVuLVVTXCI6IFwiUmVkaXJlY3RpbmcgdG8gTG9naW4sIGlnbm9yaW5nIEhUVFAgZXJyb3Igb24gY2FsbFwiLCBcIml0LUlUXCI6IFwiUmVkaXJlemlvbm8gYWwgbG9naW4gaWdub3JhbmRvIGVycm9yaSBzdWxsYSBjaGlhbWF0YVwiLCB9LFxyXG4gICAgXCJBbHJlYWR5IEhhbmRsaW5nIGFuIGVycm9yLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIjogeyBcImVuLVVTXCI6IFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIsIFwiaXQtSVRcIjogXCJzdG8gZ2nDoCBnZXN0ZW5kbyB1biBlcnJvcmUsIGlnbm9ybyBxdWVsbG8gY29ycmVudGUgcGVyIGxhIGNoaWFtYXRhIEhUVFBcIiwgfSxcclxuICAgIFwiRXJyb3IgNDQ0IG9uIGNhbGxcIjogeyBcImVuLVVTXCI6IFwiRXJyb3IgNDQ0IG9uIGNhbGxcIiwgXCJpdC1JVFwiOiBcIkVycm9yZSA0NDQgc3UgY2hpYW1hdGFcIiB9LFxyXG4gICAgXCJSZXNvdXJjZSBub3QgZm91bmRcIjogeyBcImVuLVVTXCI6IFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIsIFwiaXQtSVRcIjogXCJSaXNvcnNhIG5vbiB0cm92YXRhXCIgfSxcclxuICAgIFwiQ29udmVydGVkIG9sZCBzdG9yYWdlIHN5c3RlbSB0byBuZXcgb25lXCI6IHsgXCJlbi1VU1wiOiBcIkNvbnZlcnRlZCBvbGQgc3RvcmFnZSBzeXN0ZW0gdG8gbmV3IG9uZVwiLCBcIml0LUlUXCI6IFwiQ29udmVydGl0byBpbCB2ZWNjaGlvIHNpc3RlbWEgZGkgc3RvcmljaXp6YXppb25lIGFsIG51b3ZvXCIgfSxcclxuICAgIFwiTWFya2luZyBjYWNoZSB0byBiZSBwZXJzaXN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZVwiOiB7IFwiZW4tVVNcIjogXCJNYXJraW5nIGNhY2hlIHRvIGJlIHBlcnNpc3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlXCIsIFwiaXQtSVRcIjogXCJNYXJjbyBjYWNoZSBkYSBwZXJzaXN0ZXJlIGlsIHByaW1hIHBvc3NpYmlsZVwiIH0sXHJcbiAgICBcIk5vIG1vcmUgSFRUUCBjYWxscyB0byBiZSBleGVjdXRlZCwgZW50ZXJpbmcgaWRsZSBzdGF0ZSBhbmQgcGVyc2lzdGluZyBtb2RpZmllZCBjYWNoZXNcIjogeyBcImVuLVVTXCI6IFwiTm8gbW9yZSBIVFRQIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCBlbnRlcmluZyBpZGxlIHN0YXRlIGFuZCBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiLCBcIml0LUlUXCI6IFwiTmVzc3VuJ2FsdHJhIGNoaWFtYXRhIEhUVFAgZGV2J2Vzc2VyZSBlc2VndWl0YSwgZW50cm8gaW4gc3RhdG8gSURMRSBlIHBlcnNpc3RvIGxlIGNhY2hlIG1vZGlmaWNhdGVcIiB9LFxyXG4gICAgXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCI6IHsgXCJlbi1VU1wiOiBcIkNhY2hlcyBzdWNjZXNmdWxseSBwZXJzaXN0ZWRcIiwgXCJpdC1JVFwiOiBcIkxlIGNhY2hlIHNvbm8gc3RhdGUgcGVyc2lzdGl0ZSBjb24gc3VjY2Vzc29cIiB9LFxyXG4gICAgXCJFcnJvcnMgcGVyc2lzdGluZyBtb2RpZmllZCBjYWNoZXNcIjogeyBcImVuLVVTXCI6IFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIsIFwiaXQtSVRcIjogXCJFcnJvcmkgbmVsbGEgcGVyc2lzdGl6aW9uZSBkZWxsZSBjYWNoZSAoZXNpc3RlIHBlcnNpc3RpemlvbmU/IGJvaC4uLilcIiB9LFxyXG59Il19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class CacheInfos {
|
|
2
|
+
constructor(finalUrl, cache, cacheKey, cacheTime, cacheItem) {
|
|
3
|
+
this.finalUrl = finalUrl;
|
|
4
|
+
this.cache = cache;
|
|
5
|
+
this.cacheKey = cacheKey;
|
|
6
|
+
this.cacheTime = cacheTime;
|
|
7
|
+
this.cacheItem = cacheItem;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FjaGVJbmZvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvbW9kZWxzL0NhY2hlSW5mb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFVBQVU7SUFDbkIsWUFBbUIsUUFBZ0IsRUFBUyxLQUFjLEVBQVMsUUFBZ0IsRUFBUyxTQUFpQixFQUFTLFNBQWM7UUFBakgsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVM7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQUs7SUFBSSxDQUFDO0NBQzVJIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENhY2hlSW5mb3Mge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIGZpbmFsVXJsOiBzdHJpbmcsIHB1YmxpYyBjYWNoZTogYm9vbGVhbiwgcHVibGljIGNhY2hlS2V5OiBzdHJpbmcsIHB1YmxpYyBjYWNoZVRpbWU6IHN0cmluZywgcHVibGljIGNhY2hlSXRlbTogYW55KSB7IH1cclxufSJdfQ==
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import { HttpEventType, HttpHeaders, HttpErrorResponse, HttpClient } from '@angular/common/http';
|
|
3
3
|
import { InjectionToken, Injectable, Inject, Optional, NgModule } from '@angular/core';
|
|
4
|
+
import { PreferencesService } from '@esfaenza/preferences';
|
|
4
5
|
import { delay, finalize, map, catchError, scan } from 'rxjs/operators';
|
|
5
|
-
import { of, throwError, Observable } from 'rxjs';
|
|
6
|
+
import { forkJoin, of, throwError, Observable } from 'rxjs';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Dizionario di invalidazioni delle chiamate HTTP
|
|
@@ -132,9 +133,24 @@ const Loc = {
|
|
|
132
133
|
"Redirecting to Login, ignoring HTTP error on call": { "en-US": "Redirecting to Login, ignoring HTTP error on call", "it-IT": "Redireziono al login ignorando errori sulla chiamata", },
|
|
133
134
|
"Already Handling an error, ignoring HTTP error on call": { "en-US": "Already Handling an error, ignoring HTTP error on call", "it-IT": "sto già gestendo un errore, ignoro quello corrente per la chiamata HTTP", },
|
|
134
135
|
"Error 444 on call": { "en-US": "Error 444 on call", "it-IT": "Errore 444 su chiamata" },
|
|
135
|
-
"Resource not found": { "en-US": "Resource not found", "it-IT": "Risorsa non trovata" }
|
|
136
|
+
"Resource not found": { "en-US": "Resource not found", "it-IT": "Risorsa non trovata" },
|
|
137
|
+
"Converted old storage system to new one": { "en-US": "Converted old storage system to new one", "it-IT": "Convertito il vecchio sistema di storicizzazione al nuovo" },
|
|
138
|
+
"Marking cache to be persisted as soon as possible": { "en-US": "Marking cache to be persisted as soon as possible", "it-IT": "Marco cache da persistere il prima possibile" },
|
|
139
|
+
"No more HTTP calls to be executed, entering idle state and persisting modified caches": { "en-US": "No more HTTP calls to be executed, entering idle state and persisting modified caches", "it-IT": "Nessun'altra chiamata HTTP dev'essere eseguita, entro in stato IDLE e persisto le cache modificate" },
|
|
140
|
+
"Caches succesfully persisted": { "en-US": "Caches succesfully persisted", "it-IT": "Le cache sono state persistite con successo" },
|
|
141
|
+
"Errors persisting modified caches": { "en-US": "Errors persisting modified caches", "it-IT": "Errori nella persistizione delle cache (esiste persistizione? boh...)" },
|
|
136
142
|
};
|
|
137
143
|
|
|
144
|
+
class CacheInfos {
|
|
145
|
+
constructor(finalUrl, cache, cacheKey, cacheTime, cacheItem) {
|
|
146
|
+
this.finalUrl = finalUrl;
|
|
147
|
+
this.cache = cache;
|
|
148
|
+
this.cacheKey = cacheKey;
|
|
149
|
+
this.cacheTime = cacheTime;
|
|
150
|
+
this.cacheItem = cacheItem;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
138
154
|
/**
|
|
139
155
|
* Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere
|
|
140
156
|
* esteso/modificato il comportamento implementando la classe di "hook" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**
|
|
@@ -143,7 +159,7 @@ class HTTPService {
|
|
|
143
159
|
/**
|
|
144
160
|
* @ignore
|
|
145
161
|
*/
|
|
146
|
-
constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http) {
|
|
162
|
+
constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http, localStorage) {
|
|
147
163
|
var _a, _b;
|
|
148
164
|
this.BACKEND_URL = BACKEND_URL;
|
|
149
165
|
this.EXTENSION_CLASS = EXTENSION_CLASS;
|
|
@@ -154,34 +170,51 @@ class HTTPService {
|
|
|
154
170
|
this.CACHE_BY_USER = CACHE_BY_USER;
|
|
155
171
|
this.DEBUG_MODE = DEBUG_MODE;
|
|
156
172
|
this.http = http;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
*/
|
|
173
|
+
this.localStorage = localStorage;
|
|
174
|
+
/** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
|
|
160
175
|
this.callStatus = {};
|
|
161
|
-
/**
|
|
162
|
-
* Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary
|
|
163
|
-
*/
|
|
176
|
+
/** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */
|
|
164
177
|
this.localStorageHttpCacheKey = null;
|
|
165
|
-
/**
|
|
166
|
-
* 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
|
|
167
|
-
*/
|
|
178
|
+
/** 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 */
|
|
168
179
|
this.localStorageHttpTimedCacheKey = null;
|
|
169
|
-
/**
|
|
170
|
-
* Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa
|
|
171
|
-
*/
|
|
180
|
+
/** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */
|
|
172
181
|
this.localStorageHttpCacheExpireKey = null;
|
|
173
|
-
/**
|
|
174
|
-
* Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions**
|
|
175
|
-
*/
|
|
182
|
+
/** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */
|
|
176
183
|
this.me = null;
|
|
184
|
+
/** Indica che la cache a tempo dev'essere persistita il prima possibile */
|
|
185
|
+
this.PersistTimedCacheASAP = false;
|
|
186
|
+
/** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */
|
|
187
|
+
this.PersistUntimedCacheASAP = false;
|
|
177
188
|
this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
|
|
178
189
|
this.me = this.ExtensionsImpl.retrieveIdentity();
|
|
179
190
|
this.localStorageHttpCacheKey = ((_a = this.APP_NAME) !== null && _a !== void 0 ? _a : "APP").replace(/\s/g, '_') + "_HttpCache";
|
|
180
191
|
this.localStorageHttpTimedCacheKey = ((_b = this.APP_NAME) !== null && _b !== void 0 ? _b : "APP").replace(/\s/g, '_') + "_HttpTimedCache";
|
|
181
192
|
this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + "_Expire";
|
|
193
|
+
this.adjustOldStorageSystem();
|
|
182
194
|
if (this.untimedCacheExpired())
|
|
183
195
|
this.resetHttpUntimedCacheStorage();
|
|
184
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.
|
|
199
|
+
* Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage
|
|
200
|
+
*/
|
|
201
|
+
adjustOldStorageSystem() {
|
|
202
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
203
|
+
var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);
|
|
204
|
+
var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);
|
|
205
|
+
if (!lsTimed && !lsUntimed)
|
|
206
|
+
return;
|
|
207
|
+
localStorage.removeItem(this.localStorageHttpTimedCacheKey);
|
|
208
|
+
localStorage.removeItem(this.localStorageHttpCacheKey);
|
|
209
|
+
lsTimed = lsTimed ? JSON.parse(lsTimed) : {};
|
|
210
|
+
lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};
|
|
211
|
+
yield forkJoin([
|
|
212
|
+
this.localStorage.store(this.localStorageHttpTimedCacheKey, lsTimed),
|
|
213
|
+
this.localStorage.store(this.localStorageHttpCacheKey, lsUntimed)
|
|
214
|
+
]).toPromise();
|
|
215
|
+
this.log(this.loc("Converted old storage system to new one"));
|
|
216
|
+
});
|
|
217
|
+
}
|
|
185
218
|
/**
|
|
186
219
|
* Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
|
|
187
220
|
*
|
|
@@ -213,7 +246,7 @@ class HTTPService {
|
|
|
213
246
|
if (errorCallback)
|
|
214
247
|
errorCallback();
|
|
215
248
|
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
216
|
-
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
249
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
|
|
217
250
|
}
|
|
218
251
|
/**
|
|
219
252
|
* Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
|
|
@@ -248,23 +281,66 @@ class HTTPService {
|
|
|
248
281
|
if (errorCallback)
|
|
249
282
|
errorCallback();
|
|
250
283
|
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
251
|
-
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
284
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
|
|
252
285
|
}
|
|
253
286
|
/**
|
|
254
|
-
* Esecuzione di una POST HTTP
|
|
255
|
-
*
|
|
287
|
+
* Esecuzione di una POST HTTP
|
|
256
288
|
*
|
|
257
289
|
* @param {string} url URL su cui effettuare la chiamata
|
|
258
290
|
* @param {any} bodyData DTO per la chiamata
|
|
291
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
292
|
+
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
293
|
+
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
294
|
+
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
295
|
+
*
|
|
296
|
+
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
297
|
+
*/
|
|
298
|
+
post(url, bodyData, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
299
|
+
let myGuid = this.defaultStartCall(url);
|
|
300
|
+
var httpCall = this.http.post(url, bodyData, { headers: this.getHeaders(transaction), params: params });
|
|
301
|
+
return httpCall.pipe(map((res) => {
|
|
302
|
+
let responseItem = res;
|
|
303
|
+
return responseItem;
|
|
304
|
+
}), catchError((err, caught) => {
|
|
305
|
+
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
306
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Esecuzione di una DELETE HTTP
|
|
310
|
+
*
|
|
311
|
+
* @param {string} url URL su cui effettuare la chiamata
|
|
312
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
259
313
|
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
260
314
|
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
261
315
|
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
262
316
|
*
|
|
263
317
|
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
264
318
|
*/
|
|
265
|
-
|
|
319
|
+
delete(url, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
266
320
|
let myGuid = this.defaultStartCall(url);
|
|
267
|
-
var httpCall = this.http.
|
|
321
|
+
var httpCall = this.http.delete(url, { headers: this.getHeaders(transaction), params: params });
|
|
322
|
+
return httpCall.pipe(map((res) => {
|
|
323
|
+
let responseItem = res;
|
|
324
|
+
return responseItem;
|
|
325
|
+
}), catchError((err, caught) => {
|
|
326
|
+
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
327
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Esecuzione di una PUT HTTP
|
|
331
|
+
*
|
|
332
|
+
* @param {string} url URL su cui effettuare la chiamata
|
|
333
|
+
* @param {any} bodyData DTO per la chiamata
|
|
334
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
335
|
+
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
336
|
+
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
337
|
+
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
338
|
+
*
|
|
339
|
+
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
340
|
+
*/
|
|
341
|
+
put(url, bodyData, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
342
|
+
let myGuid = this.defaultStartCall(url);
|
|
343
|
+
var httpCall = this.http.put(url, bodyData, { headers: this.getHeaders(transaction), params: params });
|
|
268
344
|
return httpCall.pipe(map((res) => {
|
|
269
345
|
let responseItem = res;
|
|
270
346
|
return responseItem;
|
|
@@ -420,7 +496,7 @@ class HTTPService {
|
|
|
420
496
|
* @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare
|
|
421
497
|
*/
|
|
422
498
|
checkCacheInvalidation(url) {
|
|
423
|
-
let cache =
|
|
499
|
+
let cache = this.localStorage.retrieveLocal(this.localStorageHttpCacheKey);
|
|
424
500
|
let tmp = /#cache(:?-(\d+))/gi.exec(url);
|
|
425
501
|
let cacheTime = tmp ? tmp[2] : null;
|
|
426
502
|
let normalizedUrl = url.replace("#cache" + (cacheTime ? "-" + cacheTime : ""), "").replace(this.BACKEND_URL, "");
|
|
@@ -441,21 +517,53 @@ class HTTPService {
|
|
|
441
517
|
this.log(this.loc("Invlalidating cache element") + " " + k);
|
|
442
518
|
delete cache[k];
|
|
443
519
|
}
|
|
444
|
-
localStorage.
|
|
520
|
+
this.localStorage.storeLocal(this.localStorageHttpCacheKey, cache);
|
|
445
521
|
}
|
|
446
522
|
/**
|
|
447
523
|
* Finalizzazione di una chiamata
|
|
448
524
|
*
|
|
449
525
|
* @param {string} guid GUID collegato alla chiamata appena terminata
|
|
526
|
+
* @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare
|
|
527
|
+
* che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni
|
|
450
528
|
*/
|
|
451
|
-
tryFinalizeByGuid(guid) {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
this.ExtensionsImpl.
|
|
457
|
-
|
|
458
|
-
|
|
529
|
+
tryFinalizeByGuid(guid, cacheInfos) {
|
|
530
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
531
|
+
this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (this.callStatus[guid] ? this.loc('Success') : this.loc('Failure')));
|
|
532
|
+
//Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
|
|
533
|
+
//e riiniziare a valutare errori di javashit
|
|
534
|
+
if (this.callStatus[guid] && this.ExtensionsImpl.readRedirectionStatus())
|
|
535
|
+
this.ExtensionsImpl.writeRedirectionStatus(false);
|
|
536
|
+
//In ogni caso questa posso rimuoverla
|
|
537
|
+
delete this.callStatus[guid];
|
|
538
|
+
// Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
|
|
539
|
+
if (cacheInfos && cacheInfos.cache) {
|
|
540
|
+
this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;
|
|
541
|
+
this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;
|
|
542
|
+
this.log(this.loc("Marking cache to be persisted as soon as possible"));
|
|
543
|
+
}
|
|
544
|
+
// 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
|
|
545
|
+
// Alla fine di tutto marco come fatto
|
|
546
|
+
if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0) {
|
|
547
|
+
var toCall = [];
|
|
548
|
+
let tmpKey = "";
|
|
549
|
+
if (this.PersistTimedCacheASAP) {
|
|
550
|
+
tmpKey = this.localStorageHttpTimedCacheKey;
|
|
551
|
+
toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
|
|
552
|
+
}
|
|
553
|
+
if (this.PersistUntimedCacheASAP) {
|
|
554
|
+
tmpKey = this.localStorageHttpCacheKey;
|
|
555
|
+
toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
|
|
556
|
+
}
|
|
557
|
+
this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches..."));
|
|
558
|
+
var ret = yield forkJoin(toCall).toPromise();
|
|
559
|
+
if (ret)
|
|
560
|
+
this.log(this.loc("Caches succesfully persisted"));
|
|
561
|
+
else
|
|
562
|
+
this.log(this.loc("Errors persisting modified caches"));
|
|
563
|
+
this.PersistTimedCacheASAP = false;
|
|
564
|
+
this.PersistUntimedCacheASAP = false;
|
|
565
|
+
}
|
|
566
|
+
});
|
|
459
567
|
}
|
|
460
568
|
/**
|
|
461
569
|
* Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente
|
|
@@ -642,7 +750,7 @@ class HTTPService {
|
|
|
642
750
|
* @param {string} url URL su cui effettuare la chiamata
|
|
643
751
|
* @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)
|
|
644
752
|
*
|
|
645
|
-
* @returns {
|
|
753
|
+
* @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato
|
|
646
754
|
*/
|
|
647
755
|
tryGetCacheInformations(url, params) {
|
|
648
756
|
let cachingKey = null, cacheTime = null, cache = null, item = null;
|
|
@@ -655,8 +763,8 @@ class HTTPService {
|
|
|
655
763
|
this.resetHttpUntimedCacheStorage();
|
|
656
764
|
cachingKey = this.makeCacheKey(url, params);
|
|
657
765
|
let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
|
|
658
|
-
let cacheLs = localStorage.
|
|
659
|
-
let cache = cacheLs ?
|
|
766
|
+
let cacheLs = this.localStorage.retrieveLocal(cacheKey);
|
|
767
|
+
let cache = cacheLs ? cacheLs : {};
|
|
660
768
|
if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {
|
|
661
769
|
// Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco
|
|
662
770
|
// dalle proprietà interne che gli ho aggiunto per controllarne la scadenza
|
|
@@ -665,22 +773,22 @@ class HTTPService {
|
|
|
665
773
|
item = cache[cachingKey];
|
|
666
774
|
}
|
|
667
775
|
}
|
|
668
|
-
return
|
|
776
|
+
return new CacheInfos(url, useCaching, cachingKey, cacheTime, item);
|
|
669
777
|
}
|
|
670
778
|
/**
|
|
671
779
|
* Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**
|
|
672
780
|
*
|
|
673
781
|
* @param {T} item Oggetto da inserire nella cache
|
|
674
|
-
* @param {
|
|
782
|
+
* @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**
|
|
675
783
|
*/
|
|
676
784
|
cacheResponse(item, cacheInfos) {
|
|
677
785
|
let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
|
|
678
|
-
let cacheLs = localStorage.
|
|
679
|
-
let cache = cacheLs ?
|
|
786
|
+
let cacheLs = this.localStorage.retrieveLocal(cacheKey);
|
|
787
|
+
let cache = cacheLs ? cacheLs : {};
|
|
680
788
|
cache[cacheInfos.cacheKey] = item;
|
|
681
789
|
if (cacheInfos.cacheTime)
|
|
682
790
|
cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, "seconds");
|
|
683
|
-
localStorage.
|
|
791
|
+
this.localStorage.storeLocal(cacheKey, cache);
|
|
684
792
|
}
|
|
685
793
|
/**
|
|
686
794
|
* Controlla se la cache per le chiamate senza expire time è scaduta
|
|
@@ -706,14 +814,14 @@ class HTTPService {
|
|
|
706
814
|
*/
|
|
707
815
|
resetHttpUntimedCacheStorage() {
|
|
708
816
|
var _a;
|
|
709
|
-
localStorage.
|
|
817
|
+
this.localStorage.store(this.localStorageHttpCacheKey, {}).subscribe();
|
|
710
818
|
localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add((_a = this.CLIENT_CACHE_DURATION_S) !== null && _a !== void 0 ? _a : 3600, "second")));
|
|
711
819
|
}
|
|
712
820
|
/**
|
|
713
821
|
* Ripulisce la cache delle chiamate con un tempo di expire definito
|
|
714
822
|
*/
|
|
715
823
|
resetHttpTimedCacheStorage() {
|
|
716
|
-
localStorage.
|
|
824
|
+
this.localStorage.store(this.localStorageHttpTimedCacheKey, {});
|
|
717
825
|
}
|
|
718
826
|
/**
|
|
719
827
|
* Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP
|
|
@@ -725,8 +833,8 @@ class HTTPService {
|
|
|
725
833
|
*/
|
|
726
834
|
makeCacheKey(url, params) {
|
|
727
835
|
let authKeyPart = (this.me ? this.me.Idtenant : "") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : "");
|
|
728
|
-
let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + next + '=' + params.get(next), "") : "";
|
|
729
|
-
return authKeyPart + url + paramsKeyPart;
|
|
836
|
+
let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + "," + next + '=' + params.get(next), "") : "";
|
|
837
|
+
return authKeyPart + "_" + url.substring(url.indexOf("api") + 4) + "?" + paramsKeyPart;
|
|
730
838
|
}
|
|
731
839
|
/**
|
|
732
840
|
* Generazione GUID
|
|
@@ -775,7 +883,8 @@ HTTPService.ctorParameters = () => [
|
|
|
775
883
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CLIENT_CACHE_DURATION_S,] }] },
|
|
776
884
|
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [CACHE_BY_USER,] }] },
|
|
777
885
|
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [DEBUG_MODE,] }] },
|
|
778
|
-
{ type: HttpClient }
|
|
886
|
+
{ type: HttpClient },
|
|
887
|
+
{ type: PreferencesService }
|
|
779
888
|
];
|
|
780
889
|
|
|
781
890
|
class HttpserviceModule {
|