p3x-angular-http-cache-interceptor 2022.4.128 → 2023.10.109

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/LICENSE CHANGED
@@ -1,11 +1,11 @@
1
1
 
2
- @license p3x-angular-http-cache-interceptor v2022.4.127
2
+ @license p3x-angular-http-cache-interceptor v2023.10.108
3
3
 
4
4
  🔥 Cache every request in Angular, not only the GET, but all methods of this interceptor, and allows you to interact with the interceptor via specific headers and modify the request, and these specific headers will be not included in the final request
5
5
 
6
6
  https://corifeus.com/angular-http-cache-interceptor
7
7
 
8
- Copyright (c) 2022 Patrik Laszlo / P3X / Corifeus and contributors.
8
+ Copyright (c) 2023 Patrik Laszlo / P3X / Corifeus and contributors.
9
9
 
10
10
  MIT License
11
11
 
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
 
13
13
 
14
- # 🔥 Cache every request in Angular, not only the GET, but all methods of this interceptor, and allows you to interact with the interceptor via specific headers and modify the request, and these specific headers will be not included in the final request v2022.4.128
14
+ # 🔥 Cache every request in Angular, not only the GET, but all methods of this interceptor, and allows you to interact with the interceptor via specific headers and modify the request, and these specific headers will be not included in the final request v2023.10.109
15
15
 
16
16
 
17
17
 
@@ -25,7 +25,7 @@
25
25
  ### Built on NodeJs version
26
26
 
27
27
  ```txt
28
- v16.15.0
28
+ v18.16.1
29
29
  ```
30
30
 
31
31
 
@@ -34,7 +34,7 @@ v16.15.0
34
34
  # Built on Angular
35
35
 
36
36
  ```text
37
- 13.3.11
37
+ 16.1.4
38
38
  ```
39
39
 
40
40
 
@@ -186,7 +186,7 @@ All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://
186
186
 
187
187
  ---
188
188
 
189
- [**P3X-ANGULAR-HTTP-CACHE-INTERCEPTOR**](https://corifeus.com/angular-http-cache-interceptor) Build v2022.4.128
189
+ [**P3X-ANGULAR-HTTP-CACHE-INTERCEPTOR**](https://corifeus.com/angular-http-cache-interceptor) Build v2023.10.109
190
190
 
191
191
  [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software)
192
192
 
@@ -0,0 +1,112 @@
1
+ import { Inject, Injectable, Optional } from '@angular/core';
2
+ import { HttpResponse } from '@angular/common/http';
3
+ import { Observable, of } from 'rxjs';
4
+ import * as hash from 'object-hash';
5
+ import { tap } from "rxjs/operators";
6
+ import { CachingHeaders } from "./caching-headers.enum";
7
+ import { CachingStore } from "./caching-store.enum";
8
+ import { P3X_HTTP_CACHE_CONFIG } from "./http-cache-config.token";
9
+ import * as i0 from "@angular/core";
10
+ const hashOptions = {
11
+ algorithm: 'md5',
12
+ encoding: 'hex'
13
+ };
14
+ const globalCache = new Map();
15
+ export class HttpCacheInterceptorInterceptor {
16
+ getCache(key) {
17
+ if (this.httpCacheConfig.store === CachingStore.Global) {
18
+ return globalCache.get(key);
19
+ }
20
+ else {
21
+ return this.cachedData.get(key);
22
+ }
23
+ }
24
+ setCache(key, value) {
25
+ if (this.httpCacheConfig.store === CachingStore.Global) {
26
+ globalCache.set(key, value);
27
+ }
28
+ else {
29
+ this.cachedData.set(key, value);
30
+ }
31
+ }
32
+ constructor(httpCacheConfigToken) {
33
+ this.cachedData = new Map();
34
+ this.httpCacheConfig = {
35
+ behavior: CachingHeaders.Cache,
36
+ store: CachingStore.Global,
37
+ };
38
+ if (httpCacheConfigToken) {
39
+ this.httpCacheConfig = httpCacheConfigToken;
40
+ }
41
+ }
42
+ httpToKey(httpRequest) {
43
+ const body = JSON.parse(JSON.stringify(httpRequest.body));
44
+ const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions);
45
+ return key;
46
+ }
47
+ intercept(httpRequest, next) {
48
+ //console.log(httpRequest)
49
+ //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))
50
+ //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))
51
+ const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null;
52
+ const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null;
53
+ //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)
54
+ let headers = httpRequest.headers.delete(CachingHeaders.NoCache);
55
+ headers = headers.delete(CachingHeaders.Cache);
56
+ httpRequest = httpRequest.clone({
57
+ headers: headers
58
+ });
59
+ if (forcedCache && forcedNoneCache) {
60
+ throw new Error('You cannot use cache and non-cache header at once!');
61
+ }
62
+ else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {
63
+ return next.handle(httpRequest);
64
+ }
65
+ else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {
66
+ // Checked if there is cached data for this URI
67
+ const key = this.httpToKey(httpRequest);
68
+ const lastResponse = this.getCache(key);
69
+ if (lastResponse) {
70
+ // In case of parallel requests to same URI,
71
+ // return the request already in progress
72
+ // otherwise return the last cached data
73
+ //console.info('http cache interceptor hit cache', key)
74
+ return (lastResponse instanceof Observable)
75
+ ? lastResponse : of(lastResponse.clone());
76
+ }
77
+ //console.info('http cache interceptor', key)
78
+ // If the request of going through for first time
79
+ // then let the request proceed and cache the response
80
+ const requestHandle = next.handle(httpRequest).pipe(tap((stateEvent) => {
81
+ if (stateEvent instanceof HttpResponse) {
82
+ this.setCache(key, stateEvent.clone());
83
+ }
84
+ }));
85
+ // Meanwhile cache the request Observable to handle parallel request
86
+ //this.cachedData.set(key, requestHandle);
87
+ return requestHandle;
88
+ }
89
+ else {
90
+ console.error(this.httpCacheConfig);
91
+ console.error(httpRequest.headers);
92
+ throw new Error('There is a configuration in your setup');
93
+ }
94
+ /*
95
+ // Also leave scope of resetting already cached data for a URI
96
+ if (httpRequest.headers.get("reset-cache")) {
97
+ this.cachedData.delete(httpRequest.urlWithParams);
98
+ }
99
+ */
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor, deps: [{ token: P3X_HTTP_CACHE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
102
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor }); }
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor, decorators: [{
105
+ type: Injectable
106
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
107
+ type: Inject,
108
+ args: [P3X_HTTP_CACHE_CONFIG]
109
+ }, {
110
+ type: Optional
111
+ }] }]; } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWNoZS1pbnRlcmNlcHRvci5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItaHR0cC1jYWNoZS1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtY2FjaGUtaW50ZXJjZXB0b3IuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBdUQsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEcsT0FBTyxFQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxLQUFLLElBQUksTUFBTSxhQUFhLENBQUE7QUFDbkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7O0FBSWhFLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBSSxJQUFJLEdBQUcsRUFBZSxDQUFBO0FBRzNDLE1BQU0sT0FBTywrQkFBK0I7SUFTMUMsUUFBUSxDQUFDLEdBQVc7UUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3RELE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM1QjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENB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LFlBQVksVUFBVSxDQUFDO29CQUN6QyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDN0M7WUFFRCw2Q0FBNkM7WUFFN0MsaURBQWlEO1lBQ2pELHNEQUFzRDtZQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FDakQsR0FBRyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksVUFBVSxZQUFZLFlBQVksRUFBRTtvQkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FDWCxHQUFHLEVBQ0gsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUNuQixDQUFDO2lCQUNIO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtZQUVELG9FQUFvRTtZQUNwRSwwQ0FBMEM7WUFFMUMsT0FBTyxhQUFhLENBQUM7U0FDdEI7YUFBTTtZQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtTQUMxRDtRQUVEOzs7OztXQUtHO0lBR0wsQ0FBQzs4R0EzR1UsK0JBQStCLGtCQXlCdEIscUJBQXFCO2tIQXpCOUIsK0JBQStCOzsyRkFBL0IsK0JBQStCO2tCQUQzQyxVQUFVOzswQkEwQkksTUFBTTsyQkFBQyxxQkFBcUI7OzBCQUFHLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gJ29iamVjdC1oYXNoJ1xuaW1wb3J0IHt0YXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQge0NhY2hpbmdIZWFkZXJzfSBmcm9tIFwiLi9jYWNoaW5nLWhlYWRlcnMuZW51bVwiO1xuaW1wb3J0IHtDYWNoaW5nU3RvcmV9IGZyb20gXCIuL2NhY2hpbmctc3RvcmUuZW51bVwiO1xuXG5pbXBvcnQge1AzWF9IVFRQX0NBQ0hFX0NPTkZJR30gZnJvbSBcIi4vaHR0cC1jYWNoZS1jb25maWcudG9rZW5cIjtcbmltcG9ydCB7SHR0cENhY2hlQ29uZmlnfSBmcm9tIFwiLi9odHRwLWNhY2hlLWNvbmZpZ1wiO1xuXG5cbmNvbnN0IGhhc2hPcHRpb25zID0ge1xuICBhbGdvcml0aG06ICdtZDUnLFxuICBlbmNvZGluZzogJ2hleCdcbn1cblxuY29uc3QgZ2xvYmFsQ2FjaGUgPSAgbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSHR0cENhY2hlSW50ZXJjZXB0b3JJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgcHJpdmF0ZSBjYWNoZWREYXRhICA9ICBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbiAgaHR0cENhY2hlQ29uZmlnIDogSHR0cENhY2hlQ29uZmlnID0ge1xuICAgIGJlaGF2aW9yOiBDYWNoaW5nSGVhZGVycy5DYWNoZSxcbiAgICBzdG9yZTogQ2FjaGluZ1N0b3JlLkdsb2JhbCxcbiAgfVxuXG4gIGdldENhY2hlKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaHR0cENhY2hlQ29uZmlnLnN0b3JlID09PSBDYWNoaW5nU3RvcmUuR2xvYmFsKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsQ2FjaGUuZ2V0KGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRGF0YS5nZXQoa2V5KVxuICAgIH1cbiAgfVxuXG4gIHNldENhY2hlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaHR0cENhY2hlQ29uZmlnLnN0b3JlID09PSBDYWNoaW5nU3RvcmUuR2xvYmFsKSB7XG4gICAgICBnbG9iYWxDYWNoZS5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWNoZWREYXRhLnNldChrZXksIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUDNYX0hUVFBfQ0FDSEVfQ09ORklHKSBAT3B0aW9uYWwoKSBodHRwQ2FjaGVDb25maWdUb2tlbjogSHR0cENhY2hlQ29uZmlnKSB7XG4gICAgaWYgKGh0dHBDYWNoZUNvbmZpZ1Rva2VuKSB7XG4gICAgICB0aGlzLmh0dHBDYWNoZUNvbmZpZyA9IGh0dHBDYWNoZUNvbmZpZ1Rva2VuXG4gICAgfVxuICB9XG5cbiAgaHR0cFRvS2V5KGh0dHBSZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KSB7XG4gICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaHR0cFJlcXVlc3QuYm9keSkpXG4gICAgY29uc3Qga2V5ID0gaHR0cFJlcXVlc3QubWV0aG9kICsgJ0AnICsgaHR0cFJlcXVlc3QudXJsV2l0aFBhcmFtcyArICdAJyArIGhhc2goaHR0cFJlcXVlc3QucGFyYW1zLCBoYXNoT3B0aW9ucykgKyAnQCcgKyBoYXNoKGJvZHksIGhhc2hPcHRpb25zKVxuICAgIHJldHVybiBrZXlcbiAgfVxuXG4gIGludGVyY2VwdChodHRwUmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcblxuXG4gICAgLy9jb25zb2xlLmxvZyhodHRwUmVxdWVzdClcbiAgICAvL2NvbnNvbGUubG9nKCdoYXMnLCBodHRwUmVxdWVzdC5oZWFkZXJzLmhhcyhDYWNoaW5nSGVhZGVycy5Ob0NhY2hlKSlcbiAgICAvL2NvbnNvbGUubG9nKCd2YWx1ZScsIGh0dHBSZXF1ZXN0LmhlYWRlcnMuZ2V0KENhY2hpbmdIZWFkZXJzLk5vQ2FjaGUpKVxuXG4gICAgY29uc3QgZm9yY2VkQ2FjaGUgPSBodHRwUmVxdWVzdC5oZWFkZXJzLmdldChDYWNoaW5nSGVhZGVycy5DYWNoZSkgIT09IG51bGxcbiAgICBjb25zdCBmb3JjZWROb25lQ2FjaGUgPSBodHRwUmVxdWVzdC5oZWFkZXJzLmdldChDYWNoaW5nSGVhZGVycy5Ob0NhY2hlKSAhPT0gbnVsbFxuXG4gICAgLy9jb25zb2xlLmxvZygnZm9yY2VkQ2FjaGUnLCBmb3JjZWRDYWNoZSwgJ2ZvcmNlZE5vbmVDYWNoZScsIGZvcmNlZE5vbmVDYWNoZSlcblxuICAgIGxldCBoZWFkZXJzID0gaHR0cFJlcXVlc3QuaGVhZGVycy5kZWxldGUoQ2FjaGluZ0hlYWRlcnMuTm9DYWNoZSlcbiAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQ2FjaGluZ0hlYWRlcnMuQ2FjaGUpXG4gICAgaHR0cFJlcXVlc3QgPSBodHRwUmVxdWVzdC5jbG9uZSh7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgfSlcblxuICAgIGlmIChmb3JjZWRDYWNoZSAmJiBmb3JjZWROb25lQ2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCB1c2UgY2FjaGUgYW5kIG5vbi1jYWNoZSBoZWFkZXIgYXQgb25jZSEnKVxuICAgIH0gZWxzZSBpZiAoZm9yY2VkTm9uZUNhY2hlIHx8ICh0aGlzLmh0dHBDYWNoZUNvbmZpZy5iZWhhdmlvciA9PT0gQ2FjaGluZ0hlYWRlcnMuTm9DYWNoZSAmJiAhZm9yY2VkQ2FjaGUpKSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUoaHR0cFJlcXVlc3QpO1xuICAgIH0gZWxzZSBpZiAoZm9yY2VkQ2FjaGUgfHwgKHRoaXMuaHR0cENhY2hlQ29uZmlnLmJlaGF2aW9yID09PSBDYWNoaW5nSGVhZGVycy5DYWNoZSAmJiAhZm9yY2VkTm9uZUNhY2hlKSkge1xuICAgICAgLy8gQ2hlY2tlZCBpZiB0aGVyZSBpcyBjYWNoZWQgZGF0YSBmb3IgdGhpcyBVUklcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuaHR0cFRvS2V5KGh0dHBSZXF1ZXN0KVxuICAgICAgY29uc3QgbGFzdFJlc3BvbnNlID0gdGhpcy5nZXRDYWNoZShrZXkpO1xuICAgICAgaWYgKGxhc3RSZXNwb25zZSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIHNhbWUgVVJJLFxuICAgICAgICAvLyByZXR1cm4gdGhlIHJlcXVlc3QgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIHRoZSBsYXN0IGNhY2hlZCBkYXRhXG5cbiAgICAgICAgLy9jb25zb2xlLmluZm8oJ2h0dHAgY2FjaGUgaW50ZXJjZXB0b3IgaGl0IGNhY2hlJywga2V5KVxuXG4gICAgICAgIHJldHVybiAobGFzdFJlc3BvbnNlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSlcbiAgICAgICAgICA/IGxhc3RSZXNwb25zZSA6IG9mKGxhc3RSZXNwb25zZS5jbG9uZSgpKTtcbiAgICAgIH1cblxuICAgICAgLy9jb25zb2xlLmluZm8oJ2h0dHAgY2FjaGUgaW50ZXJjZXB0b3InLCBrZXkpXG5cbiAgICAgIC8vIElmIHRoZSByZXF1ZXN0IG9mIGdvaW5nIHRocm91Z2ggZm9yIGZpcnN0IHRpbWVcbiAgICAgIC8vIHRoZW4gbGV0IHRoZSByZXF1ZXN0IHByb2NlZWQgYW5kIGNhY2hlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVxdWVzdEhhbmRsZSA9IG5leHQuaGFuZGxlKGh0dHBSZXF1ZXN0KS5waXBlKFxuICAgICAgICB0YXAoKHN0YXRlRXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChzdGF0ZUV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhY2hlKFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHN0YXRlRXZlbnQuY2xvbmUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIC8vIE1lYW53aGlsZSBjYWNoZSB0aGUgcmVxdWVzdCBPYnNlcnZhYmxlIHRvIGhhbmRsZSBwYXJhbGxlbCByZXF1ZXN0XG4gICAgICAvL3RoaXMuY2FjaGVkRGF0YS5zZXQoa2V5LCByZXF1ZXN0SGFuZGxlKTtcblxuICAgICAgcmV0dXJuIHJlcXVlc3RIYW5kbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5odHRwQ2FjaGVDb25maWcpXG4gICAgICBjb25zb2xlLmVycm9yKGh0dHBSZXF1ZXN0LmhlYWRlcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGEgY29uZmlndXJhdGlvbiBpbiB5b3VyIHNldHVwJylcbiAgICB9XG5cbiAgICAvKlxuICAgIC8vIEFsc28gbGVhdmUgc2NvcGUgb2YgcmVzZXR0aW5nIGFscmVhZHkgY2FjaGVkIGRhdGEgZm9yIGEgVVJJXG4gICAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnMuZ2V0KFwicmVzZXQtY2FjaGVcIikpIHtcbiAgICAgIHRoaXMuY2FjaGVkRGF0YS5kZWxldGUoaHR0cFJlcXVlc3QudXJsV2l0aFBhcmFtcyk7XG4gICAgfVxuICAgICAqL1xuXG5cbiAgfVxufVxuIl19
@@ -0,0 +1,43 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HTTP_INTERCEPTORS } from "@angular/common/http";
3
+ import { HttpCacheInterceptorInterceptor } from './http-cache-interceptor.interceptor';
4
+ import { P3X_HTTP_CACHE_CONFIG } from "./http-cache-config.token";
5
+ import * as i0 from "@angular/core";
6
+ export class P3XHttpCacheInterceptorModule {
7
+ static forRoot(httpCacheConfig) {
8
+ return {
9
+ ngModule: P3XHttpCacheInterceptorModule,
10
+ providers: [
11
+ {
12
+ provide: P3X_HTTP_CACHE_CONFIG,
13
+ useValue: httpCacheConfig
14
+ }
15
+ ]
16
+ };
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
19
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule }); }
20
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, providers: [
21
+ {
22
+ provide: HTTP_INTERCEPTORS,
23
+ useClass: HttpCacheInterceptorInterceptor,
24
+ multi: true
25
+ }
26
+ ] }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, decorators: [{
29
+ type: NgModule,
30
+ args: [{
31
+ declarations: [],
32
+ imports: [],
33
+ providers: [
34
+ {
35
+ provide: HTTP_INTERCEPTORS,
36
+ useClass: HttpCacheInterceptorInterceptor,
37
+ multi: true
38
+ }
39
+ ],
40
+ exports: []
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWNoZS1pbnRlcmNlcHRvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWh0dHAtY2FjaGUtaW50ZXJjZXB0b3Ivc3JjL2xpYi9odHRwLWNhY2hlLWludGVyY2VwdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXNCLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUV0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFnQmxFLE1BQU0sT0FBTyw2QkFBNkI7SUFFeEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFnQztRQUM3QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLHFCQUFxQjtvQkFDOUIsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs4R0FaVSw2QkFBNkI7K0dBQTdCLDZCQUE2QjsrR0FBN0IsNkJBQTZCLGFBVDdCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsUUFBUSxFQUFFLCtCQUErQjtnQkFDekMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGOzsyRkFHVSw2QkFBNkI7a0JBYnpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRSxFQUNSO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixRQUFRLEVBQUUsK0JBQStCOzRCQUN6QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxPQUFPLEVBQUUsRUFBRTtpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIVFRQX0lOVEVSQ0VQVE9SU30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBIdHRwQ2FjaGVJbnRlcmNlcHRvckludGVyY2VwdG9yIH0gZnJvbSAnLi9odHRwLWNhY2hlLWludGVyY2VwdG9yLmludGVyY2VwdG9yJ1xuXG5pbXBvcnQgeyBQM1hfSFRUUF9DQUNIRV9DT05GSUcgfSBmcm9tIFwiLi9odHRwLWNhY2hlLWNvbmZpZy50b2tlblwiO1xuaW1wb3J0IHsgSHR0cENhY2hlQ29uZmlnIH0gZnJvbSBcIi4vaHR0cC1jYWNoZS1jb25maWdcIjtcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW1xuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUyxcbiAgICAgIHVzZUNsYXNzOiBIdHRwQ2FjaGVJbnRlcmNlcHRvckludGVyY2VwdG9yLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGV4cG9ydHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIFAzWEh0dHBDYWNoZUludGVyY2VwdG9yTW9kdWxlIHtcblxuICBzdGF0aWMgZm9yUm9vdChodHRwQ2FjaGVDb25maWc6IEh0dHBDYWNoZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UDNYSHR0cENhY2hlSW50ZXJjZXB0b3JNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFAzWEh0dHBDYWNoZUludGVyY2VwdG9yTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBQM1hfSFRUUF9DQUNIRV9DT05GSUcsXG4gICAgICAgICAgdXNlVmFsdWU6IGh0dHBDYWNoZUNvbmZpZ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG59XG4iXX0=
@@ -27,16 +27,6 @@ const hashOptions = {
27
27
  };
28
28
  const globalCache = new Map();
29
29
  class HttpCacheInterceptorInterceptor {
30
- constructor(httpCacheConfigToken) {
31
- this.cachedData = new Map();
32
- this.httpCacheConfig = {
33
- behavior: CachingHeaders.Cache,
34
- store: CachingStore.Global,
35
- };
36
- if (httpCacheConfigToken) {
37
- this.httpCacheConfig = httpCacheConfigToken;
38
- }
39
- }
40
30
  getCache(key) {
41
31
  if (this.httpCacheConfig.store === CachingStore.Global) {
42
32
  return globalCache.get(key);
@@ -53,6 +43,16 @@ class HttpCacheInterceptorInterceptor {
53
43
  this.cachedData.set(key, value);
54
44
  }
55
45
  }
46
+ constructor(httpCacheConfigToken) {
47
+ this.cachedData = new Map();
48
+ this.httpCacheConfig = {
49
+ behavior: CachingHeaders.Cache,
50
+ store: CachingStore.Global,
51
+ };
52
+ if (httpCacheConfigToken) {
53
+ this.httpCacheConfig = httpCacheConfigToken;
54
+ }
55
+ }
56
56
  httpToKey(httpRequest) {
57
57
  const body = JSON.parse(JSON.stringify(httpRequest.body));
58
58
  const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions);
@@ -112,10 +112,10 @@ class HttpCacheInterceptorInterceptor {
112
112
  }
113
113
  */
114
114
  }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor, deps: [{ token: P3X_HTTP_CACHE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
116
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor }); }
115
117
  }
116
- HttpCacheInterceptorInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, deps: [{ token: P3X_HTTP_CACHE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
117
- HttpCacheInterceptorInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor });
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, decorators: [{
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HttpCacheInterceptorInterceptor, decorators: [{
119
119
  type: Injectable
120
120
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
121
121
  type: Inject,
@@ -136,17 +136,17 @@ class P3XHttpCacheInterceptorModule {
136
136
  ]
137
137
  };
138
138
  }
139
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
140
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule }); }
141
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, providers: [
142
+ {
143
+ provide: HTTP_INTERCEPTORS,
144
+ useClass: HttpCacheInterceptorInterceptor,
145
+ multi: true
146
+ }
147
+ ] }); }
139
148
  }
140
- P3XHttpCacheInterceptorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
141
- P3XHttpCacheInterceptorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule });
142
- P3XHttpCacheInterceptorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, providers: [
143
- {
144
- provide: HTTP_INTERCEPTORS,
145
- useClass: HttpCacheInterceptorInterceptor,
146
- multi: true
147
- }
148
- ], imports: [[]] });
149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, decorators: [{
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: P3XHttpCacheInterceptorModule, decorators: [{
150
150
  type: NgModule,
151
151
  args: [{
152
152
  declarations: [],
@@ -171,3 +171,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
171
171
  */
172
172
 
173
173
  export { CachingHeaders, CachingStore, P3XHttpCacheInterceptorModule, P3X_HTTP_CACHE_CONFIG };
174
+ //# sourceMappingURL=p3x-angular-http-cache-interceptor.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"p3x-angular-http-cache-interceptor.mjs","sources":["../../../projects/angular-http-cache-interceptor/src/lib/caching-headers.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/caching-store.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-config.token.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.interceptor.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.module.ts","../../../projects/angular-http-cache-interceptor/src/public-api.ts","../../../projects/angular-http-cache-interceptor/src/p3x-angular-http-cache-interceptor.ts"],"sourcesContent":["// cache headers has to have a x- prefix\nexport enum CachingHeaders {\n NoCache = \"x-p3x-no-cache\",\n Cache = \"x-p3x-cache\",\n}\n","// cache headers has to have a x- prefix\nexport enum CachingStore {\n Global,\n PerModule\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\nexport const P3X_HTTP_CACHE_CONFIG = new InjectionToken(\n 'P3X_HTTP_CACHE_CONFIG'\n)\n","import {Inject, Injectable, Optional} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';\nimport {Observable, of} from 'rxjs';\n\nimport * as hash from 'object-hash'\nimport {tap} from \"rxjs/operators\";\n\nimport {CachingHeaders} from \"./caching-headers.enum\";\nimport {CachingStore} from \"./caching-store.enum\";\n\nimport {P3X_HTTP_CACHE_CONFIG} from \"./http-cache-config.token\";\nimport {HttpCacheConfig} from \"./http-cache-config\";\n\n\nconst hashOptions = {\n algorithm: 'md5',\n encoding: 'hex'\n}\n\nconst globalCache = new Map<string, any>()\n\n@Injectable()\nexport class HttpCacheInterceptorInterceptor implements HttpInterceptor {\n\n private cachedData = new Map<string, any>()\n\n httpCacheConfig : HttpCacheConfig = {\n behavior: CachingHeaders.Cache,\n store: CachingStore.Global,\n }\n\n getCache(key: string) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n return globalCache.get(key)\n } else {\n return this.cachedData.get(key)\n }\n }\n\n setCache(key: string, value: any) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n globalCache.set(key, value)\n } else {\n this.cachedData.set(key, value)\n }\n }\n\n constructor(@Inject(P3X_HTTP_CACHE_CONFIG) @Optional() httpCacheConfigToken: HttpCacheConfig) {\n if (httpCacheConfigToken) {\n this.httpCacheConfig = httpCacheConfigToken\n }\n }\n\n httpToKey(httpRequest: HttpRequest<any>) {\n const body = JSON.parse(JSON.stringify(httpRequest.body))\n const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions)\n return key\n }\n\n intercept(httpRequest: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n\n //console.log(httpRequest)\n //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))\n //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))\n\n const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null\n const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null\n\n //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)\n\n let headers = httpRequest.headers.delete(CachingHeaders.NoCache)\n headers = headers.delete(CachingHeaders.Cache)\n httpRequest = httpRequest.clone({\n headers: headers\n })\n\n if (forcedCache && forcedNoneCache) {\n throw new Error('You cannot use cache and non-cache header at once!')\n } else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {\n return next.handle(httpRequest);\n } else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {\n // Checked if there is cached data for this URI\n const key = this.httpToKey(httpRequest)\n const lastResponse = this.getCache(key);\n if (lastResponse) {\n // In case of parallel requests to same URI,\n // return the request already in progress\n // otherwise return the last cached data\n\n //console.info('http cache interceptor hit cache', key)\n\n return (lastResponse instanceof Observable)\n ? lastResponse : of(lastResponse.clone());\n }\n\n //console.info('http cache interceptor', key)\n\n // If the request of going through for first time\n // then let the request proceed and cache the response\n const requestHandle = next.handle(httpRequest).pipe(\n tap((stateEvent: any) => {\n if (stateEvent instanceof HttpResponse) {\n this.setCache(\n key,\n stateEvent.clone()\n );\n }\n })\n )\n\n // Meanwhile cache the request Observable to handle parallel request\n //this.cachedData.set(key, requestHandle);\n\n return requestHandle;\n } else {\n console.error(this.httpCacheConfig)\n console.error(httpRequest.headers)\n throw new Error('There is a configuration in your setup')\n }\n\n /*\n // Also leave scope of resetting already cached data for a URI\n if (httpRequest.headers.get(\"reset-cache\")) {\n this.cachedData.delete(httpRequest.urlWithParams);\n }\n */\n\n\n }\n}\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {HTTP_INTERCEPTORS} from \"@angular/common/http\";\nimport { HttpCacheInterceptorInterceptor } from './http-cache-interceptor.interceptor'\n\nimport { P3X_HTTP_CACHE_CONFIG } from \"./http-cache-config.token\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\n@NgModule({\n declarations: [],\n imports: [\n ],\n providers: [\n {\n provide: HTTP_INTERCEPTORS,\n useClass: HttpCacheInterceptorInterceptor,\n multi: true\n }\n ],\n exports: []\n})\nexport class P3XHttpCacheInterceptorModule {\n\n static forRoot(httpCacheConfig: HttpCacheConfig): ModuleWithProviders<P3XHttpCacheInterceptorModule> {\n return {\n ngModule: P3XHttpCacheInterceptorModule,\n providers: [\n {\n provide: P3X_HTTP_CACHE_CONFIG,\n useValue: httpCacheConfig\n }\n ]\n };\n }\n\n}\n","/*\n * Public API Surface of angular-http-cache-interceptor\n */\n\nexport * from './lib/http-cache-interceptor.module';\nexport * from './lib/caching-headers.enum'\nexport * from './lib/http-cache-config'\nexport * from './lib/http-cache-config.token'\nexport * from './lib/caching-store.enum'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"p3x-angular-http-cache-interceptor.mjs","sources":["../../../projects/angular-http-cache-interceptor/src/lib/caching-headers.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/caching-store.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-config.token.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.interceptor.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.module.ts","../../../projects/angular-http-cache-interceptor/src/public-api.ts","../../../projects/angular-http-cache-interceptor/src/p3x-angular-http-cache-interceptor.ts"],"sourcesContent":["// cache headers has to have a x- prefix\nexport enum CachingHeaders {\n NoCache = \"x-p3x-no-cache\",\n Cache = \"x-p3x-cache\",\n}\n","// cache headers has to have a x- prefix\nexport enum CachingStore {\n Global,\n PerModule\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\nexport const P3X_HTTP_CACHE_CONFIG = new InjectionToken(\n 'P3X_HTTP_CACHE_CONFIG'\n)\n","import {Inject, Injectable, Optional} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';\nimport {Observable, of} from 'rxjs';\n\nimport * as hash from 'object-hash'\nimport {tap} from \"rxjs/operators\";\n\nimport {CachingHeaders} from \"./caching-headers.enum\";\nimport {CachingStore} from \"./caching-store.enum\";\n\nimport {P3X_HTTP_CACHE_CONFIG} from \"./http-cache-config.token\";\nimport {HttpCacheConfig} from \"./http-cache-config\";\n\n\nconst hashOptions = {\n algorithm: 'md5',\n encoding: 'hex'\n}\n\nconst globalCache = new Map<string, any>()\n\n@Injectable()\nexport class HttpCacheInterceptorInterceptor implements HttpInterceptor {\n\n private cachedData = new Map<string, any>()\n\n httpCacheConfig : HttpCacheConfig = {\n behavior: CachingHeaders.Cache,\n store: CachingStore.Global,\n }\n\n getCache(key: string) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n return globalCache.get(key)\n } else {\n return this.cachedData.get(key)\n }\n }\n\n setCache(key: string, value: any) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n globalCache.set(key, value)\n } else {\n this.cachedData.set(key, value)\n }\n }\n\n constructor(@Inject(P3X_HTTP_CACHE_CONFIG) @Optional() httpCacheConfigToken: HttpCacheConfig) {\n if (httpCacheConfigToken) {\n this.httpCacheConfig = httpCacheConfigToken\n }\n }\n\n httpToKey(httpRequest: HttpRequest<any>) {\n const body = JSON.parse(JSON.stringify(httpRequest.body))\n const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions)\n return key\n }\n\n intercept(httpRequest: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n\n //console.log(httpRequest)\n //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))\n //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))\n\n const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null\n const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null\n\n //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)\n\n let headers = httpRequest.headers.delete(CachingHeaders.NoCache)\n headers = headers.delete(CachingHeaders.Cache)\n httpRequest = httpRequest.clone({\n headers: headers\n })\n\n if (forcedCache && forcedNoneCache) {\n throw new Error('You cannot use cache and non-cache header at once!')\n } else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {\n return next.handle(httpRequest);\n } else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {\n // Checked if there is cached data for this URI\n const key = this.httpToKey(httpRequest)\n const lastResponse = this.getCache(key);\n if (lastResponse) {\n // In case of parallel requests to same URI,\n // return the request already in progress\n // otherwise return the last cached data\n\n //console.info('http cache interceptor hit cache', key)\n\n return (lastResponse instanceof Observable)\n ? lastResponse : of(lastResponse.clone());\n }\n\n //console.info('http cache interceptor', key)\n\n // If the request of going through for first time\n // then let the request proceed and cache the response\n const requestHandle = next.handle(httpRequest).pipe(\n tap((stateEvent: any) => {\n if (stateEvent instanceof HttpResponse) {\n this.setCache(\n key,\n stateEvent.clone()\n );\n }\n })\n )\n\n // Meanwhile cache the request Observable to handle parallel request\n //this.cachedData.set(key, requestHandle);\n\n return requestHandle;\n } else {\n console.error(this.httpCacheConfig)\n console.error(httpRequest.headers)\n throw new Error('There is a configuration in your setup')\n }\n\n /*\n // Also leave scope of resetting already cached data for a URI\n if (httpRequest.headers.get(\"reset-cache\")) {\n this.cachedData.delete(httpRequest.urlWithParams);\n }\n */\n\n\n }\n}\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {HTTP_INTERCEPTORS} from \"@angular/common/http\";\nimport { HttpCacheInterceptorInterceptor } from './http-cache-interceptor.interceptor'\n\nimport { P3X_HTTP_CACHE_CONFIG } from \"./http-cache-config.token\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\n@NgModule({\n declarations: [],\n imports: [\n ],\n providers: [\n {\n provide: HTTP_INTERCEPTORS,\n useClass: HttpCacheInterceptorInterceptor,\n multi: true\n }\n ],\n exports: []\n})\nexport class P3XHttpCacheInterceptorModule {\n\n static forRoot(httpCacheConfig: HttpCacheConfig): ModuleWithProviders<P3XHttpCacheInterceptorModule> {\n return {\n ngModule: P3XHttpCacheInterceptorModule,\n providers: [\n {\n provide: P3X_HTTP_CACHE_CONFIG,\n useValue: httpCacheConfig\n }\n ]\n };\n }\n\n}\n","/*\n * Public API Surface of angular-http-cache-interceptor\n */\n\nexport * from './lib/http-cache-interceptor.module';\nexport * from './lib/caching-headers.enum'\nexport * from './lib/http-cache-config'\nexport * from './lib/http-cache-config.token'\nexport * from './lib/caching-store.enum'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -11,30 +11,24 @@
11
11
  "dependencies": {
12
12
  "tslib": "^2.0.3"
13
13
  },
14
- "module": "fesm2015/p3x-angular-http-cache-interceptor.mjs",
15
- "es2020": "fesm2020/p3x-angular-http-cache-interceptor.mjs",
16
- "esm2020": "esm2020/p3x-angular-http-cache-interceptor.mjs",
17
- "fesm2020": "fesm2020/p3x-angular-http-cache-interceptor.mjs",
18
- "fesm2015": "fesm2015/p3x-angular-http-cache-interceptor.mjs",
19
- "typings": "p3x-angular-http-cache-interceptor.d.ts",
14
+ "module": "fesm2022/p3x-angular-http-cache-interceptor.mjs",
15
+ "typings": "index.d.ts",
20
16
  "exports": {
21
17
  "./package.json": {
22
18
  "default": "./package.json"
23
19
  },
24
20
  ".": {
25
- "types": "./p3x-angular-http-cache-interceptor.d.ts",
26
- "esm2020": "./esm2020/p3x-angular-http-cache-interceptor.mjs",
27
- "es2020": "./fesm2020/p3x-angular-http-cache-interceptor.mjs",
28
- "es2015": "./fesm2015/p3x-angular-http-cache-interceptor.mjs",
29
- "node": "./fesm2015/p3x-angular-http-cache-interceptor.mjs",
30
- "default": "./fesm2020/p3x-angular-http-cache-interceptor.mjs"
21
+ "types": "./index.d.ts",
22
+ "esm2022": "./esm2022/p3x-angular-http-cache-interceptor.mjs",
23
+ "esm": "./esm2022/p3x-angular-http-cache-interceptor.mjs",
24
+ "default": "./fesm2022/p3x-angular-http-cache-interceptor.mjs"
31
25
  }
32
26
  },
33
27
  "sideEffects": false,
34
28
  "devDependencies": {
35
- "corifeus-builder": "^2022.4.130"
29
+ "corifeus-builder": "^2023.10.113"
36
30
  },
37
- "version": "2022.4.128",
31
+ "version": "2023.10.109",
38
32
  "description": "🔥 Cache every request in Angular, not only the GET, but all methods of this interceptor, and allows you to interact with the interceptor via specific headers and modify the request, and these specific headers will be not included in the final request",
39
33
  "repository": {
40
34
  "type": "git",
@@ -1,112 +0,0 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
2
- import { HttpResponse } from '@angular/common/http';
3
- import { Observable, of } from 'rxjs';
4
- import * as hash from 'object-hash';
5
- import { tap } from "rxjs/operators";
6
- import { CachingHeaders } from "./caching-headers.enum";
7
- import { CachingStore } from "./caching-store.enum";
8
- import { P3X_HTTP_CACHE_CONFIG } from "./http-cache-config.token";
9
- import * as i0 from "@angular/core";
10
- const hashOptions = {
11
- algorithm: 'md5',
12
- encoding: 'hex'
13
- };
14
- const globalCache = new Map();
15
- export class HttpCacheInterceptorInterceptor {
16
- constructor(httpCacheConfigToken) {
17
- this.cachedData = new Map();
18
- this.httpCacheConfig = {
19
- behavior: CachingHeaders.Cache,
20
- store: CachingStore.Global,
21
- };
22
- if (httpCacheConfigToken) {
23
- this.httpCacheConfig = httpCacheConfigToken;
24
- }
25
- }
26
- getCache(key) {
27
- if (this.httpCacheConfig.store === CachingStore.Global) {
28
- return globalCache.get(key);
29
- }
30
- else {
31
- return this.cachedData.get(key);
32
- }
33
- }
34
- setCache(key, value) {
35
- if (this.httpCacheConfig.store === CachingStore.Global) {
36
- globalCache.set(key, value);
37
- }
38
- else {
39
- this.cachedData.set(key, value);
40
- }
41
- }
42
- httpToKey(httpRequest) {
43
- const body = JSON.parse(JSON.stringify(httpRequest.body));
44
- const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions);
45
- return key;
46
- }
47
- intercept(httpRequest, next) {
48
- //console.log(httpRequest)
49
- //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))
50
- //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))
51
- const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null;
52
- const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null;
53
- //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)
54
- let headers = httpRequest.headers.delete(CachingHeaders.NoCache);
55
- headers = headers.delete(CachingHeaders.Cache);
56
- httpRequest = httpRequest.clone({
57
- headers: headers
58
- });
59
- if (forcedCache && forcedNoneCache) {
60
- throw new Error('You cannot use cache and non-cache header at once!');
61
- }
62
- else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {
63
- return next.handle(httpRequest);
64
- }
65
- else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {
66
- // Checked if there is cached data for this URI
67
- const key = this.httpToKey(httpRequest);
68
- const lastResponse = this.getCache(key);
69
- if (lastResponse) {
70
- // In case of parallel requests to same URI,
71
- // return the request already in progress
72
- // otherwise return the last cached data
73
- //console.info('http cache interceptor hit cache', key)
74
- return (lastResponse instanceof Observable)
75
- ? lastResponse : of(lastResponse.clone());
76
- }
77
- //console.info('http cache interceptor', key)
78
- // If the request of going through for first time
79
- // then let the request proceed and cache the response
80
- const requestHandle = next.handle(httpRequest).pipe(tap((stateEvent) => {
81
- if (stateEvent instanceof HttpResponse) {
82
- this.setCache(key, stateEvent.clone());
83
- }
84
- }));
85
- // Meanwhile cache the request Observable to handle parallel request
86
- //this.cachedData.set(key, requestHandle);
87
- return requestHandle;
88
- }
89
- else {
90
- console.error(this.httpCacheConfig);
91
- console.error(httpRequest.headers);
92
- throw new Error('There is a configuration in your setup');
93
- }
94
- /*
95
- // Also leave scope of resetting already cached data for a URI
96
- if (httpRequest.headers.get("reset-cache")) {
97
- this.cachedData.delete(httpRequest.urlWithParams);
98
- }
99
- */
100
- }
101
- }
102
- HttpCacheInterceptorInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, deps: [{ token: P3X_HTTP_CACHE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
103
- HttpCacheInterceptorInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor });
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, decorators: [{
105
- type: Injectable
106
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
107
- type: Inject,
108
- args: [P3X_HTTP_CACHE_CONFIG]
109
- }, {
110
- type: Optional
111
- }] }]; } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWNoZS1pbnRlcmNlcHRvci5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItaHR0cC1jYWNoZS1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtY2FjaGUtaW50ZXJjZXB0b3IuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBdUQsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEcsT0FBTyxFQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxLQUFLLElBQUksTUFBTSxhQUFhLENBQUE7QUFDbkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7O0FBSWhFLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBSSxJQUFJLEdBQUcsRUFBZSxDQUFBO0FBRzNDLE1BQU0sT0FBTywrQkFBK0I7SUF5QjFDLFlBQXVELG9CQUFxQztRQXZCcEYsZUFBVSxHQUFLLElBQUksR0FBRyxFQUFlLENBQUE7UUFFN0Msb0JBQWUsR0FBcUI7WUFDbEMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxLQUFLO1lBQzlCLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTTtTQUMzQixDQUFBO1FBbUJDLElBQUksb0JBQW9CLEVBQUU7WUFDeEIsSUFBSSxDQUFD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QVksWUFBWSxVQUFVLENBQUM7b0JBQ3pDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM3QztZQUVELDZDQUE2QztZQUU3QyxpREFBaUQ7WUFDakQsc0RBQXNEO1lBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNqRCxHQUFHLENBQUMsQ0FBQyxVQUFlLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxVQUFVLFlBQVksWUFBWSxFQUFFO29CQUN0QyxJQUFJLENBQUMsUUFBUSxDQUNYLEdBQUcsRUFDSCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQ25CLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFBO1lBRUQsb0VBQW9FO1lBQ3BFLDBDQUEwQztZQUUxQyxPQUFPLGFBQWEsQ0FBQztTQUN0QjthQUFNO1lBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1NBQzFEO1FBRUQ7Ozs7O1dBS0c7SUFHTCxDQUFDOzs2SEEzR1UsK0JBQStCLGtCQXlCdEIscUJBQXFCO2lJQXpCOUIsK0JBQStCOzRGQUEvQiwrQkFBK0I7a0JBRDNDLFVBQVU7OzBCQTBCSSxNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCAqIGFzIGhhc2ggZnJvbSAnb2JqZWN0LWhhc2gnXG5pbXBvcnQge3RhcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmltcG9ydCB7Q2FjaGluZ0hlYWRlcnN9IGZyb20gXCIuL2NhY2hpbmctaGVhZGVycy5lbnVtXCI7XG5pbXBvcnQge0NhY2hpbmdTdG9yZX0gZnJvbSBcIi4vY2FjaGluZy1zdG9yZS5lbnVtXCI7XG5cbmltcG9ydCB7UDNYX0hUVFBfQ0FDSEVfQ09ORklHfSBmcm9tIFwiLi9odHRwLWNhY2hlLWNvbmZpZy50b2tlblwiO1xuaW1wb3J0IHtIdHRwQ2FjaGVDb25maWd9IGZyb20gXCIuL2h0dHAtY2FjaGUtY29uZmlnXCI7XG5cblxuY29uc3QgaGFzaE9wdGlvbnMgPSB7XG4gIGFsZ29yaXRobTogJ21kNScsXG4gIGVuY29kaW5nOiAnaGV4J1xufVxuXG5jb25zdCBnbG9iYWxDYWNoZSA9ICBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwQ2FjaGVJbnRlcmNlcHRvckludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBwcml2YXRlIGNhY2hlZERhdGEgID0gIG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuICBodHRwQ2FjaGVDb25maWcgOiBIdHRwQ2FjaGVDb25maWcgPSB7XG4gICAgYmVoYXZpb3I6IENhY2hpbmdIZWFkZXJzLkNhY2hlLFxuICAgIHN0b3JlOiBDYWNoaW5nU3RvcmUuR2xvYmFsLFxuICB9XG5cbiAgZ2V0Q2FjaGUoa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5odHRwQ2FjaGVDb25maWcuc3RvcmUgPT09IENhY2hpbmdTdG9yZS5HbG9iYWwpIHtcbiAgICAgIHJldHVybiBnbG9iYWxDYWNoZS5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWREYXRhLmdldChrZXkpXG4gICAgfVxuICB9XG5cbiAgc2V0Q2FjaGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5odHRwQ2FjaGVDb25maWcuc3RvcmUgPT09IENhY2hpbmdTdG9yZS5HbG9iYWwpIHtcbiAgICAgIGdsb2JhbENhY2hlLnNldChrZXksIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhY2hlZERhdGEuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQM1hfSFRUUF9DQUNIRV9DT05GSUcpIEBPcHRpb25hbCgpIGh0dHBDYWNoZUNvbmZpZ1Rva2VuOiBIdHRwQ2FjaGVDb25maWcpIHtcbiAgICBpZiAoaHR0cENhY2hlQ29uZmlnVG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cENhY2hlQ29uZmlnID0gaHR0cENhY2hlQ29uZmlnVG9rZW5cbiAgICB9XG4gIH1cblxuICBodHRwVG9LZXkoaHR0cFJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pIHtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShodHRwUmVxdWVzdC5ib2R5KSlcbiAgICBjb25zdCBrZXkgPSBodHRwUmVxdWVzdC5tZXRob2QgKyAnQCcgKyBodHRwUmVxdWVzdC51cmxXaXRoUGFyYW1zICsgJ0AnICsgaGFzaChodHRwUmVxdWVzdC5wYXJhbXMsIGhhc2hPcHRpb25zKSArICdAJyArIGhhc2goYm9keSwgaGFzaE9wdGlvbnMpXG4gICAgcmV0dXJuIGtleVxuICB9XG5cbiAgaW50ZXJjZXB0KGh0dHBSZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuXG5cbiAgICAvL2NvbnNvbGUubG9nKGh0dHBSZXF1ZXN0KVxuICAgIC8vY29uc29sZS5sb2coJ2hhcycsIGh0dHBSZXF1ZXN0LmhlYWRlcnMuaGFzKENhY2hpbmdIZWFkZXJzLk5vQ2FjaGUpKVxuICAgIC8vY29uc29sZS5sb2coJ3ZhbHVlJywgaHR0cFJlcXVlc3QuaGVhZGVycy5nZXQoQ2FjaGluZ0hlYWRlcnMuTm9DYWNoZSkpXG5cbiAgICBjb25zdCBmb3JjZWRDYWNoZSA9IGh0dHBSZXF1ZXN0LmhlYWRlcnMuZ2V0KENhY2hpbmdIZWFkZXJzLkNhY2hlKSAhPT0gbnVsbFxuICAgIGNvbnN0IGZvcmNlZE5vbmVDYWNoZSA9IGh0dHBSZXF1ZXN0LmhlYWRlcnMuZ2V0KENhY2hpbmdIZWFkZXJzLk5vQ2FjaGUpICE9PSBudWxsXG5cbiAgICAvL2NvbnNvbGUubG9nKCdmb3JjZWRDYWNoZScsIGZvcmNlZENhY2hlLCAnZm9yY2VkTm9uZUNhY2hlJywgZm9yY2VkTm9uZUNhY2hlKVxuXG4gICAgbGV0IGhlYWRlcnMgPSBodHRwUmVxdWVzdC5oZWFkZXJzLmRlbGV0ZShDYWNoaW5nSGVhZGVycy5Ob0NhY2hlKVxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmRlbGV0ZShDYWNoaW5nSGVhZGVycy5DYWNoZSlcbiAgICBodHRwUmVxdWVzdCA9IGh0dHBSZXF1ZXN0LmNsb25lKHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICB9KVxuXG4gICAgaWYgKGZvcmNlZENhY2hlICYmIGZvcmNlZE5vbmVDYWNoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHVzZSBjYWNoZSBhbmQgbm9uLWNhY2hlIGhlYWRlciBhdCBvbmNlIScpXG4gICAgfSBlbHNlIGlmIChmb3JjZWROb25lQ2FjaGUgfHwgKHRoaXMuaHR0cENhY2hlQ29uZmlnLmJlaGF2aW9yID09PSBDYWNoaW5nSGVhZGVycy5Ob0NhY2hlICYmICFmb3JjZWRDYWNoZSkpIHtcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShodHRwUmVxdWVzdCk7XG4gICAgfSBlbHNlIGlmIChmb3JjZWRDYWNoZSB8fCAodGhpcy5odHRwQ2FjaGVDb25maWcuYmVoYXZpb3IgPT09IENhY2hpbmdIZWFkZXJzLkNhY2hlICYmICFmb3JjZWROb25lQ2FjaGUpKSB7XG4gICAgICAvLyBDaGVja2VkIGlmIHRoZXJlIGlzIGNhY2hlZCBkYXRhIGZvciB0aGlzIFVSSVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5odHRwVG9LZXkoaHR0cFJlcXVlc3QpXG4gICAgICBjb25zdCBsYXN0UmVzcG9uc2UgPSB0aGlzLmdldENhY2hlKGtleSk7XG4gICAgICBpZiAobGFzdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gc2FtZSBVUkksXG4gICAgICAgIC8vIHJldHVybiB0aGUgcmVxdWVzdCBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gdGhlIGxhc3QgY2FjaGVkIGRhdGFcblxuICAgICAgICAvL2NvbnNvbGUuaW5mbygnaHR0cCBjYWNoZSBpbnRlcmNlcHRvciBoaXQgY2FjaGUnLCBrZXkpXG5cbiAgICAgICAgcmV0dXJuIChsYXN0UmVzcG9uc2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgID8gbGFzdFJlc3BvbnNlIDogb2YobGFzdFJlc3BvbnNlLmNsb25lKCkpO1xuICAgICAgfVxuXG4gICAgICAvL2NvbnNvbGUuaW5mbygnaHR0cCBjYWNoZSBpbnRlcmNlcHRvcicsIGtleSlcblxuICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgb2YgZ29pbmcgdGhyb3VnaCBmb3IgZmlyc3QgdGltZVxuICAgICAgLy8gdGhlbiBsZXQgdGhlIHJlcXVlc3QgcHJvY2VlZCBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXF1ZXN0SGFuZGxlID0gbmV4dC5oYW5kbGUoaHR0cFJlcXVlc3QpLnBpcGUoXG4gICAgICAgIHRhcCgoc3RhdGVFdmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXRlRXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgc3RhdGVFdmVudC5jbG9uZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcblxuICAgICAgLy8gTWVhbndoaWxlIGNhY2hlIHRoZSByZXF1ZXN0IE9ic2VydmFibGUgdG8gaGFuZGxlIHBhcmFsbGVsIHJlcXVlc3RcbiAgICAgIC8vdGhpcy5jYWNoZWREYXRhLnNldChrZXksIHJlcXVlc3RIYW5kbGUpO1xuXG4gICAgICByZXR1cm4gcmVxdWVzdEhhbmRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcih0aGlzLmh0dHBDYWNoZUNvbmZpZylcbiAgICAgIGNvbnNvbGUuZXJyb3IoaHR0cFJlcXVlc3QuaGVhZGVycylcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYSBjb25maWd1cmF0aW9uIGluIHlvdXIgc2V0dXAnKVxuICAgIH1cblxuICAgIC8qXG4gICAgLy8gQWxzbyBsZWF2ZSBzY29wZSBvZiByZXNldHRpbmcgYWxyZWFkeSBjYWNoZWQgZGF0YSBmb3IgYSBVUklcbiAgICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVycy5nZXQoXCJyZXNldC1jYWNoZVwiKSkge1xuICAgICAgdGhpcy5jYWNoZWREYXRhLmRlbGV0ZShodHRwUmVxdWVzdC51cmxXaXRoUGFyYW1zKTtcbiAgICB9XG4gICAgICovXG5cblxuICB9XG59XG4iXX0=
@@ -1,43 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { HTTP_INTERCEPTORS } from "@angular/common/http";
3
- import { HttpCacheInterceptorInterceptor } from './http-cache-interceptor.interceptor';
4
- import { P3X_HTTP_CACHE_CONFIG } from "./http-cache-config.token";
5
- import * as i0 from "@angular/core";
6
- export class P3XHttpCacheInterceptorModule {
7
- static forRoot(httpCacheConfig) {
8
- return {
9
- ngModule: P3XHttpCacheInterceptorModule,
10
- providers: [
11
- {
12
- provide: P3X_HTTP_CACHE_CONFIG,
13
- useValue: httpCacheConfig
14
- }
15
- ]
16
- };
17
- }
18
- }
19
- P3XHttpCacheInterceptorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
- P3XHttpCacheInterceptorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule });
21
- P3XHttpCacheInterceptorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, providers: [
22
- {
23
- provide: HTTP_INTERCEPTORS,
24
- useClass: HttpCacheInterceptorInterceptor,
25
- multi: true
26
- }
27
- ], imports: [[]] });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, decorators: [{
29
- type: NgModule,
30
- args: [{
31
- declarations: [],
32
- imports: [],
33
- providers: [
34
- {
35
- provide: HTTP_INTERCEPTORS,
36
- useClass: HttpCacheInterceptorInterceptor,
37
- multi: true
38
- }
39
- ],
40
- exports: []
41
- }]
42
- }] });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWNoZS1pbnRlcmNlcHRvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWh0dHAtY2FjaGUtaW50ZXJjZXB0b3Ivc3JjL2xpYi9odHRwLWNhY2hlLWludGVyY2VwdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXNCLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUV0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFnQmxFLE1BQU0sT0FBTyw2QkFBNkI7SUFFeEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFnQztRQUM3QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLHFCQUFxQjtvQkFDOUIsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7MkhBWlUsNkJBQTZCOzRIQUE3Qiw2QkFBNkI7NEhBQTdCLDZCQUE2QixhQVQ3QjtRQUNUO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixZQVJRLEVBQ1I7NEZBVVUsNkJBQTZCO2tCQWJ6QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxFQUFFO29CQUNoQixPQUFPLEVBQUUsRUFDUjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsUUFBUSxFQUFFLCtCQUErQjs0QkFDekMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFLEVBQUU7aUJBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SFRUUF9JTlRFUkNFUFRPUlN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgSHR0cENhY2hlSW50ZXJjZXB0b3JJbnRlcmNlcHRvciB9IGZyb20gJy4vaHR0cC1jYWNoZS1pbnRlcmNlcHRvci5pbnRlcmNlcHRvcidcblxuaW1wb3J0IHsgUDNYX0hUVFBfQ0FDSEVfQ09ORklHIH0gZnJvbSBcIi4vaHR0cC1jYWNoZS1jb25maWcudG9rZW5cIjtcbmltcG9ydCB7IEh0dHBDYWNoZUNvbmZpZyB9IGZyb20gXCIuL2h0dHAtY2FjaGUtY29uZmlnXCI7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW10sXG4gIGltcG9ydHM6IFtcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICB1c2VDbGFzczogSHR0cENhY2hlSW50ZXJjZXB0b3JJbnRlcmNlcHRvcixcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBleHBvcnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBQM1hIdHRwQ2FjaGVJbnRlcmNlcHRvck1vZHVsZSB7XG5cbiAgc3RhdGljIGZvclJvb3QoaHR0cENhY2hlQ29uZmlnOiBIdHRwQ2FjaGVDb25maWcpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFAzWEh0dHBDYWNoZUludGVyY2VwdG9yTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBQM1hIdHRwQ2FjaGVJbnRlcmNlcHRvck1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogUDNYX0hUVFBfQ0FDSEVfQ09ORklHLFxuICAgICAgICAgIHVzZVZhbHVlOiBodHRwQ2FjaGVDb25maWdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxufVxuIl19
@@ -1,175 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Inject, Optional, NgModule } from '@angular/core';
3
- import { HttpResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
4
- import { Observable, of } from 'rxjs';
5
- import * as hash from 'object-hash';
6
- import { tap } from 'rxjs/operators';
7
-
8
- // cache headers has to have a x- prefix
9
- var CachingHeaders;
10
- (function (CachingHeaders) {
11
- CachingHeaders["NoCache"] = "x-p3x-no-cache";
12
- CachingHeaders["Cache"] = "x-p3x-cache";
13
- })(CachingHeaders || (CachingHeaders = {}));
14
-
15
- // cache headers has to have a x- prefix
16
- var CachingStore;
17
- (function (CachingStore) {
18
- CachingStore[CachingStore["Global"] = 0] = "Global";
19
- CachingStore[CachingStore["PerModule"] = 1] = "PerModule";
20
- })(CachingStore || (CachingStore = {}));
21
-
22
- const P3X_HTTP_CACHE_CONFIG = new InjectionToken('P3X_HTTP_CACHE_CONFIG');
23
-
24
- const hashOptions = {
25
- algorithm: 'md5',
26
- encoding: 'hex'
27
- };
28
- const globalCache = new Map();
29
- class HttpCacheInterceptorInterceptor {
30
- constructor(httpCacheConfigToken) {
31
- this.cachedData = new Map();
32
- this.httpCacheConfig = {
33
- behavior: CachingHeaders.Cache,
34
- store: CachingStore.Global,
35
- };
36
- if (httpCacheConfigToken) {
37
- this.httpCacheConfig = httpCacheConfigToken;
38
- }
39
- }
40
- getCache(key) {
41
- if (this.httpCacheConfig.store === CachingStore.Global) {
42
- return globalCache.get(key);
43
- }
44
- else {
45
- return this.cachedData.get(key);
46
- }
47
- }
48
- setCache(key, value) {
49
- if (this.httpCacheConfig.store === CachingStore.Global) {
50
- globalCache.set(key, value);
51
- }
52
- else {
53
- this.cachedData.set(key, value);
54
- }
55
- }
56
- httpToKey(httpRequest) {
57
- const body = JSON.parse(JSON.stringify(httpRequest.body));
58
- const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions);
59
- return key;
60
- }
61
- intercept(httpRequest, next) {
62
- //console.log(httpRequest)
63
- //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))
64
- //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))
65
- const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null;
66
- const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null;
67
- //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)
68
- let headers = httpRequest.headers.delete(CachingHeaders.NoCache);
69
- headers = headers.delete(CachingHeaders.Cache);
70
- httpRequest = httpRequest.clone({
71
- headers: headers
72
- });
73
- if (forcedCache && forcedNoneCache) {
74
- throw new Error('You cannot use cache and non-cache header at once!');
75
- }
76
- else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {
77
- return next.handle(httpRequest);
78
- }
79
- else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {
80
- // Checked if there is cached data for this URI
81
- const key = this.httpToKey(httpRequest);
82
- const lastResponse = this.getCache(key);
83
- if (lastResponse) {
84
- // In case of parallel requests to same URI,
85
- // return the request already in progress
86
- // otherwise return the last cached data
87
- //console.info('http cache interceptor hit cache', key)
88
- return (lastResponse instanceof Observable)
89
- ? lastResponse : of(lastResponse.clone());
90
- }
91
- //console.info('http cache interceptor', key)
92
- // If the request of going through for first time
93
- // then let the request proceed and cache the response
94
- const requestHandle = next.handle(httpRequest).pipe(tap((stateEvent) => {
95
- if (stateEvent instanceof HttpResponse) {
96
- this.setCache(key, stateEvent.clone());
97
- }
98
- }));
99
- // Meanwhile cache the request Observable to handle parallel request
100
- //this.cachedData.set(key, requestHandle);
101
- return requestHandle;
102
- }
103
- else {
104
- console.error(this.httpCacheConfig);
105
- console.error(httpRequest.headers);
106
- throw new Error('There is a configuration in your setup');
107
- }
108
- /*
109
- // Also leave scope of resetting already cached data for a URI
110
- if (httpRequest.headers.get("reset-cache")) {
111
- this.cachedData.delete(httpRequest.urlWithParams);
112
- }
113
- */
114
- }
115
- }
116
- HttpCacheInterceptorInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, deps: [{ token: P3X_HTTP_CACHE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
117
- HttpCacheInterceptorInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor });
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: HttpCacheInterceptorInterceptor, decorators: [{
119
- type: Injectable
120
- }], ctorParameters: function () {
121
- return [{ type: undefined, decorators: [{
122
- type: Inject,
123
- args: [P3X_HTTP_CACHE_CONFIG]
124
- }, {
125
- type: Optional
126
- }] }];
127
- } });
128
-
129
- class P3XHttpCacheInterceptorModule {
130
- static forRoot(httpCacheConfig) {
131
- return {
132
- ngModule: P3XHttpCacheInterceptorModule,
133
- providers: [
134
- {
135
- provide: P3X_HTTP_CACHE_CONFIG,
136
- useValue: httpCacheConfig
137
- }
138
- ]
139
- };
140
- }
141
- }
142
- P3XHttpCacheInterceptorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
143
- P3XHttpCacheInterceptorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule });
144
- P3XHttpCacheInterceptorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, providers: [
145
- {
146
- provide: HTTP_INTERCEPTORS,
147
- useClass: HttpCacheInterceptorInterceptor,
148
- multi: true
149
- }
150
- ], imports: [[]] });
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: P3XHttpCacheInterceptorModule, decorators: [{
152
- type: NgModule,
153
- args: [{
154
- declarations: [],
155
- imports: [],
156
- providers: [
157
- {
158
- provide: HTTP_INTERCEPTORS,
159
- useClass: HttpCacheInterceptorInterceptor,
160
- multi: true
161
- }
162
- ],
163
- exports: []
164
- }]
165
- }] });
166
-
167
- /*
168
- * Public API Surface of angular-http-cache-interceptor
169
- */
170
-
171
- /**
172
- * Generated bundle index. Do not edit.
173
- */
174
-
175
- export { CachingHeaders, CachingStore, P3XHttpCacheInterceptorModule, P3X_HTTP_CACHE_CONFIG };
@@ -1 +0,0 @@
1
- {"version":3,"file":"p3x-angular-http-cache-interceptor.mjs","sources":["../../../projects/angular-http-cache-interceptor/src/lib/caching-headers.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/caching-store.enum.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-config.token.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.interceptor.ts","../../../projects/angular-http-cache-interceptor/src/lib/http-cache-interceptor.module.ts","../../../projects/angular-http-cache-interceptor/src/public-api.ts","../../../projects/angular-http-cache-interceptor/src/p3x-angular-http-cache-interceptor.ts"],"sourcesContent":["// cache headers has to have a x- prefix\nexport enum CachingHeaders {\n NoCache = \"x-p3x-no-cache\",\n Cache = \"x-p3x-cache\",\n}\n","// cache headers has to have a x- prefix\nexport enum CachingStore {\n Global,\n PerModule\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\nexport const P3X_HTTP_CACHE_CONFIG = new InjectionToken(\n 'P3X_HTTP_CACHE_CONFIG'\n)\n","import {Inject, Injectable, Optional} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';\nimport {Observable, of} from 'rxjs';\n\nimport * as hash from 'object-hash'\nimport {tap} from \"rxjs/operators\";\n\nimport {CachingHeaders} from \"./caching-headers.enum\";\nimport {CachingStore} from \"./caching-store.enum\";\n\nimport {P3X_HTTP_CACHE_CONFIG} from \"./http-cache-config.token\";\nimport {HttpCacheConfig} from \"./http-cache-config\";\n\n\nconst hashOptions = {\n algorithm: 'md5',\n encoding: 'hex'\n}\n\nconst globalCache = new Map<string, any>()\n\n@Injectable()\nexport class HttpCacheInterceptorInterceptor implements HttpInterceptor {\n\n private cachedData = new Map<string, any>()\n\n httpCacheConfig : HttpCacheConfig = {\n behavior: CachingHeaders.Cache,\n store: CachingStore.Global,\n }\n\n getCache(key: string) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n return globalCache.get(key)\n } else {\n return this.cachedData.get(key)\n }\n }\n\n setCache(key: string, value: any) {\n if (this.httpCacheConfig.store === CachingStore.Global) {\n globalCache.set(key, value)\n } else {\n this.cachedData.set(key, value)\n }\n }\n\n constructor(@Inject(P3X_HTTP_CACHE_CONFIG) @Optional() httpCacheConfigToken: HttpCacheConfig) {\n if (httpCacheConfigToken) {\n this.httpCacheConfig = httpCacheConfigToken\n }\n }\n\n httpToKey(httpRequest: HttpRequest<any>) {\n const body = JSON.parse(JSON.stringify(httpRequest.body))\n const key = httpRequest.method + '@' + httpRequest.urlWithParams + '@' + hash(httpRequest.params, hashOptions) + '@' + hash(body, hashOptions)\n return key\n }\n\n intercept(httpRequest: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n\n //console.log(httpRequest)\n //console.log('has', httpRequest.headers.has(CachingHeaders.NoCache))\n //console.log('value', httpRequest.headers.get(CachingHeaders.NoCache))\n\n const forcedCache = httpRequest.headers.get(CachingHeaders.Cache) !== null\n const forcedNoneCache = httpRequest.headers.get(CachingHeaders.NoCache) !== null\n\n //console.log('forcedCache', forcedCache, 'forcedNoneCache', forcedNoneCache)\n\n let headers = httpRequest.headers.delete(CachingHeaders.NoCache)\n headers = headers.delete(CachingHeaders.Cache)\n httpRequest = httpRequest.clone({\n headers: headers\n })\n\n if (forcedCache && forcedNoneCache) {\n throw new Error('You cannot use cache and non-cache header at once!')\n } else if (forcedNoneCache || (this.httpCacheConfig.behavior === CachingHeaders.NoCache && !forcedCache)) {\n return next.handle(httpRequest);\n } else if (forcedCache || (this.httpCacheConfig.behavior === CachingHeaders.Cache && !forcedNoneCache)) {\n // Checked if there is cached data for this URI\n const key = this.httpToKey(httpRequest)\n const lastResponse = this.getCache(key);\n if (lastResponse) {\n // In case of parallel requests to same URI,\n // return the request already in progress\n // otherwise return the last cached data\n\n //console.info('http cache interceptor hit cache', key)\n\n return (lastResponse instanceof Observable)\n ? lastResponse : of(lastResponse.clone());\n }\n\n //console.info('http cache interceptor', key)\n\n // If the request of going through for first time\n // then let the request proceed and cache the response\n const requestHandle = next.handle(httpRequest).pipe(\n tap((stateEvent: any) => {\n if (stateEvent instanceof HttpResponse) {\n this.setCache(\n key,\n stateEvent.clone()\n );\n }\n })\n )\n\n // Meanwhile cache the request Observable to handle parallel request\n //this.cachedData.set(key, requestHandle);\n\n return requestHandle;\n } else {\n console.error(this.httpCacheConfig)\n console.error(httpRequest.headers)\n throw new Error('There is a configuration in your setup')\n }\n\n /*\n // Also leave scope of resetting already cached data for a URI\n if (httpRequest.headers.get(\"reset-cache\")) {\n this.cachedData.delete(httpRequest.urlWithParams);\n }\n */\n\n\n }\n}\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {HTTP_INTERCEPTORS} from \"@angular/common/http\";\nimport { HttpCacheInterceptorInterceptor } from './http-cache-interceptor.interceptor'\n\nimport { P3X_HTTP_CACHE_CONFIG } from \"./http-cache-config.token\";\nimport { HttpCacheConfig } from \"./http-cache-config\";\n\n@NgModule({\n declarations: [],\n imports: [\n ],\n providers: [\n {\n provide: HTTP_INTERCEPTORS,\n useClass: HttpCacheInterceptorInterceptor,\n multi: true\n }\n ],\n exports: []\n})\nexport class P3XHttpCacheInterceptorModule {\n\n static forRoot(httpCacheConfig: HttpCacheConfig): ModuleWithProviders<P3XHttpCacheInterceptorModule> {\n return {\n ngModule: P3XHttpCacheInterceptorModule,\n providers: [\n {\n provide: P3X_HTTP_CACHE_CONFIG,\n useValue: httpCacheConfig\n }\n ]\n };\n }\n\n}\n","/*\n * Public API Surface of angular-http-cache-interceptor\n */\n\nexport * from './lib/http-cache-interceptor.module';\nexport * from './lib/caching-headers.enum'\nexport * from './lib/http-cache-config'\nexport * from './lib/http-cache-config.token'\nexport * from './lib/caching-store.enum'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes