ng-http-caching 2.0.1 → 13.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n // eslint-disable-next-line no-unused-vars\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n // eslint-disable-next-line no-unused-vars\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n // eslint-disable-next-line no-unused-vars\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport interface NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n // eslint-disable-next-line no-unused-vars\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n // eslint-disable-next-line no-unused-vars\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingConfig = NgHttpCachingConfigDefault;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n }\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store as NgHttpCachingStorageInterface;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry | undefined = this.config.store?.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n };\r\n if (this.isValid(entry)) {\r\n this.config.store?.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store?.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return (this.config.store as NgHttpCachingStorageInterface).delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (regex.test(key)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): void {\r\n (this.config.store as NgHttpCachingStorageInterface).forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime = this.config.lifetime;\r\n // request has own lifetime\r\n if (entry.request.headers.has(NgHttpCachingHeaders.LIFETIME)) {\r\n lifetime = +(entry.request.headers.get(NgHttpCachingHeaders.LIFETIME) || '');\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if ((lifetime as number) < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + (lifetime as number) < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if (this.config.allowedMethod) {\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { tap, finalize, share } from 'rxjs/operators';\nimport { NgHttpCachingService, NgHttpCachingHeaders } from './ng-http-caching.service';\n\n\n@Injectable()\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\n\n // eslint-disable-next-line no-unused-vars\n constructor(private readonly cacheService: NgHttpCachingService) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // run garbage collector\n this.cacheService.runGc();\n\n // Don't cache if it's not cacheable\n if ( !this.cacheService.isCacheable(req) ) {\n return this.sendRequest(req, next);\n }\n\n // Checked if there is pending response for this request\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\n if ( cachedObservable ) {\n // console.log('cachedObservable', req);\n return cachedObservable;\n }\n\n // Checked if there is cached response for this request\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\n if (cachedResponse) {\n // console.log('cachedResponse', req);\n return of(cachedResponse.clone());\n }\n\n // If the request of going through for first time\n // then let the request proceed and cache the response\n // console.log('sendRequest', req);\n const shared = this.sendRequest(req, next).pipe(\n tap(event => {\n if (event instanceof HttpResponse) {\n this.cacheService.addToCache(req, event.clone());\n }\n }),\n finalize(() => {\n // delete pending request\n this.cacheService.deleteFromQueue(req);\n }),\n share()\n );\n\n // add pending request to queue for cache parallell request\n this.cacheService.addToQueue(req, shared);\n\n return shared;\n }\n\n /**\n * Send http request (next handler)\n */\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n let cloned: HttpRequest<any> = req.clone();\n // trim custom headers before send request\n Object.values(NgHttpCachingHeaders).forEach(ngHttpCachingHeaders => {\n if ( cloned.headers.has(ngHttpCachingHeaders) ) {\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\n }\n });\n return next.handle(cloned);\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ export declare enum NgHttpCachingHeaders {
20
20
  LIFETIME = "X-NG-HTTP-CACHING-LIFETIME",
21
21
  TAG = "X-NG-HTTP-CACHING-TAG"
22
22
  }
23
- export declare class NgHttpCachingConfig {
23
+ export interface NgHttpCachingConfig {
24
24
  store?: NgHttpCachingStorageInterface;
25
25
  lifetime?: number;
26
26
  allowedMethod?: string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-http-caching",
3
- "version": "2.0.1",
3
+ "version": "13.0.1",
4
4
  "description": "Cache for HTTP requests in Angular application.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,20 +26,30 @@
26
26
  },
27
27
  "homepage": "https://github.com/nigrosimone/ng-http-caching",
28
28
  "peerDependencies": {
29
- "@angular/common": "^10.0.6",
30
- "@angular/core": "^10.0.6"
29
+ "@angular/common": "^13.0.0",
30
+ "@angular/core": "^13.0.0"
31
31
  },
32
32
  "dependencies": {
33
- "tslib": "^2.0.0"
33
+ "tslib": "^2.3.0"
34
34
  },
35
- "main": "bundles/ng-http-caching.umd.js",
36
- "module": "fesm2015/ng-http-caching.js",
37
- "es2015": "fesm2015/ng-http-caching.js",
38
- "esm2015": "esm2015/ng-http-caching.js",
39
- "fesm2015": "fesm2015/ng-http-caching.js",
35
+ "module": "fesm2015/ng-http-caching.mjs",
36
+ "es2020": "fesm2020/ng-http-caching.mjs",
37
+ "esm2020": "esm2020/ng-http-caching.mjs",
38
+ "fesm2020": "fesm2020/ng-http-caching.mjs",
39
+ "fesm2015": "fesm2015/ng-http-caching.mjs",
40
40
  "typings": "ng-http-caching.d.ts",
41
- "sideEffects": false,
42
- "scripts": {
43
- "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode. This is not allowed.\\nPlease delete and rebuild the package with Ivy partial compilation mode, before attempting to publish.\\n')\" && exit 1"
44
- }
41
+ "exports": {
42
+ "./package.json": {
43
+ "default": "./package.json"
44
+ },
45
+ ".": {
46
+ "types": "./ng-http-caching.d.ts",
47
+ "esm2020": "./esm2020/ng-http-caching.mjs",
48
+ "es2020": "./fesm2020/ng-http-caching.mjs",
49
+ "es2015": "./fesm2015/ng-http-caching.mjs",
50
+ "node": "./fesm2015/ng-http-caching.mjs",
51
+ "default": "./fesm2020/ng-http-caching.mjs"
52
+ }
53
+ },
54
+ "sideEffects": false
45
55
  }
@@ -1,455 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common/http'), require('@angular/core'), require('rxjs'), require('rxjs/operators')) :
3
- typeof define === 'function' && define.amd ? define('ng-http-caching', ['exports', '@angular/common/http', '@angular/core', 'rxjs', 'rxjs/operators'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['ng-http-caching'] = {}, global.ng.common.http, global.ng.core, global.rxjs, global.rxjs.operators));
5
- }(this, (function (exports, http, i0, rxjs, operators) { 'use strict';
6
-
7
- function _interopNamespace(e) {
8
- if (e && e.__esModule) return e;
9
- var n = Object.create(null);
10
- if (e) {
11
- Object.keys(e).forEach(function (k) {
12
- if (k !== 'default') {
13
- var d = Object.getOwnPropertyDescriptor(e, k);
14
- Object.defineProperty(n, k, d.get ? d : {
15
- enumerable: true,
16
- get: function () {
17
- return e[k];
18
- }
19
- });
20
- }
21
- });
22
- }
23
- n['default'] = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
28
-
29
- var NgHttpCachingMemoryStorage = /** @class */ (function () {
30
- function NgHttpCachingMemoryStorage() {
31
- this.store = new Map();
32
- }
33
- Object.defineProperty(NgHttpCachingMemoryStorage.prototype, "size", {
34
- get: function () {
35
- return this.store.size;
36
- },
37
- enumerable: false,
38
- configurable: true
39
- });
40
- NgHttpCachingMemoryStorage.prototype.clear = function () {
41
- this.store.clear();
42
- };
43
- NgHttpCachingMemoryStorage.prototype.delete = function (key) {
44
- return this.store.delete(key);
45
- };
46
- NgHttpCachingMemoryStorage.prototype.forEach = function (callbackfn) {
47
- return this.store.forEach(callbackfn);
48
- };
49
- NgHttpCachingMemoryStorage.prototype.get = function (key) {
50
- return this.store.get(key);
51
- };
52
- NgHttpCachingMemoryStorage.prototype.has = function (key) {
53
- return this.store.has(key);
54
- };
55
- NgHttpCachingMemoryStorage.prototype.set = function (key, value) {
56
- this.store.set(key, value);
57
- };
58
- return NgHttpCachingMemoryStorage;
59
- }());
60
-
61
- var NG_HTTP_CACHING_CONFIG = new i0.InjectionToken('ng-http-caching.config');
62
- exports.NgHttpCachingStrategy = void 0;
63
- (function (NgHttpCachingStrategy) {
64
- NgHttpCachingStrategy["ALLOW_ALL"] = "ALLOW_ALL";
65
- NgHttpCachingStrategy["DISALLOW_ALL"] = "DISALLOW_ALL";
66
- })(exports.NgHttpCachingStrategy || (exports.NgHttpCachingStrategy = {}));
67
- exports.NgHttpCachingHeaders = void 0;
68
- (function (NgHttpCachingHeaders) {
69
- NgHttpCachingHeaders["ALLOW_CACHE"] = "X-NG-HTTP-CACHING-ALLOW-CACHE";
70
- NgHttpCachingHeaders["DISALLOW_CACHE"] = "X-NG-HTTP-CACHING-DISALLOW-CACHE";
71
- NgHttpCachingHeaders["LIFETIME"] = "X-NG-HTTP-CACHING-LIFETIME";
72
- NgHttpCachingHeaders["TAG"] = "X-NG-HTTP-CACHING-TAG";
73
- })(exports.NgHttpCachingHeaders || (exports.NgHttpCachingHeaders = {}));
74
- var NgHttpCachingConfig = /** @class */ (function () {
75
- function NgHttpCachingConfig() {
76
- }
77
- return NgHttpCachingConfig;
78
- }());
79
- var NgHttpCachingConfigDefault = {
80
- store: new NgHttpCachingMemoryStorage(),
81
- lifetime: 60 * 60 * 100,
82
- allowedMethod: ['GET'],
83
- cacheStrategy: exports.NgHttpCachingStrategy.ALLOW_ALL,
84
- };
85
- var NgHttpCachingService = /** @class */ (function () {
86
- function NgHttpCachingService(config) {
87
- this.queue = new Map();
88
- if (config) {
89
- this.config = Object.assign(Object.assign({}, NgHttpCachingConfigDefault), config);
90
- }
91
- else {
92
- this.config = NgHttpCachingConfigDefault;
93
- }
94
- }
95
- /**
96
- * Return the config
97
- */
98
- NgHttpCachingService.prototype.getConfig = function () {
99
- return this.config;
100
- };
101
- /**
102
- * Return the queue map
103
- */
104
- NgHttpCachingService.prototype.getQueue = function () {
105
- return this.queue;
106
- };
107
- /**
108
- * Return the cache store
109
- */
110
- NgHttpCachingService.prototype.getStore = function () {
111
- return this.config.store;
112
- };
113
- /**
114
- * Return response from cache
115
- */
116
- NgHttpCachingService.prototype.getFromCache = function (req) {
117
- var key = this.getKey(req);
118
- var cached = this.config.store.get(key);
119
- if (!cached) {
120
- return undefined;
121
- }
122
- if (this.isExpired(cached)) {
123
- this.clearCacheByKey(key);
124
- return undefined;
125
- }
126
- return cached.response;
127
- };
128
- /**
129
- * Add response to cache
130
- */
131
- NgHttpCachingService.prototype.addToCache = function (req, res) {
132
- var key = this.getKey(req);
133
- var entry = {
134
- url: req.urlWithParams,
135
- response: res,
136
- request: req,
137
- addedTime: Date.now(),
138
- };
139
- if (this.isValid(entry)) {
140
- this.config.store.set(key, entry);
141
- return true;
142
- }
143
- return false;
144
- };
145
- /**
146
- * Delete response from cache
147
- */
148
- NgHttpCachingService.prototype.deleteFromCache = function (req) {
149
- var key = this.getKey(req);
150
- return this.clearCacheByKey(key);
151
- };
152
- /**
153
- * Clear the cache
154
- */
155
- NgHttpCachingService.prototype.clearCache = function () {
156
- this.config.store.clear();
157
- };
158
- /**
159
- * Clear the cache by key
160
- */
161
- NgHttpCachingService.prototype.clearCacheByKey = function (key) {
162
- return this.config.store.delete(key);
163
- };
164
- /**
165
- * Clear the cache by regex
166
- */
167
- NgHttpCachingService.prototype.clearCacheByRegex = function (regex) {
168
- var _this = this;
169
- this.config.store.forEach(function (entry, key) {
170
- if (regex.test(key)) {
171
- _this.clearCacheByKey(key);
172
- }
173
- });
174
- };
175
- /**
176
- * Clear the cache by TAG
177
- */
178
- NgHttpCachingService.prototype.clearCacheByTag = function (tag) {
179
- var _this = this;
180
- this.config.store.forEach(function (entry, key) {
181
- var tagHeader = entry.request.headers.get(exports.NgHttpCachingHeaders.TAG);
182
- if (tagHeader && tagHeader.split(',').includes(tag)) {
183
- _this.clearCacheByKey(key);
184
- }
185
- });
186
- };
187
- /**
188
- * Run garbage collector (delete expired cache entry)
189
- */
190
- NgHttpCachingService.prototype.runGc = function () {
191
- var _this = this;
192
- this.config.store.forEach(function (entry, key) {
193
- if (_this.isExpired(entry)) {
194
- _this.clearCacheByKey(key);
195
- }
196
- });
197
- };
198
- /**
199
- * Return true if cache entry is expired
200
- */
201
- NgHttpCachingService.prototype.isExpired = function (entry) {
202
- // if user provide custom method, use it
203
- if (typeof this.config.isExpired === 'function') {
204
- var result = this.config.isExpired(entry);
205
- // if result is undefined, normal behaviour is provided
206
- if (typeof result !== 'undefined') {
207
- return result;
208
- }
209
- }
210
- // config/default lifetime
211
- var lifetime = this.config.lifetime;
212
- // request has own lifetime
213
- if (entry.request.headers.has(exports.NgHttpCachingHeaders.LIFETIME)) {
214
- lifetime = +entry.request.headers.get(exports.NgHttpCachingHeaders.LIFETIME);
215
- }
216
- // never expire if 0
217
- if (lifetime === 0) {
218
- return false;
219
- }
220
- // wrong lifetime
221
- if (lifetime < 0) {
222
- throw new Error('lifetime must be greater than or equal 0');
223
- }
224
- return entry.addedTime + lifetime < Date.now();
225
- };
226
- /**
227
- * Return true if cache entry is valid for store in the cache
228
- */
229
- NgHttpCachingService.prototype.isValid = function (entry) {
230
- // if user provide custom method, use it
231
- if (typeof this.config.isValid === 'function') {
232
- var result = this.config.isValid(entry);
233
- // if result is undefined, normal behaviour is provided
234
- if (typeof result !== 'undefined') {
235
- return result;
236
- }
237
- }
238
- return true;
239
- };
240
- /**
241
- * Return true if the request is cacheable
242
- */
243
- NgHttpCachingService.prototype.isCacheable = function (req) {
244
- // if user provide custom method, use it
245
- if (typeof this.config.isCacheable === 'function') {
246
- var result = this.config.isCacheable(req);
247
- // if result is undefined, normal behaviour is provided
248
- if (typeof result !== 'undefined') {
249
- return result;
250
- }
251
- }
252
- // request has disallow cache header
253
- if (req.headers.has(exports.NgHttpCachingHeaders.DISALLOW_CACHE)) {
254
- return false;
255
- }
256
- // strategy is disallow all...
257
- if (this.config.cacheStrategy === exports.NgHttpCachingStrategy.DISALLOW_ALL) {
258
- // request isn't allowed if come without allow header
259
- if (!req.headers.has(exports.NgHttpCachingHeaders.ALLOW_CACHE)) {
260
- return false;
261
- }
262
- }
263
- // if allowed method is only ALL, allow all http methos
264
- if (this.config.allowedMethod.length === 1) {
265
- if (this.config.allowedMethod[0] === 'ALL') {
266
- return true;
267
- }
268
- }
269
- // request is allowed if method is in allowedMethod
270
- return this.config.allowedMethod.indexOf(req.method) !== -1;
271
- };
272
- /**
273
- * Return the cache key
274
- */
275
- NgHttpCachingService.prototype.getKey = function (req) {
276
- // if user provide custom method, use it
277
- if (typeof this.config.getKey === 'function') {
278
- var result = this.config.getKey(req);
279
- // if result is undefined, normal behaviour is provided
280
- if (typeof result !== 'undefined') {
281
- return result;
282
- }
283
- }
284
- // default key id is url with query parameters
285
- return req.urlWithParams;
286
- };
287
- /**
288
- * Return observable from cache
289
- */
290
- NgHttpCachingService.prototype.getFromQueue = function (req) {
291
- var key = this.getKey(req);
292
- var cached = this.queue.get(key);
293
- if (!cached) {
294
- return undefined;
295
- }
296
- return cached;
297
- };
298
- /**
299
- * Add observable to cache
300
- */
301
- NgHttpCachingService.prototype.addToQueue = function (req, obs) {
302
- var key = this.getKey(req);
303
- this.queue.set(key, obs);
304
- };
305
- /**
306
- * Delete observable from cache
307
- */
308
- NgHttpCachingService.prototype.deleteFromQueue = function (req) {
309
- var key = this.getKey(req);
310
- return this.queue.delete(key);
311
- };
312
- return NgHttpCachingService;
313
- }());
314
- NgHttpCachingService.ɵfac = function NgHttpCachingService_Factory(t) { return new (t || NgHttpCachingService)(i0__namespace.ɵɵinject(NG_HTTP_CACHING_CONFIG, 8)); };
315
- NgHttpCachingService.ɵprov = /*@__PURE__*/ i0__namespace.ɵɵdefineInjectable({ token: NgHttpCachingService, factory: NgHttpCachingService.ɵfac });
316
- (function () {
317
- (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(NgHttpCachingService, [{
318
- type: i0.Injectable
319
- }], function () {
320
- return [{ type: NgHttpCachingConfig, decorators: [{
321
- type: i0.Inject,
322
- args: [NG_HTTP_CACHING_CONFIG]
323
- }, {
324
- type: i0.Optional
325
- }] }];
326
- }, null);
327
- })();
328
-
329
- var NgHttpCachingInterceptorService = /** @class */ (function () {
330
- function NgHttpCachingInterceptorService(cacheService) {
331
- this.cacheService = cacheService;
332
- }
333
- NgHttpCachingInterceptorService.prototype.intercept = function (req, next) {
334
- var _this = this;
335
- // run garbage collector
336
- this.cacheService.runGc();
337
- // Don't cache if it's not cacheable
338
- if (!this.cacheService.isCacheable(req)) {
339
- return this.sendRequest(req, next);
340
- }
341
- // Checked if there is pending response for this request
342
- var cachedObservable = this.cacheService.getFromQueue(req);
343
- if (cachedObservable) {
344
- // console.log('cachedObservable', req);
345
- return cachedObservable;
346
- }
347
- // Checked if there is cached response for this request
348
- var cachedResponse = this.cacheService.getFromCache(req);
349
- if (cachedResponse) {
350
- // console.log('cachedResponse', req);
351
- return rxjs.of(cachedResponse.clone());
352
- }
353
- // If the request of going through for first time
354
- // then let the request proceed and cache the response
355
- // console.log('sendRequest', req);
356
- var shared = this.sendRequest(req, next).pipe(operators.tap(function (event) {
357
- if (event instanceof http.HttpResponse) {
358
- _this.cacheService.addToCache(req, event.clone());
359
- }
360
- }), operators.finalize(function () {
361
- // delete pending request
362
- _this.cacheService.deleteFromQueue(req);
363
- }), operators.share());
364
- // add pending request to queue for cache parallell request
365
- this.cacheService.addToQueue(req, shared);
366
- return shared;
367
- };
368
- /**
369
- * Send http request (next handler)
370
- */
371
- NgHttpCachingInterceptorService.prototype.sendRequest = function (req, next) {
372
- var cloned = req.clone();
373
- // trim custom headers before send request
374
- Object.values(exports.NgHttpCachingHeaders).forEach(function (ngHttpCachingHeaders) {
375
- if (cloned.headers.has(ngHttpCachingHeaders)) {
376
- cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });
377
- }
378
- });
379
- return next.handle(cloned);
380
- };
381
- return NgHttpCachingInterceptorService;
382
- }());
383
- NgHttpCachingInterceptorService.ɵfac = function NgHttpCachingInterceptorService_Factory(t) { return new (t || NgHttpCachingInterceptorService)(i0__namespace.ɵɵinject(NgHttpCachingService)); };
384
- NgHttpCachingInterceptorService.ɵprov = /*@__PURE__*/ i0__namespace.ɵɵdefineInjectable({ token: NgHttpCachingInterceptorService, factory: NgHttpCachingInterceptorService.ɵfac });
385
- (function () {
386
- (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(NgHttpCachingInterceptorService, [{
387
- type: i0.Injectable
388
- }], function () { return [{ type: NgHttpCachingService }]; }, null);
389
- })();
390
-
391
- var NgHttpCachingModule = /** @class */ (function () {
392
- function NgHttpCachingModule() {
393
- }
394
- NgHttpCachingModule.forRoot = function (ngHttpCachingConfig) {
395
- return {
396
- ngModule: NgHttpCachingModule,
397
- providers: [
398
- {
399
- provide: NG_HTTP_CACHING_CONFIG,
400
- useValue: ngHttpCachingConfig,
401
- },
402
- ],
403
- };
404
- };
405
- return NgHttpCachingModule;
406
- }());
407
- NgHttpCachingModule.ɵfac = function NgHttpCachingModule_Factory(t) { return new (t || NgHttpCachingModule)(); };
408
- NgHttpCachingModule.ɵmod = /*@__PURE__*/ i0__namespace.ɵɵdefineNgModule({ type: NgHttpCachingModule });
409
- NgHttpCachingModule.ɵinj = /*@__PURE__*/ i0__namespace.ɵɵdefineInjector({ providers: [
410
- NgHttpCachingService,
411
- {
412
- provide: http.HTTP_INTERCEPTORS,
413
- useClass: NgHttpCachingInterceptorService,
414
- multi: true,
415
- },
416
- ], imports: [[]] });
417
- (function () {
418
- (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(NgHttpCachingModule, [{
419
- type: i0.NgModule,
420
- args: [{
421
- declarations: [],
422
- imports: [],
423
- providers: [
424
- NgHttpCachingService,
425
- {
426
- provide: http.HTTP_INTERCEPTORS,
427
- useClass: NgHttpCachingInterceptorService,
428
- multi: true,
429
- },
430
- ],
431
- exports: [],
432
- }]
433
- }], null, null);
434
- })();
435
-
436
- /*
437
- * Public API Surface of ng-http-caching
438
- */
439
-
440
- /**
441
- * Generated bundle index. Do not edit.
442
- */
443
-
444
- exports.NG_HTTP_CACHING_CONFIG = NG_HTTP_CACHING_CONFIG;
445
- exports.NgHttpCachingConfig = NgHttpCachingConfig;
446
- exports.NgHttpCachingConfigDefault = NgHttpCachingConfigDefault;
447
- exports.NgHttpCachingInterceptorService = NgHttpCachingInterceptorService;
448
- exports.NgHttpCachingMemoryStorage = NgHttpCachingMemoryStorage;
449
- exports.NgHttpCachingModule = NgHttpCachingModule;
450
- exports.NgHttpCachingService = NgHttpCachingService;
451
-
452
- Object.defineProperty(exports, '__esModule', { value: true });
453
-
454
- })));
455
- //# sourceMappingURL=ng-http-caching.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ng-http-caching.umd.js","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get(key: string): NgHttpCachingEntry | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport interface NgHttpCachingEntry {\r\n url: string;\r\n response: HttpResponse<any>;\r\n request: HttpRequest<any>;\r\n addedTime: number;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingConfig>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n DISALLOW_ALL = 'DISALLOW_ALL',\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n TAG = 'X-NG-HTTP-CACHING-TAG',\r\n}\r\nexport class NgHttpCachingConfig {\r\n store?: NgHttpCachingStorageInterface;\r\n lifetime?: number;\r\n allowedMethod?: string[];\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n isCacheable?: (req: HttpRequest<any>) => boolean | undefined;\r\n getKey?: (req: HttpRequest<any>) => string | undefined;\r\n isValid?: (entry: NgHttpCachingEntry) => boolean | undefined;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: NgHttpCachingConfig = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: 60 * 60 * 100,\r\n allowedMethod: ['GET'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private config: NgHttpCachingConfig;\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: NgHttpCachingConfig\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n } else {\r\n this.config = NgHttpCachingConfigDefault;\r\n }\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): NgHttpCachingConfig {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Map<string, Observable<HttpEvent<any>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): NgHttpCachingStorageInterface {\r\n return this.config.store;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache(req: HttpRequest<any>): HttpResponse<any> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry = this.config.store.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return cached.response;\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache(req: HttpRequest<any>, res: HttpResponse<any>): boolean {\r\n const key: string = this.getKey(req);\r\n const entry: NgHttpCachingEntry = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n };\r\n if ( this.isValid(entry) ) {\r\n this.config.store.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return this.config.store.delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex(regex: RegExp): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if ( regex.test(key) ){\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag(tag: string): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if ( tagHeader && tagHeader.split(',').includes(tag) ){\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc(): void {\r\n this.config.store.forEach((entry: NgHttpCachingEntry, key: string) => {\r\n if ( this.isExpired(entry) ){\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // config/default lifetime\r\n let lifetime = this.config.lifetime;\r\n // request has own lifetime\r\n if (entry.request.headers.has(NgHttpCachingHeaders.LIFETIME)) {\r\n lifetime = +entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if (lifetime < 0) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + lifetime < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n */\r\n isValid(entry: NgHttpCachingEntry): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable(req: HttpRequest<any>): boolean {\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methos\r\n if ( this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL'){\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n\r\n /**\r\n * Return the cache key\r\n */\r\n getKey(req: HttpRequest<any>): string {\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (typeof result !== 'undefined') {\r\n return result;\r\n }\r\n }\r\n // default key id is url with query parameters\r\n return req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue(req: HttpRequest<any>): Observable<HttpEvent<any>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<any>> = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue(req: HttpRequest<any>, obs: Observable<HttpEvent<any>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue(req: HttpRequest<any>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { tap, finalize, share } from 'rxjs/operators';\nimport { NgHttpCachingService, NgHttpCachingHeaders } from './ng-http-caching.service';\n\n\n@Injectable()\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\n\n constructor(private readonly cacheService: NgHttpCachingService) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // run garbage collector\n this.cacheService.runGc();\n\n // Don't cache if it's not cacheable\n if ( !this.cacheService.isCacheable(req) ) {\n return this.sendRequest(req, next);\n }\n\n // Checked if there is pending response for this request\n const cachedObservable: Observable<HttpEvent<any>> = this.cacheService.getFromQueue(req);\n if ( cachedObservable ) {\n // console.log('cachedObservable', req);\n return cachedObservable;\n }\n\n // Checked if there is cached response for this request\n const cachedResponse: HttpResponse<any> = this.cacheService.getFromCache(req);\n if (cachedResponse) {\n // console.log('cachedResponse', req);\n return of(cachedResponse.clone());\n }\n\n // If the request of going through for first time\n // then let the request proceed and cache the response\n // console.log('sendRequest', req);\n const shared = this.sendRequest(req, next).pipe(\n tap(event => {\n if (event instanceof HttpResponse) {\n this.cacheService.addToCache(req, event.clone());\n }\n }),\n finalize(() => {\n // delete pending request\n this.cacheService.deleteFromQueue(req);\n }),\n share()\n );\n\n // add pending request to queue for cache parallell request\n this.cacheService.addToQueue(req, shared);\n\n return shared;\n }\n\n /**\n * Send http request (next handler)\n */\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n let cloned: HttpRequest<any> = req.clone();\n // trim custom headers before send request\n Object.values(NgHttpCachingHeaders).forEach(ngHttpCachingHeaders => {\n if ( cloned.headers.has(ngHttpCachingHeaders) ) {\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\n }\n });\n return next.handle(cloned);\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n providers: [\r\n NgHttpCachingService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ],\r\n exports: [],\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["InjectionToken","NgHttpCachingStrategy","NgHttpCachingHeaders","Injectable","Inject","Optional","of","tap","HttpResponse","finalize","share","HTTP_INTERCEPTORS","NgModule"],"mappings":"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"}