ng-http-caching 13.0.7 → 13.0.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.
- package/README.md +2 -1
- package/esm2020/lib/ng-http-caching-interceptor.service.mjs +1 -1
- package/esm2020/lib/ng-http-caching.service.mjs +26 -17
- package/esm2020/lib/storage/ng-http-caching-browser-storage.mjs +1 -1
- package/esm2020/lib/storage/ng-http-caching-local-storage.mjs +1 -1
- package/esm2020/lib/storage/ng-http-caching-session-storage.mjs +1 -1
- package/fesm2015/ng-http-caching.mjs +25 -19
- package/fesm2015/ng-http-caching.mjs.map +1 -1
- package/fesm2020/ng-http-caching.mjs +25 -16
- package/fesm2020/ng-http-caching.mjs.map +1 -1
- package/lib/ng-http-caching.service.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -100,8 +100,9 @@ export interface NgHttpCachingConfig {
|
|
|
100
100
|
}
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
### version (string - default:
|
|
103
|
+
### version (string - default: VERSION.major)
|
|
104
104
|
Cache version. When you have a breaking change, change the version, and it'll delete the current cache automatically.
|
|
105
|
+
The default value is Angular major version (eg. 13), in this way, the cache is invalitaded on every Angular upgrade.
|
|
105
106
|
|
|
106
107
|
### lifetime (number - default: 3.600.000)
|
|
107
108
|
Number of millisecond that a response is stored in the cache.
|
|
@@ -63,4 +63,4 @@ NgHttpCachingInterceptorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion
|
|
|
63
63
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: NgHttpCachingInterceptorService, decorators: [{
|
|
64
64
|
type: Injectable
|
|
65
65
|
}], ctorParameters: function () { return [{ type: i1.NgHttpCachingService }]; } });
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmctaW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdELFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQUkzRixNQUFNLE9BQU8sK0JBQStCO0lBRTFDLDBDQUEwQztJQUMxQyxZQUE2QixZQUFrQztRQUFsQyxpQkFBWSxHQUFaLFlBQVksQ0FBc0I7SUFBSSxDQUFDO0lBRXBFLFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBQ2hELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELHdEQUF3RDtRQUN4RCxNQUFNLGdCQUFnQixHQUEyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLHdDQUF3QztZQUN4QyxPQUFPLGdCQUFnQixDQUFDO1NBQ3pCO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sY0FBYyxHQUFrQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRixJQUFJLGNBQWMsRUFBRTtZQUNsQixzQ0FBc0M7WUFDdEMsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDbkM7UUFFRCxpREFBaUQ7UUFDakQsc0RBQXNEO1FBQ3RELG1DQUFtQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtnQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDUixDQUFDO1FBRUYsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNsRCxJQUFJLE1BQU0sR0FBcUIsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLDBDQUEwQztRQUMxQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUN0RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQzVDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7NEhBOURVLCtCQUErQjtnSUFBL0IsK0JBQStCOzJGQUEvQiwrQkFBK0I7a0JBRDNDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBmaW5hbGl6ZSwgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdTZXJ2aWNlLCBOZ0h0dHBDYWNoaW5nSGVhZGVyc0xpc3QgfSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nSW50ZXJjZXB0b3JTZXJ2aWNlIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjYWNoZVNlcnZpY2U6IE5nSHR0cENhY2hpbmdTZXJ2aWNlKSB7IH1cclxuXHJcbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICAvLyBydW4gZ2FyYmFnZSBjb2xsZWN0b3JcclxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnJ1bkdjKCk7XHJcblxyXG4gICAgLy8gRG9uJ3QgY2FjaGUgaWYgaXQncyBub3QgY2FjaGVhYmxlXHJcbiAgICBpZiAoIXRoaXMuY2FjaGVTZXJ2aWNlLmlzQ2FjaGVhYmxlKHJlcSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QocmVxLCBuZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja2VkIGlmIHRoZXJlIGlzIHBlbmRpbmcgcmVzcG9uc2UgZm9yIHRoaXMgcmVxdWVzdFxyXG4gICAgY29uc3QgY2FjaGVkT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRGcm9tUXVldWUocmVxKTtcclxuICAgIGlmIChjYWNoZWRPYnNlcnZhYmxlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWNoZWRPYnNlcnZhYmxlJywgcmVxKTtcclxuICAgICAgcmV0dXJuIGNhY2hlZE9ic2VydmFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2tlZCBpZiB0aGVyZSBpcyBjYWNoZWQgcmVzcG9uc2UgZm9yIHRoaXMgcmVxdWVzdFxyXG4gICAgY29uc3QgY2FjaGVkUmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+IHwgdW5kZWZpbmVkID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0RnJvbUNhY2hlKHJlcSk7XHJcbiAgICBpZiAoY2FjaGVkUmVzcG9uc2UpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ2NhY2hlZFJlc3BvbnNlJywgcmVxKTtcclxuICAgICAgcmV0dXJuIG9mKGNhY2hlZFJlc3BvbnNlLmNsb25lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSByZXF1ZXN0IG9mIGdvaW5nIHRocm91Z2ggZm9yIGZpcnN0IHRpbWVcclxuICAgIC8vIHRoZW4gbGV0IHRoZSByZXF1ZXN0IHByb2NlZWQgYW5kIGNhY2hlIHRoZSByZXNwb25zZVxyXG4gICAgLy8gY29uc29sZS5sb2coJ3NlbmRSZXF1ZXN0JywgcmVxKTtcclxuICAgIGNvbnN0IHNoYXJlZCA9IHRoaXMuc2VuZFJlcXVlc3QocmVxLCBuZXh0KS5waXBlKFxyXG4gICAgICB0YXAoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuYWRkVG9DYWNoZShyZXEsIGV2ZW50LmNsb25lKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAvLyBkZWxldGUgcGVuZGluZyByZXF1ZXN0XHJcbiAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuZGVsZXRlRnJvbVF1ZXVlKHJlcSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzaGFyZSgpXHJcbiAgICApO1xyXG5cclxuICAgIC8vIGFkZCBwZW5kaW5nIHJlcXVlc3QgdG8gcXVldWUgZm9yIGNhY2hlIHBhcmFsbGVsbCByZXF1ZXN0XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5hZGRUb1F1ZXVlKHJlcSwgc2hhcmVkKTtcclxuXHJcbiAgICByZXR1cm4gc2hhcmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBodHRwIHJlcXVlc3QgKG5leHQgaGFuZGxlcilcclxuICAgKi9cclxuICBzZW5kUmVxdWVzdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgbGV0IGNsb25lZDogSHR0cFJlcXVlc3Q8YW55PiA9IHJlcS5jbG9uZSgpO1xyXG4gICAgLy8gdHJpbSBjdXN0b20gaGVhZGVycyBiZWZvcmUgc2VuZCByZXF1ZXN0XHJcbiAgICBOZ0h0dHBDYWNoaW5nSGVhZGVyc0xpc3QuZm9yRWFjaChuZ0h0dHBDYWNoaW5nSGVhZGVycyA9PiB7XHJcbiAgICAgIGlmIChjbG9uZWQuaGVhZGVycy5oYXMobmdIdHRwQ2FjaGluZ0hlYWRlcnMpKSB7XHJcbiAgICAgICAgY2xvbmVkID0gY2xvbmVkLmNsb25lKHsgaGVhZGVyczogY2xvbmVkLmhlYWRlcnMuZGVsZXRlKG5nSHR0cENhY2hpbmdIZWFkZXJzKSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoY2xvbmVkKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';
|
|
1
|
+
import { Injectable, InjectionToken, Inject, Optional, VERSION } from '@angular/core';
|
|
2
2
|
import { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export const NG_HTTP_CACHING_CONFIG = new InjectionToken('ng-http-caching.config');
|
|
@@ -24,17 +24,22 @@ export const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);
|
|
|
24
24
|
export const NgHttpCachingConfigDefault = {
|
|
25
25
|
store: new NgHttpCachingMemoryStorage(),
|
|
26
26
|
lifetime: 60 * 60 * 100,
|
|
27
|
-
version:
|
|
27
|
+
version: VERSION.major,
|
|
28
28
|
allowedMethod: ['GET'],
|
|
29
29
|
cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,
|
|
30
30
|
};
|
|
31
31
|
export class NgHttpCachingService {
|
|
32
32
|
constructor(config) {
|
|
33
33
|
this.queue = new Map();
|
|
34
|
-
this.
|
|
34
|
+
this.gcLock = false;
|
|
35
35
|
if (config) {
|
|
36
36
|
this.config = { ...NgHttpCachingConfigDefault, ...config };
|
|
37
37
|
}
|
|
38
|
+
else {
|
|
39
|
+
this.config = { ...NgHttpCachingConfigDefault };
|
|
40
|
+
}
|
|
41
|
+
// start cache clean
|
|
42
|
+
this.runGc();
|
|
38
43
|
}
|
|
39
44
|
/**
|
|
40
45
|
* Return the config
|
|
@@ -59,7 +64,7 @@ export class NgHttpCachingService {
|
|
|
59
64
|
*/
|
|
60
65
|
getFromCache(req) {
|
|
61
66
|
const key = this.getKey(req);
|
|
62
|
-
const cached = this.config.store
|
|
67
|
+
const cached = this.config.store.get(key);
|
|
63
68
|
if (!cached) {
|
|
64
69
|
return undefined;
|
|
65
70
|
}
|
|
@@ -82,7 +87,7 @@ export class NgHttpCachingService {
|
|
|
82
87
|
version: this.config.version,
|
|
83
88
|
};
|
|
84
89
|
if (this.isValid(entry)) {
|
|
85
|
-
this.config.store
|
|
90
|
+
this.config.store.set(key, entry);
|
|
86
91
|
return true;
|
|
87
92
|
}
|
|
88
93
|
return false;
|
|
@@ -98,7 +103,7 @@ export class NgHttpCachingService {
|
|
|
98
103
|
* Clear the cache
|
|
99
104
|
*/
|
|
100
105
|
clearCache() {
|
|
101
|
-
this.config.store
|
|
106
|
+
this.config.store.clear();
|
|
102
107
|
}
|
|
103
108
|
/**
|
|
104
109
|
* Clear the cache by key
|
|
@@ -131,11 +136,17 @@ export class NgHttpCachingService {
|
|
|
131
136
|
* Run garbage collector (delete expired cache entry)
|
|
132
137
|
*/
|
|
133
138
|
runGc() {
|
|
139
|
+
if (this.gcLock) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
this.gcLock = true;
|
|
134
143
|
this.config.store.forEach((entry, key) => {
|
|
135
144
|
if (this.isExpired(entry)) {
|
|
136
145
|
this.clearCacheByKey(key);
|
|
137
146
|
}
|
|
138
147
|
});
|
|
148
|
+
this.gcLock = false;
|
|
149
|
+
return true;
|
|
139
150
|
}
|
|
140
151
|
/**
|
|
141
152
|
* Return true if cache entry is expired
|
|
@@ -152,8 +163,9 @@ export class NgHttpCachingService {
|
|
|
152
163
|
// config/default lifetime
|
|
153
164
|
let lifetime = this.config.lifetime;
|
|
154
165
|
// request has own lifetime
|
|
155
|
-
|
|
156
|
-
|
|
166
|
+
const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);
|
|
167
|
+
if (headerLifetime) {
|
|
168
|
+
lifetime = +headerLifetime;
|
|
157
169
|
}
|
|
158
170
|
// never expire if 0
|
|
159
171
|
if (lifetime === 0) {
|
|
@@ -207,16 +219,13 @@ export class NgHttpCachingService {
|
|
|
207
219
|
}
|
|
208
220
|
}
|
|
209
221
|
// if allowed method is only ALL, allow all http methos
|
|
210
|
-
if (this.config.allowedMethod) {
|
|
211
|
-
if (this.config.allowedMethod
|
|
212
|
-
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
222
|
+
if (this.config.allowedMethod.length === 1) {
|
|
223
|
+
if (this.config.allowedMethod[0] === 'ALL') {
|
|
224
|
+
return true;
|
|
215
225
|
}
|
|
216
|
-
// request is allowed if method is in allowedMethod
|
|
217
|
-
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
218
226
|
}
|
|
219
|
-
|
|
227
|
+
// request is allowed if method is in allowedMethod
|
|
228
|
+
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
220
229
|
}
|
|
221
230
|
/**
|
|
222
231
|
* Return the cache key
|
|
@@ -269,4 +278,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
|
269
278
|
}, {
|
|
270
279
|
type: Optional
|
|
271
280
|
}] }]; } });
|
|
272
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOztBQVV0RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxxQkFLWDtBQUxELFdBQVkscUJBQXFCO0lBQy9CLDBDQUEwQztJQUMxQyxnREFBdUIsQ0FBQTtJQUN2QiwwQ0FBMEM7SUFDMUMsc0RBQTZCLENBQUE7QUFDL0IsQ0FBQyxFQUxXLHFCQUFxQixLQUFyQixxQkFBcUIsUUFLaEM7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFTWDtBQVRELFdBQVksb0JBQW9CO0lBQzlCLDBDQUEwQztJQUMxQyxxRUFBNkMsQ0FBQTtJQUM3QywwQ0FBMEM7SUFDMUMsMkVBQW1ELENBQUE7SUFDbkQsMENBQTBDO0lBQzFDLCtEQUF1QyxDQUFBO0lBQ3ZDLDBDQUEwQztJQUMxQyxxREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBVFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQVMvQjtBQUNELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQXlCNUUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQStCO0lBQ3BFLEtBQUssRUFBRSxJQUFJLDBCQUEwQixFQUFFO0lBQ3ZDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7SUFDdkIsT0FB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QUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFRTixNQUFNOzJCQUFDLHNCQUFzQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1tZW1vcnktc3RvcmFnZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdFbnRyeSB7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+O1xyXG4gIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT47XHJcbiAgYWRkZWRUaW1lOiBudW1iZXI7XHJcbiAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ0h0dHBDYWNoaW5nQ29uZmlnPihcclxuICAnbmctaHR0cC1jYWNoaW5nLmNvbmZpZydcclxuKTtcclxuXHJcbmV4cG9ydCBlbnVtIE5nSHR0cENhY2hpbmdTdHJhdGVneSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgQUxMT1dfQUxMID0gJ0FMTE9XX0FMTCcsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgRElTQUxMT1dfQUxMID0gJ0RJU0FMTE9XX0FMTCcsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5nSHR0cENhY2hpbmdIZWFkZXJzIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBBTExPV19DQUNIRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1BTExPVy1DQUNIRScsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgRElTQUxMT1dfQ0FDSEUgPSAnWC1ORy1IVFRQLUNBQ0hJTkctRElTQUxMT1ctQ0FDSEUnLFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIExJRkVUSU1FID0gJ1gtTkctSFRUUC1DQUNISU5HLUxJRkVUSU1FJyxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBUQUcgPSAnWC1ORy1IVFRQLUNBQ0hJTkctVEFHJyxcclxufVxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0hlYWRlcnNMaXN0ID0gT2JqZWN0LnZhbHVlcyhOZ0h0dHBDYWNoaW5nSGVhZGVycyk7XHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgc3RvcmU/OiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZTtcclxuICBsaWZldGltZT86IG51bWJlcjtcclxuICBhbGxvd2VkTWV0aG9kPzogc3RyaW5nW107XHJcbiAgY2FjaGVTdHJhdGVneT86IE5nSHR0cENhY2hpbmdTdHJhdGVneTtcclxuICB2ZXJzaW9uPzogc3RyaW5nO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGlzRXhwaXJlZD86IChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGlzQ2FjaGVhYmxlPzogKHJlcTogSHR0cFJlcXVlc3Q8YW55PikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBnZXRLZXk/OiAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgaXNWYWxpZD86IChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnIGV4dGVuZHMgTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgc3RvcmU6IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIGxpZmV0aW1lOiBudW1iZXI7XHJcbiAgYWxsb3dlZE1ldGhvZDogc3RyaW5nW107XHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5O1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0OiBOZ0h0dHBDYWNoaW5nRGVmYXVsdENvbmZpZyA9IHtcclxuICBzdG9yZTogbmV3IE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlKCksXHJcbiAgbGlmZXRpbWU6IDYwICogNjAgKiAxMDAsXHJcbiAgdmVyc2lvbjogJzEnLFxyXG4gIGFsbG93ZWRNZXRob2Q6IFsnR0VUJ10sXHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTCxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWc6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnID0gTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChOR19IVFRQX0NBQ0hJTkdfQ09ORklHKSBAT3B0aW9uYWwoKSBjb25maWc6IE5nSHR0cENhY2hpbmdDb25maWdcclxuICApIHtcclxuICAgIGlmIChjb25maWcpIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLk5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0LCAuLi5jb25maWcgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY29uZmlnXHJcbiAgICovXHJcbiAgZ2V0Q29uZmlnKCk6IE5nSHR0cENhY2hpbmdDb25maWcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBxdWV1ZSBtYXBcclxuICAgKi9cclxuICBnZXRRdWV1ZSgpOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVldWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGNhY2hlIHN0b3JlXHJcbiAgICovXHJcbiAgZ2V0U3RvcmUoKTogTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnN0b3JlIGFzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHJlc3BvbnNlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tQ2FjaGUocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlc3BvbnNlPGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgY2FjaGVkOiBOZ0h0dHBDYWNoaW5nRW50cnkgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZy5zdG9yZT8uZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0V4cGlyZWQoY2FjaGVkKSkge1xyXG4gICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYWNoZWQucmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcmVzcG9uc2UgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb0NhY2hlKHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgcmVzOiBIdHRwUmVzcG9uc2U8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSA9IHtcclxuICAgICAgdXJsOiByZXEudXJsV2l0aFBhcmFtcyxcclxuICAgICAgcmVzcG9uc2U6IHJlcyxcclxuICAgICAgcmVxdWVzdDogcmVxLFxyXG4gICAgICBhZGRlZFRpbWU6IERhdGUubm93KCksXHJcbiAgICAgIHZlcnNpb246IHRoaXMuY29uZmlnLnZlcnNpb24sXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZChlbnRyeSkpIHtcclxuICAgICAgdGhpcy5jb25maWcuc3RvcmU/LnNldChrZXksIGVudHJ5KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21DYWNoZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHJldHVybiB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlXHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlPy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IGtleVxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5zdG9yZSBhcyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSkuZGVsZXRlKGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGUgYnkgcmVnZXhcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlSZWdleChyZWdleDogUmVnRXhwKTogdm9pZCB7XHJcbiAgICAodGhpcy5jb25maWcuc3RvcmUgYXMgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UpLmZvckVhY2goKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChyZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBUQUdcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlUYWcodGFnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICh0aGlzLmNvbmZpZy5zdG9yZSBhcyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSkuZm9yRWFjaCgoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgdGFnSGVhZGVyID0gZW50cnkucmVxdWVzdC5oZWFkZXJzLmdldChOZ0h0dHBDYWNoaW5nSGVhZGVycy5UQUcpO1xyXG4gICAgICBpZiAodGFnSGVhZGVyICYmIHRhZ0hlYWRlci5zcGxpdCgnLCcpLmluY2x1ZGVzKHRhZykpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJ1biBnYXJiYWdlIGNvbGxlY3RvciAoZGVsZXRlIGV4cGlyZWQgY2FjaGUgZW50cnkpXHJcbiAgICovXHJcbiAgcnVuR2MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5mb3JFYWNoKChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0V4cGlyZWQoZW50cnkpKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBjYWNoZSBlbnRyeSBpcyBleHBpcmVkXHJcbiAgICovXHJcbiAgaXNFeHBpcmVkKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnkpOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNFeHBpcmVkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzRXhwaXJlZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY29uZmlnL2RlZmF1bHQgbGlmZXRpbWVcclxuICAgIGxldCBsaWZldGltZSA9IHRoaXMuY29uZmlnLmxpZmV0aW1lO1xyXG4gICAgLy8gcmVxdWVzdCBoYXMgb3duIGxpZmV0aW1lXHJcbiAgICBpZiAoZW50cnkucmVxdWVzdC5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5MSUZFVElNRSkpIHtcclxuICAgICAgbGlmZXRpbWUgPSArKGVudHJ5LnJlcXVlc3QuaGVhZGVycy5nZXQoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuTElGRVRJTUUpIHx8ICcnKTtcclxuICAgIH1cclxuICAgIC8vIG5ldmVyIGV4cGlyZSBpZiAwXHJcbiAgICBpZiAobGlmZXRpbWUgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gd3JvbmcgbGlmZXRpbWVcclxuICAgIGlmICgobGlmZXRpbWUgYXMgbnVtYmVyKSA8IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaWZldGltZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAwJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cnkuYWRkZWRUaW1lICsgKGxpZmV0aW1lIGFzIG51bWJlcikgPCBEYXRlLm5vdygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgY2FjaGUgZW50cnkgaXMgdmFsaWQgZm9yIHN0b3JlIGluIHRoZSBjYWNoZVxyXG4gICAqL1xyXG4gIGlzVmFsaWQoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzVmFsaWQoZW50cnkpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRpZmZlcmVudCB2ZXJzaW9uXHJcbiAgICBpZiAodGhpcy5jb25maWcudmVyc2lvbiAhPT0gZW50cnkudmVyc2lvbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIGlzQ2FjaGVhYmxlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaGFzIGRpc2FsbG93IGNhY2hlIGhlYWRlclxyXG4gICAgaWYgKHJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5ESVNBTExPV19DQUNIRSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RyYXRlZ3kgaXMgZGlzYWxsb3cgYWxsLi4uXHJcbiAgICBpZiAodGhpcy5jb25maWcuY2FjaGVTdHJhdGVneSA9PT0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTCkge1xyXG4gICAgICAvLyByZXF1ZXN0IGlzbid0IGFsbG93ZWQgaWYgY29tZSB3aXRob3V0IGFsbG93IGhlYWRlclxyXG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5BTExPV19DQUNIRSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIGFsbG93ZWQgbWV0aG9kIGlzIG9ubHkgQUxMLCBhbGxvdyBhbGwgaHR0cCBtZXRob3NcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kWzBdID09PSAnQUxMJykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHJlcXVlc3QgaXMgYWxsb3dlZCBpZiBtZXRob2QgaXMgaW4gYWxsb3dlZE1ldGhvZFxyXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZC5pbmRleE9mKHJlcS5tZXRob2QpICE9PSAtMTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBrZXlcclxuICAgKi9cclxuICBnZXRLZXkocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuZ2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmdldEtleShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRlZmF1bHQga2V5IGlkIGlzIHVybCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnNcclxuICAgIHJldHVybiByZXEudXJsV2l0aFBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tUXVldWUocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgY2FjaGVkOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB8IHVuZGVmaW5lZCA9IHRoaXMucXVldWUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9ic2VydmFibGUgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb1F1ZXVlKHJlcTogSHR0cFJlcXVlc3Q8YW55Piwgb2JzOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgdGhpcy5xdWV1ZS5zZXQoa2V5LCBvYnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIG9ic2VydmFibGUgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21RdWV1ZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl0RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFVdEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLENBQ3RELHdCQUF3QixDQUN6QixDQUFDO0FBRUYsTUFBTSxDQUFOLElBQVkscUJBS1g7QUFMRCxXQUFZLHFCQUFxQjtJQUMvQiwwQ0FBMEM7SUFDMUMsZ0RBQXVCLENBQUE7SUFDdkIsMENBQTBDO0lBQzFDLHNEQUE2QixDQUFBO0FBQy9CLENBQUMsRUFMVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBS2hDO0FBRUQsTUFBTSxDQUFOLElBQVksb0JBU1g7QUFURCxXQUFZLG9CQUFvQjtJQUM5QiwwQ0FBMEM7SUFDMUMscUVBQTZDLENBQUE7SUFDN0MsMENBQTBDO0lBQzFDLDJFQUFtRCxDQUFBO0lBQ25ELDBDQUEwQztJQUMxQywrREFBdUMsQ0FBQTtJQUN2QywwQ0FBMEM7SUFDMUMscURBQTZCLENBQUE7QUFDL0IsQ0FBQyxFQVRXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFTL0I7QUFDRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUEwQjVFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUErQjtJQUNwRSxLQUFLLEVBQUUsSUFBSSwwQkFBMEIsRUFBRTtJQUN2QyxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFH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LEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7aUhBM1FVLG9CQUFvQixrQkFTckIsc0JBQXNCO3FIQVRyQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBVU4sTUFBTTsyQkFBQyxzQkFBc0I7OzBCQUFHLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0LCBPcHRpb25hbCwgVkVSU0lPTiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL09ic2VydmFibGUnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB9IGZyb20gJy4vc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctbWVtb3J5LXN0b3JhZ2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nRW50cnkge1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PjtcclxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+O1xyXG4gIGFkZGVkVGltZTogbnVtYmVyO1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdIdHRwQ2FjaGluZ0NvbmZpZz4oXHJcbiAgJ25nLWh0dHAtY2FjaGluZy5jb25maWcnXHJcbik7XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIEFMTE9XX0FMTCA9ICdBTExPV19BTEwnLFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIERJU0FMTE9XX0FMTCA9ICdESVNBTExPV19BTEwnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nSGVhZGVycyB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgQUxMT1dfQ0FDSEUgPSAnWC1ORy1IVFRQLUNBQ0hJTkctQUxMT1ctQ0FDSEUnLFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIERJU0FMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLURJU0FMTE9XLUNBQ0hFJyxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBMSUZFVElNRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1MSUZFVElNRScsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgVEFHID0gJ1gtTkctSFRUUC1DQUNISU5HLVRBRycsXHJcbn1cclxuZXhwb3J0IGNvbnN0IE5nSHR0cENhY2hpbmdIZWFkZXJzTGlzdCA9IE9iamVjdC52YWx1ZXMoTmdIdHRwQ2FjaGluZ0hlYWRlcnMpO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICBzdG9yZT86IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIGxpZmV0aW1lPzogbnVtYmVyO1xyXG4gIGFsbG93ZWRNZXRob2Q/OiBzdHJpbmdbXTtcclxuICBjYWNoZVN0cmF0ZWd5PzogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5O1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgaXNFeHBpcmVkPzogKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnkpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgaXNDYWNoZWFibGU/OiAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGdldEtleT86IChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBpc1ZhbGlkPzogKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnkpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0RlZmF1bHRDb25maWcgZXh0ZW5kcyBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICBzdG9yZTogTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2U7XHJcbiAgbGlmZXRpbWU6IG51bWJlcjtcclxuICBhbGxvd2VkTWV0aG9kOiBzdHJpbmdbXTtcclxuICBjYWNoZVN0cmF0ZWd5OiBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3k7XHJcbiAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQ6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnID0ge1xyXG4gIHN0b3JlOiBuZXcgTmdIdHRwQ2FjaGluZ01lbW9yeVN0b3JhZ2UoKSxcclxuICBsaWZldGltZTogNjAgKiA2MCAqIDEwMCxcclxuICB2ZXJzaW9uOiBWRVJTSU9OLm1ham9yLFxyXG4gIGFsbG93ZWRNZXRob2Q6IFsnR0VUJ10sXHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTCxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWc6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnO1xyXG5cclxuICBwcml2YXRlIGdjTG9jayA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTkdfSFRUUF9DQUNISU5HX0NPTkZJRykgQE9wdGlvbmFsKCkgY29uZmlnOiBOZ0h0dHBDYWNoaW5nQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0geyAuLi5OZ0h0dHBDYWNoaW5nQ29uZmlnRGVmYXVsdCwgLi4uY29uZmlnIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQgfTtcclxuICAgIH1cclxuICAgIC8vIHN0YXJ0IGNhY2hlIGNsZWFuXHJcbiAgICB0aGlzLnJ1bkdjKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGNvbmZpZ1xyXG4gICAqL1xyXG4gIGdldENvbmZpZygpOiBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgcXVldWUgbWFwXHJcbiAgICovXHJcbiAgZ2V0UXVldWUoKTogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBzdG9yZVxyXG4gICAqL1xyXG4gIGdldFN0b3JlKCk6IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiByZXNwb25zZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZ2V0RnJvbUNhY2hlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBSZXNwb25zZTxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIGNvbnN0IGNhY2hlZDogTmdIdHRwQ2FjaGluZ0VudHJ5IHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWcuc3RvcmUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0V4cGlyZWQoY2FjaGVkKSkge1xyXG4gICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYWNoZWQucmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcmVzcG9uc2UgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb0NhY2hlKHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgcmVzOiBIdHRwUmVzcG9uc2U8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSA9IHtcclxuICAgICAgdXJsOiByZXEudXJsV2l0aFBhcmFtcyxcclxuICAgICAgcmVzcG9uc2U6IHJlcyxcclxuICAgICAgcmVxdWVzdDogcmVxLFxyXG4gICAgICBhZGRlZFRpbWU6IERhdGUubm93KCksXHJcbiAgICAgIHZlcnNpb246IHRoaXMuY29uZmlnLnZlcnNpb24sXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZChlbnRyeSkpIHtcclxuICAgICAgdGhpcy5jb25maWcuc3RvcmUuc2V0KGtleSwgZW50cnkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSByZXNwb25zZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZGVsZXRlRnJvbUNhY2hlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGVcclxuICAgKi9cclxuICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBrZXlcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZS5kZWxldGUoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSByZWdleFxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVJlZ2V4KHJlZ2V4OiBSZWdFeHApOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2goKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChyZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBUQUdcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlUYWcodGFnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2goKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhZ0hlYWRlciA9IGVudHJ5LnJlcXVlc3QuaGVhZGVycy5nZXQoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuVEFHKTtcclxuICAgICAgaWYgKHRhZ0hlYWRlciAmJiB0YWdIZWFkZXIuc3BsaXQoJywnKS5pbmNsdWRlcyh0YWcpKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW4gZ2FyYmFnZSBjb2xsZWN0b3IgKGRlbGV0ZSBleHBpcmVkIGNhY2hlIGVudHJ5KVxyXG4gICAqL1xyXG4gIHJ1bkdjKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ2NMb2NrKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2NMb2NrID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2goKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRXhwaXJlZChlbnRyeSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2NMb2NrID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWRcclxuICAgKi9cclxuICBpc0V4cGlyZWQoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0V4cGlyZWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNFeHBpcmVkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25maWcvZGVmYXVsdCBsaWZldGltZVxyXG4gICAgbGV0IGxpZmV0aW1lOiBudW1iZXIgPSB0aGlzLmNvbmZpZy5saWZldGltZTtcclxuICAgIC8vIHJlcXVlc3QgaGFzIG93biBsaWZldGltZVxyXG4gICAgY29uc3QgaGVhZGVyTGlmZXRpbWUgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLkxJRkVUSU1FKTtcclxuICAgIGlmIChoZWFkZXJMaWZldGltZSkge1xyXG4gICAgICBsaWZldGltZSA9ICtoZWFkZXJMaWZldGltZTtcclxuICAgIH1cclxuICAgIC8vIG5ldmVyIGV4cGlyZSBpZiAwXHJcbiAgICBpZiAobGlmZXRpbWUgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gd3JvbmcgbGlmZXRpbWVcclxuICAgIGlmIChsaWZldGltZSA8IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaWZldGltZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAwJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cnkuYWRkZWRUaW1lICsgbGlmZXRpbWUgPCBEYXRlLm5vdygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgY2FjaGUgZW50cnkgaXMgdmFsaWQgZm9yIHN0b3JlIGluIHRoZSBjYWNoZVxyXG4gICAqL1xyXG4gIGlzVmFsaWQoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzVmFsaWQoZW50cnkpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRpZmZlcmVudCB2ZXJzaW9uXHJcbiAgICBpZiAodGhpcy5jb25maWcudmVyc2lvbiAhPT0gZW50cnkudmVyc2lvbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIGlzQ2FjaGVhYmxlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaGFzIGRpc2FsbG93IGNhY2hlIGhlYWRlclxyXG4gICAgaWYgKHJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5ESVNBTExPV19DQUNIRSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RyYXRlZ3kgaXMgZGlzYWxsb3cgYWxsLi4uXHJcbiAgICBpZiAodGhpcy5jb25maWcuY2FjaGVTdHJhdGVneSA9PT0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTCkge1xyXG4gICAgICAvLyByZXF1ZXN0IGlzbid0IGFsbG93ZWQgaWYgY29tZSB3aXRob3V0IGFsbG93IGhlYWRlclxyXG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5BTExPV19DQUNIRSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIGFsbG93ZWQgbWV0aG9kIGlzIG9ubHkgQUxMLCBhbGxvdyBhbGwgaHR0cCBtZXRob3NcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBpZiAodGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZFswXSA9PT0gJ0FMTCcpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcmVxdWVzdCBpcyBhbGxvd2VkIGlmIG1ldGhvZCBpcyBpbiBhbGxvd2VkTWV0aG9kXHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZC5pbmRleE9mKHJlcS5tZXRob2QpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY2FjaGUga2V5XHJcbiAgICovXHJcbiAgZ2V0S2V5KHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IHN0cmluZyB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5nZXRLZXkocmVxKTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBkZWZhdWx0IGtleSBpZCBpcyB1cmwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzXHJcbiAgICByZXR1cm4gcmVxLnVybFdpdGhQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gb2JzZXJ2YWJsZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZ2V0RnJvbVF1ZXVlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIGNvbnN0IGNhY2hlZDogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQgPSB0aGlzLnF1ZXVlLmdldChrZXkpO1xyXG5cclxuICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNhY2hlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBvYnNlcnZhYmxlIHRvIGNhY2hlXHJcbiAgICovXHJcbiAgYWRkVG9RdWV1ZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG9iczogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHRoaXMucXVldWUuc2V0KGtleSwgb2JzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBkZWxldGVGcm9tUXVldWUocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kZWxldGUoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -123,4 +123,4 @@ export class NgHttpCachingBrowserStorage {
|
|
|
123
123
|
}));
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQXFCO0lBQ2xELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLG9EQUFvRDtJQUNqRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3JILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7U0FDN0csQ0FDSjtRQUNELE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3BILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FB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M0MsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDeEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5jb25zdCBLRVlfUFJFRklYID0gJ05nSHR0cENhY2hpbmc6Oic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcS5jbG9uZSgpOyAvLyBNYWtlIGEgY2xvbmUsIHVzZWZ1bCBmb3IgZG9pbmcgZGVzdHJ1Y3RpdmUgdGhpbmdzXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwgLy8gVGhlIFJlcXVlc3QgTWV0aG9kLCBlLmcuIEdFVCwgUE9TVCwgREVMRVRFXHJcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCwgLy8gVGhlIFVSTFxyXG4gICAgICAgIHBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKCAvLyBKdXN0IGEgaGVscGVyIHRvIG1ha2UgdGhpcyBpbnRvIGFuIG9iamVjdCwgbm90IHJlYWxseSByZXF1aXJlZCBidXQgbWFrZXMgdGhlIG91dHB1dCBuaWNlclxyXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMua2V5cygpLm1hcCggLy8gR2V0IGFsbCBvZiB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICAgICAgKGtleTogc3RyaW5nKSA9PiBba2V5LCByZXF1ZXN0LmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgLy8gVGhlIHJlcXVlc3QgcGFyYW1ldGVyc1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMsIC8vIFdoZXRoZXIgY3JlZGVudGlhbHMgYXJlIGJlaW5nIHNlbnRcclxuICAgICAgICByZXNwbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsIC8vIFRoZSByZXNwb25zZSB0eXBlXHJcbiAgICAgICAgYm9keTogcmVxdWVzdC5zZXJpYWxpemVCb2R5KCkgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc3BvbnNlKHJlczogSHR0cFJlc3BvbnNlPGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXMuY2xvbmUoKTtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKCAvLyBKdXN0IGEgaGVscGVyIHRvIG1ha2UgdGhpcyBpbnRvIGFuIG9iamVjdCwgbm90IHJlYWxseSByZXF1aXJlZCBidXQgbWFrZXMgdGhlIG91dHB1dCBuaWNlclxyXG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVzcG9uc2UuaGVhZGVycy5nZXRBbGwoa2V5KV0gLy8gR2V0IGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICAgICAgdXJsOiByZXNwb25zZS51cmwsXHJcbiAgICAgICAgYm9keTogcmVzcG9uc2UgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmVxdWVzdDxUID0gYW55PihyZXE6IHN0cmluZyk6IEh0dHBSZXF1ZXN0PFQ+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnBhcnNlKHJlcSk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpOyAvLyBQcm9iYWJseSBzb21lIHdheSB0byBtYWtlIHRoaXMgYSBvbmUtbGluZXIsIGJ1dCBhbGFzLCB0aGVyZSBhcmUgbm8gZ29vZCBkb2NzXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBpbiByZXF1ZXN0LnBhcmFtcykge1xyXG4gICAgICAgIHJlcXVlc3QucGFyYW1zW3BhcmFtZXRlcl0uZm9yRWFjaCgocGFyYW1WYWx1ZTogc3RyaW5nKSA9PiBwYXJhbXMuYXBwZW5kKHBhcmFtZXRlciwgcGFyYW1WYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYm9keSwge1xyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiByZXF1ZXN0LndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlc3BvbnNlPFQgPSBhbnk+KHJlczogc3RyaW5nKTogSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2U8VD4oe1xyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBib2R5OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdCcm93c2VyU3RvcmFnZSBpbXBsZW1lbnRzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIHtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSl7fVxyXG5cclxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGUgPSB0aGlzLnN0b3JhZ2UubGVuZ3RoOyBpIDwgZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oS0VZX1BSRUZJWCArIGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5LCBrZXk6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGl0ZXJhdGUgdGhpcy5zdG9yYWdlXHJcbiAgICAgICAgY29uc3QgbGVuUHJlZml4ID0gS0VZX1BSRUZJWC5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGUgPSB0aGlzLnN0b3JhZ2UubGVuZ3RoOyBpIDwgZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoa2V5LnN1YnN0cmluZyhsZW5QcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4odmFsdWUsIGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleTogc3RyaW5nKTogTmdIdHRwQ2FjaGluZ0VudHJ5IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oS0VZX1BSRUZJWCArIGtleSk7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyc2VkSXRlbTogU3RvcmFnZUVudHJ5ID0gSlNPTi5wYXJzZShpdGVtKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHVybDogcGFyc2VkSXRlbS51cmwsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZTogZGVzZXJpYWxpemVSZXNwb25zZShwYXJzZWRJdGVtLnJlc3BvbnNlKSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IGRlc2VyaWFsaXplUmVxdWVzdChwYXJzZWRJdGVtLnJlcXVlc3QpLFxyXG4gICAgICAgICAgICAgICAgYWRkZWRUaW1lOiBwYXJzZWRJdGVtLmFkZGVkVGltZSxcclxuICAgICAgICAgICAgICAgIHZlcnNpb246IHBhcnNlZEl0ZW0udmVyc2lvblxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShLRVlfUFJFRklYICsga2V5KSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKEtFWV9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgdXJsOiB2YWx1ZS51cmwsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlOiBzZXJpYWxpemVSZXNwb25zZSh2YWx1ZS5yZXNwb25zZSksXHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IHNlcmlhbGl6ZVJlcXVlc3QodmFsdWUucmVxdWVzdCksXHJcbiAgICAgICAgICAgIGFkZGVkVGltZTogdmFsdWUuYWRkZWRUaW1lXHJcbiAgICAgICAgfSBhcyBTdG9yYWdlRW50cnkpKTtcclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIFN0b3JhZ2VFbnRyeSB7XHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIHJlc3BvbnNlOiBzdHJpbmc7XHJcbiAgICByZXF1ZXN0OiBzdHJpbmc7XHJcbiAgICBhZGRlZFRpbWU6IG51bWJlcjtcclxuICAgIHZlcnNpb246IHN0cmluZztcclxufVxyXG4iXX0=
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQXFCO0lBQ2xELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLG9EQUFvRDtJQUNqRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3JILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7U0FDN0csQ0FDSjtRQUNELE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3BILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FB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M0MsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDeEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5jb25zdCBLRVlfUFJFRklYID0gJ05nSHR0cENhY2hpbmc6Oic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcS5jbG9uZSgpOyAvLyBNYWtlIGEgY2xvbmUsIHVzZWZ1bCBmb3IgZG9pbmcgZGVzdHJ1Y3RpdmUgdGhpbmdzXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwgLy8gVGhlIFJlcXVlc3QgTWV0aG9kLCBlLmcuIEdFVCwgUE9TVCwgREVMRVRFXHJcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCwgLy8gVGhlIFVSTFxyXG4gICAgICAgIHBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKCAvLyBKdXN0IGEgaGVscGVyIHRvIG1ha2UgdGhpcyBpbnRvIGFuIG9iamVjdCwgbm90IHJlYWxseSByZXF1aXJlZCBidXQgbWFrZXMgdGhlIG91dHB1dCBuaWNlclxyXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMua2V5cygpLm1hcCggLy8gR2V0IGFsbCBvZiB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICAgICAgKGtleTogc3RyaW5nKSA9PiBba2V5LCByZXF1ZXN0LmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgLy8gVGhlIHJlcXVlc3QgcGFyYW1ldGVyc1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMsIC8vIFdoZXRoZXIgY3JlZGVudGlhbHMgYXJlIGJlaW5nIHNlbnRcclxuICAgICAgICByZXNwbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsIC8vIFRoZSByZXNwb25zZSB0eXBlXHJcbiAgICAgICAgYm9keTogcmVxdWVzdC5zZXJpYWxpemVCb2R5KCkgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc3BvbnNlKHJlczogSHR0cFJlc3BvbnNlPGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXMuY2xvbmUoKTtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKCAvLyBKdXN0IGEgaGVscGVyIHRvIG1ha2UgdGhpcyBpbnRvIGFuIG9iamVjdCwgbm90IHJlYWxseSByZXF1aXJlZCBidXQgbWFrZXMgdGhlIG91dHB1dCBuaWNlclxyXG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVzcG9uc2UuaGVhZGVycy5nZXRBbGwoa2V5KV0gLy8gR2V0IGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICAgICAgdXJsOiByZXNwb25zZS51cmwsXHJcbiAgICAgICAgYm9keTogcmVzcG9uc2UgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmVxdWVzdDxUID0gYW55PihyZXE6IHN0cmluZyk6IEh0dHBSZXF1ZXN0PFQ+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnBhcnNlKHJlcSk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpOyAvLyBQcm9iYWJseSBzb21lIHdheSB0byBtYWtlIHRoaXMgYSBvbmUtbGluZXIsIGJ1dCBhbGFzLCB0aGVyZSBhcmUgbm8gZ29vZCBkb2NzXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBpbiByZXF1ZXN0LnBhcmFtcykge1xyXG4gICAgICAgIHJlcXVlc3QucGFyYW1zW3BhcmFtZXRlcl0uZm9yRWFjaCgocGFyYW1WYWx1ZTogc3RyaW5nKSA9PiBwYXJhbXMuYXBwZW5kKHBhcmFtZXRlciwgcGFyYW1WYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYm9keSwge1xyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiByZXF1ZXN0LndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlc3BvbnNlPFQgPSBhbnk+KHJlczogc3RyaW5nKTogSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2U8VD4oe1xyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBib2R5OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdCcm93c2VyU3RvcmFnZSBpbXBsZW1lbnRzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIHtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSkgeyB9XHJcblxyXG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5zdG9yYWdlLmxlbmd0aDsgaSA8IGU7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2Uua2V5KGkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShLRVlfUFJFRklYICsga2V5KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgLy8gaXRlcmF0ZSB0aGlzLnN0b3JhZ2VcclxuICAgICAgICBjb25zdCBsZW5QcmVmaXggPSBLRVlfUFJFRklYLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXkuc3Vic3RyaW5nKGxlblByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tmbih2YWx1ZSwga2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBOZ0h0dHBDYWNoaW5nRW50cnkgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShLRVlfUFJFRklYICsga2V5KTtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRJdGVtOiBTdG9yYWdlRW50cnkgPSBKU09OLnBhcnNlKGl0ZW0pO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBwYXJzZWRJdGVtLnVybCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBkZXNlcmlhbGl6ZVJlc3BvbnNlKHBhcnNlZEl0ZW0ucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogZGVzZXJpYWxpemVSZXF1ZXN0KHBhcnNlZEl0ZW0ucmVxdWVzdCksXHJcbiAgICAgICAgICAgICAgICBhZGRlZFRpbWU6IHBhcnNlZEl0ZW0uYWRkZWRUaW1lLFxyXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcGFyc2VkSXRlbS52ZXJzaW9uXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRJdGVtKEtFWV9QUkVGSVggKyBrZXkpICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oS0VZX1BSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICB1cmw6IHZhbHVlLnVybCxcclxuICAgICAgICAgICAgcmVzcG9uc2U6IHNlcmlhbGl6ZVJlc3BvbnNlKHZhbHVlLnJlc3BvbnNlKSxcclxuICAgICAgICAgICAgcmVxdWVzdDogc2VyaWFsaXplUmVxdWVzdCh2YWx1ZS5yZXF1ZXN0KSxcclxuICAgICAgICAgICAgYWRkZWRUaW1lOiB2YWx1ZS5hZGRlZFRpbWVcclxuICAgICAgICB9IGFzIFN0b3JhZ2VFbnRyeSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgU3RvcmFnZUVudHJ5IHtcclxuICAgIHVybDogc3RyaW5nO1xyXG4gICAgcmVzcG9uc2U6IHN0cmluZztcclxuICAgIHJlcXVlc3Q6IHN0cmluZztcclxuICAgIGFkZGVkVGltZTogbnVtYmVyO1xyXG4gICAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcbiJdfQ==
|
|
@@ -4,4 +4,4 @@ export class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {
|
|
|
4
4
|
super(localStorage);
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWxvY2FsLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1sb2NhbC1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWhGLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSwyQkFBMkI7SUFFdEU7UUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ0Jyb3dzZXJTdG9yYWdlIH0gZnJvbSAnLi9uZy1odHRwLWNhY2hpbmctYnJvd3Nlci1zdG9yYWdlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nTG9jYWxTdG9yYWdlIGV4dGVuZHMgTmdIdHRwQ2FjaGluZ0Jyb3dzZXJTdG9yYWdlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihsb2NhbFN0b3JhZ2UpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -4,4 +4,4 @@ export class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {
|
|
|
4
4
|
super(sessionStorage);
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLXNlc3Npb24tc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLXNlc3Npb24tc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVoRixNQUFNLE9BQU8sMkJBQTRCLFNBQVEsMkJBQTJCO0lBRXhFO1FBQ0ksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSHR0cENhY2hpbmdCcm93c2VyU3RvcmFnZSB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTmdIdHRwQ2FjaGluZ1Nlc3Npb25TdG9yYWdlIGV4dGVuZHMgTmdIdHRwQ2FjaGluZ0Jyb3dzZXJTdG9yYWdlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihzZXNzaW9uU3RvcmFnZSk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpResponse, HTTP_INTERCEPTORS, HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { InjectionToken, Injectable, Inject, Optional, NgModule } from '@angular/core';
|
|
3
|
+
import { InjectionToken, VERSION, Injectable, Inject, Optional, NgModule } from '@angular/core';
|
|
4
4
|
import { of } from 'rxjs';
|
|
5
5
|
import { tap, finalize, share } from 'rxjs/operators';
|
|
6
6
|
|
|
@@ -55,17 +55,22 @@ const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);
|
|
|
55
55
|
const NgHttpCachingConfigDefault = {
|
|
56
56
|
store: new NgHttpCachingMemoryStorage(),
|
|
57
57
|
lifetime: 60 * 60 * 100,
|
|
58
|
-
version:
|
|
58
|
+
version: VERSION.major,
|
|
59
59
|
allowedMethod: ['GET'],
|
|
60
60
|
cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,
|
|
61
61
|
};
|
|
62
62
|
class NgHttpCachingService {
|
|
63
63
|
constructor(config) {
|
|
64
64
|
this.queue = new Map();
|
|
65
|
-
this.
|
|
65
|
+
this.gcLock = false;
|
|
66
66
|
if (config) {
|
|
67
67
|
this.config = Object.assign(Object.assign({}, NgHttpCachingConfigDefault), config);
|
|
68
68
|
}
|
|
69
|
+
else {
|
|
70
|
+
this.config = Object.assign({}, NgHttpCachingConfigDefault);
|
|
71
|
+
}
|
|
72
|
+
// start cache clean
|
|
73
|
+
this.runGc();
|
|
69
74
|
}
|
|
70
75
|
/**
|
|
71
76
|
* Return the config
|
|
@@ -89,9 +94,8 @@ class NgHttpCachingService {
|
|
|
89
94
|
* Return response from cache
|
|
90
95
|
*/
|
|
91
96
|
getFromCache(req) {
|
|
92
|
-
var _a;
|
|
93
97
|
const key = this.getKey(req);
|
|
94
|
-
const cached =
|
|
98
|
+
const cached = this.config.store.get(key);
|
|
95
99
|
if (!cached) {
|
|
96
100
|
return undefined;
|
|
97
101
|
}
|
|
@@ -105,7 +109,6 @@ class NgHttpCachingService {
|
|
|
105
109
|
* Add response to cache
|
|
106
110
|
*/
|
|
107
111
|
addToCache(req, res) {
|
|
108
|
-
var _a;
|
|
109
112
|
const key = this.getKey(req);
|
|
110
113
|
const entry = {
|
|
111
114
|
url: req.urlWithParams,
|
|
@@ -115,7 +118,7 @@ class NgHttpCachingService {
|
|
|
115
118
|
version: this.config.version,
|
|
116
119
|
};
|
|
117
120
|
if (this.isValid(entry)) {
|
|
118
|
-
|
|
121
|
+
this.config.store.set(key, entry);
|
|
119
122
|
return true;
|
|
120
123
|
}
|
|
121
124
|
return false;
|
|
@@ -131,8 +134,7 @@ class NgHttpCachingService {
|
|
|
131
134
|
* Clear the cache
|
|
132
135
|
*/
|
|
133
136
|
clearCache() {
|
|
134
|
-
|
|
135
|
-
(_a = this.config.store) === null || _a === void 0 ? void 0 : _a.clear();
|
|
137
|
+
this.config.store.clear();
|
|
136
138
|
}
|
|
137
139
|
/**
|
|
138
140
|
* Clear the cache by key
|
|
@@ -165,11 +167,17 @@ class NgHttpCachingService {
|
|
|
165
167
|
* Run garbage collector (delete expired cache entry)
|
|
166
168
|
*/
|
|
167
169
|
runGc() {
|
|
170
|
+
if (this.gcLock) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
this.gcLock = true;
|
|
168
174
|
this.config.store.forEach((entry, key) => {
|
|
169
175
|
if (this.isExpired(entry)) {
|
|
170
176
|
this.clearCacheByKey(key);
|
|
171
177
|
}
|
|
172
178
|
});
|
|
179
|
+
this.gcLock = false;
|
|
180
|
+
return true;
|
|
173
181
|
}
|
|
174
182
|
/**
|
|
175
183
|
* Return true if cache entry is expired
|
|
@@ -186,8 +194,9 @@ class NgHttpCachingService {
|
|
|
186
194
|
// config/default lifetime
|
|
187
195
|
let lifetime = this.config.lifetime;
|
|
188
196
|
// request has own lifetime
|
|
189
|
-
|
|
190
|
-
|
|
197
|
+
const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);
|
|
198
|
+
if (headerLifetime) {
|
|
199
|
+
lifetime = +headerLifetime;
|
|
191
200
|
}
|
|
192
201
|
// never expire if 0
|
|
193
202
|
if (lifetime === 0) {
|
|
@@ -241,16 +250,13 @@ class NgHttpCachingService {
|
|
|
241
250
|
}
|
|
242
251
|
}
|
|
243
252
|
// if allowed method is only ALL, allow all http methos
|
|
244
|
-
if (this.config.allowedMethod) {
|
|
245
|
-
if (this.config.allowedMethod
|
|
246
|
-
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
253
|
+
if (this.config.allowedMethod.length === 1) {
|
|
254
|
+
if (this.config.allowedMethod[0] === 'ALL') {
|
|
255
|
+
return true;
|
|
249
256
|
}
|
|
250
|
-
// request is allowed if method is in allowedMethod
|
|
251
|
-
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
252
257
|
}
|
|
253
|
-
|
|
258
|
+
// request is allowed if method is in allowedMethod
|
|
259
|
+
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
254
260
|
}
|
|
255
261
|
/**
|
|
256
262
|
* Return the cache key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n // eslint-disable-next-line no-unused-vars\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\nexport interface NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n version?: string;\r\n // eslint-disable-next-line no-unused-vars\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingDefaultConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n version: '1',\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingDefaultConfig = NgHttpCachingConfigDefault;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n }\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store as NgHttpCachingStorageInterface;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry | undefined = this.config.store?.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n this.config.store?.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store?.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return (this.config.store as NgHttpCachingStorageInterface).delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (regex.test(key)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime = this.config.lifetime;\r\n // request has own lifetime\r\n if (entry.request.headers.has(NgHttpCachingHeaders.LIFETIME)) {\r\n lifetime = +(entry.request.headers.get(NgHttpCachingHeaders.LIFETIME) || '');\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if ((lifetime as number) < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + (lifetime as number) < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if (this.config.allowedMethod) {\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { tap, finalize, share } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private readonly cacheService: NgHttpCachingService) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if ( !this.cacheService.isCacheable(req) ) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if ( cachedObservable ) {\r\n // console.log('cachedObservable', req);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse', req);\r\n return of(cachedResponse.clone());\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n share()\r\n );\r\n\r\n // add pending request to queue for cache parallell request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if ( cloned.headers.has(ngHttpCachingHeaders) ) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport function serializeRequest(req: HttpRequest<any>): string {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n respnseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function serializeResponse(res: HttpResponse<any>): string {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function deserializeRequest<T = any>(req: string): HttpRequest<T> {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n // tslint:disable-next-line: forin\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport function deserializeResponse<T = any>(res: string): HttpResponse<T> {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private storage: Storage){}\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n this.storage.removeItem(KEY_PREFIX + key);\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n const lenPrefix = KEY_PREFIX.length;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n const value = this.get(key.substring(lenPrefix));\r\n if (value) {\r\n callbackfn(value, key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n const item = this.storage.getItem(KEY_PREFIX + key);\r\n if (item) {\r\n const parsedItem: StorageEntry = JSON.parse(item);\r\n return {\r\n url: parsedItem.url,\r\n response: deserializeResponse(parsedItem.response),\r\n request: deserializeRequest(parsedItem.request),\r\n addedTime: parsedItem.addedTime,\r\n version: parsedItem.version\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.storage.getItem(KEY_PREFIX + key) !== undefined;\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.storage.setItem(KEY_PREFIX + key, JSON.stringify({\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime\r\n } as StorageEntry));\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor(){\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor(){\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional, VERSION } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n // eslint-disable-next-line no-unused-vars\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\n\r\nexport interface NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n version?: string;\r\n // eslint-disable-next-line no-unused-vars\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingDefaultConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n version: VERSION.major,\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingDefaultConfig;\r\n\r\n private gcLock = false;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n } else {\r\n this.config = { ...NgHttpCachingConfigDefault };\r\n }\r\n // start cache clean\r\n this.runGc();\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry | undefined = this.config.store.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n this.config.store.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return this.config.store.delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (regex.test(key)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): boolean {\r\n if (this.gcLock) {\r\n return false;\r\n }\r\n this.gcLock = true;\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n this.gcLock = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime: number = this.config.lifetime;\r\n // request has own lifetime\r\n const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);\r\n if (headerLifetime) {\r\n lifetime = +headerLifetime;\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if (lifetime < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + lifetime < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { tap, finalize, share } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private readonly cacheService: NgHttpCachingService) { }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if (!this.cacheService.isCacheable(req)) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if (cachedObservable) {\r\n // console.log('cachedObservable', req);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse', req);\r\n return of(cachedResponse.clone());\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n share()\r\n );\r\n\r\n // add pending request to queue for cache parallell request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if (cloned.headers.has(ngHttpCachingHeaders)) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport function serializeRequest(req: HttpRequest<any>): string {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n respnseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function serializeResponse(res: HttpResponse<any>): string {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function deserializeRequest<T = any>(req: string): HttpRequest<T> {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n // tslint:disable-next-line: forin\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport function deserializeResponse<T = any>(res: string): HttpResponse<T> {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private storage: Storage) { }\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n this.storage.removeItem(KEY_PREFIX + key);\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n const lenPrefix = KEY_PREFIX.length;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n const value = this.get(key.substring(lenPrefix));\r\n if (value) {\r\n callbackfn(value, key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n const item = this.storage.getItem(KEY_PREFIX + key);\r\n if (item) {\r\n const parsedItem: StorageEntry = JSON.parse(item);\r\n return {\r\n url: parsedItem.url,\r\n response: deserializeResponse(parsedItem.response),\r\n request: deserializeRequest(parsedItem.request),\r\n addedTime: parsedItem.addedTime,\r\n version: parsedItem.version\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.storage.getItem(KEY_PREFIX + key) !== undefined;\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.storage.setItem(KEY_PREFIX + key, JSON.stringify({\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime\r\n } as StorageEntry));\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpResponse, HTTP_INTERCEPTORS, HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { InjectionToken, Injectable, Inject, Optional, NgModule } from '@angular/core';
|
|
3
|
+
import { InjectionToken, VERSION, Injectable, Inject, Optional, NgModule } from '@angular/core';
|
|
4
4
|
import { of } from 'rxjs';
|
|
5
5
|
import { tap, finalize, share } from 'rxjs/operators';
|
|
6
6
|
|
|
@@ -55,17 +55,22 @@ const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);
|
|
|
55
55
|
const NgHttpCachingConfigDefault = {
|
|
56
56
|
store: new NgHttpCachingMemoryStorage(),
|
|
57
57
|
lifetime: 60 * 60 * 100,
|
|
58
|
-
version:
|
|
58
|
+
version: VERSION.major,
|
|
59
59
|
allowedMethod: ['GET'],
|
|
60
60
|
cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,
|
|
61
61
|
};
|
|
62
62
|
class NgHttpCachingService {
|
|
63
63
|
constructor(config) {
|
|
64
64
|
this.queue = new Map();
|
|
65
|
-
this.
|
|
65
|
+
this.gcLock = false;
|
|
66
66
|
if (config) {
|
|
67
67
|
this.config = { ...NgHttpCachingConfigDefault, ...config };
|
|
68
68
|
}
|
|
69
|
+
else {
|
|
70
|
+
this.config = { ...NgHttpCachingConfigDefault };
|
|
71
|
+
}
|
|
72
|
+
// start cache clean
|
|
73
|
+
this.runGc();
|
|
69
74
|
}
|
|
70
75
|
/**
|
|
71
76
|
* Return the config
|
|
@@ -90,7 +95,7 @@ class NgHttpCachingService {
|
|
|
90
95
|
*/
|
|
91
96
|
getFromCache(req) {
|
|
92
97
|
const key = this.getKey(req);
|
|
93
|
-
const cached = this.config.store
|
|
98
|
+
const cached = this.config.store.get(key);
|
|
94
99
|
if (!cached) {
|
|
95
100
|
return undefined;
|
|
96
101
|
}
|
|
@@ -113,7 +118,7 @@ class NgHttpCachingService {
|
|
|
113
118
|
version: this.config.version,
|
|
114
119
|
};
|
|
115
120
|
if (this.isValid(entry)) {
|
|
116
|
-
this.config.store
|
|
121
|
+
this.config.store.set(key, entry);
|
|
117
122
|
return true;
|
|
118
123
|
}
|
|
119
124
|
return false;
|
|
@@ -129,7 +134,7 @@ class NgHttpCachingService {
|
|
|
129
134
|
* Clear the cache
|
|
130
135
|
*/
|
|
131
136
|
clearCache() {
|
|
132
|
-
this.config.store
|
|
137
|
+
this.config.store.clear();
|
|
133
138
|
}
|
|
134
139
|
/**
|
|
135
140
|
* Clear the cache by key
|
|
@@ -162,11 +167,17 @@ class NgHttpCachingService {
|
|
|
162
167
|
* Run garbage collector (delete expired cache entry)
|
|
163
168
|
*/
|
|
164
169
|
runGc() {
|
|
170
|
+
if (this.gcLock) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
this.gcLock = true;
|
|
165
174
|
this.config.store.forEach((entry, key) => {
|
|
166
175
|
if (this.isExpired(entry)) {
|
|
167
176
|
this.clearCacheByKey(key);
|
|
168
177
|
}
|
|
169
178
|
});
|
|
179
|
+
this.gcLock = false;
|
|
180
|
+
return true;
|
|
170
181
|
}
|
|
171
182
|
/**
|
|
172
183
|
* Return true if cache entry is expired
|
|
@@ -183,8 +194,9 @@ class NgHttpCachingService {
|
|
|
183
194
|
// config/default lifetime
|
|
184
195
|
let lifetime = this.config.lifetime;
|
|
185
196
|
// request has own lifetime
|
|
186
|
-
|
|
187
|
-
|
|
197
|
+
const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);
|
|
198
|
+
if (headerLifetime) {
|
|
199
|
+
lifetime = +headerLifetime;
|
|
188
200
|
}
|
|
189
201
|
// never expire if 0
|
|
190
202
|
if (lifetime === 0) {
|
|
@@ -238,16 +250,13 @@ class NgHttpCachingService {
|
|
|
238
250
|
}
|
|
239
251
|
}
|
|
240
252
|
// if allowed method is only ALL, allow all http methos
|
|
241
|
-
if (this.config.allowedMethod) {
|
|
242
|
-
if (this.config.allowedMethod
|
|
243
|
-
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
253
|
+
if (this.config.allowedMethod.length === 1) {
|
|
254
|
+
if (this.config.allowedMethod[0] === 'ALL') {
|
|
255
|
+
return true;
|
|
246
256
|
}
|
|
247
|
-
// request is allowed if method is in allowedMethod
|
|
248
|
-
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
249
257
|
}
|
|
250
|
-
|
|
258
|
+
// request is allowed if method is in allowedMethod
|
|
259
|
+
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
251
260
|
}
|
|
252
261
|
/**
|
|
253
262
|
* Return the cache key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n // eslint-disable-next-line no-unused-vars\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\nexport interface NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n version?: string;\r\n // eslint-disable-next-line no-unused-vars\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingDefaultConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n version: '1',\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingDefaultConfig = NgHttpCachingConfigDefault;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n }\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store as NgHttpCachingStorageInterface;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry | undefined = this.config.store?.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n this.config.store?.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store?.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return (this.config.store as NgHttpCachingStorageInterface).delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (regex.test(key)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime = this.config.lifetime;\r\n // request has own lifetime\r\n if (entry.request.headers.has(NgHttpCachingHeaders.LIFETIME)) {\r\n lifetime = +(entry.request.headers.get(NgHttpCachingHeaders.LIFETIME) || '');\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if ((lifetime as number) < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + (lifetime as number) < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if (this.config.allowedMethod) {\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { tap, finalize, share } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private readonly cacheService: NgHttpCachingService) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if ( !this.cacheService.isCacheable(req) ) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if ( cachedObservable ) {\r\n // console.log('cachedObservable', req);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse', req);\r\n return of(cachedResponse.clone());\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n share()\r\n );\r\n\r\n // add pending request to queue for cache parallell request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if ( cloned.headers.has(ngHttpCachingHeaders) ) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport function serializeRequest(req: HttpRequest<any>): string {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n respnseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function serializeResponse(res: HttpResponse<any>): string {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function deserializeRequest<T = any>(req: string): HttpRequest<T> {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n // tslint:disable-next-line: forin\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport function deserializeResponse<T = any>(res: string): HttpResponse<T> {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private storage: Storage){}\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n this.storage.removeItem(KEY_PREFIX + key);\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n const lenPrefix = KEY_PREFIX.length;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n const value = this.get(key.substring(lenPrefix));\r\n if (value) {\r\n callbackfn(value, key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n const item = this.storage.getItem(KEY_PREFIX + key);\r\n if (item) {\r\n const parsedItem: StorageEntry = JSON.parse(item);\r\n return {\r\n url: parsedItem.url,\r\n response: deserializeResponse(parsedItem.response),\r\n request: deserializeRequest(parsedItem.request),\r\n addedTime: parsedItem.addedTime,\r\n version: parsedItem.version\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.storage.getItem(KEY_PREFIX + key) !== undefined;\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.storage.setItem(KEY_PREFIX + key, JSON.stringify({\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime\r\n } as StorageEntry));\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor(){\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor(){\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional, VERSION } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n // eslint-disable-next-line no-unused-vars\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\n\r\nexport interface NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n version?: string;\r\n // eslint-disable-next-line no-unused-vars\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingDefaultConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n version: VERSION.major,\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingDefaultConfig;\r\n\r\n private gcLock = false;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n } else {\r\n this.config = { ...NgHttpCachingConfigDefault };\r\n }\r\n // start cache clean\r\n this.runGc();\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry | undefined = this.config.store.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n this.config.store.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return this.config.store.delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (regex.test(key)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): boolean {\r\n if (this.gcLock) {\r\n return false;\r\n }\r\n this.gcLock = true;\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n this.gcLock = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime: number = this.config.lifetime;\r\n // request has own lifetime\r\n const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);\r\n if (headerLifetime) {\r\n lifetime = +headerLifetime;\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if (lifetime < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + lifetime < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { tap, finalize, share } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private readonly cacheService: NgHttpCachingService) { }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if (!this.cacheService.isCacheable(req)) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if (cachedObservable) {\r\n // console.log('cachedObservable', req);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse', req);\r\n return of(cachedResponse.clone());\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n share()\r\n );\r\n\r\n // add pending request to queue for cache parallell request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if (cloned.headers.has(ngHttpCachingHeaders)) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport function serializeRequest(req: HttpRequest<any>): string {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n respnseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function serializeResponse(res: HttpResponse<any>): string {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport function deserializeRequest<T = any>(req: string): HttpRequest<T> {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n // tslint:disable-next-line: forin\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport function deserializeResponse<T = any>(res: string): HttpResponse<T> {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private storage: Storage) { }\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n this.storage.removeItem(KEY_PREFIX + key);\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n const lenPrefix = KEY_PREFIX.length;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n const value = this.get(key.substring(lenPrefix));\r\n if (value) {\r\n callbackfn(value, key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n const item = this.storage.getItem(KEY_PREFIX + key);\r\n if (item) {\r\n const parsedItem: StorageEntry = JSON.parse(item);\r\n return {\r\n url: parsedItem.url,\r\n response: deserializeResponse(parsedItem.response),\r\n request: deserializeRequest(parsedItem.request),\r\n addedTime: parsedItem.addedTime,\r\n version: parsedItem.version\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.storage.getItem(KEY_PREFIX + key) !== undefined;\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.storage.setItem(KEY_PREFIX + key, JSON.stringify({\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime\r\n } as StorageEntry));\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ export declare const NgHttpCachingConfigDefault: NgHttpCachingDefaultConfig;
|
|
|
44
44
|
export declare class NgHttpCachingService {
|
|
45
45
|
private queue;
|
|
46
46
|
private config;
|
|
47
|
+
private gcLock;
|
|
47
48
|
constructor(config: NgHttpCachingConfig);
|
|
48
49
|
/**
|
|
49
50
|
* Return the config
|
|
@@ -88,7 +89,7 @@ export declare class NgHttpCachingService {
|
|
|
88
89
|
/**
|
|
89
90
|
* Run garbage collector (delete expired cache entry)
|
|
90
91
|
*/
|
|
91
|
-
runGc():
|
|
92
|
+
runGc(): boolean;
|
|
92
93
|
/**
|
|
93
94
|
* Return true if cache entry is expired
|
|
94
95
|
*/
|