import { Injectable } from '@angular/core'; import { HttpEvent, HttpRequest, HttpResponse, HttpInterceptor, HttpHandler } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import { tap } from 'rxjs/operators'; import 'rxjs/add/observable/of'; import { RequestCache } from '../services/request-cache.service'; @Injectable() export class CachingInterceptor implements HttpInterceptor { constructor(private cache: RequestCache) { } intercept(req: HttpRequest, next: HttpHandler) { const cachedResponse = this.cache.get(req); return cachedResponse ? Observable.of(cachedResponse) : this.sendRequest(req, next); } sendRequest( req: HttpRequest, next: HttpHandler ): Observable> { return next.handle(req).pipe( tap(event => { if (event instanceof HttpResponse) { this.cache.put(req, event); } }) ); } }