ng-http-caching 1.0.13 → 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.
Files changed (28) hide show
  1. package/README.md +228 -16
  2. package/esm2020/lib/ng-http-caching-interceptor.service.mjs +66 -0
  3. package/esm2020/lib/ng-http-caching.module.mjs +45 -0
  4. package/esm2020/lib/ng-http-caching.service.mjs +265 -0
  5. package/esm2020/lib/storage/ng-http-caching-memory-storage.mjs +28 -0
  6. package/esm2020/lib/storage/ng-http-caching-storage.interface.mjs +2 -0
  7. package/{esm2015/ng-http-caching.js → esm2020/ng-http-caching.mjs} +0 -0
  8. package/esm2020/public-api.mjs +9 -0
  9. package/fesm2015/ng-http-caching.mjs +410 -0
  10. package/fesm2015/ng-http-caching.mjs.map +1 -0
  11. package/{fesm2015/ng-http-caching.js → fesm2020/ng-http-caching.mjs} +104 -56
  12. package/fesm2020/ng-http-caching.mjs.map +1 -0
  13. package/lib/ng-http-caching-interceptor.service.d.ts +2 -2
  14. package/lib/ng-http-caching.module.d.ts +3 -2
  15. package/lib/ng-http-caching.service.d.ts +14 -5
  16. package/lib/storage/ng-http-caching-memory-storage.d.ts +12 -0
  17. package/lib/storage/ng-http-caching-storage.interface.d.ts +10 -0
  18. package/package.json +24 -14
  19. package/public-api.d.ts +2 -0
  20. package/bundles/ng-http-caching.umd.js +0 -385
  21. package/bundles/ng-http-caching.umd.js.map +0 -1
  22. package/bundles/ng-http-caching.umd.min.js +0 -2
  23. package/bundles/ng-http-caching.umd.min.js.map +0 -1
  24. package/esm2015/lib/ng-http-caching-interceptor.service.js +0 -65
  25. package/esm2015/lib/ng-http-caching.module.js +0 -44
  26. package/esm2015/lib/ng-http-caching.service.js +0 -247
  27. package/esm2015/public-api.js +0 -7
  28. package/fesm2015/ng-http-caching.js.map +0 -1
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # NgHttpCaching [![Build Status](https://travis-ci.org/nigrosimone/ng-http-caching.svg?branch=master)](https://travis-ci.com/github/nigrosimone/ng-http-caching) [![Coverage Status](https://coveralls.io/repos/github/nigrosimone/ng-http-caching/badge.svg?branch=master)](https://coveralls.io/github/nigrosimone/ng-http-caching?branch=master)
1
+ # NgHttpCaching [![Build Status](https://travis-ci.org/nigrosimone/ng-http-caching.svg?branch=master)](https://travis-ci.com/github/nigrosimone/ng-http-caching) [![Coverage Status](https://coveralls.io/repos/github/nigrosimone/ng-http-caching/badge.svg?branch=master)](https://coveralls.io/github/nigrosimone/ng-http-caching?branch=master) [![NPM version](https://img.shields.io/npm/v/ng-http-caching.svg)](https://www.npmjs.com/package/ng-http-caching)
2
2
 
3
3
  Cache for HTTP requests in Angular application.
4
4
 
5
- # Description
5
+ ## Description
6
6
 
7
7
  Sometime there is a need to cache the HTTP requests so that browser doesn’t have to hit server to fetch same data when same service is invoked serially or in parallel. `NgHttpCaching` intercept all request are made, try to retrieve a cached instance of the response and then return the cached response or send the request to the backend. Once the operation has completed cache the response.
8
8
 
@@ -14,10 +14,11 @@ See the [stackblitz demo](https://stackblitz.com/edit/demo-ng-http-caching?file=
14
14
  ✅ Handles simultaneous/parallel requests<br>
15
15
  ✅ Automatic garbage collector of cache<br>
16
16
  ✅ More than 90% unit tested<br>
17
+ ✅ Custom cache storage<br>
17
18
 
18
- # Get Started
19
+ ## Get Started
19
20
 
20
- *Step 1*: intall `ng-http-caching`
21
+ *Step 1*: install `ng-http-caching`
21
22
 
22
23
  ```bash
23
24
  npm i ng-http-caching
@@ -62,7 +63,7 @@ import { NgHttpCachingModule, NgHttpCachingConfig } from 'ng-http-caching';
62
63
 
63
64
  // your config...
64
65
  const ngHttpCachingConfig: NgHttpCachingConfig = {
65
- lifetime: 1000 * 10; // cache expire after 10 seconds
66
+ lifetime: 1000 * 10 // cache expire after 10 seconds
66
67
  };
67
68
 
68
69
  @NgModule({
@@ -80,7 +81,7 @@ const ngHttpCachingConfig: NgHttpCachingConfig = {
80
81
  export class AppModule { }
81
82
  ```
82
83
 
83
- ### Config
84
+ ## Config
84
85
 
85
86
  This is all the configuration interface, see below for the detail of each config.
86
87
 
@@ -90,6 +91,7 @@ export interface NgHttpCachingConfig {
90
91
  lifetime?: number;
91
92
  allowedMethod?: string[];
92
93
  cacheStrategy?: NgHttpCachingStrategy;
94
+ store?: NgHttpCachingStorageInterface;
93
95
  isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;
94
96
  isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;
95
97
  isCacheable?: (req: HttpRequest<any>) => boolean | undefined;
@@ -114,6 +116,21 @@ Set the cache strategy, possible strategies are:
114
116
  - `NgHttpCachingStrategy.ALLOW_ALL`: All request are cacheable if HTTP method is into `allowedMethod`;
115
117
  - `NgHttpCachingStrategy.DISALLOW_ALL`: Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`;
116
118
 
119
+ ### store (class of NgHttpCachingStorageInterface - default: NgHttpCachingMemoryStorage)
120
+ Set the cache store. You can imlement your custom store by implement the `NgHttpCachingStorageInterface` interface, eg.:
121
+
122
+ ```ts
123
+ import { NgHttpCachingConfig, NgHttpCachingStorageInterface } from 'ng-http-caching';
124
+
125
+ class MyCustomStore implements NgHttpCachingStorageInterface {
126
+ // ... your logic
127
+ }
128
+
129
+ const ngHttpCachingConfig: NgHttpCachingConfig = {
130
+ store: new MyCustomStore(),
131
+ };
132
+ ```
133
+
117
134
  ### isExpired (function - default see NgHttpCachingService.isExpired());
118
135
  If this function return `true` the request is expired and a new request is send to backend, if return `false` isn't expired.
119
136
  If the result is `undefined`, the normal behaviour is provided.
@@ -198,7 +215,176 @@ const ngHttpCachingConfig: NgHttpCachingConfig = {
198
215
  };
199
216
  ```
200
217
 
201
- ## Example: exclude specific request from cache
218
+ ## Headers
219
+
220
+ `NgHttpCaching` use some custom headers for customize the caching behaviour.
221
+ The supported headers are exported from the enum `NgHttpCachingHeaders`:
222
+
223
+ ```ts
224
+ export enum NgHttpCachingHeaders {
225
+ ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',
226
+ DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',
227
+ LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',
228
+ TAG = 'X-NG-HTTP-CACHING-TAG',
229
+ }
230
+ ```
231
+
232
+ All those headers are removed before send the request to the backend.
233
+
234
+ ### X-NG-HTTP-CACHING-ALLOW-CACHE (string: any value);
235
+
236
+ If you have choose the `DISALLOW_ALL` cache strategy, you can mark specific request as cacheable by adding the header `X-NG-HTTP-CACHING-ALLOW-CACHE`, eg.:
237
+
238
+ ```ts
239
+ this.http.get('https://my-json-server.typicode.com/typicode/demo/db', {
240
+ headers: {
241
+ [NgHttpCachingHeaders.ALLOW_ALL]: '1',
242
+ }
243
+ }).subscribe(e => console.log);
244
+ ```
245
+
246
+ ### X-NG-HTTP-CACHING-DISALLOW-CACHE (string: any value);
247
+
248
+ You can disallow specific request by add the header `X-NG-HTTP-CACHING-DISALLOW-CACHE`, eg.:
249
+
250
+ ```ts
251
+ this.http.get('https://my-json-server.typicode.com/typicode/demo/db', {
252
+ headers: {
253
+ [NgHttpCachingHeaders.DISALLOW_CACHE]: '1',
254
+ }
255
+ }).subscribe(e => console.log);
256
+ ```
257
+
258
+ ### X-NG-HTTP-CACHING-LIFETIME (string: number of millisecond);
259
+
260
+ You can set specific lifetime for request by add the header `X-NG-HTTP-CACHING-LIFETIME` with a string value as the number of millisecond, eg.:
261
+
262
+ ```ts
263
+ this.http.get('https://my-json-server.typicode.com/typicode/demo/db', {
264
+ headers: {
265
+ [NgHttpCachingHeaders.LIFETIME]: (1000 * 60 * 60 * 24 * 365).toString(), // one year
266
+ }
267
+ }).subscribe(e => console.log);
268
+ ```
269
+
270
+ ### X-NG-HTTP-CACHING-TAG (string: tag name);
271
+
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: string)` for delete all the tagged request. Eg.:
274
+
275
+ ```ts
276
+ this.http.get('https://my-json-server.typicode.com/typicode/demo/db?id=1', {
277
+ headers: {
278
+ [NgHttpCachingHeaders.TAG]: 'foo',
279
+ }
280
+ }).subscribe(e => console.log);
281
+ ```
282
+
283
+ ## Cache service
284
+
285
+ You can inject into your component the `NgHttpCachingService` that expose some utils methods:
286
+
287
+ ```ts
288
+ export class NgHttpCachingService {
289
+
290
+ /**
291
+ * Return the config
292
+ */
293
+ getConfig(): NgHttpCachingConfig;
294
+
295
+ /**
296
+ * Return the queue map
297
+ */
298
+ getQueue(): Map<string, Observable<HttpEvent<any>>>;
299
+
300
+ /**
301
+ * Return the cache store
302
+ */
303
+ getStore(): NgHttpCachingStorageInterface;
304
+
305
+ /**
306
+ * Return response from cache
307
+ */
308
+ getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined;
309
+
310
+ /**
311
+ * Add response to cache
312
+ */
313
+ addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean;
314
+
315
+ /**
316
+ * Delete response from cache
317
+ */
318
+ deleteFromCache(req: HttpRequest<any>): boolean;
319
+
320
+ /**
321
+ * Clear the cache
322
+ */
323
+ clearCache(): void;
324
+
325
+ /**
326
+ * Clear the cache by key
327
+ */
328
+ clearCacheByKey(key: string): boolean;
329
+
330
+ /**
331
+ * Clear the cache by regex
332
+ */
333
+ clearCacheByRegex(regex: RegExp): void;
334
+
335
+ /**
336
+ * Clear the cache by TAG
337
+ */
338
+ clearCacheByTag(tag: string): void;
339
+
340
+ /**
341
+ * Run garbage collector (delete expired cache entry)
342
+ */
343
+ runGc(): void;
344
+
345
+ /**
346
+ * Return true if cache entry is expired
347
+ */
348
+ isExpired(entry: NgHttpCachingEntry): boolean;
349
+
350
+ /**
351
+ * Return true if cache entry is valid for store in the cache
352
+ */
353
+ isValid(entry: NgHttpCachingEntry): boolean;
354
+
355
+ /**
356
+ * Return true if the request is cacheable
357
+ */
358
+ isCacheable(req: HttpRequest<any>): boolean;
359
+
360
+ /**
361
+ * Return the cache key
362
+ */
363
+ getKey(req: HttpRequest<any>): string;
364
+
365
+ /**
366
+ * Return observable from cache
367
+ */
368
+ getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined;
369
+
370
+ /**
371
+ * Add observable to cache
372
+ */
373
+ addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void;
374
+
375
+ /**
376
+ * Delete observable from cache
377
+ */
378
+ deleteFromQueue(req: HttpRequest<any>): boolean;
379
+
380
+ }
381
+ ```
382
+
383
+ ## Examples
384
+
385
+ Below there are some examples of use case.
386
+
387
+ ### Example: exclude specific request from cache
202
388
 
203
389
  You can disallow specific request by add the header `X-NG-HTTP-CACHING-DISALLOW-CACHE`, eg.:
204
390
 
@@ -228,7 +414,7 @@ export class AppComponent implements OnInit {
228
414
  }
229
415
  ```
230
416
 
231
- ## Example: set specific lifetime for request
417
+ ### Example: set specific lifetime for request
232
418
 
233
419
  You can set specific lifetime for request by add the header `X-NG-HTTP-CACHING-LIFETIME` with a string value as the number of millisecond, eg.:
234
420
 
@@ -258,7 +444,7 @@ export class AppComponent implements OnInit {
258
444
  }
259
445
  ```
260
446
 
261
- ## Example: mark specific request as cacheable (if cache strategy is DISALLOW_ALL)
447
+ ### Example: mark specific request as cacheable (if cache strategy is DISALLOW_ALL)
262
448
 
263
449
  If you have choose the `DISALLOW_ALL` cache strategy, you can mark specific request as cacheable by adding the header `X-NG-HTTP-CACHING-ALLOW-CACHE`, eg.:
264
450
 
@@ -288,7 +474,7 @@ export class AppComponent implements OnInit {
288
474
  }
289
475
  ```
290
476
 
291
- ## Example: clear/flush all the cache
477
+ ### Example: clear/flush all the cache
292
478
 
293
479
  If user switch the account (logout/login) or the application language, maybe ca be necessary clear all the cache, eg.:
294
480
 
@@ -312,7 +498,7 @@ export class AppComponent {
312
498
  }
313
499
  ```
314
500
 
315
- ## Example: clear/flush specific cache entry
501
+ ### Example: clear/flush specific cache entry
316
502
 
317
503
  If you want delete some cache entry, eg.:
318
504
 
@@ -336,7 +522,7 @@ export class AppComponent {
336
522
  }
337
523
  ```
338
524
 
339
- ## Example: clear/flush specific cache entry by RegEx
525
+ ### Example: clear/flush specific cache entry by RegEx
340
526
 
341
527
  If you want delete some cache entry by RegEx, eg.:
342
528
 
@@ -360,10 +546,11 @@ export class AppComponent {
360
546
  }
361
547
  ```
362
548
 
363
- ## Example: TAG request and clear/flush specific cache entry by TAG
549
+ ### Example: TAG request and clear/flush specific cache entry by TAG
364
550
 
365
- You can tag multiple request by adding special header `'X-NG-HTTP-CACHING-TAG'` with the same tag and
366
- using `NgHttpCachingService.clearCacheByTag(tag: syting)` for delete all the tagged request. Eg.:
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:
553
+ )` for delete all the tagged request. Eg.:
367
554
 
368
555
  ```ts
369
556
  import { Component, OnInit } from '@angular/core';
@@ -402,4 +589,29 @@ export class AppComponent {
402
589
  this.ngHttpCachingService.clearCacheByTag('foo');
403
590
  }
404
591
  }
405
- ```
592
+ ```
593
+
594
+ ## Alternatives
595
+
596
+ Aren't you satisfied? there are some valid alternatives:
597
+
598
+ - [@ngneat/cashew](https://www.npmjs.com/package/@ngneat/cashew)
599
+ - [p3x-angular-http-cache-interceptor](https://www.npmjs.com/package/p3x-angular-http-cache-interceptor)
600
+ - [@d4h/angular-http-cache](https://www.npmjs.com/package/@d4h/angular-http-cache)
601
+
602
+
603
+ ## Support
604
+
605
+ This is an open-source project. Star this [repository](https://github.com/nigrosimone/ng-http-caching), if you like it, or even [donate](https://www.paypal.com/paypalme/snwp). Thank you so much!
606
+
607
+ ## My other libraries
608
+
609
+ I have published some other Angular libraries, take a look:
610
+
611
+ - [NgSimpleState: Simple state management in Angular with only Services and RxJS](https://www.npmjs.com/package/ng-simple-state)
612
+ - [NgPortal: Component property connection in Angular application](https://www.npmjs.com/package/ng-portal)
613
+ - [NgHttpCaching: Cache for HTTP requests in Angular application](https://www.npmjs.com/package/ng-http-caching)
614
+ - [NgGenericPipe: Generic pipe for Angular application](https://www.npmjs.com/package/ng-generic-pipe)
615
+ - [NgLet: Structural directive for sharing data as local variable into html component template](https://www.npmjs.com/package/ng-let)
616
+ - [NgLock: Angular decorator for lock a function and user interface while a task running](https://www.npmjs.com/package/ng-lock)
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=