ng-http-caching 2.0.1 → 13.0.1

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 CHANGED
@@ -270,7 +270,7 @@ this.http.get('https://my-json-server.typicode.com/typicode/demo/db', {
270
270
  ### X-NG-HTTP-CACHING-TAG (string: tag name);
271
271
 
272
272
  You can tag multiple request by adding special header `X-NG-HTTP-CACHING-TAG` with the same tag and
273
- using `NgHttpCachingService.clearCacheByTag(tag: syting)` for delete all the tagged request. Eg.:
273
+ using `NgHttpCachingService.clearCacheByTag(tag: string)` for delete all the tagged request. Eg.:
274
274
 
275
275
  ```ts
276
276
  this.http.get('https://my-json-server.typicode.com/typicode/demo/db?id=1', {
@@ -549,7 +549,8 @@ export class AppComponent {
549
549
  ### Example: TAG request and clear/flush specific cache entry by TAG
550
550
 
551
551
  You can tag multiple request by adding special header `X-NG-HTTP-CACHING-TAG` with the same tag and
552
- using `NgHttpCachingService.clearCacheByTag(tag: syting)` for delete all the tagged request. Eg.:
552
+ using `NgHttpCachingService.clearCacheByTag(tag:
553
+ )` for delete all the tagged request. Eg.:
553
554
 
554
555
  ```ts
555
556
  import { Component, OnInit } from '@angular/core';
@@ -613,4 +614,4 @@ I have published some other Angular libraries, take a look:
613
614
  - [NgGenericPipe: Generic pipe for Angular application](https://www.npmjs.com/package/ng-generic-pipe)
614
615
  - [NgLet: Structural directive for sharing data as local variable into html component template](https://www.npmjs.com/package/ng-let)
615
616
  - [NgLock: Angular decorator for lock a function and user interface while a task running](https://www.npmjs.com/package/ng-lock)
616
- - [NgCondition: An alternative to `*ngIf; else` directive for simplify conditions into HTML template for Angular application](https://www.npmjs.com/package/ng-condition)
617
+ - [NgCondition: An alternative to `*ngIf; else` directive for simplify conditions into HTML template for Angular application](https://www.npmjs.com/package/ng-condition)
@@ -0,0 +1,66 @@
1
+ import { HttpResponse } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { of } from 'rxjs';
4
+ import { tap, finalize, share } from 'rxjs/operators';
5
+ import { NgHttpCachingHeaders } from './ng-http-caching.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./ng-http-caching.service";
8
+ export class NgHttpCachingInterceptorService {
9
+ // eslint-disable-next-line no-unused-vars
10
+ constructor(cacheService) {
11
+ this.cacheService = cacheService;
12
+ }
13
+ intercept(req, next) {
14
+ // run garbage collector
15
+ this.cacheService.runGc();
16
+ // Don't cache if it's not cacheable
17
+ if (!this.cacheService.isCacheable(req)) {
18
+ return this.sendRequest(req, next);
19
+ }
20
+ // Checked if there is pending response for this request
21
+ const cachedObservable = this.cacheService.getFromQueue(req);
22
+ if (cachedObservable) {
23
+ // console.log('cachedObservable', req);
24
+ return cachedObservable;
25
+ }
26
+ // Checked if there is cached response for this request
27
+ const cachedResponse = this.cacheService.getFromCache(req);
28
+ if (cachedResponse) {
29
+ // console.log('cachedResponse', req);
30
+ return of(cachedResponse.clone());
31
+ }
32
+ // If the request of going through for first time
33
+ // then let the request proceed and cache the response
34
+ // console.log('sendRequest', req);
35
+ const shared = this.sendRequest(req, next).pipe(tap(event => {
36
+ if (event instanceof HttpResponse) {
37
+ this.cacheService.addToCache(req, event.clone());
38
+ }
39
+ }), finalize(() => {
40
+ // delete pending request
41
+ this.cacheService.deleteFromQueue(req);
42
+ }), share());
43
+ // add pending request to queue for cache parallell request
44
+ this.cacheService.addToQueue(req, shared);
45
+ return shared;
46
+ }
47
+ /**
48
+ * Send http request (next handler)
49
+ */
50
+ sendRequest(req, next) {
51
+ let cloned = req.clone();
52
+ // trim custom headers before send request
53
+ Object.values(NgHttpCachingHeaders).forEach(ngHttpCachingHeaders => {
54
+ if (cloned.headers.has(ngHttpCachingHeaders)) {
55
+ cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });
56
+ }
57
+ });
58
+ return next.handle(cloned);
59
+ }
60
+ }
61
+ NgHttpCachingInterceptorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingInterceptorService, deps: [{ token: i1.NgHttpCachingService }], target: i0.ɵɵFactoryTarget.Injectable });
62
+ NgHttpCachingInterceptorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingInterceptorService });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingInterceptorService, decorators: [{
64
+ type: Injectable
65
+ }], ctorParameters: function () { return [{ type: i1.NgHttpCachingService }]; } });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmctaW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdELFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQXdCLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQUl2RixNQUFNLE9BQU8sK0JBQStCO0lBRTFDLDBDQUEwQztJQUMxQyxZQUE2QixZQUFrQztRQUFsQyxpQkFBWSxHQUFaLFlBQVksQ0FBc0I7SUFBRyxDQUFDO0lBRW5FLFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBQ2hELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFCLG9DQUFvQztRQUNwQyxJQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUc7WUFDekMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELHdEQUF3RDtRQUN4RCxNQUFNLGdCQUFnQixHQUEyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRyxJQUFLLGdCQUFnQixFQUFHO1lBQ3RCLHdDQUF3QztZQUN4QyxPQUFPLGdCQUFnQixDQUFDO1NBQ3pCO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sY0FBYyxHQUFrQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRixJQUFJLGNBQWMsRUFBRTtZQUNsQixzQ0FBc0M7WUFDdEMsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDbkM7UUFFRCxpREFBaUQ7UUFDakQsc0RBQXNEO1FBQ3RELG1DQUFtQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtnQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDUixDQUFDO1FBRUYsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNsRCxJQUFJLE1BQU0sR0FBcUIsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLDBDQUEwQztRQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDakUsSUFBSyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFHO2dCQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNqRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7OzRIQTlEVSwrQkFBK0I7Z0lBQS9CLCtCQUErQjsyRkFBL0IsK0JBQStCO2tCQUQzQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgZmluYWxpemUsIHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1NlcnZpY2UsIE5nSHR0cENhY2hpbmdIZWFkZXJzIH0gZnJvbSAnLi9uZy1odHRwLWNhY2hpbmcuc2VydmljZSc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdJbnRlcmNlcHRvclNlcnZpY2UgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNhY2hlU2VydmljZTogTmdIdHRwQ2FjaGluZ1NlcnZpY2UpIHt9XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgLy8gcnVuIGdhcmJhZ2UgY29sbGVjdG9yXG4gICAgdGhpcy5jYWNoZVNlcnZpY2UucnVuR2MoKTtcblxuICAgIC8vIERvbid0IGNhY2hlIGlmIGl0J3Mgbm90IGNhY2hlYWJsZVxuICAgIGlmICggIXRoaXMuY2FjaGVTZXJ2aWNlLmlzQ2FjaGVhYmxlKHJlcSkgKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdChyZXEsIG5leHQpO1xuICAgIH1cblxuICAgIC8vIENoZWNrZWQgaWYgdGhlcmUgaXMgcGVuZGluZyByZXNwb25zZSBmb3IgdGhpcyByZXF1ZXN0XG4gICAgY29uc3QgY2FjaGVkT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRGcm9tUXVldWUocmVxKTtcbiAgICBpZiAoIGNhY2hlZE9ic2VydmFibGUgKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnY2FjaGVkT2JzZXJ2YWJsZScsIHJlcSk7XG4gICAgICByZXR1cm4gY2FjaGVkT2JzZXJ2YWJsZTtcbiAgICB9XG5cbiAgICAvLyBDaGVja2VkIGlmIHRoZXJlIGlzIGNhY2hlZCByZXNwb25zZSBmb3IgdGhpcyByZXF1ZXN0XG4gICAgY29uc3QgY2FjaGVkUmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+IHwgdW5kZWZpbmVkID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0RnJvbUNhY2hlKHJlcSk7XG4gICAgaWYgKGNhY2hlZFJlc3BvbnNlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnY2FjaGVkUmVzcG9uc2UnLCByZXEpO1xuICAgICAgcmV0dXJuIG9mKGNhY2hlZFJlc3BvbnNlLmNsb25lKCkpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSByZXF1ZXN0IG9mIGdvaW5nIHRocm91Z2ggZm9yIGZpcnN0IHRpbWVcbiAgICAvLyB0aGVuIGxldCB0aGUgcmVxdWVzdCBwcm9jZWVkIGFuZCBjYWNoZSB0aGUgcmVzcG9uc2VcbiAgICAvLyBjb25zb2xlLmxvZygnc2VuZFJlcXVlc3QnLCByZXEpO1xuICAgIGNvbnN0IHNoYXJlZCA9IHRoaXMuc2VuZFJlcXVlc3QocmVxLCBuZXh0KS5waXBlKFxuICAgICAgdGFwKGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuYWRkVG9DYWNoZShyZXEsIGV2ZW50LmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgLy8gZGVsZXRlIHBlbmRpbmcgcmVxdWVzdFxuICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5kZWxldGVGcm9tUXVldWUocmVxKTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG5cbiAgICAvLyBhZGQgcGVuZGluZyByZXF1ZXN0IHRvIHF1ZXVlIGZvciBjYWNoZSBwYXJhbGxlbGwgcmVxdWVzdFxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmFkZFRvUXVldWUocmVxLCBzaGFyZWQpO1xuXG4gICAgcmV0dXJuIHNoYXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGh0dHAgcmVxdWVzdCAobmV4dCBoYW5kbGVyKVxuICAgKi9cbiAgc2VuZFJlcXVlc3QocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBsZXQgY2xvbmVkOiBIdHRwUmVxdWVzdDxhbnk+ID0gcmVxLmNsb25lKCk7XG4gICAgLy8gdHJpbSBjdXN0b20gaGVhZGVycyBiZWZvcmUgc2VuZCByZXF1ZXN0XG4gICAgT2JqZWN0LnZhbHVlcyhOZ0h0dHBDYWNoaW5nSGVhZGVycykuZm9yRWFjaChuZ0h0dHBDYWNoaW5nSGVhZGVycyA9PiB7XG4gICAgICBpZiAoIGNsb25lZC5oZWFkZXJzLmhhcyhuZ0h0dHBDYWNoaW5nSGVhZGVycykgKSB7XG4gICAgICAgIGNsb25lZCA9IGNsb25lZC5jbG9uZSh7IGhlYWRlcnM6IGNsb25lZC5oZWFkZXJzLmRlbGV0ZShuZ0h0dHBDYWNoaW5nSGVhZGVycykgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKGNsb25lZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,45 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HTTP_INTERCEPTORS } from '@angular/common/http';
3
+ import { NG_HTTP_CACHING_CONFIG, NgHttpCachingService, } from './ng-http-caching.service';
4
+ import { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';
5
+ import * as i0 from "@angular/core";
6
+ export class NgHttpCachingModule {
7
+ static forRoot(ngHttpCachingConfig) {
8
+ return {
9
+ ngModule: NgHttpCachingModule,
10
+ providers: [
11
+ {
12
+ provide: NG_HTTP_CACHING_CONFIG,
13
+ useValue: ngHttpCachingConfig,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ }
19
+ NgHttpCachingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
+ NgHttpCachingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingModule });
21
+ NgHttpCachingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingModule, providers: [
22
+ NgHttpCachingService,
23
+ {
24
+ provide: HTTP_INTERCEPTORS,
25
+ useClass: NgHttpCachingInterceptorService,
26
+ multi: true,
27
+ },
28
+ ], imports: [[]] });
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingModule, decorators: [{
30
+ type: NgModule,
31
+ args: [{
32
+ declarations: [],
33
+ imports: [],
34
+ providers: [
35
+ NgHttpCachingService,
36
+ {
37
+ provide: HTTP_INTERCEPTORS,
38
+ useClass: NgHttpCachingInterceptorService,
39
+ multi: true,
40
+ },
41
+ ],
42
+ exports: [],
43
+ }]
44
+ }] });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL25nLWh0dHAtY2FjaGluZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUNMLHNCQUFzQixFQUV0QixvQkFBb0IsR0FDckIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7QUFleEYsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixNQUFNLENBQUMsT0FBTyxDQUNaLG1CQUF5QztRQUV6QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLHNCQUFzQjtvQkFDL0IsUUFBUSxFQUFFLG1CQUFtQjtpQkFDOUI7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDOztnSEFiVSxtQkFBbUI7aUhBQW5CLG1CQUFtQjtpSEFBbkIsbUJBQW1CLGFBVm5CO1FBQ1Qsb0JBQW9CO1FBQ3BCO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixZQVJRLEVBQUU7MkZBV0EsbUJBQW1CO2tCQWIvQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxFQUFFO29CQUNoQixPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUU7d0JBQ1Qsb0JBQW9CO3dCQUNwQjs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixRQUFRLEVBQUUsK0JBQStCOzRCQUN6QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxPQUFPLEVBQUUsRUFBRTtpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEhUVFBfSU5URVJDRVBUT1JTIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG4gIE5HX0hUVFBfQ0FDSElOR19DT05GSUcsXHJcbiAgTmdIdHRwQ2FjaGluZ0NvbmZpZyxcclxuICBOZ0h0dHBDYWNoaW5nU2VydmljZSxcclxufSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ0ludGVyY2VwdG9yU2VydmljZSB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLWludGVyY2VwdG9yLnNlcnZpY2UnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtdLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgTmdIdHRwQ2FjaGluZ1NlcnZpY2UsXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxyXG4gICAgICB1c2VDbGFzczogTmdIdHRwQ2FjaGluZ0ludGVyY2VwdG9yU2VydmljZSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChcclxuICAgIG5nSHR0cENhY2hpbmdDb25maWc/OiBOZ0h0dHBDYWNoaW5nQ29uZmlnXHJcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOZ0h0dHBDYWNoaW5nTW9kdWxlPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogTmdIdHRwQ2FjaGluZ01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogTkdfSFRUUF9DQUNISU5HX0NPTkZJRyxcclxuICAgICAgICAgIHVzZVZhbHVlOiBuZ0h0dHBDYWNoaW5nQ29uZmlnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,265 @@
1
+ import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';
2
+ import { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';
3
+ import * as i0 from "@angular/core";
4
+ export const NG_HTTP_CACHING_CONFIG = new InjectionToken('ng-http-caching.config');
5
+ export var NgHttpCachingStrategy;
6
+ (function (NgHttpCachingStrategy) {
7
+ // eslint-disable-next-line no-unused-vars
8
+ NgHttpCachingStrategy["ALLOW_ALL"] = "ALLOW_ALL";
9
+ // eslint-disable-next-line no-unused-vars
10
+ NgHttpCachingStrategy["DISALLOW_ALL"] = "DISALLOW_ALL";
11
+ })(NgHttpCachingStrategy || (NgHttpCachingStrategy = {}));
12
+ export var NgHttpCachingHeaders;
13
+ (function (NgHttpCachingHeaders) {
14
+ // eslint-disable-next-line no-unused-vars
15
+ NgHttpCachingHeaders["ALLOW_CACHE"] = "X-NG-HTTP-CACHING-ALLOW-CACHE";
16
+ // eslint-disable-next-line no-unused-vars
17
+ NgHttpCachingHeaders["DISALLOW_CACHE"] = "X-NG-HTTP-CACHING-DISALLOW-CACHE";
18
+ // eslint-disable-next-line no-unused-vars
19
+ NgHttpCachingHeaders["LIFETIME"] = "X-NG-HTTP-CACHING-LIFETIME";
20
+ // eslint-disable-next-line no-unused-vars
21
+ NgHttpCachingHeaders["TAG"] = "X-NG-HTTP-CACHING-TAG";
22
+ })(NgHttpCachingHeaders || (NgHttpCachingHeaders = {}));
23
+ export const NgHttpCachingConfigDefault = {
24
+ store: new NgHttpCachingMemoryStorage(),
25
+ lifetime: 60 * 60 * 100,
26
+ allowedMethod: ['GET'],
27
+ cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,
28
+ };
29
+ export class NgHttpCachingService {
30
+ constructor(config) {
31
+ this.queue = new Map();
32
+ this.config = NgHttpCachingConfigDefault;
33
+ if (config) {
34
+ this.config = { ...NgHttpCachingConfigDefault, ...config };
35
+ }
36
+ }
37
+ /**
38
+ * Return the config
39
+ */
40
+ getConfig() {
41
+ return this.config;
42
+ }
43
+ /**
44
+ * Return the queue map
45
+ */
46
+ getQueue() {
47
+ return this.queue;
48
+ }
49
+ /**
50
+ * Return the cache store
51
+ */
52
+ getStore() {
53
+ return this.config.store;
54
+ }
55
+ /**
56
+ * Return response from cache
57
+ */
58
+ getFromCache(req) {
59
+ const key = this.getKey(req);
60
+ const cached = this.config.store?.get(key);
61
+ if (!cached) {
62
+ return undefined;
63
+ }
64
+ if (this.isExpired(cached)) {
65
+ this.clearCacheByKey(key);
66
+ return undefined;
67
+ }
68
+ return cached.response;
69
+ }
70
+ /**
71
+ * Add response to cache
72
+ */
73
+ addToCache(req, res) {
74
+ const key = this.getKey(req);
75
+ const entry = {
76
+ url: req.urlWithParams,
77
+ response: res,
78
+ request: req,
79
+ addedTime: Date.now(),
80
+ };
81
+ if (this.isValid(entry)) {
82
+ this.config.store?.set(key, entry);
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ /**
88
+ * Delete response from cache
89
+ */
90
+ deleteFromCache(req) {
91
+ const key = this.getKey(req);
92
+ return this.clearCacheByKey(key);
93
+ }
94
+ /**
95
+ * Clear the cache
96
+ */
97
+ clearCache() {
98
+ this.config.store?.clear();
99
+ }
100
+ /**
101
+ * Clear the cache by key
102
+ */
103
+ clearCacheByKey(key) {
104
+ return this.config.store.delete(key);
105
+ }
106
+ /**
107
+ * Clear the cache by regex
108
+ */
109
+ clearCacheByRegex(regex) {
110
+ this.config.store.forEach((entry, key) => {
111
+ if (regex.test(key)) {
112
+ this.clearCacheByKey(key);
113
+ }
114
+ });
115
+ }
116
+ /**
117
+ * Clear the cache by TAG
118
+ */
119
+ clearCacheByTag(tag) {
120
+ this.config.store.forEach((entry, key) => {
121
+ const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);
122
+ if (tagHeader && tagHeader.split(',').includes(tag)) {
123
+ this.clearCacheByKey(key);
124
+ }
125
+ });
126
+ }
127
+ /**
128
+ * Run garbage collector (delete expired cache entry)
129
+ */
130
+ runGc() {
131
+ this.config.store.forEach((entry, key) => {
132
+ if (this.isExpired(entry)) {
133
+ this.clearCacheByKey(key);
134
+ }
135
+ });
136
+ }
137
+ /**
138
+ * Return true if cache entry is expired
139
+ */
140
+ isExpired(entry) {
141
+ // if user provide custom method, use it
142
+ if (typeof this.config.isExpired === 'function') {
143
+ const result = this.config.isExpired(entry);
144
+ // if result is undefined, normal behaviour is provided
145
+ if (typeof result !== 'undefined') {
146
+ return result;
147
+ }
148
+ }
149
+ // config/default lifetime
150
+ let lifetime = this.config.lifetime;
151
+ // request has own lifetime
152
+ if (entry.request.headers.has(NgHttpCachingHeaders.LIFETIME)) {
153
+ lifetime = +(entry.request.headers.get(NgHttpCachingHeaders.LIFETIME) || '');
154
+ }
155
+ // never expire if 0
156
+ if (lifetime === 0) {
157
+ return false;
158
+ }
159
+ // wrong lifetime
160
+ if (lifetime < 0) {
161
+ throw new Error('lifetime must be greater than or equal 0');
162
+ }
163
+ return entry.addedTime + lifetime < Date.now();
164
+ }
165
+ /**
166
+ * Return true if cache entry is valid for store in the cache
167
+ */
168
+ isValid(entry) {
169
+ // if user provide custom method, use it
170
+ if (typeof this.config.isValid === 'function') {
171
+ const result = this.config.isValid(entry);
172
+ // if result is undefined, normal behaviour is provided
173
+ if (typeof result !== 'undefined') {
174
+ return result;
175
+ }
176
+ }
177
+ return true;
178
+ }
179
+ /**
180
+ * Return true if the request is cacheable
181
+ */
182
+ isCacheable(req) {
183
+ // if user provide custom method, use it
184
+ if (typeof this.config.isCacheable === 'function') {
185
+ const result = this.config.isCacheable(req);
186
+ // if result is undefined, normal behaviour is provided
187
+ if (typeof result !== 'undefined') {
188
+ return result;
189
+ }
190
+ }
191
+ // request has disallow cache header
192
+ if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {
193
+ return false;
194
+ }
195
+ // strategy is disallow all...
196
+ if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {
197
+ // request isn't allowed if come without allow header
198
+ if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {
199
+ return false;
200
+ }
201
+ }
202
+ // if allowed method is only ALL, allow all http methos
203
+ if (this.config.allowedMethod) {
204
+ if (this.config.allowedMethod.length === 1) {
205
+ if (this.config.allowedMethod[0] === 'ALL') {
206
+ return true;
207
+ }
208
+ }
209
+ // request is allowed if method is in allowedMethod
210
+ return this.config.allowedMethod.indexOf(req.method) !== -1;
211
+ }
212
+ return true;
213
+ }
214
+ /**
215
+ * Return the cache key
216
+ */
217
+ getKey(req) {
218
+ // if user provide custom method, use it
219
+ if (typeof this.config.getKey === 'function') {
220
+ const result = this.config.getKey(req);
221
+ // if result is undefined, normal behaviour is provided
222
+ if (typeof result !== 'undefined') {
223
+ return result;
224
+ }
225
+ }
226
+ // default key id is url with query parameters
227
+ return req.urlWithParams;
228
+ }
229
+ /**
230
+ * Return observable from cache
231
+ */
232
+ getFromQueue(req) {
233
+ const key = this.getKey(req);
234
+ const cached = this.queue.get(key);
235
+ if (!cached) {
236
+ return undefined;
237
+ }
238
+ return cached;
239
+ }
240
+ /**
241
+ * Add observable to cache
242
+ */
243
+ addToQueue(req, obs) {
244
+ const key = this.getKey(req);
245
+ this.queue.set(key, obs);
246
+ }
247
+ /**
248
+ * Delete observable from cache
249
+ */
250
+ deleteFromQueue(req) {
251
+ const key = this.getKey(req);
252
+ return this.queue.delete(key);
253
+ }
254
+ }
255
+ NgHttpCachingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingService, deps: [{ token: NG_HTTP_CACHING_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
256
+ NgHttpCachingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingService });
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NgHttpCachingService, decorators: [{
258
+ type: Injectable
259
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
260
+ type: Inject,
261
+ args: [NG_HTTP_CACHING_CONFIG]
262
+ }, {
263
+ type: Optional
264
+ }] }]; } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOztBQVN0RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxxQkFLWDtBQUxELFdBQVkscUJBQXFCO0lBQy9CLDBDQUEwQztJQUMxQyxnREFBdUIsQ0FBQTtJQUN2QiwwQ0FBMEM7SUFDMUMsc0RBQTZCLENBQUE7QUFDL0IsQ0FBQyxFQUxXLHFCQUFxQixLQUFyQixxQkFBcUIsUUFLaEM7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFTWDtBQVRELFdBQVksb0JBQW9CO0lBQzlCLDBDQUEwQztJQUMxQyxxRUFBNkMsQ0FBQTtJQUM3QywwQ0FBMEM7SUFDMUMsMkVBQW1ELENBQUE7SUFDbkQsMENBQTBDO0lBQzFDLCtEQUF1QyxDQUFBO0lBQ3ZDLDBDQUEwQztJQUMxQyxxREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBVFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQVMvQjtBQWdCRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBd0I7SUFDN0QsS0FBSyxFQUFFLElBQUksMEJBQTBCLEVBQUU7SUFDdkMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRztJQUN2QixhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDdEIsYUFBYSxFQUFFLHFCQUFxQixDQUFDLFNBQVM7Q0FDL0MsQ0FBQztBQUdG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Q0FBQzthQUNmO1NBQ0Y7UUFDRCw4Q0FBOEM7UUFDOUMsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxHQUFxQjtRQUNoQyxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUEyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsR0FBcUIsRUFBRSxHQUErQjtRQUMvRCxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsR0FBcUI7UUFDbkMsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7O2lIQTVQVSxvQkFBb0Isa0JBT3JCLHNCQUFzQjtxSEFQckIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQVFOLE1BQU07MkJBQUMsc0JBQXNCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9PYnNlcnZhYmxlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ01lbW9yeVN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLW1lbW9yeS1zdG9yYWdlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0VudHJ5IHtcclxuICB1cmw6IHN0cmluZztcclxuICByZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT47XHJcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PjtcclxuICBhZGRlZFRpbWU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdIdHRwQ2FjaGluZ0NvbmZpZz4oXHJcbiAgJ25nLWh0dHAtY2FjaGluZy5jb25maWcnXHJcbik7XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIEFMTE9XX0FMTCA9ICdBTExPV19BTEwnLFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIERJU0FMTE9XX0FMTCA9ICdESVNBTExPV19BTEwnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nSGVhZGVycyB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgQUxMT1dfQ0FDSEUgPSAnWC1ORy1IVFRQLUNBQ0hJTkctQUxMT1ctQ0FDSEUnLFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIERJU0FMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLURJU0FMTE9XLUNBQ0hFJyxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBMSUZFVElNRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1MSUZFVElNRScsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgVEFHID0gJ1gtTkctSFRUUC1DQUNISU5HLVRBRycsXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICBzdG9yZT86IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIGxpZmV0aW1lPzogbnVtYmVyO1xyXG4gIGFsbG93ZWRNZXRob2Q/OiBzdHJpbmdbXTtcclxuICBjYWNoZVN0cmF0ZWd5PzogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5O1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGlzRXhwaXJlZD86IChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGlzQ2FjaGVhYmxlPzogKHJlcTogSHR0cFJlcXVlc3Q8YW55PikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBnZXRLZXk/OiAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgaXNWYWxpZD86IChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQ6IE5nSHR0cENhY2hpbmdDb25maWcgPSB7XHJcbiAgc3RvcmU6IG5ldyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSgpLFxyXG4gIGxpZmV0aW1lOiA2MCAqIDYwICogMTAwLFxyXG4gIGFsbG93ZWRNZXRob2Q6IFsnR0VUJ10sXHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTCxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWc6IE5nSHR0cENhY2hpbmdDb25maWcgPSBOZ0h0dHBDYWNoaW5nQ29uZmlnRGVmYXVsdDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KE5HX0hUVFBfQ0FDSElOR19DT05GSUcpIEBPcHRpb25hbCgpIGNvbmZpZzogTmdIdHRwQ2FjaGluZ0NvbmZpZ1xyXG4gICkge1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQsIC4uLmNvbmZpZyB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjb25maWdcclxuICAgKi9cclxuICBnZXRDb25maWcoKTogTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHF1ZXVlIG1hcFxyXG4gICAqL1xyXG4gIGdldFF1ZXVlKCk6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY2FjaGUgc3RvcmVcclxuICAgKi9cclxuICBnZXRTdG9yZSgpOiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc3RvcmUgYXMgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGdldEZyb21DYWNoZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBIdHRwUmVzcG9uc2U8YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE5nSHR0cENhY2hpbmdFbnRyeSB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLnN0b3JlPy5nZXQoa2V5KTtcclxuXHJcbiAgICBpZiAoIWNhY2hlZCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRXhwaXJlZChjYWNoZWQpKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNhY2hlZC5yZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCByZXNwb25zZSB0byBjYWNoZVxyXG4gICAqL1xyXG4gIGFkZFRvQ2FjaGUocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCByZXM6IEh0dHBSZXNwb25zZTxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5ID0ge1xyXG4gICAgICB1cmw6IHJlcS51cmxXaXRoUGFyYW1zLFxyXG4gICAgICByZXNwb25zZTogcmVzLFxyXG4gICAgICByZXF1ZXN0OiByZXEsXHJcbiAgICAgIGFkZGVkVGltZTogRGF0ZS5ub3coKSxcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkKGVudHJ5KSkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zdG9yZT8uc2V0KGtleSwgZW50cnkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSByZXNwb25zZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZGVsZXRlRnJvbUNhY2hlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGVcclxuICAgKi9cclxuICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmU/LmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGUgYnkga2V5XHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZUJ5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLnN0b3JlIGFzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlKS5kZWxldGUoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSByZWdleFxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVJlZ2V4KHJlZ2V4OiBSZWdFeHApOiB2b2lkIHtcclxuICAgICh0aGlzLmNvbmZpZy5zdG9yZSBhcyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSkuZm9yRWFjaCgoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IFRBR1xyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVRhZyh0YWc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgKHRoaXMuY29uZmlnLnN0b3JlIGFzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlKS5mb3JFYWNoKChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCB0YWdIZWFkZXIgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLlRBRyk7XHJcbiAgICAgIGlmICh0YWdIZWFkZXIgJiYgdGFnSGVhZGVyLnNwbGl0KCcsJykuaW5jbHVkZXModGFnKSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUnVuIGdhcmJhZ2UgY29sbGVjdG9yIChkZWxldGUgZXhwaXJlZCBjYWNoZSBlbnRyeSlcclxuICAgKi9cclxuICBydW5HYygpOiB2b2lkIHtcclxuICAgICh0aGlzLmNvbmZpZy5zdG9yZSBhcyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSkuZm9yRWFjaCgoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNFeHBpcmVkKGVudHJ5KSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgY2FjaGUgZW50cnkgaXMgZXhwaXJlZFxyXG4gICAqL1xyXG4gIGlzRXhwaXJlZChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5KTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmlzRXhwaXJlZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0V4cGlyZWQoZW50cnkpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbmZpZy9kZWZhdWx0IGxpZmV0aW1lXHJcbiAgICBsZXQgbGlmZXRpbWUgPSB0aGlzLmNvbmZpZy5saWZldGltZTtcclxuICAgIC8vIHJlcXVlc3QgaGFzIG93biBsaWZldGltZVxyXG4gICAgaWYgKGVudHJ5LnJlcXVlc3QuaGVhZGVycy5oYXMoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuTElGRVRJTUUpKSB7XHJcbiAgICAgIGxpZmV0aW1lID0gKyhlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLkxJRkVUSU1FKSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgICAvLyBuZXZlciBleHBpcmUgaWYgMFxyXG4gICAgaWYgKGxpZmV0aW1lID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHdyb25nIGxpZmV0aW1lXHJcbiAgICBpZiAoKGxpZmV0aW1lIGFzIG51bWJlcikgPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGlmZXRpbWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgMCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudHJ5LmFkZGVkVGltZSArIChsaWZldGltZSBhcyBudW1iZXIpIDwgRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIHZhbGlkIGZvciBzdG9yZSBpbiB0aGUgY2FjaGVcclxuICAgKi9cclxuICBpc1ZhbGlkKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnkpOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc1ZhbGlkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIGlzQ2FjaGVhYmxlKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaGFzIGRpc2FsbG93IGNhY2hlIGhlYWRlclxyXG4gICAgaWYgKHJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5ESVNBTExPV19DQUNIRSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RyYXRlZ3kgaXMgZGlzYWxsb3cgYWxsLi4uXHJcbiAgICBpZiAodGhpcy5jb25maWcuY2FjaGVTdHJhdGVneSA9PT0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTCkge1xyXG4gICAgICAvLyByZXF1ZXN0IGlzbid0IGFsbG93ZWQgaWYgY29tZSB3aXRob3V0IGFsbG93IGhlYWRlclxyXG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5BTExPV19DQUNIRSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIGFsbG93ZWQgbWV0aG9kIGlzIG9ubHkgQUxMLCBhbGxvdyBhbGwgaHR0cCBtZXRob3NcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kWzBdID09PSAnQUxMJykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHJlcXVlc3QgaXMgYWxsb3dlZCBpZiBtZXRob2QgaXMgaW4gYWxsb3dlZE1ldGhvZFxyXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZC5pbmRleE9mKHJlcS5tZXRob2QpICE9PSAtMTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBrZXlcclxuICAgKi9cclxuICBnZXRLZXkocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuZ2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmdldEtleShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRlZmF1bHQga2V5IGlkIGlzIHVybCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnNcclxuICAgIHJldHVybiByZXEudXJsV2l0aFBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tUXVldWUocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgY2FjaGVkOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB8IHVuZGVmaW5lZCA9IHRoaXMucXVldWUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9ic2VydmFibGUgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb1F1ZXVlKHJlcTogSHR0cFJlcXVlc3Q8YW55Piwgb2JzOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgdGhpcy5xdWV1ZS5zZXQoa2V5LCBvYnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIG9ic2VydmFibGUgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21RdWV1ZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,28 @@
1
+ export class NgHttpCachingMemoryStorage {
2
+ constructor() {
3
+ this.store = new Map();
4
+ }
5
+ get size() {
6
+ return this.store.size;
7
+ }
8
+ clear() {
9
+ this.store.clear();
10
+ }
11
+ delete(key) {
12
+ return this.store.delete(key);
13
+ }
14
+ // eslint-disable-next-line no-unused-vars
15
+ forEach(callbackfn) {
16
+ return this.store.forEach(callbackfn);
17
+ }
18
+ get(key) {
19
+ return this.store.get(key);
20
+ }
21
+ has(key) {
22
+ return this.store.has(key);
23
+ }
24
+ set(key, value) {
25
+ this.store.set(key, value);
26
+ }
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLW1lbW9yeS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaHR0cC1jYWNoaW5nL3NyYy9saWIvc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctbWVtb3J5LXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLDBCQUEwQjtJQUF2QztRQU1ZLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQTBCMUQsQ0FBQztJQTlCRyxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFJRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsT0FBTyxDQUFDLFVBQTREO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQXlCO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ0VudHJ5IH0gZnJvbSAnLi4vbmctaHR0cC1jYWNoaW5nLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlIGltcGxlbWVudHMgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2Uge1xyXG5cclxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0b3JlID0gbmV3IE1hcDxzdHJpbmcsIE5nSHR0cENhY2hpbmdFbnRyeT4oKTtcclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5LCBrZXk6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmZvckVhY2goY2FsbGJhY2tmbik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleTogc3RyaW5nKTogTmdIdHRwQ2FjaGluZ0VudHJ5IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3JlLnNldChrZXksIHZhbHVlKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaHR0cC1jYWNoaW5nL3NyYy9saWIvc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2Uge1xyXG5cclxuICAgIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcclxuXHJcbiAgICBjbGVhcigpOiB2b2lkO1xyXG5cclxuICAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW47XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xyXG5cclxuICAgIGdldChrZXk6IHN0cmluZyk6IE5nSHR0cENhY2hpbmdFbnRyeSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuO1xyXG5cclxuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSk6IHZvaWQ7XHJcbn1cclxuIl19