From 3f0935eaa2714064d4bbb96d8a756e7ccb2da0cb Mon Sep 17 00:00:00 2001 From: Netanel Basal Date: Wed, 8 Jan 2020 15:36:17 +0200 Subject: [PATCH] feat(lib): add inline cache --- .../ngneat/http-cache/src/lib/httpCache.ts | 9 +++++-- .../src/lib/httpCacheInterceptor.ts | 27 ++++++++----------- .../http-cache/src/lib/httpCacheStorage.ts | 15 ++++++++--- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/projects/ngneat/http-cache/src/lib/httpCache.ts b/projects/ngneat/http-cache/src/lib/httpCache.ts index c077ebc..0df782b 100644 --- a/projects/ngneat/http-cache/src/lib/httpCache.ts +++ b/projects/ngneat/http-cache/src/lib/httpCache.ts @@ -19,8 +19,13 @@ export class HttpCacheFacade { this.ttlManager.set(request, ttl); } - isCached(request: HttpRequest) { - return this.storage.has(request) && this.ttlManager.isValid(request); + validate(request: HttpRequest) { + const has = this.storage.has(request); + const isValid = this.ttlManager.isValid(request); + if (has && isValid) return true; + + this.storage.delete(request); + return false; } get(request: HttpRequest) { diff --git a/projects/ngneat/http-cache/src/lib/httpCacheInterceptor.ts b/projects/ngneat/http-cache/src/lib/httpCacheInterceptor.ts index a68c657..df5c138 100644 --- a/projects/ngneat/http-cache/src/lib/httpCacheInterceptor.ts +++ b/projects/ngneat/http-cache/src/lib/httpCacheInterceptor.ts @@ -11,33 +11,28 @@ export class HttpCacheInterceptor implements HttpInterceptor { constructor(private cacheFacade: HttpCacheFacade) {} intercept(request: HttpRequest, next: HttpHandler): Observable> { - const allowCacheGlobal = this.cacheFacade.isCacheable(request); - const allowCacheLocal = request.params.get('cache$') as any; + const isRequestCacheable = this.cacheFacade.isCacheable(request); - const filteredParams = filterParams(request); - const clone = request.clone({ - params: new HttpParams({ - fromObject: filteredParams - }) - }); - - // allowCacheLocal !== false => because it can be null which means we allow it - if (allowCacheLocal === true || (allowCacheGlobal && allowCacheLocal !== false)) { - const ttl = request.params.get('ttl$'); - - if (this.cacheFacade.isCached(request)) { + if (isRequestCacheable && !!request.params.get('cache$') === true) { + if (this.cacheFacade.validate(request)) { return of(this.cacheFacade.get(request)); } + const filteredParams = filterParams(request); + const clone = request.clone({ + params: new HttpParams({ fromObject: filteredParams }) + }); + return next.handle(clone).pipe( tap(event => { if (event instanceof HttpResponse) { + const ttl = request.params.get('ttl$'); this.cacheFacade.set(request, event, +ttl); } }) ); - } else { - return next.handle(clone); } + + return next.handle(request); } } diff --git a/projects/ngneat/http-cache/src/lib/httpCacheStorage.ts b/projects/ngneat/http-cache/src/lib/httpCacheStorage.ts index 7ed4187..f4e39e8 100644 --- a/projects/ngneat/http-cache/src/lib/httpCacheStorage.ts +++ b/projects/ngneat/http-cache/src/lib/httpCacheStorage.ts @@ -6,7 +6,7 @@ export abstract class HttpCacheStorage { abstract has(request: HttpRequest): boolean; abstract get(request: HttpRequest): HttpResponse; abstract set(request: HttpRequest, response: HttpResponse): void; - abstract delete(key: string | RegExp): void; + abstract delete(key: string | RegExp | HttpRequest): void; } @Injectable() @@ -27,13 +27,20 @@ export class DefaultHttpCacheStorage implements HttpCacheStorage { this.cache.set(this.keySerializer.serialize(request), response); } - delete(url: string | RegExp): void { + delete(url: string | RegExp | HttpRequest): void { + let _url = url; + + if (url instanceof HttpRequest) { + _url = this.keySerializer.serialize(url); + } + if (typeof url === 'string') { - this.cache.delete(url); + this.cache.delete(_url as string); + return; } for (const [key] of Array.from(this.cache)) { - if ((url as RegExp).test(key)) { + if ((_url as RegExp).test(key)) { this.cache.delete(key); break; }