@experteam-mx/ngx-services
Version:
Angular common services for Experteam apps
37 lines • 5.63 kB
JavaScript
import { inject } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { of } from 'rxjs';
import { tap } from 'rxjs/operators';
import { ENVIRONMENT_TOKEN } from '../ngx-services.models';
const DEFAULT_TTL = 10000; // ttl in ms
const cache = new Map();
/**
* Interceptor function to handle HTTP caching for GET requests. It retrieves cached responses
* if available and valid; otherwise, it processes the request and caches the response for future use.
*
* @param {HttpRequest<any>} req - The HTTP request object being intercepted.
* @param {HttpHandlerFn} next - The next HTTP handler function in the chain to process the request.
* @return {Observable<HttpEvent<any>>} An observable that emits the HTTP event, either from cache
* or by invoking the next handler.
*/
export function httpCachingInterceptor(req, next) {
const { cacheTtl } = inject(ENVIRONMENT_TOKEN);
if (req.method !== 'GET')
return next(req);
const cached = cache.get(req.urlWithParams);
if (cached) {
const isExpired = Date.now() > cached.ttl;
if (!isExpired) {
return of(cached.res);
}
cache.delete(req.urlWithParams); // If expired, remove the entry from cache
}
return next(req).pipe(tap((res) => {
if (!(res instanceof HttpResponse)) {
return;
}
const ttl = Date.now() + (cacheTtl ?? DEFAULT_TTL);
cache.set(req.urlWithParams, { res, ttl });
}));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jYWNoaW5nLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1zZXJ2aWNlcy9zcmMvbGliL2ludGVyY2VwdG9ycy9odHRwLWNhY2hpbmcuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN0QyxPQUFPLEVBQXlDLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRTFGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDckMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBRTFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQSxDQUFDLFlBQVk7QUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQW1ELENBQUE7QUFFeEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUUsR0FBcUIsRUFBRSxJQUFtQjtJQUNoRixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFFOUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUUxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUUzQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUE7UUFFekMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQUMsQ0FBQztRQUV6QyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQSxDQUFDLDBDQUEwQztJQUM1RSxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNuQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNWLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQUMsT0FBTTtRQUFDLENBQUM7UUFFOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxDQUFBO1FBRWxELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzVDLENBQUMsQ0FBQyxDQUNILENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwSGFuZGxlckZuLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXHJcblxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBFTlZJUk9OTUVOVF9UT0tFTiB9IGZyb20gJy4uL25neC1zZXJ2aWNlcy5tb2RlbHMnXHJcblxyXG5jb25zdCBERUZBVUxUX1RUTCA9IDEwMDAwIC8vIHR0bCBpbiBtc1xyXG5jb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHR0bDogbnVtYmVyLCByZXM6IEh0dHBSZXNwb25zZTxhbnk+IH0+KClcclxuXHJcbi8qKlxyXG4gKiBJbnRlcmNlcHRvciBmdW5jdGlvbiB0byBoYW5kbGUgSFRUUCBjYWNoaW5nIGZvciBHRVQgcmVxdWVzdHMuIEl0IHJldHJpZXZlcyBjYWNoZWQgcmVzcG9uc2VzXHJcbiAqIGlmIGF2YWlsYWJsZSBhbmQgdmFsaWQ7IG90aGVyd2lzZSwgaXQgcHJvY2Vzc2VzIHRoZSByZXF1ZXN0IGFuZCBjYWNoZXMgdGhlIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0h0dHBSZXF1ZXN0PGFueT59IHJlcSAtIFRoZSBIVFRQIHJlcXVlc3Qgb2JqZWN0IGJlaW5nIGludGVyY2VwdGVkLlxyXG4gKiBAcGFyYW0ge0h0dHBIYW5kbGVyRm59IG5leHQgLSBUaGUgbmV4dCBIVFRQIGhhbmRsZXIgZnVuY3Rpb24gaW4gdGhlIGNoYWluIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuXHJcbiAqIEByZXR1cm4ge09ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIEhUVFAgZXZlbnQsIGVpdGhlciBmcm9tIGNhY2hlXHJcbiAqIG9yIGJ5IGludm9raW5nIHRoZSBuZXh0IGhhbmRsZXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaHR0cENhY2hpbmdJbnRlcmNlcHRvciAocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlckZuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gIGNvbnN0IHsgY2FjaGVUdGwgfSA9IGluamVjdChFTlZJUk9OTUVOVF9UT0tFTilcclxuXHJcbiAgaWYgKHJlcS5tZXRob2QgIT09ICdHRVQnKSByZXR1cm4gbmV4dChyZXEpXHJcblxyXG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChyZXEudXJsV2l0aFBhcmFtcylcclxuXHJcbiAgaWYgKGNhY2hlZCkge1xyXG4gICAgY29uc3QgaXNFeHBpcmVkID0gRGF0ZS5ub3coKSA+IGNhY2hlZC50dGxcclxuXHJcbiAgICBpZiAoIWlzRXhwaXJlZCkgeyByZXR1cm4gb2YoY2FjaGVkLnJlcykgfVxyXG5cclxuICAgIGNhY2hlLmRlbGV0ZShyZXEudXJsV2l0aFBhcmFtcykgLy8gSWYgZXhwaXJlZCwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIGNhY2hlXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV4dChyZXEpLnBpcGUoXHJcbiAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIShyZXMgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpKSB7IHJldHVybiB9XHJcblxyXG4gICAgICBjb25zdCB0dGwgPSBEYXRlLm5vdygpICsgKGNhY2hlVHRsID8/IERFRkFVTFRfVFRMKVxyXG5cclxuICAgICAgY2FjaGUuc2V0KHJlcS51cmxXaXRoUGFyYW1zLCB7IHJlcywgdHRsIH0pXHJcbiAgICB9KVxyXG4gIClcclxufVxyXG4iXX0=