Project

General

Profile

1
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
2
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';
3
import { Observable, of } from 'rxjs';
4
import { tap } from 'rxjs/operators';
5
import { TransferState, makeStateKey, StateKey } from '@angular/platform-browser';
6
import { isPlatformServer } from '@angular/common';
7

    
8
@Injectable({
9
  providedIn: 'root'
10
})
11
export class HttpInterceptorService implements HttpInterceptor {
12
  constructor(private transferState: TransferState, @Inject(PLATFORM_ID) private platformId: any) {}
13

    
14
  public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
15

    
16
    //console.info("intercept transferstate");
17
    if (request.method !== 'GET') {
18
      return next.handle(request);
19
    }
20

    
21
    const key: StateKey<string> = makeStateKey<string>(request.url);
22

    
23
    const storedResponse = this.transferState.get<any>(key, null);
24
    //console.info(key, storedResponse);
25
    if (storedResponse) {
26
      const response = new HttpResponse({body: storedResponse, status: 200});
27
      if (!isPlatformServer(this.platformId)) {
28
        //console.info("browser remove: ", key);
29
        this.transferState.remove(key);
30
      }
31
      return of(response);
32
    } else {
33
      if (isPlatformServer(this.platformId)) {
34
        return next.handle(request).pipe(tap((event) => {
35
          //console.info("server add: ", key);
36
          this.transferState.set(key, (<HttpResponse<any>>event).body);
37
        }));
38
      } else {
39
        return next.handle(request);
40
      }
41
    }
42
  }
43
}
(2-2/3)