{"version":3,"file":"obliczeniowo-elementary-http-cache.mjs","sources":["../../../../projects/components/http-cache/models/cache.model.ts","../../../../projects/components/http-cache/services/cache.service.ts","../../../../projects/components/http-cache/services/http-cache.service.ts","../../../../projects/components/http-cache/services/cache.interceptor.service.ts","../../../../projects/components/http-cache/obliczeniowo-elementary-http-cache.ts"],"sourcesContent":["import { CacheItem } from '../public-api';\n\nexport interface CacheOptions<Res = any, Ext = any> {\n  /**\n   * collect - collecting response body as table, maxSize parameter controls max size of table\n   * reload - force to reload cache (send request)\n   */\n  type?: 'collect' | 'reload';\n  /**\n   * Work with type='collect'\n   */\n  maxSize?: number;\n  data?: any;\n  name?: string;\n  external?: Ext;\n  withCacheItem?: boolean;\n  /** list of keys to clear */\n  clear?: string[];\n  /** list of keys to retrigger */\n  retrigger?: string[];\n  convert?: (data: Res) => any;\n  reloadOn?: (data: CacheItem<Res, Ext>) => boolean;\n}\n\nexport class CacheModel<Res = any, Ext = any> {\n  constructor(\n    public options?: CacheOptions<Res, Ext>\n  ) { }\n}\n","\nimport { Subject } from 'rxjs';\nimport { Injectable } from '@angular/core';\nimport { CacheOptions } from '../models/cache.model';\n\nexport interface CacheItem<Res, Ext = any> {\n  body: Res;\n  reqBody?: any,\n  triggeredAt: Date;\n  method: 'get' | 'post' | 'put' | 'patch' | 'delete' | string;\n  responseAt?: Date;\n  cache?: CacheOptions;\n  fullPath: string;\n  external?: Ext;\n  reloading?: true;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CacheService {\n  protected cache = new Map<string, CacheItem<any>>();\n\n  /**\n   * triggered when cache name value is changed or removed, not triggered when all cache was cleared\n   */\n  changed = new Subject<{ name: string, item?: CacheItem<any> }>();\n\n  /**\n   * triggered when one name of cache was cleared (emit string as name of removed one) or all was cleared (emit undefined)\n   */\n  cleared = new Subject<string | undefined>();\n\n  set(name: string, item: CacheItem<any>) {\n    this.cache.set(name, item);\n    this.changed.next({ name, item });\n  }\n\n  get(name: string): CacheItem<any> | undefined {\n    return this.cache.get(name);\n  }\n\n  has(name: string): boolean {\n    return this.cache.has(name);\n  }\n\n  /**\n   * when no name clear all, single one when name is known\n   */\n  clear(name?: string) {\n    if (name) {\n      this.cache.delete(name);\n      this.changed.next({ name });\n      this.cleared.next(name);\n    } else {\n      this.cache.clear();\n      this.cleared.next(undefined);\n    }\n  }\n}\n","import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { CacheModel, CacheOptions } from '../models/cache.model';\nimport { CacheItem } from './cache.service';\n\nexport interface HttpClientOptions {\n  body?: any;\n  headers?: HttpHeaders | {\n    [header: string]: string | string[];\n  };\n  context?: HttpContext;\n  observe?: 'body';\n  params?: HttpParams | {\n    [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n  };\n  responseType?: 'json';\n  reportProgress?: boolean;\n  withCredentials?: boolean;\n  cache?: CacheOptions;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class HttpCacheService {\n  constructor(public http: HttpClient) { }\n\n  request<R>(method: string, url: string, options?: {\n    body?: any;\n    headers?: HttpHeaders | {\n      [header: string]: string | string[];\n    };\n    context?: HttpContext;\n    observe?: 'body';\n    params?: HttpParams | {\n      [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n    };\n    responseType?: 'json';\n    reportProgress?: boolean;\n    withCredentials?: boolean;\n    cache?: CacheOptions;\n  }): Observable<R> {\n    if (options?.cache?.name) {\n      options.cache = { ...options.cache, name: `${method.toLowerCase()}:${options?.cache?.name}` }\n    }\n    return this.http.request<R>(\n      method,\n      url,\n      {\n        ...options,\n        body: options?.cache\n          ? new CacheModel(\n            {\n              ...options.cache,\n              data: options?.body\n            })\n          : options?.body\n      }\n    );\n  }\n\n  get<R>(url: string, options?: HttpClientOptions): Observable<R> {\n    return this.request<R>('GET', url, options);\n  }\n\n  patch<R>(url: string, body: any, options?: HttpClientOptions): Observable<R> {\n    options = { ...options, body };\n    return this.request<R>('PATCH', url, options)\n  }\n\n  post<R>(url: string, body: any, options?: HttpClientOptions): Observable<R> {\n    options = { ...options, body };\n    return this.request<R>('POST', url, options);\n  }\n\n  put<R>(url: string, body: any, options?: HttpClientOptions): Observable<R> {\n    options = { ...options, body };\n    return this.request<R>('PUT', url, options)\n  }\n\n  delete<R>(url: string, options?: HttpClientOptions): Observable<R> {\n    return this.request<R>('DELETE', url, options)\n  }\n\n  retrigger(cacheItem: CacheItem<any> | undefined) {\n    if (cacheItem?.cache) {\n      this.request(cacheItem.method, cacheItem.fullPath, {\n        cache: {\n          ...cacheItem.cache,\n          name: cacheItem.cache?.name && cacheItem.cache?.name.split(':')[1],\n          type: 'reload'\n        }\n      }).subscribe();\n    }\n  }\n}\n","import { HttpCacheService } from './http-cache.service';\nimport { HttpEvent, HttpHandler, HttpRequest, HttpResponse, HttpResponseBase, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { map, Observable, of, finalize, filter, tap } from 'rxjs';\nimport { CacheModel } from '../models/cache.model';\nimport { CacheItem, CacheService } from './cache.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CacheInterceptorService {\n  constructor(\n    private readonly cache: CacheService,\n    private readonly http: HttpCacheService\n  ) {\n  }\n\n  intercept(\n    request: HttpRequest<any>, next: HttpHandler\n  ): Observable<HttpEvent<any>> {\n    const body = request.body;\n    const hasCacheModel = body instanceof CacheModel;\n\n    if (hasCacheModel && body?.options?.type === 'reload' && body?.options?.name) {\n      this.cache.clear(body.options?.name);\n    }\n\n    if (hasCacheModel && body.options?.type !== 'collect') {\n      if (body?.options?.name) {\n        if (this.cache.has(body?.options?.name)) {\n          const data: CacheItem<any> = this.cache.get(body?.options?.name) as CacheItem<any>;\n\n          if (data.reloading || body?.options?.reloadOn &&\n            !body?.options?.reloadOn(data) || !body?.options?.reloadOn) {\n            return of(new HttpResponse<any>({\n              body: body?.options?.withCacheItem && data || data?.body,\n              status: 304\n            }));\n          }\n          data.reloading = true;\n        }\n      }\n      request = request.clone({ body: body?.options?.data });\n    }\n\n    const triggeredAt = new Date();\n    const setCacheState = (reloading?: true) => {\n      if (hasCacheModel && body?.options?.name && this.cache.has(body?.options?.name)) {\n        const cacheItem = this.cache.get(body?.options?.name) as CacheItem<any>;\n        cacheItem.reloading = reloading;\n        if (reloading) {\n          cacheItem.external = body.options.external;\n          cacheItem.responseAt = new Date();\n          cacheItem.reqBody = request.body;\n          cacheItem.cache = body.options;\n        }\n      }\n    }\n\n    return next.handle(request).pipe(\n      filter<any>(resp => resp instanceof HttpResponseBase),\n      map((resp: any) => {\n        if (hasCacheModel && resp?.body) {\n          resp.body = body?.options?.convert?.(resp.body) || resp.body;\n        }\n        return resp;\n      }),\n      map((resp: any) => {\n        if (!hasCacheModel || body?.options?.type !== 'collect') {\n          return resp;\n      }\n        const cache: CacheItem<any> = body?.options?.name &&\n          this.cache.has(body?.options?.name) &&\n          this.cache.get(body?.options?.name) ||\n          { body: [], triggeredAt, fullPath: request.urlWithParams, method: request.method.toLowerCase() };\n\n        if (resp.body) {\n          cache.body.push(resp.body);\n          cache.triggeredAt = new Date();\n          cache.method = request.method.toLowerCase();\n        }\n        if (body?.options?.maxSize && cache.body.length > body.options.maxSize) {\n          cache.body.shift();\n        }\n        if (body?.options?.name) {\n          this.cache.set(body?.options?.name, cache);\n        }\n        resp.body = cache.body;\n        return resp;\n      }),\n      map((resp: any) => {\n        if (hasCacheModel && resp?.body && body?.options?.name) {\n          if (body.options?.type !== 'collect') {\n            this.cache.set(\n              body?.options?.name,\n              {\n                body: resp.body,\n                triggeredAt,\n                fullPath: request.urlWithParams,\n                method: request.method.toLowerCase()\n              }\n            )\n          }\n        }\n        setCacheState(true);\n        if (hasCacheModel && body.options?.withCacheItem) {\n          if (!body?.options?.name) {\n            throw new HttpErrorResponse({ status: 404, statusText: 'For withCacheItem=true option cache name is required!' })\n          }\n          resp.body = { ...(this.cache.get(body?.options?.name) as CacheItem<any>) };\n          delete resp.body.reloading;\n        }\n        return resp;\n      }),\n      tap(() => {\n        if (hasCacheModel) {\n          if (body?.options?.clear) {\n            body.options.clear.forEach(clear => this.cache.clear(clear));\n          }\n          if (body?.options?.retrigger) {\n            body.options.retrigger.forEach((retrigger: string) => this.http.retrigger(this.cache.get(retrigger)));\n          }\n        }\n      }),\n      finalize(() => {\n        setCacheState();\n      }),\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CacheService","i2.HttpCacheService"],"mappings":"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"}