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.
- package/README.md +228 -16
- package/esm2020/lib/ng-http-caching-interceptor.service.mjs +66 -0
- package/esm2020/lib/ng-http-caching.module.mjs +45 -0
- package/esm2020/lib/ng-http-caching.service.mjs +265 -0
- package/esm2020/lib/storage/ng-http-caching-memory-storage.mjs +28 -0
- package/esm2020/lib/storage/ng-http-caching-storage.interface.mjs +2 -0
- package/{esm2015/ng-http-caching.js → esm2020/ng-http-caching.mjs} +0 -0
- package/esm2020/public-api.mjs +9 -0
- package/fesm2015/ng-http-caching.mjs +410 -0
- package/fesm2015/ng-http-caching.mjs.map +1 -0
- package/{fesm2015/ng-http-caching.js → fesm2020/ng-http-caching.mjs} +104 -56
- package/fesm2020/ng-http-caching.mjs.map +1 -0
- package/lib/ng-http-caching-interceptor.service.d.ts +2 -2
- package/lib/ng-http-caching.module.d.ts +3 -2
- package/lib/ng-http-caching.service.d.ts +14 -5
- package/lib/storage/ng-http-caching-memory-storage.d.ts +12 -0
- package/lib/storage/ng-http-caching-storage.interface.d.ts +10 -0
- package/package.json +24 -14
- package/public-api.d.ts +2 -0
- package/bundles/ng-http-caching.umd.js +0 -385
- package/bundles/ng-http-caching.umd.js.map +0 -1
- package/bundles/ng-http-caching.umd.min.js +0 -2
- package/bundles/ng-http-caching.umd.min.js.map +0 -1
- package/esm2015/lib/ng-http-caching-interceptor.service.js +0 -65
- package/esm2015/lib/ng-http-caching.module.js +0 -44
- package/esm2015/lib/ng-http-caching.service.js +0 -247
- package/esm2015/public-api.js +0 -7
- package/fesm2015/ng-http-caching.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# NgHttpCaching [](https://travis-ci.com/github/nigrosimone/ng-http-caching) [](https://coveralls.io/github/nigrosimone/ng-http-caching?branch=master)
|
|
1
|
+
# NgHttpCaching [](https://travis-ci.com/github/nigrosimone/ng-http-caching) [](https://coveralls.io/github/nigrosimone/ng-http-caching?branch=master) [](https://www.npmjs.com/package/ng-http-caching)
|
|
2
2
|
|
|
3
3
|
Cache for HTTP requests in Angular application.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
19
|
+
## Get Started
|
|
19
20
|
|
|
20
|
-
*Step 1*:
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
549
|
+
### Example: TAG request and clear/flush specific cache entry by TAG
|
|
364
550
|
|
|
365
|
-
You can tag multiple request by adding special header `
|
|
366
|
-
using `NgHttpCachingService.clearCacheByTag(tag:
|
|
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=
|